|
1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // |
|
15 |
|
16 #include <upnp/tupnptable.h> |
|
17 #include <inetprottextutils.h> |
|
18 #include <upnp/upnpconstants.h> |
|
19 |
|
20 #include "cupnpheaderwriter.h" |
|
21 #include "CHeaderField.h" |
|
22 |
|
23 |
|
24 const TInt KMaxNumDigits = 10; |
|
25 _LIT8(KTimeoutSecond, "Second-"); |
|
26 _LIT8(KSemiSpaceSep,"; "); |
|
27 _LIT8(KQuotes, "\""); |
|
28 _LIT8(KOpenAngleBracket, "<"); |
|
29 _LIT8(KCloseAngleBracket, ">"); |
|
30 |
|
31 |
|
32 CUPnPHeaderWriter* CUPnPHeaderWriter::NewL(RStringPool aStringPool) |
|
33 { |
|
34 return new (ELeave) CUPnPHeaderWriter(aStringPool); |
|
35 } |
|
36 |
|
37 CUPnPHeaderWriter::~CUPnPHeaderWriter() |
|
38 { |
|
39 // do nothing. |
|
40 } |
|
41 |
|
42 void CUPnPHeaderWriter::EncodeHeaderL(RHeaderField& aHeader) |
|
43 { |
|
44 RStringF fieldStr = iStringPool.StringF(aHeader.Name()); |
|
45 switch( fieldStr.Index(TUPnPTable::Table()) ) |
|
46 { |
|
47 case UPnP::EST: |
|
48 EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeST); |
|
49 break; |
|
50 case UPnP::EUSN: |
|
51 EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeUSN); |
|
52 break; |
|
53 case UPnP::ETimeout: |
|
54 EncodeTimeoutHeaderL(aHeader, KErrUPnPEncodeTimeout); |
|
55 break; |
|
56 case UPnP::EExt: |
|
57 EncodeExtL(aHeader); |
|
58 break; |
|
59 case UPnP::ESID: |
|
60 EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeSID); |
|
61 break; |
|
62 case UPnP::ENTS: |
|
63 EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeNTS); |
|
64 break; |
|
65 case UPnP::ENT: |
|
66 EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeNT); |
|
67 break; |
|
68 case UPnP::EMX: |
|
69 EncodeGenericNumberHeaderL(aHeader, KErrUPnPEncodeMX); |
|
70 break; |
|
71 case UPnP::ESEQ: |
|
72 EncodeGenericNumberHeaderL(aHeader, KErrUPnPEncodeSEQ); |
|
73 break; |
|
74 case UPnP::EMAN: |
|
75 EncodeMANL(aHeader, KErrUPnPEncodeMAN); |
|
76 break; |
|
77 case UPnP::ESoapAction: |
|
78 EncodeSoapActionL(aHeader); |
|
79 break; |
|
80 case UPnP::ECallback: |
|
81 EncodeCallbackL(aHeader); |
|
82 break; |
|
83 default: |
|
84 User::Leave(KErrNotSupported); |
|
85 } |
|
86 } |
|
87 |
|
88 CUPnPHeaderWriter::CUPnPHeaderWriter(RStringPool aStringPool) |
|
89 :iStringPool(aStringPool) |
|
90 { |
|
91 // do nothing. |
|
92 } |
|
93 |
|
94 void CUPnPHeaderWriter::EncodeGenericUpnpHeaderL(RHeaderField& aHeader, TInt aErrorCode) const |
|
95 { |
|
96 THeaderFieldPartIter iter = aHeader.PartsL(); |
|
97 iter.First(); |
|
98 if (iter.AtEnd()) |
|
99 User::Leave(aErrorCode); |
|
100 |
|
101 aHeader.BeginRawDataL(); |
|
102 |
|
103 const CHeaderFieldPart* part = iter(); |
|
104 if (part == NULL) |
|
105 User::Leave(aErrorCode); |
|
106 |
|
107 THTTPHdrVal ptVal = part->Value(); |
|
108 if (ptVal.Type() != THTTPHdrVal::KStrFVal) |
|
109 User::Leave(aErrorCode); |
|
110 aHeader.WriteRawDataL(ptVal.StrF().DesC()); |
|
111 |
|
112 aHeader.CommitRawData(); |
|
113 } |
|
114 |
|
115 void CUPnPHeaderWriter::EncodeGenericNumberHeaderL(RHeaderField& aHeader, TInt aErrorCodeToUseOnFailure) const |
|
116 { |
|
117 // header = <header> ":" 1*DIGIT |
|
118 THeaderFieldPartIter iter1 = aHeader.PartsL(); |
|
119 iter1.First(); |
|
120 if (!iter1.AtEnd()) |
|
121 { |
|
122 const CHeaderFieldPart* part = iter1(); |
|
123 if (part) |
|
124 { |
|
125 THTTPHdrVal pt1val = part->Value(); |
|
126 if (pt1val.Type() == THTTPHdrVal::KTIntVal) |
|
127 { |
|
128 TBuf8<KMaxNumDigits> lenBuf; |
|
129 lenBuf.Num(pt1val.Int()); |
|
130 aHeader.BeginRawDataL(); |
|
131 aHeader.WriteRawDataL(lenBuf); |
|
132 aHeader.CommitRawData(); |
|
133 return; |
|
134 } |
|
135 } |
|
136 } |
|
137 User::Leave(aErrorCodeToUseOnFailure); |
|
138 } |
|
139 |
|
140 void CUPnPHeaderWriter::EncodeTimeoutHeaderL(RHeaderField& aHeader, TInt aErrorCode) const |
|
141 { |
|
142 THeaderFieldPartIter iter = aHeader.PartsL(); |
|
143 iter.First(); |
|
144 if (iter.AtEnd()) |
|
145 User::Leave(aErrorCode); |
|
146 |
|
147 aHeader.BeginRawDataL(); |
|
148 |
|
149 const CHeaderFieldPart* part = iter(); |
|
150 if (part == NULL) |
|
151 User::Leave(aErrorCode); |
|
152 |
|
153 THTTPHdrVal ptVal = part->Value(); |
|
154 if (ptVal.Type() != THTTPHdrVal::KTIntVal) |
|
155 User::Leave(aErrorCode); |
|
156 |
|
157 if(ptVal.Int() == -KMaxTInt) |
|
158 { |
|
159 RStringF infiniteStrF = iStringPool.StringF(UPnP::EInfinite, TUPnPTable::Table()); |
|
160 aHeader.WriteRawDataL(infiniteStrF.DesC()); |
|
161 } |
|
162 else |
|
163 { |
|
164 HBufC8* ptValDesC; |
|
165 InetProtTextUtils::ConvertIntToDescriptorL(ptVal.Int(), ptValDesC); |
|
166 CleanupStack::PushL(ptValDesC); |
|
167 RBuf8 buf; |
|
168 buf.CreateL(KTimeoutSecond()); |
|
169 CleanupClosePushL(buf); |
|
170 buf.ReAllocL(buf.Length() + ptValDesC->Length()); |
|
171 buf.Append(ptValDesC->Des()); |
|
172 aHeader.WriteRawDataL(buf); |
|
173 CleanupStack::PopAndDestroy(&buf); |
|
174 CleanupStack::PopAndDestroy(ptValDesC); |
|
175 } |
|
176 |
|
177 aHeader.CommitRawData(); |
|
178 } |
|
179 |
|
180 void CUPnPHeaderWriter::EncodeMANL(RHeaderField& aHeader, TInt aErrorCode) const |
|
181 { |
|
182 THeaderFieldPartIter iter = aHeader.PartsL(); |
|
183 iter.First(); |
|
184 if (iter.AtEnd()) |
|
185 User::Leave(aErrorCode); |
|
186 |
|
187 aHeader.BeginRawDataL(); |
|
188 const CHeaderFieldPart* part = WriteRawStrFMANPartL(aHeader, iter, aErrorCode); |
|
189 |
|
190 // Check for parameters |
|
191 THeaderFieldParamIter iter2 = part->Parameters(); |
|
192 iter2.First(); |
|
193 |
|
194 if(!iter2.AtEnd()) |
|
195 { |
|
196 aHeader.WriteRawDataL(KSemiSpaceSep); |
|
197 const CHeaderFieldParam* param = iter2(); |
|
198 if (!param) |
|
199 User::Leave(aErrorCode); |
|
200 |
|
201 RStringF nsStr = iStringPool.StringF(UPnP::ENS,TUPnPTable::Table()); |
|
202 THTTPHdrVal paramVal = param->Value(); |
|
203 if (param->Name() == nsStr) |
|
204 { |
|
205 // Get the ns value |
|
206 if (paramVal.Type() != THTTPHdrVal::KTIntVal) |
|
207 User::Leave(aErrorCode); |
|
208 HBufC8* nsValBuf; |
|
209 InetProtTextUtils::ConvertIntToDescriptorL(paramVal.Int(), nsValBuf); |
|
210 CleanupStack::PushL(nsValBuf); |
|
211 aHeader.WriteRawDataL(nsStr.DesC()); |
|
212 aHeader.WriteRawDataL('='); |
|
213 aHeader.WriteRawDataL(*nsValBuf); |
|
214 CleanupStack::PopAndDestroy(nsValBuf); |
|
215 } |
|
216 else |
|
217 { |
|
218 // Extension parameter - handle strings only |
|
219 if (paramVal.Type() != THTTPHdrVal::KStrFVal) |
|
220 User::Leave(aErrorCode); |
|
221 RStringF paramName = iStringPool.StringF(param->Name()); |
|
222 aHeader.WriteRawDataL(paramName.DesC()); |
|
223 aHeader.WriteRawDataL('='); |
|
224 aHeader.WriteRawDataL(paramVal.StrF().DesC()); |
|
225 } |
|
226 } |
|
227 |
|
228 // Done |
|
229 aHeader.CommitRawData(); |
|
230 } |
|
231 |
|
232 const CHeaderFieldPart* CUPnPHeaderWriter::WriteRawStrFMANPartL(RHeaderField& aHeader, THeaderFieldPartIter& aIter, TInt aErrorCode) const |
|
233 { |
|
234 const CHeaderFieldPart* part = aIter(); |
|
235 if (part == NULL) |
|
236 User::Leave(aErrorCode); |
|
237 THTTPHdrVal ptVal = part->Value(); |
|
238 if (ptVal.Type() != THTTPHdrVal::KStrFVal) |
|
239 User::Leave(aErrorCode); |
|
240 |
|
241 aHeader.WriteRawDataL(KQuotes()); |
|
242 aHeader.WriteRawDataL(ptVal.StrF().DesC()); |
|
243 aHeader.WriteRawDataL(KQuotes()); |
|
244 |
|
245 return part; |
|
246 } |
|
247 |
|
248 void CUPnPHeaderWriter::EncodeSoapActionL(RHeaderField& aHeader) const |
|
249 { |
|
250 THeaderFieldPartIter iter = aHeader.PartsL(); |
|
251 iter.First(); |
|
252 if (iter.AtEnd()) |
|
253 User::Leave(KErrUPnPEncodeSoapAction); |
|
254 |
|
255 aHeader.BeginRawDataL(); |
|
256 |
|
257 const CHeaderFieldPart* part = iter(); |
|
258 if (part == NULL) |
|
259 User::Leave(KErrUPnPEncodeSoapAction); |
|
260 THTTPHdrVal ptVal = part->Value(); |
|
261 if (ptVal.Type() != THTTPHdrVal::KStrFVal) |
|
262 User::Leave(KErrUPnPEncodeSoapAction); |
|
263 |
|
264 aHeader.WriteRawDataL(KQuotes()); |
|
265 aHeader.WriteRawDataL(ptVal.StrF().DesC()); |
|
266 aHeader.WriteRawDataL(KQuotes()); |
|
267 aHeader.CommitRawData(); |
|
268 } |
|
269 |
|
270 void CUPnPHeaderWriter::EncodeCallbackL(RHeaderField& aHeader) const |
|
271 { |
|
272 THeaderFieldPartIter iter = aHeader.PartsL(); |
|
273 iter.First(); |
|
274 if (iter.AtEnd()) |
|
275 User::Leave(KErrUPnPEncodeCallback); |
|
276 |
|
277 aHeader.BeginRawDataL(); |
|
278 |
|
279 while (!iter.AtEnd()) |
|
280 { |
|
281 const CHeaderFieldPart* part = iter(); |
|
282 if (part == NULL) |
|
283 User::Leave(KErrUPnPEncodeCallback); |
|
284 THTTPHdrVal ptVal = part->Value(); |
|
285 if (ptVal.Type() != THTTPHdrVal::KStrFVal) |
|
286 User::Leave(KErrUPnPEncodeCallback); |
|
287 |
|
288 aHeader.WriteRawDataL(KOpenAngleBracket()); |
|
289 aHeader.WriteRawDataL(ptVal.StrF().DesC()); |
|
290 aHeader.WriteRawDataL(KCloseAngleBracket()); |
|
291 ++iter; |
|
292 } |
|
293 |
|
294 aHeader.CommitRawData(); |
|
295 } |
|
296 |
|
297 void CUPnPHeaderWriter::EncodeExtL(RHeaderField& aHeader) |
|
298 { |
|
299 aHeader.BeginRawDataL(); |
|
300 aHeader.WriteRawDataL(KNullDesC8); |
|
301 aHeader.CommitRawData(); |
|
302 } |