1
//=============================================================================
3
// Contents: Definitions for DwDispositionType
4
// Maintainer: Doug Sauder <dwsauder@fwb.gulf.net>
5
// WWW: http://www.fwb.gulf.net/~dwsauder/mimepp.html
7
// Copyright (c) 1996, 1997 Douglas W. Sauder
8
// All rights reserved.
10
// IN NO EVENT SHALL DOUGLAS W. SAUDER BE LIABLE TO ANY PARTY FOR DIRECT,
11
// INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
12
// THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF DOUGLAS W. SAUDER
13
// HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15
// DOUGLAS W. SAUDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT
16
// NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
17
// PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"
18
// BASIS, AND DOUGLAS W. SAUDER HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
19
// SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
21
//=============================================================================
23
#define DW_IMPLEMENTATION
25
#include <mimelib/config.h>
26
#include <mimelib/debug.h>
27
#include <mimelib/string.h>
28
#include <mimelib/param.h>
29
#include <mimelib/disptype.h>
30
#include <mimelib/token.h>
31
#include <mimelib/enum.h>
34
const char* const DwDispositionType::sClassName = "DwDispositionType";
37
DwDispositionType* (*DwDispositionType::sNewDispositionType)(
38
const DwString&, DwMessageComponent*) = 0;
41
DwDispositionType* DwDispositionType::NewDispositionType(
42
const DwString& aStr, DwMessageComponent* aParent)
44
if (sNewDispositionType) {
45
return sNewDispositionType(aStr, aParent);
48
return new DwDispositionType(aStr, aParent);
53
DwDispositionType::DwDispositionType()
55
mDispositionType = DwMime::kDispTypeNull;
57
mClassId = kCidDispositionType;
58
mClassName = sClassName;
62
DwDispositionType::DwDispositionType(const DwDispositionType& aDispType)
63
: DwFieldBody(aDispType),
64
mDispositionTypeStr(aDispType.mDispositionTypeStr),
65
mFilenameStr(aDispType.mFilenameStr)
68
mDispositionType = aDispType.mDispositionType;
69
if (aDispType.mFirstParameter) {
70
CopyParameterList(aDispType.mFirstParameter);
72
mClassId = kCidDispositionType;
73
mClassName = sClassName;
77
DwDispositionType::DwDispositionType(const DwString& aStr,
78
DwMessageComponent* aParent)
79
: DwFieldBody(aStr, aParent)
81
mDispositionType = DwMime::kDispTypeNull;
83
mClassId = kCidDispositionType;
84
mClassName = sClassName;
88
DwDispositionType::~DwDispositionType()
90
if (mFirstParameter) {
91
DeleteParameterList();
96
const DwDispositionType& DwDispositionType::operator = (
97
const DwDispositionType& aDispType)
99
if (this == &aDispType) return *this;
100
mDispositionType = aDispType.mDispositionType;
101
mDispositionTypeStr = aDispType.mDispositionTypeStr;
102
mFilenameStr = aDispType.mFilenameStr;
104
if (mFirstParameter) {
105
DeleteParameterList();
107
if (aDispType.mFirstParameter) {
108
CopyParameterList(aDispType.mFirstParameter);
112
mParent->SetModified();
119
int DwDispositionType::DispositionType() const
121
return mDispositionType;
125
void DwDispositionType::SetDispositionType(int aType)
127
mDispositionType = aType;
133
const DwString& DwDispositionType::DispositionTypeStr() const
135
return mDispositionTypeStr;
139
void DwDispositionType::SetDispositionTypeStr(const DwString& aStr)
141
mDispositionTypeStr = aStr;
147
const DwString& DwDispositionType::Filename() const
149
DwParameter* param = mFirstParameter;
151
if (DwStrcasecmp(param->Attribute(), "filename") == 0) {
152
// Filename parameter found. Return its value.
153
// Implementation note: this member function is const, which
154
// forbids us from assigning to mFilenameStr. The following
155
// trick gets around this. (ANSI implementations could use the
156
// "mutable" declaration).
157
DwDispositionType* _this = (DwDispositionType*) this;
158
_this->mFilenameStr = param->Value();
161
param = param->Next();
167
void DwDispositionType::SetFilename(const DwString& aStr)
170
// Search for filename parameter in parameter list. If found, set its
172
DwParameter* param = mFirstParameter;
174
if (DwStrcasecmp(param->Attribute(), "filename") == 0) {
175
param->SetValue(mFilenameStr);
178
param = param->Next();
180
// Boundary parameter not found. Add it.
181
param = DwParameter::NewParameter("", 0);
182
param->SetAttribute("Filename");
183
param->SetValue(aStr);
188
DwParameter* DwDispositionType::FirstParameter() const
190
return mFirstParameter;
194
void DwDispositionType::AddParameter(DwParameter* aParam)
196
_AddParameter(aParam);
201
void DwDispositionType::_AddParameter(DwParameter* aParam)
203
if (!mFirstParameter) {
204
mFirstParameter = aParam;
207
DwParameter* cur = mFirstParameter;
209
DwParameter* next = cur->Next();
214
cur->SetNext(aParam);
217
aParam->SetParent(this);
221
void DwDispositionType::Parse()
224
mDispositionType = DwMime::kDispTypeNull;
225
mDispositionTypeStr = "";
226
if (mFirstParameter) {
227
DeleteParameterList();
229
if (mString.length() == 0) return;
230
DwRfc1521Tokenizer tokenizer(mString);
232
while (!found && tokenizer.Type() != eTkNull) {
233
if (tokenizer.Type() == eTkToken) {
234
mDispositionTypeStr = tokenizer.Token();
240
DwTokenString tokenStr(mString);
244
while (!found && tokenizer.Type() != eTkNull) {
245
if (tokenizer.Type() == eTkTspecial
246
&& tokenizer.Token()[0] == ';') {
251
if (tokenizer.Type() == eTkNull) {
252
// No more parameters
255
tokenStr.SetFirst(tokenizer);
259
while (!attribFound && tokenizer.Type() != eTkNull) {
260
if (tokenizer.Type() == eTkToken) {
261
attrib = tokenizer.Token();
268
while (!found && tokenizer.Type() != eTkNull) {
269
if (tokenizer.Type() == eTkTspecial
270
&& tokenizer.Token()[0] == '=') {
277
while (!valueFound && tokenizer.Type() != eTkNull) {
278
if (tokenizer.Type() == eTkToken
279
|| tokenizer.Type() == eTkQuotedString) {
284
if (attribFound && valueFound) {
285
tokenStr.ExtendTo(tokenizer);
287
DwParameter::NewParameter(tokenStr.Tokens(), this);
289
_AddParameter(param);
296
void DwDispositionType::Assemble()
298
if (!mIsModified) return;
300
if (mDispositionTypeStr.length() == 0)
302
mString += mDispositionTypeStr;
303
DwParameter* param = FirstParameter();
307
mString += ";" DW_EOL " ";
312
mString += param->AsString();
313
param = param->Next();
319
DwMessageComponent* DwDispositionType::Clone() const
321
return new DwDispositionType(*this);
325
void DwDispositionType::EnumToStr()
327
switch (mDispositionType) {
328
case DwMime::kDispTypeInline:
329
mDispositionTypeStr = "inline";
331
case DwMime::kDispTypeAttachment:
332
mDispositionTypeStr = "attachment";
338
void DwDispositionType::StrToEnum()
340
switch (mDispositionTypeStr[0]) {
342
if (DwStrcasecmp(mDispositionTypeStr, "inline") == 0) {
343
mDispositionType = DwMime::kDispTypeInline;
346
mDispositionType = DwMime::kDispTypeUnknown;
350
if (DwStrcasecmp(mDispositionTypeStr, "attachment") == 0) {
351
mDispositionType = DwMime::kDispTypeAttachment;
354
mDispositionType = DwMime::kDispTypeUnknown;
361
void DwDispositionType::DeleteParameterList()
363
DwParameter* param = mFirstParameter;
365
DwParameter* nextParam = param->Next();
374
void DwDispositionType::CopyParameterList(DwParameter* aFirst)
376
DwParameter* param = aFirst;
378
DwParameter* newParam = (DwParameter*) param->Clone();
379
AddParameter(newParam);
380
param = param->Next();
385
#if defined(DW_DEBUG_VERSION)
386
void DwDispositionType::PrintDebugInfo(std::ostream& aStrm, int aDepth) const
389
"------------ Debug info for DwDispositionType class ------------\n";
390
_PrintDebugInfo(aStrm);
391
int depth = aDepth - 1;
392
depth = (depth >= 0) ? depth : 0;
393
if (aDepth == 0 || depth > 0) {
394
DwParameter* param = mFirstParameter;
396
param->PrintDebugInfo(aStrm, depth);
397
param = param->Next();
402
void DwDispositionType::PrintDebugInfo(std::ostream&, int) const {}
403
#endif // defined(DW_DEBUG_VERSION)
406
#if defined(DW_DEBUG_VERSION)
407
void DwDispositionType::_PrintDebugInfo(std::ostream& aStrm) const
409
DwFieldBody::_PrintDebugInfo(aStrm);
410
aStrm << "Disposition Type: " << mDispositionTypeStr
411
<< " (" << mDispositionType << ")\n";
412
aStrm << "Filename: " << mFilenameStr << "\n";
413
aStrm << "Parameters: ";
414
DwParameter* param = mFirstParameter;
418
if (count) aStrm << ' ';
419
aStrm << param->ObjectId();
420
param = param->Next();
430
void DwDispositionType::_PrintDebugInfo(std::ostream& ) const {}
431
#endif // defined(DW_DEBUG_VERSION)
434
void DwDispositionType::CheckInvariants() const
436
#if defined(DW_DEBUG_VERSION)
437
mDispositionTypeStr.CheckInvariants();
438
mFilenameStr.CheckInvariants();
439
DwParameter* param = mFirstParameter;
441
param->CheckInvariants();
442
assert((DwMessageComponent*) this == param->Parent());
443
param = param->Next();
445
#endif // defined(DW_DEBUG_VERSION)