1 /* |
|
2 * Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: Maintain contexts for WebDAV transactions |
|
15 * |
|
16 */ |
|
17 |
|
18 |
|
19 // INCLUDE FILES |
|
20 #include <httperr.h> |
|
21 #include <dnd_err.h> |
|
22 //#include "rsfwdavtransaction.h" |
|
23 #include "rsfwdavaccesscontext.h" |
|
24 #include "rsfwdavaccess.h" |
|
25 #include "rsfwdavfileinfo.h" |
|
26 #include "mdebug.h" |
|
27 #include "xml/xmlparsererrors.h" |
|
28 #include "rsfwdirentattr.h" |
|
29 #include "rsfwdirent.h" |
|
30 |
|
31 |
|
32 // CRsfwDavAccessContext |
|
33 // ============================ MEMBER FUNCTIONS ============================== |
|
34 // Destructor |
|
35 CRsfwDavAccessContext::~CRsfwDavAccessContext() |
|
36 { |
|
37 } |
|
38 |
|
39 // ---------------------------------------------------------------------------- |
|
40 // CRsfwDavAccessContext::SubmitL |
|
41 // Submit the operation. |
|
42 // ---------------------------------------------------------------------------- |
|
43 // |
|
44 void CRsfwDavAccessContext::SubmitL() |
|
45 { |
|
46 iWebDavTransactionId = iWebDavTransaction->Id(); |
|
47 iWebDavTransaction->SubmitL(); |
|
48 } |
|
49 |
|
50 // ---------------------------------------------------------------------------- |
|
51 // CRsfwDavAccessContext::Retry |
|
52 // Retry the operation. |
|
53 // ---------------------------------------------------------------------------- |
|
54 // |
|
55 void CRsfwDavAccessContext::Retry() |
|
56 { |
|
57 TRAPD(err, StartL()); |
|
58 if (err != KErrNone) |
|
59 { |
|
60 iStatus = err; |
|
61 iDone = ETrue; |
|
62 } |
|
63 } |
|
64 |
|
65 // ---------------------------------------------------------------------------- |
|
66 // CRsfwDavAccessContext::MapError |
|
67 // Map an HTTP error code to SymbianOS error code. |
|
68 // Whenever possible, these default mappings should be overriden |
|
69 // in the derived classes. |
|
70 // ---------------------------------------------------------------------------- |
|
71 // |
|
72 void CRsfwDavAccessContext::MapError(TInt& aError) |
|
73 { |
|
74 switch (aError) |
|
75 { |
|
76 case HTTPStatus::EBadRequest: |
|
77 aError = KErrBadName; |
|
78 break; |
|
79 |
|
80 case HTTPStatus::EMovedPermanently: |
|
81 case HTTPStatus::ETemporaryRedirect: |
|
82 aError = KErrNotFound; |
|
83 break; |
|
84 |
|
85 default: |
|
86 if (HTTPStatus::IsServerError(aError)) |
|
87 { |
|
88 aError = KErrNotSupported; |
|
89 } |
|
90 else if (HTTPStatus::IsClientError(aError)) |
|
91 { |
|
92 aError = KErrAccessDenied; |
|
93 } |
|
94 else if (HTTPStatus::IsRedirection(aError)) |
|
95 { |
|
96 aError = KErrNotFound; |
|
97 } |
|
98 else |
|
99 { |
|
100 if (aError > 0) |
|
101 { |
|
102 // An arbitrary choice for error codes that should not occur |
|
103 aError = KErrAccessDenied; |
|
104 } |
|
105 } |
|
106 break; |
|
107 } |
|
108 } |
|
109 |
|
110 // ---------------------------------------------------------------------------- |
|
111 // CRsfwDavAccessContext::TargetPath |
|
112 // return target path, to support cancel by path from |
|
113 // FM local dialogs |
|
114 // This can be NULL for some non-cancellable operations like OPTIONS |
|
115 // but note that for example when reading files the active operation may be |
|
116 // PROPFIND when user presses cancel. |
|
117 // ---------------------------------------------------------------------------- |
|
118 // |
|
119 const TDesC& CRsfwDavAccessContext::TargetPath() |
|
120 { |
|
121 return iRemotePathName; |
|
122 } |
|
123 |
|
124 |
|
125 // ---------------------------------------------------------------------------- |
|
126 // Derived access contexts |
|
127 // ---------------------------------------------------------------------------- |
|
128 |
|
129 // CRsfwDavAccessContextOptions |
|
130 // ============================ MEMBER FUNCTIONS ============================== |
|
131 // ---------------------------------------------------------------------------- |
|
132 // CRsfwDavAccessContextOptions::NewL |
|
133 // Two-phased constructor. |
|
134 // ---------------------------------------------------------------------------- |
|
135 // |
|
136 CRsfwDavAccessContextOptions* |
|
137 CRsfwDavAccessContextOptions::NewL(CRsfwDavAccess* aDavAccess, |
|
138 MRsfwRemoteAccessResponseHandler* aResponseHandler) |
|
139 { |
|
140 CRsfwDavAccessContextOptions* self = new (ELeave) CRsfwDavAccessContextOptions; |
|
141 CleanupStack::PushL(self); |
|
142 self->ConstructL(aDavAccess, aResponseHandler); |
|
143 CleanupStack::Pop(self); |
|
144 return self; |
|
145 } |
|
146 |
|
147 // ---------------------------------------------------------------------------- |
|
148 // CRsfwDavAccessContextOptions::ConstructL |
|
149 // Symbian 2nd phase constructor can leave. |
|
150 // ---------------------------------------------------------------------------- |
|
151 // |
|
152 void CRsfwDavAccessContextOptions::ConstructL( |
|
153 CRsfwDavAccess* aDavAccess, |
|
154 MRsfwRemoteAccessResponseHandler* aResponseHandler) |
|
155 { |
|
156 DEBUGSTRING(("======= START =======")); |
|
157 iDavAccess = aDavAccess; |
|
158 iResponseHandler = aResponseHandler; |
|
159 iTryCount = KCommRetries; |
|
160 iRemotePathName = KNullDesC; |
|
161 } |
|
162 |
|
163 // ---------------------------------------------------------------------------- |
|
164 // CRsfwDavAccessContextOptions::StartL |
|
165 // Submit the WebDAV transaction |
|
166 // ---------------------------------------------------------------------------- |
|
167 // |
|
168 void CRsfwDavAccessContextOptions::StartL() |
|
169 { |
|
170 DEBUGSTRING(("DAV: Options StartL")); |
|
171 iWebDavTransaction = iDavAccess->WebDavSession()->OptionsL(); |
|
172 SubmitL(); |
|
173 } |
|
174 |
|
175 // ---------------------------------------------------------------------------- |
|
176 // CRsfwDavAccessContextOptions::TransactionCompleteL |
|
177 // Handle a successfully completed transaction |
|
178 // ---------------------------------------------------------------------------- |
|
179 // |
|
180 void CRsfwDavAccessContextOptions::TransactionCompleteL() |
|
181 { |
|
182 DEBUGSTRING(("DAV: OptionsL done")); |
|
183 iStatus = KErrNone; |
|
184 iDone = ETrue; |
|
185 } |
|
186 |
|
187 // ---------------------------------------------------------------------------- |
|
188 // CRsfwDavAccessContextOptions::TransactionError |
|
189 // Handle a transaction fault |
|
190 // ---------------------------------------------------------------------------- |
|
191 // |
|
192 void CRsfwDavAccessContextOptions::TransactionError(TInt aError) |
|
193 { |
|
194 DEBUGSTRING(("DAV: OptionsL raw err=%d", aError)); |
|
195 if ((aError == KErrCommsLineFail) || |
|
196 (aError == KErrNotReady) || |
|
197 (aError == KErrDisconnected)) |
|
198 { |
|
199 iTryCount--; |
|
200 } |
|
201 else |
|
202 { |
|
203 // Map protocol specific error codes into symbian error codes |
|
204 switch (aError) |
|
205 { |
|
206 case HTTPStatus::EMethodNotAllowed: |
|
207 // Server doesn't support DAV |
|
208 aError = KErrNotSupported; |
|
209 break; |
|
210 |
|
211 case HTTPStatus::EBadRequest: |
|
212 aError = KErrPathNotFound; |
|
213 break; |
|
214 |
|
215 case HTTPStatus::EBadGateway: // Proxy didn't find the server |
|
216 case HTTPStatus::ENotFound: |
|
217 case KErrDndNameNotFound: // name resolver didn't find the server |
|
218 case KErrDndAddrNotFound: |
|
219 case KErrHttpCannotEstablishTunnel: // ssl error when server not found |
|
220 aError = KErrNotFound; |
|
221 break; |
|
222 |
|
223 default: |
|
224 MapError(aError); |
|
225 break; |
|
226 } |
|
227 |
|
228 DEBUGSTRING(("DAV: OptionsL err=%d", aError)); |
|
229 iStatus = aError; |
|
230 iTryCount = 0; |
|
231 } |
|
232 |
|
233 if (iTryCount) |
|
234 { |
|
235 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
236 Retry(); |
|
237 } |
|
238 else |
|
239 { |
|
240 iStatus = aError; |
|
241 iDone = ETrue; |
|
242 } |
|
243 } |
|
244 |
|
245 // CRsfwDavAccessContextPropFindDir |
|
246 // ============================ MEMBER FUNCTIONS ============================== |
|
247 // ---------------------------------------------------------------------------- |
|
248 // CRsfwDavAccessContextPropFindDir::NewL |
|
249 // Two-phased constructor. |
|
250 // ---------------------------------------------------------------------------- |
|
251 // |
|
252 CRsfwDavAccessContextPropFindDir* CRsfwDavAccessContextPropFindDir::NewL( |
|
253 CRsfwDavAccess* aDavAccess, |
|
254 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
255 const TDesC& aPathName, |
|
256 TInt aDepth, |
|
257 CRsfwDirEntAttr** aDirEntAttr, |
|
258 RPointerArray<CRsfwDirEnt>* aDirEnts) |
|
259 { |
|
260 CRsfwDavAccessContextPropFindDir* self = |
|
261 new (ELeave) CRsfwDavAccessContextPropFindDir; |
|
262 CleanupStack::PushL(self); |
|
263 self->ConstructL(aDavAccess, |
|
264 aResponseHandler, |
|
265 aPathName, |
|
266 aDepth, |
|
267 aDirEntAttr, |
|
268 aDirEnts); |
|
269 CleanupStack::Pop(self); |
|
270 return self; |
|
271 } |
|
272 |
|
273 CRsfwDavAccessContextPropFindDir::~CRsfwDavAccessContextPropFindDir() |
|
274 { |
|
275 iOwnDirEnts.ResetAndDestroy(); |
|
276 } |
|
277 |
|
278 // ---------------------------------------------------------------------------- |
|
279 // CRsfwDavAccessContextPropFindDir::ConstructL |
|
280 // Symbian 2nd phase constructor can leave. |
|
281 // ---------------------------------------------------------------------------- |
|
282 // |
|
283 void CRsfwDavAccessContextPropFindDir::ConstructL( |
|
284 CRsfwDavAccess* aDavAccess, |
|
285 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
286 const TDesC& aPathName, |
|
287 TInt aDepth, |
|
288 CRsfwDirEntAttr** aDirEntAttr, |
|
289 RPointerArray<CRsfwDirEnt>* aDirEnts) |
|
290 { |
|
291 DEBUGSTRING(("CRsfwDavAccessContextPropFindDir::ConstructL")); |
|
292 DEBUGSTRING16(("aPathName ='%S'", &aPathName)); |
|
293 iDavAccess = aDavAccess; |
|
294 iResponseHandler = aResponseHandler; |
|
295 iDepth = aDepth; |
|
296 iDirEntAttr = aDirEntAttr; |
|
297 iDirEnts = aDirEnts; |
|
298 if (aDirEnts) |
|
299 { |
|
300 iDirEnts = aDirEnts; |
|
301 } |
|
302 else |
|
303 { |
|
304 iDirEnts = &iOwnDirEnts; |
|
305 } |
|
306 iTryCount = KCommRetries; |
|
307 iRemotePathName = aPathName; |
|
308 } |
|
309 |
|
310 // ---------------------------------------------------------------------------- |
|
311 // CRsfwDavAccessContextPropfindDir::StartL |
|
312 // Submit the WebDAV transaction |
|
313 // ---------------------------------------------------------------------------- |
|
314 // |
|
315 void CRsfwDavAccessContextPropFindDir::StartL() |
|
316 { |
|
317 /* |
|
318 Preconditions: |
|
319 - we haven't seen the directory at all (there is no CRsfwDavFileInfo for it) |
|
320 - we have seen the directory and now the e-tag, |
|
321 but haven't fetched the contents |
|
322 - we have cached the contents also |
|
323 */ |
|
324 DEBUGSTRING(("DAV: PropFindDir StartL")); |
|
325 iDirEnts->ResetAndDestroy(); |
|
326 iWebDavTransaction = iDavAccess->WebDavSession()->PropFindL(iRemotePathName, |
|
327 iDepth, |
|
328 ETrue, |
|
329 *iDirEnts); |
|
330 SubmitL(); |
|
331 } |
|
332 |
|
333 // ---------------------------------------------------------------------------- |
|
334 // CRsfwDavAccessContextPropFindDir::TransactionCompleteL |
|
335 // Handle a successfully completed transaction |
|
336 // ---------------------------------------------------------------------------- |
|
337 // |
|
338 void CRsfwDavAccessContextPropFindDir::TransactionCompleteL() |
|
339 { |
|
340 TInt err = KErrNone; |
|
341 DEBUGSTRING(("DAV: PropFindDir complete")); |
|
342 |
|
343 if (iDirEntAttr) |
|
344 { |
|
345 if (iDirEnts->Count()) |
|
346 { |
|
347 *iDirEntAttr = (*iDirEnts)[0]->ExtractAttr(); |
|
348 } |
|
349 } |
|
350 |
|
351 #ifdef _DEBUG |
|
352 DEBUGSTRING(("DAV: DoPropFindDir: returning %d", err)); |
|
353 TInt i; |
|
354 for (i = 0; i < iDirEnts->Count(); i++) |
|
355 { |
|
356 CRsfwDirEnt* d = (*iDirEnts)[i]; |
|
357 TPtrC name(*d->Name()); |
|
358 DEBUGSTRING16(("'%S' - (size=%d, attr=0x%x)", |
|
359 &name, |
|
360 d->Attr()->Size(), |
|
361 d->Attr()->Att())); |
|
362 } |
|
363 #endif // DEBUG |
|
364 |
|
365 iStatus = err; |
|
366 iDone = ETrue; |
|
367 } |
|
368 |
|
369 // ---------------------------------------------------------------------------- |
|
370 // CRsfwDavAccessContextPropFindDir::TransactionError |
|
371 // Handle a transaction fault |
|
372 // ---------------------------------------------------------------------------- |
|
373 // |
|
374 void CRsfwDavAccessContextPropFindDir::TransactionError(TInt aError) |
|
375 { |
|
376 DEBUGSTRING(("DAV: PropFindDir raw err=%d", aError)); |
|
377 if ((aError == KErrCommsLineFail) || |
|
378 (aError == KErrNotReady) || |
|
379 (aError == KErrDisconnected)) |
|
380 { |
|
381 iTryCount--; |
|
382 } |
|
383 else |
|
384 { |
|
385 // Map XML parser errors to KErrCorrupt |
|
386 if ((aError <= EXmlFeatureLockedWhileParsing) && |
|
387 (aError >= EXmlParserError)) |
|
388 { |
|
389 aError = EXmlParserError; |
|
390 } |
|
391 |
|
392 // Map protocol specific error codes into symbian error codes |
|
393 switch (aError) |
|
394 { |
|
395 case EXmlParserError: |
|
396 aError = KErrCorrupt; |
|
397 break; |
|
398 case HTTPStatus::ENotFound: |
|
399 aError = KErrNotFound; |
|
400 break; |
|
401 |
|
402 case HTTPStatus::EForbidden: |
|
403 case HTTPStatus::EUnauthorized: |
|
404 aError = KErrAccessDenied; |
|
405 break; |
|
406 case HTTPStatus::EMovedPermanently: |
|
407 case HTTPStatus::ETemporaryRedirect: |
|
408 // The object we are looking for exists, but has a different |
|
409 // type (e.g. we were looking for a file but it is a directory). |
|
410 // PROPFIND should return not found... |
|
411 aError = KErrNotFound; |
|
412 break; |
|
413 default: |
|
414 MapError(aError); |
|
415 break; |
|
416 } |
|
417 |
|
418 DEBUGSTRING(("DAV: PropFindDir err=%d", aError)); |
|
419 iStatus = aError; |
|
420 iTryCount = 0; |
|
421 } |
|
422 |
|
423 if (iTryCount) |
|
424 { |
|
425 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
426 Retry(); |
|
427 } |
|
428 else |
|
429 { |
|
430 iStatus = aError; |
|
431 iDone = ETrue; |
|
432 } |
|
433 } |
|
434 |
|
435 // CRsfwDavAccessContextPropFindFile |
|
436 // ============================ MEMBER FUNCTIONS ============================== |
|
437 // ---------------------------------------------------------------------------- |
|
438 // CRsfwDavAccessContextPropFindFile::NewL |
|
439 // Two-phased constructor. |
|
440 // ---------------------------------------------------------------------------- |
|
441 // |
|
442 CRsfwDavAccessContextPropFindFile* CRsfwDavAccessContextPropFindFile::NewL( |
|
443 CRsfwDavAccess* aDavAccess, |
|
444 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
445 const TDesC& aPathName, |
|
446 CRsfwDirEntAttr** aDirEntAttr) |
|
447 { |
|
448 CRsfwDavAccessContextPropFindFile* self = |
|
449 new (ELeave) CRsfwDavAccessContextPropFindFile; |
|
450 CleanupStack::PushL(self); |
|
451 self->ConstructL(aDavAccess, aResponseHandler, aPathName, aDirEntAttr); |
|
452 CleanupStack::Pop(self); |
|
453 return self; |
|
454 } |
|
455 |
|
456 CRsfwDavAccessContextPropFindFile::~CRsfwDavAccessContextPropFindFile() |
|
457 { |
|
458 iOwnDirEnts.ResetAndDestroy(); |
|
459 } |
|
460 |
|
461 // ---------------------------------------------------------------------------- |
|
462 // CRsfwDavAccessContextPropfindFile::ConstructL |
|
463 // Symbian 2nd phase constructor can leave. |
|
464 // ---------------------------------------------------------------------------- |
|
465 // |
|
466 void CRsfwDavAccessContextPropFindFile::ConstructL( |
|
467 CRsfwDavAccess* aDavAccess, |
|
468 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
469 const TDesC& aPathName, |
|
470 CRsfwDirEntAttr** aDirEntAttr) |
|
471 { |
|
472 DEBUGSTRING(("CRsfwDavAccessContextPropFindFile::ConstructL")); |
|
473 DEBUGSTRING16(("aPathName ='%S'", &aPathName)); |
|
474 iDavAccess = aDavAccess; |
|
475 iResponseHandler = aResponseHandler; |
|
476 iDirEntAttr = aDirEntAttr; |
|
477 iTryCount = KCommRetries; |
|
478 iRemotePathName = aPathName; |
|
479 } |
|
480 |
|
481 // ---------------------------------------------------------------------------- |
|
482 // CRsfwDavAccessContextPropFindFile::StartL |
|
483 // Submit the WebDAV transaction |
|
484 // ---------------------------------------------------------------------------- |
|
485 // |
|
486 void CRsfwDavAccessContextPropFindFile::StartL() |
|
487 { |
|
488 DEBUGSTRING(("DAV: PropFindFile StartL")); |
|
489 iOwnDirEnts.ResetAndDestroy(); |
|
490 iWebDavTransaction = iDavAccess->WebDavSession()->PropFindL(iRemotePathName, |
|
491 0, |
|
492 EFalse, |
|
493 iOwnDirEnts); |
|
494 SubmitL(); |
|
495 } |
|
496 |
|
497 // ---------------------------------------------------------------------------- |
|
498 // CRsfwDavAccessContextPropFindFile::TransactionCompleteL |
|
499 // Handle a successfully completed transaction |
|
500 // ---------------------------------------------------------------------------- |
|
501 // |
|
502 void CRsfwDavAccessContextPropFindFile::TransactionCompleteL() |
|
503 { |
|
504 DEBUGSTRING(("DAV: PropFindFile complete")); |
|
505 |
|
506 if (iOwnDirEnts.Count() > 0) |
|
507 { |
|
508 *iDirEntAttr = iOwnDirEnts[0]->ExtractAttr(); |
|
509 } |
|
510 |
|
511 iStatus = KErrNone; |
|
512 iDone = ETrue; |
|
513 } |
|
514 |
|
515 // ---------------------------------------------------------------------------- |
|
516 // CRsfwDavAccessContextPropFindFile::TransactionError |
|
517 // Handle a transaction fault |
|
518 // ---------------------------------------------------------------------------- |
|
519 // |
|
520 void CRsfwDavAccessContextPropFindFile::TransactionError(TInt aError) |
|
521 { |
|
522 DEBUGSTRING(("DAV: PropFindFile raw err=%d", aError)); |
|
523 if ((aError == KErrCommsLineFail) || |
|
524 (aError == KErrNotReady) || |
|
525 (aError == KErrDisconnected)) |
|
526 { |
|
527 iTryCount--; |
|
528 } |
|
529 else |
|
530 { |
|
531 // Map XML parser errors to KErrCorrupt |
|
532 if ((aError <= EXmlFeatureLockedWhileParsing) && |
|
533 (aError >= EXmlParserError)) |
|
534 { |
|
535 aError = EXmlParserError; |
|
536 } |
|
537 // Map protocol specific error codes into symbian error codes |
|
538 switch (aError) |
|
539 { |
|
540 case EXmlParserError: |
|
541 aError = KErrCorrupt; |
|
542 break; |
|
543 |
|
544 case HTTPStatus::ENotFound: |
|
545 aError = KErrNotFound; |
|
546 break; |
|
547 |
|
548 case HTTPStatus::EForbidden: |
|
549 case HTTPStatus::EUnauthorized: |
|
550 aError = KErrAccessDenied; |
|
551 break; |
|
552 case HTTPStatus::EMovedPermanently: |
|
553 case HTTPStatus::ETemporaryRedirect: |
|
554 // The object we are looking for exists, but has a different |
|
555 // type (e.g. we were looking for a file but it is a directory). |
|
556 // PROPFIND should return not found... |
|
557 aError = KErrNotFound; |
|
558 break; |
|
559 default: |
|
560 MapError(aError); |
|
561 break; |
|
562 } |
|
563 |
|
564 DEBUGSTRING(("DAV: PropFindFile err=%d", aError)); |
|
565 iStatus = aError; |
|
566 iTryCount = 0; |
|
567 } |
|
568 |
|
569 if (iTryCount) |
|
570 { |
|
571 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
572 Retry(); |
|
573 } |
|
574 else |
|
575 { |
|
576 iStatus = aError; |
|
577 iDone = ETrue; |
|
578 } |
|
579 } |
|
580 |
|
581 // CRsfwDavAccessContextGet |
|
582 // ============================ MEMBER FUNCTIONS ============================== |
|
583 // ---------------------------------------------------------------------------- |
|
584 // CRsfwDavAccessContextGet::NewL |
|
585 // Two-phased constructor. |
|
586 // ---------------------------------------------------------------------------- |
|
587 // |
|
588 CRsfwDavAccessContextGet* |
|
589 CRsfwDavAccessContextGet::NewL(CRsfwDavAccess* aDavAccess, |
|
590 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
591 const TDesC& aRemotePathName, |
|
592 const TDesC& aLocalPathName, |
|
593 TInt aOffset, |
|
594 TInt* aLength, |
|
595 TUint aFlags) |
|
596 { |
|
597 CRsfwDavAccessContextGet* self = new (ELeave) CRsfwDavAccessContextGet; |
|
598 CleanupStack::PushL(self); |
|
599 self->ConstructL(aDavAccess, |
|
600 aResponseHandler, |
|
601 aRemotePathName, |
|
602 aLocalPathName, |
|
603 aOffset, |
|
604 aLength, |
|
605 aFlags); |
|
606 CleanupStack::Pop(self); |
|
607 return self; |
|
608 } |
|
609 |
|
610 // ---------------------------------------------------------------------------- |
|
611 // CRsfwDavAccessContextGet::ConstructL |
|
612 // Symbian 2nd phase constructor can leave. |
|
613 // ---------------------------------------------------------------------------- |
|
614 // |
|
615 void CRsfwDavAccessContextGet::ConstructL( |
|
616 CRsfwDavAccess* aDavAccess, |
|
617 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
618 const TDesC& aRemotePathName, |
|
619 const TDesC& aLocalPathName, |
|
620 TInt aOffset, |
|
621 TInt* aLength, |
|
622 TUint aFlags) |
|
623 { |
|
624 iDavAccess = aDavAccess; |
|
625 iResponseHandler = aResponseHandler; |
|
626 iRemotePathName = aRemotePathName; |
|
627 iLocalPathName = aLocalPathName; |
|
628 iOffset = aOffset; |
|
629 iLength = aLength; |
|
630 iFlags = aFlags; |
|
631 iTryCount = KCommRetries; |
|
632 } |
|
633 |
|
634 // ---------------------------------------------------------------------------- |
|
635 // CRsfwDavAccessContextGet::StartL |
|
636 // Submit the WebDAV transaction |
|
637 // ---------------------------------------------------------------------------- |
|
638 // |
|
639 void CRsfwDavAccessContextGet::StartL() |
|
640 { |
|
641 DEBUGSTRING(("DAV: Get StartL")); |
|
642 iWebDavTransaction = iDavAccess->WebDavSession()->GetL(iRemotePathName, |
|
643 iLocalPathName, |
|
644 iOffset, |
|
645 iLength, |
|
646 iFlags); |
|
647 SubmitL(); |
|
648 } |
|
649 |
|
650 // ---------------------------------------------------------------------------- |
|
651 // CRsfwDavAccessContextGet::TransactionCompleteL |
|
652 // Handle a successfully completed transaction |
|
653 // ---------------------------------------------------------------------------- |
|
654 // |
|
655 void CRsfwDavAccessContextGet::TransactionCompleteL() |
|
656 { |
|
657 DEBUGSTRING(("DAV: Get done")); |
|
658 |
|
659 iStatus = KErrNone; |
|
660 iDone = ETrue; |
|
661 } |
|
662 |
|
663 // ---------------------------------------------------------------------------- |
|
664 // CRsfwDavAccessContextGet::TransactionError |
|
665 // Handle a transaction fault |
|
666 // ---------------------------------------------------------------------------- |
|
667 // |
|
668 void CRsfwDavAccessContextGet::TransactionError(TInt aError) |
|
669 { |
|
670 DEBUGSTRING(("DAV: Get raw err=%d", aError)); |
|
671 if ((aError == KErrCommsLineFail) || |
|
672 (aError == KErrNotReady) || |
|
673 (aError == KErrDisconnected)) |
|
674 { |
|
675 iTryCount--; |
|
676 } |
|
677 else |
|
678 { |
|
679 // Map protocol specific error codes into symbian error codes |
|
680 switch (aError) |
|
681 { |
|
682 case HTTPStatus::ENotFound: |
|
683 aError = KErrNotFound; |
|
684 break; |
|
685 |
|
686 case HTTPStatus::ENotModified: |
|
687 aError = KErrNone; |
|
688 break; |
|
689 |
|
690 case HTTPStatus::EForbidden: |
|
691 aError = KErrAccessDenied; |
|
692 break; |
|
693 |
|
694 default: |
|
695 MapError(aError); |
|
696 break; |
|
697 } |
|
698 |
|
699 DEBUGSTRING(("DAV: Get err=%d", aError)); |
|
700 iStatus = aError; |
|
701 iTryCount = 0; |
|
702 } |
|
703 |
|
704 if (iTryCount) |
|
705 { |
|
706 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
707 Retry(); |
|
708 } |
|
709 else |
|
710 { |
|
711 iStatus = aError; |
|
712 iDone = ETrue; |
|
713 } |
|
714 } |
|
715 |
|
716 |
|
717 |
|
718 // CRsfwDavAccessContextPut |
|
719 // ============================ MEMBER FUNCTIONS ============================== |
|
720 // ---------------------------------------------------------------------------- |
|
721 // CRsfwDavAccessContextPut::NewL |
|
722 // Two-phased constructor. |
|
723 // ---------------------------------------------------------------------------- |
|
724 // |
|
725 CRsfwDavAccessContextPut* |
|
726 CRsfwDavAccessContextPut::NewL(CRsfwDavAccess* aDavAccess, |
|
727 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
728 const TDesC& aLocalPathName, |
|
729 const TDesC& aRemotePathName, |
|
730 const TDesC8& aMimeType, |
|
731 TInt aOffset, |
|
732 TInt aLength, |
|
733 TInt aTotalLength, |
|
734 const TDesC8* aLockToken) |
|
735 { |
|
736 CRsfwDavAccessContextPut* self = new (ELeave) CRsfwDavAccessContextPut; |
|
737 CleanupStack::PushL(self); |
|
738 self->ConstructL(aDavAccess, |
|
739 aResponseHandler, |
|
740 aLocalPathName, |
|
741 aRemotePathName, |
|
742 aMimeType, |
|
743 aOffset, |
|
744 aLength, |
|
745 aTotalLength, |
|
746 aLockToken); |
|
747 CleanupStack::Pop(self); |
|
748 return self; |
|
749 } |
|
750 |
|
751 // ---------------------------------------------------------------------------- |
|
752 // CRsfwDavAccessContextPut::ConstructL |
|
753 // Symbian 2nd phase constructor can leave. |
|
754 // ---------------------------------------------------------------------------- |
|
755 // |
|
756 void CRsfwDavAccessContextPut::ConstructL( |
|
757 CRsfwDavAccess* aDavAccess, |
|
758 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
759 const TDesC& aLocalPathName, |
|
760 const TDesC& aRemotePathName, |
|
761 const TDesC8& aMimeType, |
|
762 TInt aOffset, |
|
763 TInt aLength, |
|
764 TInt aTotalLength, |
|
765 const TDesC8* aLockToken) |
|
766 { |
|
767 iDavAccess = aDavAccess; |
|
768 iResponseHandler = aResponseHandler; |
|
769 iLocalPathName = aLocalPathName; |
|
770 iRemotePathName = aRemotePathName; |
|
771 iMimeType = aMimeType; |
|
772 iOffset = aOffset; |
|
773 iLength = aLength; |
|
774 iTotalLength = aTotalLength; |
|
775 iLockToken = aLockToken; |
|
776 iTryCount = KCommRetries; |
|
777 iContentRangeSupported = ETrue; |
|
778 } |
|
779 |
|
780 // ---------------------------------------------------------------------------- |
|
781 // CRsfwDavAccessContextPut::StartL |
|
782 // Submit the WebDAV transaction |
|
783 // ---------------------------------------------------------------------------- |
|
784 // |
|
785 void CRsfwDavAccessContextPut::StartL() |
|
786 { |
|
787 DEBUGSTRING(("DAV: Put StartL")); |
|
788 iWebDavTransaction = |
|
789 iDavAccess-> |
|
790 WebDavSession()-> |
|
791 PutL(iLocalPathName, |
|
792 iRemotePathName, |
|
793 iMimeType, |
|
794 iOffset, |
|
795 iLength, |
|
796 iTotalLength, |
|
797 iContentRangeSupported, |
|
798 iLockToken); |
|
799 |
|
800 SubmitL(); |
|
801 } |
|
802 |
|
803 // ---------------------------------------------------------------------------- |
|
804 // CRsfwDavAccessContextPut::TransactionCompleteL |
|
805 // Handle a successfully completed transaction |
|
806 // ---------------------------------------------------------------------------- |
|
807 // |
|
808 void CRsfwDavAccessContextPut::TransactionCompleteL() |
|
809 { |
|
810 DEBUGSTRING(("DAV: Put done")); |
|
811 iStatus = KErrNone; |
|
812 iDone = ETrue; |
|
813 } |
|
814 |
|
815 |
|
816 // ---------------------------------------------------------------------------- |
|
817 // CRsfwDavAccessContextPut::TransactionError |
|
818 // Handle a transaction fault |
|
819 // ---------------------------------------------------------------------------- |
|
820 // |
|
821 void CRsfwDavAccessContextPut::TransactionError(TInt aError) |
|
822 { |
|
823 DEBUGSTRING(("DAV: Put raw err=%d", aError)); |
|
824 if ((aError == KErrCommsLineFail) || |
|
825 (aError == KErrNotReady) || |
|
826 (aError == KErrDisconnected) || |
|
827 (aError == HTTPStatus::ENotImplemented)) |
|
828 { |
|
829 iTryCount--; |
|
830 } |
|
831 else |
|
832 { |
|
833 // Map protocol specific error codes into Symbian error codes |
|
834 switch (aError) |
|
835 { |
|
836 case HTTPStatus::EForbidden: |
|
837 aError = KErrAccessDenied; |
|
838 break; |
|
839 |
|
840 case HTTPStatus::EMethodNotAllowed: |
|
841 case HTTPStatus::EConflict: |
|
842 // EConflict can mean either resource already exists or |
|
843 // the parent does not exist. |
|
844 // However, in our code we make sure that the parent exists. |
|
845 aError = KErrAlreadyExists; |
|
846 break; |
|
847 |
|
848 case HTTPStatus::EUnsupportedMediaType: |
|
849 aError = KErrNotSupported; |
|
850 break; |
|
851 case HTTPStatus::EInternalServerError: |
|
852 case RsfwDavStatus::EInsufficientStorage: |
|
853 aError = KErrDiskFull; |
|
854 break; |
|
855 case HTTPStatus::EMovedPermanently: |
|
856 case HTTPStatus::ETemporaryRedirect: |
|
857 // It is not allowed to write a file with the same name |
|
858 // as an existing directory. |
|
859 aError = KErrAccessDenied; |
|
860 break; |
|
861 default: |
|
862 MapError(aError); |
|
863 break; |
|
864 } |
|
865 |
|
866 DEBUGSTRING(("DAV: Put err=%d", aError)); |
|
867 iStatus = aError; |
|
868 iTryCount = 0; |
|
869 } |
|
870 |
|
871 if (aError == HTTPStatus::ENotImplemented) |
|
872 { |
|
873 // we assume that the server does not support Content-Range: with PUT |
|
874 iContentRangeSupported = EFalse; |
|
875 } |
|
876 |
|
877 if (iTryCount) |
|
878 { |
|
879 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
880 Retry(); |
|
881 } |
|
882 else |
|
883 { |
|
884 iStatus = aError; |
|
885 iDone = ETrue; |
|
886 } |
|
887 } |
|
888 |
|
889 // CRsfwDavAccessContextMkDir |
|
890 // ============================ MEMBER FUNCTIONS ============================== |
|
891 // ---------------------------------------------------------------------------- |
|
892 // CRsfwDavAccessContextMkDir::NewL |
|
893 // Two-phased constructor. |
|
894 // ---------------------------------------------------------------------------- |
|
895 // |
|
896 CRsfwDavAccessContextMkDir* |
|
897 CRsfwDavAccessContextMkDir::NewL(CRsfwDavAccess* aDavAccess, |
|
898 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
899 const TDesC& aPathName) |
|
900 { |
|
901 CRsfwDavAccessContextMkDir* self = new (ELeave) CRsfwDavAccessContextMkDir; |
|
902 CleanupStack::PushL(self); |
|
903 self->ConstructL(aDavAccess, aResponseHandler, aPathName); |
|
904 CleanupStack::Pop(self); |
|
905 return self; |
|
906 } |
|
907 |
|
908 // ---------------------------------------------------------------------------- |
|
909 // CRsfwDavAccessContextMkDir::ConstructL |
|
910 // Symbian 2nd phase constructor can leave. |
|
911 // ---------------------------------------------------------------------------- |
|
912 // |
|
913 void CRsfwDavAccessContextMkDir::ConstructL( |
|
914 CRsfwDavAccess* aDavAccess, |
|
915 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
916 const TDesC& aPathName) |
|
917 { |
|
918 iDavAccess = aDavAccess; |
|
919 iResponseHandler = aResponseHandler; |
|
920 iTryCount = KCommRetries; |
|
921 iRemotePathName = aPathName; |
|
922 } |
|
923 |
|
924 // ---------------------------------------------------------------------------- |
|
925 // CRsfwDavAccessContextMkDir::StartL |
|
926 // Submit the WebDAV transaction |
|
927 // ---------------------------------------------------------------------------- |
|
928 // |
|
929 void CRsfwDavAccessContextMkDir::StartL() |
|
930 { |
|
931 DEBUGSTRING(("DAV: MkDir StartL")); |
|
932 iWebDavTransaction = iDavAccess->WebDavSession()->MkDirL(iRemotePathName); |
|
933 SubmitL(); |
|
934 } |
|
935 |
|
936 // ---------------------------------------------------------------------------- |
|
937 // CRsfwDavAccessContextMkDir::TransactionCompleteL |
|
938 // Handle a successfully completed transaction |
|
939 // ---------------------------------------------------------------------------- |
|
940 // |
|
941 void CRsfwDavAccessContextMkDir::TransactionCompleteL() |
|
942 { |
|
943 DEBUGSTRING(("DAV: MkDir done")); |
|
944 iStatus = KErrNone; |
|
945 iDone = ETrue; |
|
946 } |
|
947 |
|
948 // ---------------------------------------------------------------------------- |
|
949 // CRsfwDavAccessContextMkDir::TransactionError |
|
950 // Handle a transaction fault |
|
951 // ---------------------------------------------------------------------------- |
|
952 // |
|
953 void CRsfwDavAccessContextMkDir::TransactionError(TInt aError) |
|
954 { |
|
955 DEBUGSTRING(("DAV: MkDir raw err=%d", aError)); |
|
956 if ((aError == KErrCommsLineFail) || |
|
957 (aError == KErrNotReady) || |
|
958 (aError == KErrDisconnected)) |
|
959 { |
|
960 iTryCount--; |
|
961 } |
|
962 else |
|
963 { |
|
964 /* |
|
965 Map protocol specific error codes into Symbian error codes |
|
966 KErrAlreadyExists dirD already exists in /dirA/dirB/dirC/ |
|
967 KErrAccessDenied dirD already exists but is not a directory. |
|
968 KErrDirFull There is no room in /dirA/dirB/dirC/ for the new entry, |
|
969 which is especially applicable to the root directory. |
|
970 */ |
|
971 switch (aError) |
|
972 { |
|
973 case HTTPStatus::EForbidden: |
|
974 case HTTPStatus::EConflict: |
|
975 /* |
|
976 EConflict can mean either resource already exists |
|
977 but is not a collection or the parent does not exist. |
|
978 However, in our code we make sure that the parent exists. |
|
979 */ |
|
980 aError = KErrAccessDenied; |
|
981 break; |
|
982 |
|
983 case HTTPStatus::EMethodNotAllowed: |
|
984 case HTTPStatus::EMovedPermanently: |
|
985 aError = KErrAlreadyExists; |
|
986 break; |
|
987 |
|
988 case HTTPStatus::EUnsupportedMediaType: |
|
989 aError = KErrNotSupported; |
|
990 break; |
|
991 |
|
992 case HTTPStatus::EInternalServerError: |
|
993 case RsfwDavStatus::EInsufficientStorage: |
|
994 aError = KErrDirFull; |
|
995 break; |
|
996 |
|
997 default: |
|
998 MapError(aError); |
|
999 break; |
|
1000 } |
|
1001 |
|
1002 DEBUGSTRING(("DAV: MkDir err=%d", aError)); |
|
1003 iStatus = aError; |
|
1004 iTryCount = 0; |
|
1005 } |
|
1006 |
|
1007 if (iTryCount) |
|
1008 { |
|
1009 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
1010 Retry(); |
|
1011 } |
|
1012 else |
|
1013 { |
|
1014 iStatus = aError; |
|
1015 iDone = ETrue; |
|
1016 } |
|
1017 } |
|
1018 |
|
1019 // CRsfwDavAccessContextDelete |
|
1020 // ============================ MEMBER FUNCTIONS ============================== |
|
1021 // ---------------------------------------------------------------------------- |
|
1022 // CRsfwDavAccessContextDelete::NewL |
|
1023 // Two-phased constructor. |
|
1024 // ---------------------------------------------------------------------------- |
|
1025 // |
|
1026 CRsfwDavAccessContextDelete* |
|
1027 CRsfwDavAccessContextDelete::NewL(CRsfwDavAccess* aDavAccess, |
|
1028 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1029 const TDesC& aPathName, |
|
1030 TBool aIsDir, |
|
1031 const TDesC8* aLockToken) |
|
1032 { |
|
1033 CRsfwDavAccessContextDelete* self = new (ELeave) CRsfwDavAccessContextDelete; |
|
1034 CleanupStack::PushL(self); |
|
1035 self->ConstructL(aDavAccess, aResponseHandler, aPathName, aIsDir, aLockToken); |
|
1036 CleanupStack::Pop(self); |
|
1037 return self; |
|
1038 } |
|
1039 |
|
1040 // ---------------------------------------------------------------------------- |
|
1041 // CRsfwDavAccessContextDelete::ConstructL |
|
1042 // Symbian 2nd phase constructor can leave. |
|
1043 // ---------------------------------------------------------------------------- |
|
1044 // |
|
1045 void CRsfwDavAccessContextDelete::ConstructL( |
|
1046 CRsfwDavAccess* aDavAccess, |
|
1047 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1048 const TDesC& aPathName, |
|
1049 TBool aIsDir, |
|
1050 const TDesC8* aLockToken) |
|
1051 { |
|
1052 iDavAccess = aDavAccess; |
|
1053 iResponseHandler = aResponseHandler; |
|
1054 iIsDir = aIsDir; |
|
1055 iLockToken = aLockToken; |
|
1056 iTryCount = KCommRetries; |
|
1057 iRemotePathName = aPathName; |
|
1058 } |
|
1059 |
|
1060 // ---------------------------------------------------------------------------- |
|
1061 // CRsfwDavAccessContextDelete::StartL |
|
1062 // Submit the WebDAV transaction |
|
1063 // ---------------------------------------------------------------------------- |
|
1064 // |
|
1065 void CRsfwDavAccessContextDelete::StartL() |
|
1066 { |
|
1067 DEBUGSTRING(("DAV: Delete StartL")); |
|
1068 iWebDavTransaction = iDavAccess->WebDavSession()->DeleteL(iRemotePathName, |
|
1069 iIsDir, |
|
1070 iLockToken); |
|
1071 SubmitL(); |
|
1072 } |
|
1073 |
|
1074 // ---------------------------------------------------------------------------- |
|
1075 // CRsfwDavAccessContextDelete::TransactionCompleteL |
|
1076 // Handle a successfully completed transaction |
|
1077 // ---------------------------------------------------------------------------- |
|
1078 // |
|
1079 void CRsfwDavAccessContextDelete::TransactionCompleteL() |
|
1080 { |
|
1081 DEBUGSTRING(("DAV: Delete done")); |
|
1082 iDavAccess->RemoveDavFileInfoL(iRemotePathName); |
|
1083 iStatus = KErrNone; |
|
1084 iDone = ETrue; |
|
1085 } |
|
1086 |
|
1087 // ---------------------------------------------------------------------------- |
|
1088 // CRsfwDavAccessContextDelete::TransactionError |
|
1089 // Handle a transaction fault |
|
1090 // ---------------------------------------------------------------------------- |
|
1091 // |
|
1092 void CRsfwDavAccessContextDelete::TransactionError(TInt aError) |
|
1093 { |
|
1094 DEBUGSTRING(("DAV: Delete raw err=%d", aError)); |
|
1095 if ((aError == KErrCommsLineFail) || |
|
1096 (aError == KErrNotReady) || |
|
1097 (aError == KErrDisconnected)) |
|
1098 { |
|
1099 iTryCount--; |
|
1100 } |
|
1101 else |
|
1102 { |
|
1103 switch (aError) |
|
1104 { |
|
1105 case HTTPStatus::ENotFound: |
|
1106 aError = KErrNotFound; |
|
1107 break; |
|
1108 |
|
1109 case HTTPStatus::EForbidden: |
|
1110 case RsfwDavStatus::ELocked: |
|
1111 aError = KErrAccessDenied; |
|
1112 break; |
|
1113 case HTTPStatus::EMovedPermanently: |
|
1114 case HTTPStatus::ETemporaryRedirect: |
|
1115 // We are attempting to delete a file |
|
1116 // with the same name as an existing directory |
|
1117 aError = KErrBadName; |
|
1118 break; |
|
1119 |
|
1120 default: |
|
1121 MapError(aError); |
|
1122 break; |
|
1123 } |
|
1124 |
|
1125 DEBUGSTRING(("DAV: Delete err=%d", aError)); |
|
1126 iStatus = aError; |
|
1127 iTryCount = 0; |
|
1128 } |
|
1129 |
|
1130 if (iTryCount) |
|
1131 { |
|
1132 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
1133 Retry(); |
|
1134 } |
|
1135 else |
|
1136 { |
|
1137 iStatus = aError; |
|
1138 iDone = ETrue; |
|
1139 } |
|
1140 } |
|
1141 |
|
1142 // CRsfwDavAccessContextMove |
|
1143 // ============================ MEMBER FUNCTIONS ============================== |
|
1144 // ---------------------------------------------------------------------------- |
|
1145 // CRsfwDavAccessContextMove::NewL |
|
1146 // Two-phased constructor. |
|
1147 // ---------------------------------------------------------------------------- |
|
1148 // |
|
1149 CRsfwDavAccessContextMove* |
|
1150 CRsfwDavAccessContextMove::NewL(CRsfwDavAccess* aDavAccess, |
|
1151 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1152 const TDesC& aSrcPathName, |
|
1153 const TDesC& aDstPathName, |
|
1154 TBool aOverwrite, |
|
1155 const TDesC8* aSrcLockToken, |
|
1156 const TDesC8* aDstLockToken) |
|
1157 { |
|
1158 CRsfwDavAccessContextMove* self = new (ELeave) CRsfwDavAccessContextMove; |
|
1159 CleanupStack::PushL(self); |
|
1160 self->ConstructL(aDavAccess, |
|
1161 aResponseHandler, |
|
1162 aSrcPathName, |
|
1163 aDstPathName, |
|
1164 aOverwrite, |
|
1165 aSrcLockToken, |
|
1166 aDstLockToken); |
|
1167 CleanupStack::Pop(self); |
|
1168 return self; |
|
1169 } |
|
1170 |
|
1171 // ---------------------------------------------------------------------------- |
|
1172 // CRsfwDavAccessContextMove::ConstructL |
|
1173 // Symbian 2nd phase constructor can leave. |
|
1174 // ---------------------------------------------------------------------------- |
|
1175 // |
|
1176 void CRsfwDavAccessContextMove::ConstructL( |
|
1177 CRsfwDavAccess* aDavAccess, |
|
1178 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1179 const TDesC& aSrcPathName, |
|
1180 const TDesC& aDstPathName, |
|
1181 TBool aOverwrite, |
|
1182 const TDesC8* aSrcLockToken, |
|
1183 const TDesC8* aDstLockToken) |
|
1184 { |
|
1185 iDavAccess = aDavAccess; |
|
1186 iResponseHandler = aResponseHandler; |
|
1187 iSrcPathName = aSrcPathName; |
|
1188 iOverwrite = aOverwrite; |
|
1189 iSrcLockToken = aSrcLockToken; |
|
1190 iDstLockToken = aDstLockToken; |
|
1191 iTryCount = KCommRetries; |
|
1192 iRemotePathName = aDstPathName; |
|
1193 } |
|
1194 |
|
1195 // ---------------------------------------------------------------------------- |
|
1196 // CRsfwDavAccessContextMove::StartL |
|
1197 // Submit the WebDAV transaction |
|
1198 // ---------------------------------------------------------------------------- |
|
1199 // |
|
1200 void CRsfwDavAccessContextMove::StartL() |
|
1201 { |
|
1202 DEBUGSTRING(("DAV: Move StartL")); |
|
1203 iWebDavTransaction = iDavAccess->WebDavSession()->MoveL(iSrcPathName, |
|
1204 iRemotePathName, |
|
1205 iOverwrite, |
|
1206 iSrcLockToken, |
|
1207 iDstLockToken); |
|
1208 SubmitL(); |
|
1209 } |
|
1210 |
|
1211 // ---------------------------------------------------------------------------- |
|
1212 // CRsfwDavAccessContextMove::TransactionCompleteL |
|
1213 // Handle a successfully completed transaction |
|
1214 // ---------------------------------------------------------------------------- |
|
1215 // |
|
1216 void CRsfwDavAccessContextMove::TransactionCompleteL() |
|
1217 { |
|
1218 DEBUGSTRING(("DAV: Move done")); |
|
1219 // move will delete the old file and does not lock the new one |
|
1220 // so we just remove the token lock info |
|
1221 iDavAccess->RemoveDavFileInfoL(iSrcPathName); |
|
1222 iStatus = KErrNone; |
|
1223 iDone = ETrue; |
|
1224 } |
|
1225 |
|
1226 // ---------------------------------------------------------------------------- |
|
1227 // CRsfwDavAccessContextMove::TransactionError |
|
1228 // Handle a transaction fault |
|
1229 // ---------------------------------------------------------------------------- |
|
1230 // |
|
1231 void CRsfwDavAccessContextMove::TransactionError(TInt aError) |
|
1232 { |
|
1233 DEBUGSTRING(("DAV: Move raw err=%d", aError)); |
|
1234 if ((aError == KErrCommsLineFail) || |
|
1235 (aError == KErrNotReady) || |
|
1236 (aError == KErrDisconnected)) |
|
1237 { |
|
1238 iTryCount--; |
|
1239 } |
|
1240 else |
|
1241 { |
|
1242 // Map protocol specific error codes into Symbian error codes |
|
1243 switch (aError) |
|
1244 { |
|
1245 case HTTPStatus::ENotFound: |
|
1246 aError = KErrNotFound; |
|
1247 break; |
|
1248 |
|
1249 case HTTPStatus::EConflict: // source file not found |
|
1250 aError = KErrNotFound; |
|
1251 break; |
|
1252 |
|
1253 case HTTPStatus::EBadGateway: |
|
1254 case HTTPStatus::EForbidden: |
|
1255 aError = KErrBadName; |
|
1256 break; |
|
1257 |
|
1258 case HTTPStatus::EPreconditionFailed: |
|
1259 // Not performed due to the value of the Overwrite header |
|
1260 aError = KErrAlreadyExists; |
|
1261 break; |
|
1262 |
|
1263 case RsfwDavStatus::ELocked: |
|
1264 aError = KErrAccessDenied; |
|
1265 break; |
|
1266 |
|
1267 case HTTPStatus::EMovedPermanently: |
|
1268 case HTTPStatus::ETemporaryRedirect: |
|
1269 // The operation failed as object exists, although its type |
|
1270 // didn't match the type of our parameter (file vs. dir) |
|
1271 aError = KErrAlreadyExists; |
|
1272 break; |
|
1273 default: |
|
1274 MapError(aError); |
|
1275 break; |
|
1276 } |
|
1277 |
|
1278 DEBUGSTRING(("DAV: Move err=%d", aError)); |
|
1279 iStatus = aError; |
|
1280 iTryCount = 0; |
|
1281 } |
|
1282 |
|
1283 if (iTryCount) |
|
1284 { |
|
1285 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
1286 Retry(); |
|
1287 } |
|
1288 else |
|
1289 { |
|
1290 iStatus = aError; |
|
1291 iDone = ETrue; |
|
1292 } |
|
1293 } |
|
1294 |
|
1295 // CRsfwDavAccessContextLock |
|
1296 // ============================ MEMBER FUNCTIONS ============================== |
|
1297 // ---------------------------------------------------------------------------- |
|
1298 // CRsfwDavAccessContextLock::NewL |
|
1299 // Two-phased constructor. |
|
1300 // ---------------------------------------------------------------------------- |
|
1301 // |
|
1302 CRsfwDavAccessContextLock* |
|
1303 CRsfwDavAccessContextLock::NewL(CRsfwDavAccess* aDavAccess, |
|
1304 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1305 const TDesC& aPathName, |
|
1306 TUint aLockFlags, |
|
1307 TUint& aTimeout, |
|
1308 TDesC8** aLockToken) |
|
1309 { |
|
1310 CRsfwDavAccessContextLock* self = new (ELeave) CRsfwDavAccessContextLock; |
|
1311 CleanupStack::PushL(self); |
|
1312 self->ConstructL(aDavAccess, |
|
1313 aResponseHandler, |
|
1314 aPathName, |
|
1315 aLockFlags, |
|
1316 aTimeout, |
|
1317 aLockToken); |
|
1318 CleanupStack::Pop(self); |
|
1319 return self; |
|
1320 } |
|
1321 |
|
1322 CRsfwDavAccessContextLock::~CRsfwDavAccessContextLock() |
|
1323 { |
|
1324 delete iDavFileInfo; |
|
1325 } |
|
1326 |
|
1327 // ---------------------------------------------------------------------------- |
|
1328 // CRsfwDavAccessContextLock::ConstructL |
|
1329 // Symbian 2nd phase constructor can leave. |
|
1330 // ---------------------------------------------------------------------------- |
|
1331 // |
|
1332 void CRsfwDavAccessContextLock::ConstructL( |
|
1333 CRsfwDavAccess* aDavAccess, |
|
1334 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1335 const TDesC& aPathName, |
|
1336 TUint aLockFlags, |
|
1337 TUint& aTimeout, |
|
1338 TDesC8** aLockToken) |
|
1339 { |
|
1340 iDavAccess = aDavAccess; |
|
1341 iResponseHandler = aResponseHandler; |
|
1342 iLockFlags = aLockFlags; |
|
1343 iTimeout = &aTimeout; |
|
1344 iLockToken = aLockToken; |
|
1345 iTryCount = KCommRetries; |
|
1346 iRemotePathName = aPathName; |
|
1347 } |
|
1348 |
|
1349 // ---------------------------------------------------------------------------- |
|
1350 // CRsfwDavAccessContextLock::StartL |
|
1351 // Submit the WebDAV transaction |
|
1352 // ---------------------------------------------------------------------------- |
|
1353 // |
|
1354 void CRsfwDavAccessContextLock::StartL() |
|
1355 { |
|
1356 DEBUGSTRING(("DAV: Lock StartL")); |
|
1357 iWebDavTransaction = iDavAccess->WebDavSession()->LockL(iRemotePathName, |
|
1358 iLockFlags, |
|
1359 *iTimeout, |
|
1360 &iDavFileInfo); |
|
1361 SubmitL(); |
|
1362 } |
|
1363 |
|
1364 // ---------------------------------------------------------------------------- |
|
1365 // CRsfwDavAccessContextLock::TransactionCompleteL |
|
1366 // Handle a successfully completed transaction |
|
1367 // ---------------------------------------------------------------------------- |
|
1368 // |
|
1369 void CRsfwDavAccessContextLock::TransactionCompleteL() |
|
1370 { |
|
1371 DEBUGSTRING(("DAV: Lock done")); |
|
1372 |
|
1373 /* |
|
1374 Preconditions: |
|
1375 - we haven't seen the file at all (there is no fileInfo for it) |
|
1376 or |
|
1377 - we have cached it and there is fileinfo with a |
|
1378 lock token (lock token is never assumed to be valid, |
|
1379 if FileEngine decides to call this function) |
|
1380 */ |
|
1381 *iTimeout = iDavFileInfo->Timeout(); |
|
1382 |
|
1383 CRsfwDavFileInfo* storedFileInfo = iDavAccess->DavFileInfoL(iRemotePathName); |
|
1384 HBufC8* lockToken; |
|
1385 if (storedFileInfo) |
|
1386 { |
|
1387 // Lock operation succesful, set lock timeout |
|
1388 if (iDavFileInfo->Name()) |
|
1389 { |
|
1390 storedFileInfo->SetNameL(*(iDavFileInfo->Name())); |
|
1391 } |
|
1392 if (iDavFileInfo->LockToken()) |
|
1393 { |
|
1394 storedFileInfo->SetLockTokenL(*(iDavFileInfo->LockToken())); |
|
1395 } |
|
1396 storedFileInfo->SetTimeout(iDavFileInfo->Timeout()); |
|
1397 lockToken = storedFileInfo->LockToken(); |
|
1398 } |
|
1399 else |
|
1400 { |
|
1401 // new file |
|
1402 iDavAccess->AddDavFileInfo(iDavFileInfo); |
|
1403 lockToken = iDavFileInfo->LockToken(); |
|
1404 // Ownership transferred to CRsfwDavAccess |
|
1405 iDavFileInfo = NULL; |
|
1406 } |
|
1407 |
|
1408 if (iLockToken) |
|
1409 { |
|
1410 // Allocate and return the lock token to the caller |
|
1411 *iLockToken = lockToken->Des().AllocL(); |
|
1412 } |
|
1413 |
|
1414 iStatus = KErrNone; |
|
1415 iDone = ETrue; |
|
1416 } |
|
1417 |
|
1418 // ---------------------------------------------------------------------------- |
|
1419 // CRsfwDavAccessContextLock::TransactionError |
|
1420 // Handle a transaction fault |
|
1421 // ---------------------------------------------------------------------------- |
|
1422 // |
|
1423 void CRsfwDavAccessContextLock::TransactionError(TInt aError) |
|
1424 { |
|
1425 DEBUGSTRING(("DAV: Lock raw err=%d", aError)); |
|
1426 if ((aError == KErrCommsLineFail) || |
|
1427 (aError == KErrNotReady) || |
|
1428 (aError == KErrDisconnected)) |
|
1429 { |
|
1430 iTryCount--; |
|
1431 } |
|
1432 else |
|
1433 { |
|
1434 // Map XML parser errors to KErrCorrupt |
|
1435 if ((aError <= EXmlFeatureLockedWhileParsing) && |
|
1436 (aError >= EXmlParserError)) |
|
1437 { |
|
1438 aError = EXmlParserError; |
|
1439 } |
|
1440 |
|
1441 // Map protocol specific error codes into Symbian error codes |
|
1442 switch (aError) |
|
1443 { |
|
1444 case EXmlParserError: |
|
1445 aError = KErrCorrupt; |
|
1446 break; |
|
1447 case HTTPStatus::ENotFound: |
|
1448 aError = KErrNotFound; |
|
1449 break; |
|
1450 |
|
1451 case RsfwDavStatus::ELocked: |
|
1452 aError = KErrAccessDenied; |
|
1453 break; |
|
1454 |
|
1455 default: |
|
1456 MapError(aError); |
|
1457 break; |
|
1458 } |
|
1459 |
|
1460 // Lock operation not successful. |
|
1461 // If we have file info for this let's "reset" relevant parts |
|
1462 // DavFileInfoL may leave if the path is over 255 chars |
|
1463 // that shouldn't happen anymore here as we have already used the path |
|
1464 CRsfwDavFileInfo* davFileInfo = NULL; |
|
1465 TRAPD(err, davFileInfo = iDavAccess->DavFileInfoL(iRemotePathName)); |
|
1466 if (!err && davFileInfo) |
|
1467 { |
|
1468 davFileInfo->ResetLockToken(); |
|
1469 davFileInfo->SetTimeout(0); |
|
1470 } |
|
1471 |
|
1472 DEBUGSTRING(("DAV: Lock err=%d", aError)); |
|
1473 iStatus = aError; |
|
1474 iTryCount = 0; |
|
1475 } |
|
1476 |
|
1477 if (iTryCount) |
|
1478 { |
|
1479 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
1480 Retry(); |
|
1481 } |
|
1482 else |
|
1483 { |
|
1484 iStatus = aError; |
|
1485 iDone = ETrue; |
|
1486 } |
|
1487 } |
|
1488 |
|
1489 // CRsfwDavAccessContextRefreshLock |
|
1490 // ============================ MEMBER FUNCTIONS ============================== |
|
1491 // ---------------------------------------------------------------------------- |
|
1492 // CRsfwDavAccessContextRefreshLock::NewL |
|
1493 // Two-phased constructor. |
|
1494 // ---------------------------------------------------------------------------- |
|
1495 // |
|
1496 CRsfwDavAccessContextRefreshLock* CRsfwDavAccessContextRefreshLock::NewL( |
|
1497 CRsfwDavAccess* aDavAccess, |
|
1498 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1499 const TDesC& aPathName, |
|
1500 const TDesC8* aLockToken, |
|
1501 TUint& aTimeout) |
|
1502 { |
|
1503 CRsfwDavAccessContextRefreshLock* self = |
|
1504 new (ELeave) CRsfwDavAccessContextRefreshLock; |
|
1505 CleanupStack::PushL(self); |
|
1506 self->ConstructL(aDavAccess, |
|
1507 aResponseHandler, |
|
1508 aPathName, |
|
1509 aLockToken, |
|
1510 aTimeout); |
|
1511 CleanupStack::Pop(self); |
|
1512 return self; |
|
1513 } |
|
1514 |
|
1515 CRsfwDavAccessContextRefreshLock::~CRsfwDavAccessContextRefreshLock() |
|
1516 { |
|
1517 delete iDavFileInfo; |
|
1518 } |
|
1519 |
|
1520 // ---------------------------------------------------------------------------- |
|
1521 // CRsfwDavAccessContextRefreshLock::ConstructL |
|
1522 // Symbian 2nd phase constructor can leave. |
|
1523 // ---------------------------------------------------------------------------- |
|
1524 // |
|
1525 void CRsfwDavAccessContextRefreshLock::ConstructL( |
|
1526 CRsfwDavAccess* aDavAccess, |
|
1527 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1528 const TDesC& aPathName, |
|
1529 const TDesC8* aLockToken, |
|
1530 TUint& aTimeout) |
|
1531 { |
|
1532 iDavAccess = aDavAccess; |
|
1533 iResponseHandler = aResponseHandler; |
|
1534 iPathName = aPathName; |
|
1535 iLockToken = aLockToken; |
|
1536 iTimeout = &aTimeout; |
|
1537 iTryCount = KCommRetries; |
|
1538 |
|
1539 // set remotepathname to null, so that this request cannot be cancelled |
|
1540 // cancellations come from the UI and this is internal to RFE |
|
1541 iRemotePathName = KNullDesC; |
|
1542 } |
|
1543 |
|
1544 // ---------------------------------------------------------------------------- |
|
1545 // CRsfwDavAccessContextRefreshLock::StartL |
|
1546 // Submit the WebDAV transaction |
|
1547 // ---------------------------------------------------------------------------- |
|
1548 // |
|
1549 void CRsfwDavAccessContextRefreshLock::StartL() |
|
1550 { |
|
1551 DEBUGSTRING(("DAV: RefreshLock StartL")); |
|
1552 iWebDavTransaction = |
|
1553 iDavAccess-> |
|
1554 WebDavSession()-> |
|
1555 RefreshLockL(iPathName, |
|
1556 *iTimeout, |
|
1557 iLockToken, |
|
1558 &iDavFileInfo); |
|
1559 SubmitL(); |
|
1560 } |
|
1561 |
|
1562 // ---------------------------------------------------------------------------- |
|
1563 // CRsfwDavAccessContextRefreshLock::TransactionCompleteL |
|
1564 // Handle a successfully completed transaction |
|
1565 // ---------------------------------------------------------------------------- |
|
1566 // |
|
1567 void CRsfwDavAccessContextRefreshLock::TransactionCompleteL() |
|
1568 { |
|
1569 DEBUGSTRING(("DAV: RefreshLock done")); |
|
1570 |
|
1571 // The server may have changed the timeout, |
|
1572 *iTimeout = iDavFileInfo->Timeout(); |
|
1573 iStatus = KErrNone; |
|
1574 iDone = ETrue; |
|
1575 } |
|
1576 |
|
1577 // ---------------------------------------------------------------------------- |
|
1578 // CRsfwDavAccessContextRefreshLock::TransactionError |
|
1579 // Handle a transaction fault |
|
1580 // ---------------------------------------------------------------------------- |
|
1581 // |
|
1582 void CRsfwDavAccessContextRefreshLock::TransactionError(TInt aError) |
|
1583 { |
|
1584 DEBUGSTRING(("DAV: RefreshLock raw err=%d", aError)); |
|
1585 if ((aError == KErrCommsLineFail) || |
|
1586 // ? (aError == KErrNotReady) || |
|
1587 (aError == KErrDisconnected)) |
|
1588 { |
|
1589 iTryCount--; |
|
1590 } |
|
1591 else |
|
1592 { |
|
1593 // Map XML parser errors to KErrCorrupt |
|
1594 if ((aError <= EXmlFeatureLockedWhileParsing) && |
|
1595 (aError >= EXmlParserError)) |
|
1596 { |
|
1597 aError = EXmlParserError; |
|
1598 } |
|
1599 |
|
1600 // Map protocol specific error codes into Symbian error codes |
|
1601 switch (aError) |
|
1602 { |
|
1603 case EXmlParserError: |
|
1604 aError = KErrCorrupt; |
|
1605 break; |
|
1606 case HTTPStatus::ENotFound: |
|
1607 aError = KErrNotFound; |
|
1608 break; |
|
1609 |
|
1610 case HTTPStatus::EPreconditionFailed: |
|
1611 aError = KErrArgument; |
|
1612 break; |
|
1613 |
|
1614 case RsfwDavStatus::ELocked: |
|
1615 aError = KErrLocked; |
|
1616 break; |
|
1617 |
|
1618 default: |
|
1619 MapError(aError); |
|
1620 break; |
|
1621 } |
|
1622 |
|
1623 DEBUGSTRING(("DAV: RefreshLock err=%d", aError)); |
|
1624 iStatus = aError; |
|
1625 iTryCount = 0; |
|
1626 } |
|
1627 |
|
1628 if (iTryCount) |
|
1629 { |
|
1630 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
1631 Retry(); |
|
1632 } |
|
1633 else |
|
1634 { |
|
1635 iStatus = aError; |
|
1636 iDone = ETrue; |
|
1637 } |
|
1638 } |
|
1639 |
|
1640 // CRsfwDavAccessContextUnlock |
|
1641 // ============================ MEMBER FUNCTIONS ============================== |
|
1642 // ---------------------------------------------------------------------------- |
|
1643 // CRsfwDavAccessContextUnlock::NewL |
|
1644 // Two-phased constructor. |
|
1645 // ---------------------------------------------------------------------------- |
|
1646 // |
|
1647 CRsfwDavAccessContextUnlock* |
|
1648 CRsfwDavAccessContextUnlock::NewL(CRsfwDavAccess* aDavAccess, |
|
1649 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1650 const TDesC& aPathName, |
|
1651 const TDesC8* aLockToken) |
|
1652 { |
|
1653 CRsfwDavAccessContextUnlock* self = new (ELeave) CRsfwDavAccessContextUnlock; |
|
1654 CleanupStack::PushL(self); |
|
1655 self->ConstructL(aDavAccess, |
|
1656 aResponseHandler, |
|
1657 aPathName, |
|
1658 aLockToken); |
|
1659 CleanupStack::Pop(self); |
|
1660 return self; |
|
1661 } |
|
1662 |
|
1663 // ---------------------------------------------------------------------------- |
|
1664 // CRsfwDavAccessContextUnlock::ConstructL |
|
1665 // Symbian 2nd phase constructor can leave. |
|
1666 // ---------------------------------------------------------------------------- |
|
1667 // |
|
1668 void CRsfwDavAccessContextUnlock::ConstructL( |
|
1669 CRsfwDavAccess* aDavAccess, |
|
1670 MRsfwRemoteAccessResponseHandler* aResponseHandler, |
|
1671 const TDesC& aPathName, |
|
1672 const TDesC8* aLockToken) |
|
1673 { |
|
1674 iDavAccess = aDavAccess; |
|
1675 iResponseHandler = aResponseHandler; |
|
1676 iLockToken = aLockToken; |
|
1677 iTryCount = KCommRetries; |
|
1678 iRemotePathName = aPathName; |
|
1679 } |
|
1680 |
|
1681 // ---------------------------------------------------------------------------- |
|
1682 // CRsfwDavAccessContextUnlock::StartL |
|
1683 // Submit the WebDAV transaction |
|
1684 // ---------------------------------------------------------------------------- |
|
1685 // |
|
1686 void CRsfwDavAccessContextUnlock::StartL() |
|
1687 { |
|
1688 DEBUGSTRING(("DAV: Unlock StartL")); |
|
1689 iWebDavTransaction = iDavAccess->WebDavSession()->UnlockL(iRemotePathName, |
|
1690 iLockToken); |
|
1691 SubmitL(); |
|
1692 } |
|
1693 |
|
1694 // ---------------------------------------------------------------------------- |
|
1695 // CRsfwDavAccessContextUnlock::TransactionCompleteL |
|
1696 // Handle a successfully completed transaction |
|
1697 // ---------------------------------------------------------------------------- |
|
1698 // |
|
1699 void CRsfwDavAccessContextUnlock::TransactionCompleteL() |
|
1700 { |
|
1701 DEBUGSTRING(("DAV: Unlock done")); |
|
1702 |
|
1703 // Remove the lock |
|
1704 CRsfwDavFileInfo* davFileInfo = iDavAccess->DavFileInfoL(iRemotePathName); |
|
1705 if (davFileInfo) |
|
1706 { |
|
1707 davFileInfo->ResetFlag(TRsfwDavFileInfoFlags::EUnlockPending); |
|
1708 davFileInfo->ResetLockToken(); |
|
1709 iDavAccess->RemoveDavFileInfoL(iRemotePathName); |
|
1710 } |
|
1711 |
|
1712 iStatus = KErrNone; |
|
1713 iDone = ETrue; |
|
1714 } |
|
1715 |
|
1716 // ---------------------------------------------------------------------------- |
|
1717 // CRsfwDavAccessContextUnlock::TransactionError |
|
1718 // Handle a transaction fault |
|
1719 // ---------------------------------------------------------------------------- |
|
1720 // |
|
1721 void CRsfwDavAccessContextUnlock::TransactionError(TInt aError) |
|
1722 { |
|
1723 DEBUGSTRING(("DAV: Unlock raw err=%d", aError)); |
|
1724 |
|
1725 // Currently we don't remove the lock token (CRsfwDavFileInfo struct) |
|
1726 // if UNLOCK returns an error for some reason. |
|
1727 // If lock timeouts are smallish, deleting would make sense |
|
1728 // as the lock may have timed out in which case server returns an |
|
1729 // error for UNLOCK and our client might not even care about |
|
1730 // the result of UNLOCK. |
|
1731 // In this case we have a risk of unwanted never-to-be-deleted |
|
1732 // CRsfwDavFileInfos. |
|
1733 // On the other hand, |
|
1734 // if infinite timeout is used, the current behaviour is better |
|
1735 // (if UNLOCK fails for some reason the client must re-try). |
|
1736 |
|
1737 // at least remove 'unlock pending' flag |
|
1738 CRsfwDavFileInfo* davFileInfo = NULL; |
|
1739 TRAP_IGNORE(davFileInfo = iDavAccess->DavFileInfoL(iRemotePathName)); |
|
1740 |
|
1741 if (davFileInfo) |
|
1742 { |
|
1743 davFileInfo->ResetFlag(TRsfwDavFileInfoFlags::EUnlockPending); |
|
1744 } |
|
1745 |
|
1746 if ((aError == KErrCommsLineFail) || |
|
1747 (aError == KErrNotReady) || |
|
1748 (aError == KErrDisconnected)) |
|
1749 { |
|
1750 iTryCount--; |
|
1751 } |
|
1752 else |
|
1753 { |
|
1754 // Map protocol specific error codes into Symbian error codes |
|
1755 MapError(aError); |
|
1756 DEBUGSTRING(("DAV: Unlock err=%d", aError)); |
|
1757 iStatus = aError; |
|
1758 iTryCount = 0; |
|
1759 } |
|
1760 |
|
1761 if (iTryCount) |
|
1762 { |
|
1763 DEBUGSTRING(("DAV: Retry %d", iTryCount)); |
|
1764 Retry(); |
|
1765 } |
|
1766 else |
|
1767 { |
|
1768 iStatus = aError; |
|
1769 iDone = ETrue; |
|
1770 } |
|
1771 } |
|
1772 |
|
1773 // End of File |
|