diff -r 000000000000 -r dd21522fd290 browserutilities/feedsengine/FeedsServer/UrlHandler/src/FileHandler.cpp --- /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 +#include +#include + +#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(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; + }