* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include "Image.h"
#include "ImageDebugInfo.h"
#include "LocatableFile.h"
#include "Team.h"
#include "TeamDebugInfo.h"
Image::Image(Team* team,const ImageInfo& imageInfo, LocatableFile* imageFile)
:
fTeam(team),
fInfo(imageInfo),
fImageFile(imageFile),
fDebugInfo(NULL),
fDebugInfoState(IMAGE_DEBUG_INFO_NOT_LOADED)
{
if (fImageFile != NULL)
fImageFile->AcquireReference();
}
Image::~Image()
{
if (fDebugInfo != NULL) {
if (fTeam != NULL)
fTeam->DebugInfo()->RemoveImageDebugInfo(fDebugInfo);
fDebugInfo->ReleaseReference();
}
if (fImageFile != NULL)
fImageFile->ReleaseReference();
}
status_t
Image::Init()
{
return B_OK;
}
bool
Image::ContainsAddress(target_addr_t address) const
{
return (address >= fInfo.TextBase()
&& address < fInfo.TextBase() + fInfo.TextSize())
|| (address >= fInfo.DataBase()
&& address < fInfo.DataBase() + fInfo.DataSize());
}
status_t
Image::SetImageDebugInfo(ImageDebugInfo* debugInfo,
image_debug_info_state state)
{
if (debugInfo == fDebugInfo && state == fDebugInfoState)
return B_OK;
if (fDebugInfo != NULL) {
fTeam->DebugInfo()->RemoveImageDebugInfo(fDebugInfo);
fDebugInfo->ReleaseReference();
}
fDebugInfo = debugInfo;
fDebugInfoState = state;
status_t error = B_OK;
if (fDebugInfo != NULL) {
error = fTeam->DebugInfo()->AddImageDebugInfo(fDebugInfo);
if (error == B_OK) {
fDebugInfo->AcquireReference();
} else {
fDebugInfo = NULL;
fDebugInfoState = IMAGE_DEBUG_INFO_UNAVAILABLE;
}
}
fTeam->NotifyImageDebugInfoChanged(this);
return error;
}