xref: /haiku/src/kits/debugger/model/Image.cpp (revision 899e0ef82b5624ace2ccfa5f5a58c8ebee54aaef)
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