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