1 //=============================================================================
2 // File: msgcmp.cpp
3 // Contents: Definitions for DwMessageComponent
4 // Maintainer: Doug Sauder <dwsauder@fwb.gulf.net>
5 // WWW: http://www.fwb.gulf.net/~dwsauder/mimepp.html
6 // $Revision: 1.7 $
7 // $Date: 1997/09/27 11:54:08 $
8 //
9 // Copyright (c) 1996, 1997 Douglas W. Sauder
10 // All rights reserved.
11 //
12 // IN NO EVENT SHALL DOUGLAS W. SAUDER BE LIABLE TO ANY PARTY FOR DIRECT,
13 // INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
14 // THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF DOUGLAS W. SAUDER
15 // HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16 //
17 // DOUGLAS W. SAUDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT
18 // NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
19 // PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"
20 // BASIS, AND DOUGLAS W. SAUDER HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
21 // SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
22 //
23 //=============================================================================
24
25 #define DW_IMPLEMENTATION
26
27 #include <mimelib/config.h>
28 #include <mimelib/debug.h>
29 #include <stdlib.h>
30 #include <mimelib/msgcmp.h>
31
32 #define kMagicNumber ((DwUint32) 0x22222222L)
33
34
35 int DwMessageComponent::sNextObjectId = 1;
36 const char* const DwMessageComponent::sClassName = "DwMessageComponent";
37
38
DwMessageComponent()39 DwMessageComponent::DwMessageComponent()
40 {
41 mMagicNumber = (DwUint32) kMagicNumber;
42 mObjectId = sNextObjectId++;
43 mIsModified = 0;
44 mParent = 0;
45 mClassId = kCidMessageComponent;
46 mClassName = sClassName;
47 }
48
49
DwMessageComponent(const DwMessageComponent & aCmp)50 DwMessageComponent::DwMessageComponent(const DwMessageComponent& aCmp)
51 : mString(aCmp.mString)
52 {
53 mMagicNumber = (DwUint32) kMagicNumber;
54 mObjectId = sNextObjectId++;
55 mIsModified = aCmp.mIsModified;
56 mParent = 0;
57 mClassId = kCidMessageComponent;
58 mClassName = sClassName;
59 }
60
61
DwMessageComponent(const DwString & aStr,DwMessageComponent * aParent)62 DwMessageComponent::DwMessageComponent(const DwString& aStr,
63 DwMessageComponent* aParent)
64 : mString(aStr)
65 {
66 mMagicNumber = (DwUint32) kMagicNumber;
67 mObjectId = sNextObjectId++;
68 mIsModified = 0;
69 mParent = aParent;
70 mClassId = kCidMessageComponent;
71 mClassName = sClassName;
72 }
73
74
~DwMessageComponent()75 DwMessageComponent::~DwMessageComponent()
76 {
77 #if defined (DW_DEBUG_VERSION) || defined (DW_DEVELOPMENT_VERSION)
78 if (mMagicNumber != (DwUint32) kMagicNumber) {
79 std::cerr << "Bad value for 'this' in destructor\n";
80 std::cerr << "(Possibly 'delete' was called twice for same object)\n";
81 abort();
82 }
83 mMagicNumber = 0;
84 #endif // defined (DW_DEBUG_VERSION) || defined (DW_DEVELOPMENT_VERSION)
85 }
86
87
88 const DwMessageComponent&
operator =(const DwMessageComponent & aCmp)89 DwMessageComponent::operator = (const DwMessageComponent& aCmp)
90 {
91 if (this == &aCmp) return *this;
92 mString = aCmp.mString;
93 mIsModified = aCmp.mIsModified;
94 return *this;
95 }
96
97
FromString(const DwString & aStr)98 void DwMessageComponent::FromString(const DwString& aStr)
99 {
100 mString = aStr;
101 if (mParent != 0) {
102 mParent->SetModified();
103 }
104 }
105
106
FromString(const char * aCstr)107 void DwMessageComponent::FromString(const char* aCstr)
108 {
109 assert(aCstr != 0);
110 mString = aCstr;
111 if (mParent != 0) {
112 mParent->SetModified();
113 }
114 }
115
116
AsString()117 const DwString& DwMessageComponent::AsString()
118 {
119 return mString;
120 }
121
122
Parent()123 DwMessageComponent* DwMessageComponent::Parent()
124 {
125 return mParent;
126 }
127
128
SetParent(DwMessageComponent * aParent)129 void DwMessageComponent::SetParent(DwMessageComponent* aParent)
130 {
131 mParent = aParent;
132 }
133
134
IsModified() const135 DwBool DwMessageComponent::IsModified() const
136 {
137 return mIsModified;
138 }
139
140
SetModified()141 void DwMessageComponent::SetModified()
142 {
143 mIsModified = 1;
144 if (mParent) mParent->SetModified();
145 }
146
147
ClassId() const148 int DwMessageComponent::ClassId() const
149 {
150 return mClassId;
151 }
152
153
ClassName() const154 const char* DwMessageComponent::ClassName() const
155 {
156 return mClassName;
157 }
158
159
ObjectId() const160 int DwMessageComponent::ObjectId() const
161 {
162 return mObjectId;
163 }
164
165
PrintDebugInfo(ostream & aStrm,int) const166 void DwMessageComponent::PrintDebugInfo(ostream& aStrm, int /*aDepth*/) const
167 {
168 #if defined (DW_DEBUG_VERSION)
169 _PrintDebugInfo(aStrm);
170 #endif // defined (DW_DEBUG_VERSION)
171 }
172
173
_PrintDebugInfo(ostream & aStrm) const174 void DwMessageComponent::_PrintDebugInfo(ostream& aStrm) const
175 {
176 #if defined (DW_DEBUG_VERSION)
177 aStrm << "ObjectId: " << ObjectId() << '\n';
178 aStrm << "ClassId: ";
179 switch (ClassId()) {
180 case kCidError:
181 aStrm << "kCidError";
182 break;
183 case kCidUnknown:
184 aStrm << "kCidUnknown";
185 break;
186 case kCidAddress:
187 aStrm << "kCidAddress";
188 break;
189 case kCidAddressList:
190 aStrm << "kCidAddressList";
191 break;
192 case kCidBody:
193 aStrm << "kCidBody";
194 break;
195 case kCidBodyPart:
196 aStrm << "kCidBodyPart";
197 break;
198 case kCidDispositionType:
199 aStrm << "kCidDispositionType";
200 break;
201 case kCidMechanism:
202 aStrm << "kCidMechanism";
203 break;
204 case kCidMediaType:
205 aStrm << "kCidMediaType";
206 break;
207 case kCidParameter:
208 aStrm << "kCidParameter";
209 break;
210 case kCidDateTime:
211 aStrm << "kCidDateTime";
212 break;
213 case kCidEntity:
214 aStrm << "kCidEntity";
215 break;
216 case kCidField:
217 aStrm << "kCidField";
218 break;
219 case kCidFieldBody:
220 aStrm << "kCidFieldBody";
221 break;
222 case kCidGroup:
223 aStrm << "kCidGroup";
224 break;
225 case kCidHeaders:
226 aStrm << "kCidHeaders";
227 break;
228 case kCidMailbox:
229 aStrm << "kCidMailbox";
230 break;
231 case kCidMailboxList:
232 aStrm << "kCidMailboxList";
233 break;
234 case kCidMessage:
235 aStrm << "kCidMessage";
236 break;
237 case kCidMessageComponent:
238 aStrm << "kCidMessageComponent";
239 break;
240 case kCidMsgId:
241 aStrm << "kCidMsgId";
242 break;
243 case kCidText:
244 aStrm << "kCidText";
245 break;
246 }
247 aStrm << '\n';
248 aStrm << "ClassName: " << ClassName() << '\n';
249 aStrm << "String: " << mString << '\n';
250 aStrm << "IsModified: " << (IsModified() ? "True" : "False") << '\n';
251 aStrm << "Parent ObjectId: ";
252 if (mParent) {
253 aStrm << mParent->ObjectId() << '\n';
254 }
255 else {
256 aStrm << "(none)\n";
257 }
258 #endif // defined (DW_DEBUG_VERSION)
259 }
260
261
CheckInvariants() const262 void DwMessageComponent::CheckInvariants() const
263 {
264 #if defined (DW_DEBUG_VERSION)
265 assert(mMagicNumber == kMagicNumber);
266 assert(mClassName != 0);
267 mString.CheckInvariants();
268 #endif // defined (DW_DEBUG_VERSION)
269 }
270
271
272