* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2013-2014, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#include "BreakpointSetting.h"
#include <Message.h>
#include "ArchivingUtils.h"
#include "FunctionID.h"
#include "LocatableFile.h"
#include "UserBreakpoint.h"
BreakpointSetting::BreakpointSetting()
:
fFunctionID(NULL),
fSourceFile(),
fSourceLocation(),
fRelativeAddress(0),
fEnabled(false),
fHidden(false),
fConditionExpression()
{
}
BreakpointSetting::BreakpointSetting(const BreakpointSetting& other)
:
fFunctionID(other.fFunctionID),
fSourceFile(other.fSourceFile),
fSourceLocation(other.fSourceLocation),
fRelativeAddress(other.fRelativeAddress),
fEnabled(other.fEnabled),
fHidden(other.fHidden),
fConditionExpression(other.fConditionExpression)
{
if (fFunctionID != NULL)
fFunctionID->AcquireReference();
}
BreakpointSetting::~BreakpointSetting()
{
_Unset();
}
status_t
BreakpointSetting::SetTo(const UserBreakpointLocation& location, bool enabled,
bool hidden, const BString& conditionExpression)
{
_Unset();
fFunctionID = location.GetFunctionID();
if (fFunctionID != NULL)
fFunctionID->AcquireReference();
if (LocatableFile* file = location.SourceFile())
file->GetPath(fSourceFile);
fSourceLocation = location.GetSourceLocation();
fRelativeAddress = location.RelativeAddress();
fEnabled = enabled;
fHidden = hidden;
fConditionExpression = conditionExpression;
return B_OK;
}
status_t
BreakpointSetting::SetTo(const BMessage& archive)
{
_Unset();
fFunctionID = ArchivingUtils::UnarchiveChild<FunctionID>(archive,
"function");
if (fFunctionID == NULL)
return B_BAD_VALUE;
archive.FindString("sourceFile", &fSourceFile);
int32 line;
if (archive.FindInt32("line", &line) != B_OK)
line = -1;
int32 column;
if (archive.FindInt32("column", &column) != B_OK)
column = -1;
fSourceLocation = SourceLocation(line, column);
if (archive.FindUInt64("relativeAddress", &fRelativeAddress) != B_OK)
fRelativeAddress = 0;
if (archive.FindBool("enabled", &fEnabled) != B_OK)
fEnabled = false;
if (archive.FindBool("hidden", &fHidden) != B_OK)
fHidden = false;
if (archive.FindString("condition", &fConditionExpression) != B_OK)
fConditionExpression.Truncate(0);
return B_OK;
}
status_t
BreakpointSetting::WriteTo(BMessage& archive) const
{
if (fFunctionID == NULL)
return B_BAD_VALUE;
archive.MakeEmpty();
status_t error;
if ((error = ArchivingUtils::ArchiveChild(fFunctionID, archive, "function"))
!= B_OK
|| (error = archive.AddString("sourceFile", fSourceFile)) != B_OK
|| (error = archive.AddInt32("line", fSourceLocation.Line())) != B_OK
|| (error = archive.AddInt32("column", fSourceLocation.Column()))
!= B_OK
|| (error = archive.AddUInt64("relativeAddress", fRelativeAddress))
!= B_OK
|| (error = archive.AddBool("enabled", fEnabled)) != B_OK
|| (error = archive.AddBool("hidden", fHidden)) != B_OK
|| (error = archive.AddString("condition", fConditionExpression))
!= B_OK) {
return error;
}
return B_OK;
}
BreakpointSetting&
BreakpointSetting::operator=(const BreakpointSetting& other)
{
if (this == &other)
return *this;
_Unset();
fFunctionID = other.fFunctionID;
if (fFunctionID != NULL)
fFunctionID->AcquireReference();
fSourceFile = other.fSourceFile;
fSourceLocation = other.fSourceLocation;
fRelativeAddress = other.fRelativeAddress;
fEnabled = other.fEnabled;
fHidden = other.fHidden;
fConditionExpression = other.fConditionExpression;
return *this;
}
void
BreakpointSetting::_Unset()
{
if (fFunctionID != NULL) {
fFunctionID->ReleaseReference();
fFunctionID = NULL;
}
fSourceFile.Truncate(0);
fSourceLocation = SourceLocation();
fRelativeAddress = 0;
fEnabled = false;
fConditionExpression.Truncate(0);
}