diff -r e904b452aa85 -r 235c00e46fb7 browser/src/BrCtlApiTestObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/src/BrCtlApiTestObserver.cpp Thu Jan 21 14:54:07 2010 +0000 @@ -0,0 +1,530 @@ +/* +* Copyright (c) 2006 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: BrCtlApiTest +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include "BrCtlApiTestObserver.h" +#include +#include + +#ifndef RD_PF_SEC_APPARC +//#include +#else +#include "AiwGenericParam.h" +#endif + + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::UpdateBrowserVScrollBarL +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::UpdateBrowserVScrollBarL(TInt /* aDocumentHeight */, + TInt /* aDisplayHeight */, + TInt /* aDisplayPosY */ ) + { + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::UpdateBrowserHScrollBarL +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::UpdateBrowserHScrollBarL(TInt /* aDocumentWidth */, + TInt /* aDisplayWidth */, + TInt /* aDisplayPosX */ ) + { + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::NotifyLayoutChange +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::NotifyLayoutChange( TBrCtlLayout /* aNewLayout */) + { + } + +// --------------------------------------------------------- +// CBrCtlSampleAppLayoutObserver::UpdateTitle +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::UpdateTitleL( const TDesC& /*aTitle*/ ) + { + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::UpdateSoftkeyL +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::UpdateSoftkeyL(TBrCtlKeySoftkey /* aKeySoftkey */, + const TDesC& /* aLabel */, + TUint32 /* aCommandId */, + TBrCtlSoftkeyChangeReason /* aBrCtlSoftkeyChangeReason */) + { + return; + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::NetworkConnectionNeededL +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::NetworkConnectionNeededL(TInt* /*aConnectionPtr*/, + TInt* /*aSockSvrHandle*/, + TBool* /*aNewConn*/, + TApBearerType* /*aBearerType*/) + { + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::HandleRequestL +// --------------------------------------------------------- +// +TBool CBrCtlApiTestObserver::HandleRequestL(RArray* aTypeArray, CDesCArrayFlat* aDesArray) + { + + TInt i; + + // The 2 arrays must be in sync. Each element in iTypeArray + // identifies the type of the corresponding element in iDesArray. + if( aTypeArray->Count() != aDesArray->Count() ) + { + User::Leave( KErrArgument ); + } + + // get url + HBufC* url = NULL; + // Serach url in the param list + for(i = 0; i < aTypeArray->Count(); i++) + { + if( (*aTypeArray)[i] == EParamRequestUrl ) + { + // the url is found + url = HBufC::NewLC( (*aDesArray)[i].Length() ); + url->Des().Copy( (*aDesArray)[i] ); + break; + } + } + if( !url ) + { + // The url wasn't found. + User::Leave( KErrArgument ); + } + + // get referrer header + HBufC* refererHeader = NULL; + // Serach url in the param list + for( i = 0; i < aTypeArray->Count(); i++ ) + { + if( (*aTypeArray)[i] == EParamRefererHeader ) + { + // the referer Header is found + refererHeader = HBufC::NewLC( (*aDesArray)[i].Length() ); + refererHeader->Des().Copy( (*aDesArray)[i] ); + break; + } + } + + if( refererHeader ) + { + CleanupStack::PopAndDestroy( 1 ); // refererHeader + } + + CleanupStack::PopAndDestroy( 1 ); // url + + return ETrue; + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::HandleDownloadL +// --------------------------------------------------------- +// +TBool CBrCtlApiTestObserver::HandleDownloadL(RArray* aTypeArray, CDesCArrayFlat* aDesArray) + { + TInt i = 0; + TInt count = aTypeArray->Count(); + for (i = 0; i < count; i++) + { + if ((*aTypeArray)[i] == EParamLocalFileName && aDesArray[i].Length() > 0) + { + TInt j = 0; + for (j = 0; j < count; j++) + { + if ((*aTypeArray)[j] == EParamReceivedContentType) + { + HBufC8* dataType8 = HBufC8::NewLC((*aDesArray)[j].Length()); + dataType8->Des().Copy((*aDesArray)[j]); + TDataType dataType(*dataType8); + iHandler->OpenFileEmbeddedL((*aDesArray)[i], dataType); + CleanupStack::PopAndDestroy(); + break; + } + } + break; + } + } + return EFalse; + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::HandleBrowserLoadEventL +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::HandleBrowserLoadEventL( TBrCtlDefs::TBrCtlLoadEvent /* aLoadEvent */, + TUint /* aSize */, TUint16 /* aTransactionId */ ) + { + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::ResolveEmbeddedLinkL +// --------------------------------------------------------- +// +TBool CBrCtlApiTestObserver::ResolveEmbeddedLinkL(const TDesC& aEmbeddedUrl, + const TDesC& /* aCurrentUrl */, + TBrCtlLoadContentType /* aLoadContentType */, + MBrCtlLinkContent& aEmbeddedLinkContent) + { + if (IsFileScheme(aEmbeddedUrl)) + { + GetFileNameL(aEmbeddedUrl); + HBufC8* buf = ReadFileLC(*iFileName); + HBufC* contentType = NULL; + TPtrC p(NULL, 0); + contentType = RecognizeLC(*iFileName, *buf); + aEmbeddedLinkContent.HandleResolveComplete(*contentType, p, buf); + CleanupStack::PopAndDestroy(2); // contentType, buf + return ETrue; + } + return EFalse; + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::ResolveLinkL +// --------------------------------------------------------- +// +TBool CBrCtlApiTestObserver::ResolveLinkL(const TDesC& aUrl, const TDesC& /* aCurrentUrl */, + MBrCtlLinkContent& aBrCtlLinkContent) + { + if (IsFileScheme(aUrl)) + { + GetFileNameL(aUrl); + HBufC8* buf = ReadFileLC(*iFileName); + HBufC* contentType = NULL; + TPtrC p(NULL, 0); + contentType = RecognizeLC(*iFileName, *buf); + aBrCtlLinkContent.HandleResolveComplete(*contentType, p, buf); + CleanupStack::PopAndDestroy(2); // contentType, buf + return ETrue; + } + return EFalse; + } + + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::CancelAll +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::CancelAll() + { + } + + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::ConstructL +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::ConstructL() + { + iHandler = CDocumentHandler::NewL(CEikonEnv::Static()->Process()) ; + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::~CBrCtlApiTestObserver +// --------------------------------------------------------- +// +CBrCtlApiTestObserver::~CBrCtlApiTestObserver() + { + delete iFileName; + delete iHandler; + } + + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::NewL +// --------------------------------------------------------- +// +CBrCtlApiTestObserver* CBrCtlApiTestObserver::NewL() +{ + CBrCtlApiTestObserver* self = new(ELeave)CBrCtlApiTestObserver; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; +} + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::IsFileScheme +// --------------------------------------------------------- +// + +TBool CBrCtlApiTestObserver::IsFileScheme(const TDesC& aFileName) + { + _LIT(KFileScheme, "file://"); + if (aFileName.Length() > 0 && aFileName.Ptr() != NULL) + { + if (aFileName.FindF(KFileScheme) == 0) + { + return ETrue; + } + } + return EFalse; + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::ReadFile +// --------------------------------------------------------- +// +HBufC8* CBrCtlApiTestObserver::ReadFileLC(const TDesC& aFileName) + { + RFs rfs; + RFile file; + User::LeaveIfError(rfs.Connect()); + CleanupClosePushL(rfs); + User::LeaveIfError(file.Open(rfs, aFileName, EFileRead)); + CleanupClosePushL(file); + TInt size; + User::LeaveIfError(file.Size(size)); + HBufC8* buf = HBufC8::NewLC(size); + TPtr8 bufPtr(buf->Des()); + User::LeaveIfError(file.Read(bufPtr)); + CleanupStack::Pop(); // buf + CleanupStack::PopAndDestroy(2); // file, rfs + CleanupStack::PushL(buf); + return buf; + } + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::RecognizeL +// --------------------------------------------------------- +// +HBufC* CBrCtlApiTestObserver::RecognizeLC(const TDesC& aFileName, const TDesC8& aData) + { + TDataRecognitionResult dataType; + RApaLsSession apaSession; + TInt ret; + HBufC* contentTypeString = NULL; + + User::LeaveIfError(apaSession.Connect()); + // Ask the application architecture to find the file type + ret = apaSession.RecognizeData(aFileName, aData, dataType); + apaSession.Close(); + + if (ret == KErrNone && + (dataType.iConfidence == CApaDataRecognizerType::ECertain) || + (dataType.iConfidence == CApaDataRecognizerType::EProbable)) + { + // If the file type was found, try to match it to a known file type + TPtrC8 mimeTypePtr = dataType.iDataType.Des8(); + TInt len = mimeTypePtr.Length() + 1; + contentTypeString = HBufC::NewL(len); + contentTypeString->Des().Copy(mimeTypePtr); + contentTypeString->Des().ZeroTerminate(); + } + CleanupStack::PushL(contentTypeString); + return contentTypeString; + } + +// ----------------------------------------------------------------------------- +// CBrCtlApiTestObserver::GetFileNameL +// Translate the file name from a URL to a valid file name in the system. +// ----------------------------------------------------------------------------- +// +TBool CBrCtlApiTestObserver::GetFileNameL(const TDesC& aFileName) + { + // This function accepts URLs in the following format: + // file://filename.xxx + // file:///filename.xxx + // file://c:/filename.xxx + // file:///c:/filename.xxx + // + _LIT(KFileScheme, "file://"); + _LIT(KDefaultDrivePath, "C:\\"); + _LIT(KPathChar, "\\"); + + TInt count; + TInt index = 0; + TBool drvLetter = EFalse; + TUint16 c; + + // Verify the file scheme + TPtrC urlPtr(aFileName); + if (urlPtr.FindF(KFileScheme) != 0) + { + return EFalse; + } + urlPtr.Set(urlPtr.Mid(KFileScheme().Length())); + + // make sure there are enough characters in the filename before + // trying to check them + count = urlPtr.Length(); + if(count == 0) + { + return EFalse; // no filename, so can't look at urlPtr[0] + } + + // Skip the first '/' if there is one + if (urlPtr[0] == '/') + { + urlPtr.Set(urlPtr.Mid(1)); + } + count = urlPtr.Length(); + + // Is there a drive letter? + if(count > 1) + { + // can check for drive letter + if (urlPtr[1 + index] == ':') + { + drvLetter = ETrue; + } + } + if(drvLetter == EFalse) + { + // 3 additional characters for the string "c:\" + count = urlPtr.Length() + 3; + } + iFileName = HBufC::NewL(count); + if (!drvLetter) + { + iFileName->Des().Append(KDefaultDrivePath); + } + + TBool fragment(EFalse); + // Convert relative path containing /./ and /../ to absolute path + for (; index < urlPtr.Length() && !fragment; index ++) + { + switch(urlPtr[index]) + { + case '#': //Check if there is a fragment '#' + { + fragment = ETrue; + continue; // Just stop there + } + + case '/': + { + iFileName->Des().Append(KPathChar); + break; + } + case '.': + { + if (index > 1 && urlPtr[index - 1] == '/') + { + if (index < count - 1 && urlPtr[index + 1] == '/') + { + index ++; // skip ./ + break; + } + if (index > 2 && index < count - 3 && + urlPtr[index + 1] == '.' && urlPtr[index + 2] == '/') + { + TInt i = index - 2; + + for (; i > 0 && urlPtr[i] != '/'; i--) {} // skip /../ + + iFileName->Des().SetLength(iFileName->Des().Length() - (index - i)); + index += 2; + break; + } + } + } + // no break + //lint -fallthrough + + default: + { + c = urlPtr[index]; + iFileName->Des().Append(&c, 1); + break; + } + } // end of switch + } + return ETrue; +} + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::NewDownloadL +// --------------------------------------------------------- +// +TBool CBrCtlApiTestObserver::NewDownloadL(TUint /* aTransactionID */, + const TDesC& /* aFileName */, + const TDesC& /* aContentType */, + const TDesC& /* aUrl */) +{ + return ETrue; +} + +void CBrCtlApiTestObserver::ResumeDownloadL(TUint /* aTransactionID */, + TUint /* aLength */, + const TDesC& /* aFileName */, + const TDesC& /* aContentType */, + const TDesC& /* aUrl */) +{ +} + +void CBrCtlApiTestObserver::HandleDownloadEventL( TUint /* aTransactionID */, + TBrCtlDownloadEvent /* aDownloadEvent */, + TUint /* aValue*/ ) +{ +} + +// Dummy function definitions for the functions from CBrCtlWindowObserver class - Added for Widget Extension Test + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::OpenWindowL +// --------------------------------------------------------- +// +CBrCtlInterface* CBrCtlApiTestObserver::OpenWindowL(TDesC& aUrl, TDesC* aTargetName, TBool aUserInitiated, + TAny* aReserved) +{ + +} + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::FindWindowL +// --------------------------------------------------------- +// +CBrCtlInterface* CBrCtlApiTestObserver::FindWindowL( const TDesC& aTargetName ) const +{ + +} + +// --------------------------------------------------------- +// CBrCtlApiTestObserver::HandleWindowCommandL +// --------------------------------------------------------- +// +void CBrCtlApiTestObserver::HandleWindowCommandL( const TDesC& aTargetName, TBrCtlWindowCommand aCommand ) +{ + +} + + + +// End of File