1 /* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #include "Image.h" 7 8 #include "ImageDebugInfo.h" 9 #include "LocatableFile.h" 10 #include "Team.h" 11 #include "TeamDebugInfo.h" 12 13 14 Image::Image(Team* team,const ImageInfo& imageInfo, LocatableFile* imageFile) 15 : 16 fTeam(team), 17 fInfo(imageInfo), 18 fImageFile(imageFile), 19 fDebugInfo(NULL), 20 fDebugInfoState(IMAGE_DEBUG_INFO_NOT_LOADED) 21 { 22 if (fImageFile != NULL) 23 fImageFile->AcquireReference(); 24 } 25 26 27 Image::~Image() 28 { 29 if (fDebugInfo != NULL) { 30 if (fTeam != NULL) 31 fTeam->DebugInfo()->RemoveImageDebugInfo(fDebugInfo); 32 fDebugInfo->ReleaseReference(); 33 } 34 if (fImageFile != NULL) 35 fImageFile->ReleaseReference(); 36 } 37 38 39 status_t 40 Image::Init() 41 { 42 return B_OK; 43 } 44 45 46 bool 47 Image::ContainsAddress(target_addr_t address) const 48 { 49 return (address >= fInfo.TextBase() 50 && address < fInfo.TextBase() + fInfo.TextSize()) 51 || (address >= fInfo.DataBase() 52 && address < fInfo.DataBase() + fInfo.DataSize()); 53 } 54 55 56 status_t 57 Image::SetImageDebugInfo(ImageDebugInfo* debugInfo, 58 image_debug_info_state state) 59 { 60 if (debugInfo == fDebugInfo && state == fDebugInfoState) 61 return B_OK; 62 63 if (fDebugInfo != NULL) { 64 fTeam->DebugInfo()->RemoveImageDebugInfo(fDebugInfo); 65 fDebugInfo->ReleaseReference(); 66 } 67 68 fDebugInfo = debugInfo; 69 fDebugInfoState = state; 70 71 status_t error = B_OK; 72 if (fDebugInfo != NULL) { 73 error = fTeam->DebugInfo()->AddImageDebugInfo(fDebugInfo); 74 if (error == B_OK) { 75 fDebugInfo->AcquireReference(); 76 } else { 77 fDebugInfo = NULL; 78 fDebugInfoState = IMAGE_DEBUG_INFO_UNAVAILABLE; 79 } 80 } 81 82 // notify listeners 83 fTeam->NotifyImageDebugInfoChanged(this); 84 85 return error; 86 } 87