1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2013-2014, Rene Gollent, rene@gollent.com.
4 * Distributed under the terms of the MIT License.
5 */
6
7
8#include "BreakpointSetting.h"
9
10#include <Message.h>
11
12#include "ArchivingUtils.h"
13#include "FunctionID.h"
14#include "LocatableFile.h"
15#include "UserBreakpoint.h"
16
17
18BreakpointSetting::BreakpointSetting()
19	:
20	fFunctionID(NULL),
21	fSourceFile(),
22	fSourceLocation(),
23	fRelativeAddress(0),
24	fEnabled(false),
25	fHidden(false),
26	fConditionExpression()
27{
28}
29
30
31BreakpointSetting::BreakpointSetting(const BreakpointSetting& other)
32	:
33	fFunctionID(other.fFunctionID),
34	fSourceFile(other.fSourceFile),
35	fSourceLocation(other.fSourceLocation),
36	fRelativeAddress(other.fRelativeAddress),
37	fEnabled(other.fEnabled),
38	fHidden(other.fHidden),
39	fConditionExpression(other.fConditionExpression)
40{
41	if (fFunctionID != NULL)
42		fFunctionID->AcquireReference();
43}
44
45
46BreakpointSetting::~BreakpointSetting()
47{
48	_Unset();
49}
50
51
52status_t
53BreakpointSetting::SetTo(const UserBreakpointLocation& location, bool enabled,
54	bool hidden, const BString& conditionExpression)
55{
56	_Unset();
57
58	fFunctionID = location.GetFunctionID();
59	if (fFunctionID != NULL)
60		fFunctionID->AcquireReference();
61
62	if (LocatableFile* file = location.SourceFile())
63		file->GetPath(fSourceFile);
64
65	fSourceLocation = location.GetSourceLocation();
66	fRelativeAddress = location.RelativeAddress();
67	fEnabled = enabled;
68	fHidden = hidden;
69	fConditionExpression = conditionExpression;
70
71	return B_OK;
72}
73
74
75status_t
76BreakpointSetting::SetTo(const BMessage& archive)
77{
78	_Unset();
79
80	fFunctionID = ArchivingUtils::UnarchiveChild<FunctionID>(archive,
81		"function");
82	if (fFunctionID == NULL)
83		return B_BAD_VALUE;
84
85	archive.FindString("sourceFile", &fSourceFile);
86
87	int32 line;
88	if (archive.FindInt32("line", &line) != B_OK)
89		line = -1;
90
91	int32 column;
92	if (archive.FindInt32("column", &column) != B_OK)
93		column = -1;
94
95	fSourceLocation = SourceLocation(line, column);
96
97	if (archive.FindUInt64("relativeAddress", &fRelativeAddress) != B_OK)
98		fRelativeAddress = 0;
99
100	if (archive.FindBool("enabled", &fEnabled) != B_OK)
101		fEnabled = false;
102
103	if (archive.FindBool("hidden", &fHidden) != B_OK)
104		fHidden = false;
105
106	if (archive.FindString("condition", &fConditionExpression) != B_OK)
107		fConditionExpression.Truncate(0);
108
109	return B_OK;
110}
111
112
113status_t
114BreakpointSetting::WriteTo(BMessage& archive) const
115{
116	if (fFunctionID == NULL)
117		return B_BAD_VALUE;
118
119	archive.MakeEmpty();
120
121	status_t error;
122	if ((error = ArchivingUtils::ArchiveChild(fFunctionID, archive, "function"))
123			!= B_OK
124		|| (error = archive.AddString("sourceFile", fSourceFile)) != B_OK
125		|| (error = archive.AddInt32("line", fSourceLocation.Line())) != B_OK
126		|| (error = archive.AddInt32("column", fSourceLocation.Column()))
127			!= B_OK
128		|| (error = archive.AddUInt64("relativeAddress", fRelativeAddress))
129			!= B_OK
130		|| (error = archive.AddBool("enabled", fEnabled)) != B_OK
131		|| (error = archive.AddBool("hidden", fHidden)) != B_OK
132		|| (error = archive.AddString("condition", fConditionExpression))
133			!= B_OK) {
134		return error;
135	}
136
137	return B_OK;
138}
139
140
141BreakpointSetting&
142BreakpointSetting::operator=(const BreakpointSetting& other)
143{
144	if (this == &other)
145		return *this;
146
147	_Unset();
148
149	fFunctionID = other.fFunctionID;
150	if (fFunctionID != NULL)
151		fFunctionID->AcquireReference();
152
153	fSourceFile = other.fSourceFile;
154	fSourceLocation = other.fSourceLocation;
155	fRelativeAddress = other.fRelativeAddress;
156	fEnabled = other.fEnabled;
157	fHidden = other.fHidden;
158	fConditionExpression = other.fConditionExpression;
159
160	return *this;
161}
162
163
164void
165BreakpointSetting::_Unset()
166{
167	if (fFunctionID != NULL) {
168		fFunctionID->ReleaseReference();
169		fFunctionID = NULL;
170	}
171
172	fSourceFile.Truncate(0);
173	fSourceLocation = SourceLocation();
174	fRelativeAddress = 0;
175	fEnabled = false;
176	fConditionExpression.Truncate(0);
177}
178