⛏️ index : haiku.git

/*
 * 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;
		}
	}

	// notify listeners
	fTeam->NotifyImageDebugInfoChanged(this);

	return error;
}