browserutilities/feedsengine/FeedsServer/UrlHandler/src/FileHandler.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/feedsengine/FeedsServer/UrlHandler/src/FileHandler.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,185 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  A class that fetches resources via RFile.
+*
+*/
+
+
+#include <e32base.h>
+#include <e32std.h>
+#include <f32file.h>
+
+#include "FileHandler.h"
+#include "LeakTracker.h"
+#include "Logger.h"
+
+
+// -----------------------------------------------------------------------------
+// CFileHandler::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFileHandler* CFileHandler::NewL()
+    {
+    CFileHandler* self = new (ELeave) CFileHandler();
+    
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+        
+// -----------------------------------------------------------------------------
+// CFileHandler::CFileHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CFileHandler::CFileHandler():
+        iLeakTracker(CLeakTracker::EFileHandler)
+    {
+    }
+        
+
+// -----------------------------------------------------------------------------
+// CFileHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CFileHandler::ConstructL()
+    {
+    iIdle = CIdle::NewL(CActive::EPriorityIdle);
+    }        
+
+
+// -----------------------------------------------------------------------------
+// CFileHandler::~CFileHandler
+// Deconstructor.
+// -----------------------------------------------------------------------------
+//
+CFileHandler::~CFileHandler()
+    {
+    delete iIdle;    
+    delete iUrl;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CFileHandler::LoadUrl
+// 
+// Loads the given url -- asynchronously
+// -----------------------------------------------------------------------------
+//
+void CFileHandler::LoadUrlL(const TDesC& aUrl, MLoadObserver& aObserver)
+    {
+    iUrl = aUrl.AllocL();
+    iObserver = &aObserver;
+
+    // To be consistent with other asynchronous UrlHandlers the buffer isn't 
+    // processed until after the callstack unrolls.
+    iIdle->Start(TCallBack(LoadCompleted, this));
+    }
+
+
+// -----------------------------------------------------------------------------
+// CFileHandler::LoadCompleted
+// 
+// Loads and passes the buffer to the observer.
+// -----------------------------------------------------------------------------
+//
+TInt CFileHandler::LoadCompleted(TAny* aPtr)
+    {
+    CFileHandler*  self = static_cast<CFileHandler*>(aPtr);    
+    HBufC8*        buffer = NULL;
+
+    TRAPD(err, buffer = self->LoadCompletedHelperL());
+    
+    // Pass the buffer to the observer.    
+    self->iObserver->LoadCompleted(err, buffer, KNullDesC, KNullDesC);
+
+    return EFalse;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CFileHandler::LoadCompletedHelperL
+// 
+// Loads and passes the buffer to the observer.
+// -----------------------------------------------------------------------------
+//
+HBufC8* CFileHandler::LoadCompletedHelperL()
+    {
+    _LIT(KFileScheme, "file://");
+
+    TInt           size;
+    HBufC16*       correcttedPath = NULL;
+    HBufC8*        buffer = NULL;
+    TPtr8          bufferPtr(NULL, 0);
+
+    // Extract the file path from the url.
+    TPtr  path(iUrl->Des());
+
+    if (iUrl->Find(KFileScheme) == 0)
+        {
+        path.Set((TUint16*) iUrl->Ptr() + KFileScheme().Length(), 
+                iUrl->Length() - KFileScheme().Length(), iUrl->Length() - 
+                KFileScheme().Length());
+
+        correcttedPath = HBufC16::NewLC(path.Length());
+        correcttedPath->Des() = path;
+        path.Set(correcttedPath->Des());
+
+        for (TInt i = 0; i < path.Length(); i++)
+            {
+            if (path[i] == '/')
+                {
+                path[i] = '\\';
+                }
+            }
+        }
+
+    // Otherwise leave as this isn't a file url.
+    else
+        {
+        User::Leave(KErrNotSupported);
+        }
+
+    // Open the file.
+    RFs    rfs;
+    RFile  file;
+
+    User::LeaveIfError(rfs.Connect());
+    CleanupClosePushL(rfs);
+
+    User::LeaveIfError(file.Open(rfs, path, EFileRead | EFileShareReadersOnly));
+    CleanupClosePushL(file);
+
+    // Read file
+    User::LeaveIfError(file.Size(size));
+    
+    buffer = HBufC8::NewL(size);
+    bufferPtr.Set(buffer->Des());
+
+    file.Read(bufferPtr, size);
+    
+    // Clean up.
+    CleanupStack::PopAndDestroy(/*file*/);
+    CleanupStack::PopAndDestroy(/*rfs*/);
+    CleanupStack::PopAndDestroy(correcttedPath);
+
+    return buffer;
+    }