browserutilities/schemehandler/SchemeDispatcher/src/FileHandler.cpp
changeset 0 dd21522fd290
child 37 cb62a4f66ebe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/schemehandler/SchemeDispatcher/src/FileHandler.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,280 @@
+/*
+* Copyright (c) 2002 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: 
+*      Implementation of Scheme handler interface implementation for file:// scheme
+*      
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "FileHandler.h"
+#include "SchemeDispLogger.h"
+#include <ECom.h>		// For REComSession
+#include <eikenv.h>
+#include <apmstd.h>
+#include <apparc.h>
+#include <eikproc.h>
+#include <f32file.h>
+#include <APGTASK.H>
+#include <apgcli.h>
+
+// ================= CONSTANTS =======================
+_LIT( KLocalhostPattern,"file://localhost/");
+_LIT( KEmptyPattern,"file:///");
+_LIT( KFilePattern,"file://");
+_LIT( KBrowserPrefix, "4 " );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CFileHandler::NewL()
+// ---------------------------------------------------------
+//
+CFileHandler* CFileHandler::NewL( const TDesC& aUrl )
+	{
+	CLOG_ENTERFN( "CFileHandler::NewL()" );
+
+	CFileHandler* self=new(ELeave) CFileHandler();
+	CleanupStack::PushL( self );
+	self->ConstructL( aUrl );
+	CleanupStack::Pop( self );
+
+	CLOG_LEAVEFN( "CFileHandler::NewL()" );
+	return self;
+	}
+
+// ---------------------------------------------------------
+// CFileHandler::~CFileHandler()
+// ---------------------------------------------------------
+//
+CFileHandler::~CFileHandler()
+	{
+	CLOG_ENTERFN( "CFileHandler::~CFileHandler()" );
+
+    if( iDocHandler )
+        {
+	    delete iDocHandler;
+        }
+
+	if(iDoc != NULL)
+		{
+		CEikProcess*  hostProcess = CEikonEnv::Static()->Process();
+		hostProcess->DestroyDocument(iDoc);
+		iDoc = NULL;
+		}
+
+	if( iLauncher )
+		{
+		delete iLauncher;
+		iLauncher = NULL;
+		}		
+
+	CLOG_LEAVEFN( "CFileHandler::~CFileHandler()" );
+	}
+
+// ---------------------------------------------------------
+// CFileHandler::CFileHandler()
+// ---------------------------------------------------------
+//
+CFileHandler::CFileHandler() : CBaseHandler()
+	{
+	// Deliberately do nothing here : See ConstructL() for initialisation 
+    // completion.
+	}
+
+// ---------------------------------------------------------
+// CFileHandler::ConstructL()
+// ---------------------------------------------------------
+//
+void CFileHandler::ConstructL( const TDesC& aUrl )
+	{
+	iParsedUrl = HBufC::NewL( aUrl.Length() );
+	iParsedUrl->Des().Copy( aUrl );
+	}
+
+// ---------------------------------------------------------
+// CFileHandler::HandleUrlEmbeddedL()
+// ---------------------------------------------------------
+//
+void CFileHandler::HandleUrlEmbeddedL()
+	{
+	CLOG_ENTERFN( "CFileHandler::HandleUrlEmbeddedL()" );
+
+    TBool dochandler( ETrue );
+    HBufC* buf = ParseFileSchemeLC( dochandler );
+
+    if( dochandler )
+        {
+        /* Documnet Handler launches the file */
+        iDocHandler = CDocumentHandler::NewL(
+              CEikonEnv::Static()->Process() );
+
+        iDocHandler->SetExitObserver( this );
+        TDataType dataType;
+
+        CAiwGenericParamList& paramList = iDocHandler->InParamListL();
+        RFile file;  
+        iDocHandler->OpenTempFileL( buf->Des(), file );
+        CLOG_WRITE(" OpenTempFileL OK");
+        CleanupClosePushL( file );
+        iDocHandler->OpenFileEmbeddedL( file, dataType, paramList );
+        CLOG_WRITE(" OpenFileEmbeddedL OK");
+        CleanupStack::PopAndDestroy( &file ); // file
+        CLOG_WRITE(" PopAndDestroy( &file ) OK");
+        }
+    else
+        {
+	    HBufC* buf16 = HBufC::NewLC( 
+		    iParsedUrl->Des().Length() + KBrowserPrefix.iTypeLength );
+	    buf16->Des().Copy( KBrowserPrefix );
+	    buf16->Des().Append( *buf );
+	            
+        iLauncher = CBrowserLauncher::NewL();
+        iLauncher->LaunchBrowserEmbeddedL( buf16->Des(), 
+                                           NULL, 
+                                           this );
+        CleanupStack::PopAndDestroy();  // buf16        
+        }
+	CleanupStack::PopAndDestroy(); //buf
+
+	CLOG_LEAVEFN( "CFileHandler::HandleUrlEmbeddedL()" );
+	}
+
+// ---------------------------------------------------------
+// CFileHandler::HandleUrlStandaloneL()
+// ---------------------------------------------------------
+//
+void CFileHandler::HandleUrlStandaloneL()
+	{
+	CLOG_ENTERFN( "CFileHandler::HandleUrlStandaloneL()" );
+
+    LaunchSchemeAppWithCommandLineL();
+
+	CLOG_LEAVEFN( "CFileHandler::HandleUrlStandaloneL()" );
+	}
+	
+// ---------------------------------------------------------
+// CFileHandler::HandleServerAppExit()
+// ---------------------------------------------------------
+//
+void CFileHandler::HandleServerAppExit(TInt aReason)
+	{
+	CLOG_ENTERFN( "CFileHandler::HandleServerAppExit" );
+
+	if( NULL != iSchemeDoc )
+		{
+	    iSchemeDoc->HandleServerAppExit( aReason );
+		}
+
+	CLOG_LEAVEFN( "CFileHandler::HandleServerAppExit" );	
+	}
+
+// ---------------------------------------------------------
+// CFileHandler::ConvertUrlToPathL()
+// ---------------------------------------------------------
+//
+void CFileHandler::ConvertUrlToPathL( TDes& aLiteral )
+	{
+	/* Search backslash in the path and change it to slash*/
+	_LIT16(KBackSlash16,"/");
+	_LIT16(KSlash16,"\\");
+
+	/* Find until the last occurance */
+	TInt pos;
+	while( KErrNotFound != ( pos = aLiteral.FindF( KBackSlash16 ) ) )
+		{
+		aLiteral.Replace(pos,1,KSlash16);
+		}
+	}
+
+// ---------------------------------------------------------
+// CFileHandler::ConvertUrlToPathL()
+// ---------------------------------------------------------
+//
+void CFileHandler::ConvertPathToUrlL( TDes& aLiteral )
+	{
+	/* Search backslash in the path and change it to slash*/
+	_LIT16(KBackSlash16,"/");
+	_LIT16(KSlash16,"\\");
+
+	/* Find until the last occurance */
+	TInt pos;
+	while( KErrNotFound != ( pos = aLiteral.FindF( KSlash16 ) ) )
+		{
+		aLiteral.Replace( pos, 1, KBackSlash16);
+		}
+	}
+
+// ---------------------------------------------------------
+// CFileHandler::ParseFileSchemeLC()
+// ---------------------------------------------------------
+//
+HBufC* CFileHandler::ParseFileSchemeLC( TBool& aDocHandler )
+    {
+    TPtrC path;
+    HBufC* pathCopy = NULL;
+    TRAPD( err, path.Set( RemoveSchemeFromUrlL( KLocalhostPattern() ) ) );
+    if( !err )
+        {
+	    pathCopy = HBufC::NewLC( path.Length() );
+	    pathCopy->Des().Copy( path );
+        TPtr ptr = pathCopy->Des();
+        ConvertUrlToPathL( ptr );
+        aDocHandler = ETrue;
+        return pathCopy;
+        }
+
+    TRAP( err,  path.Set( RemoveSchemeFromUrlL( KEmptyPattern() ) ) );
+    if( !err )
+        {
+	    pathCopy = HBufC::NewLC( path.Length() );
+	    pathCopy->Des().Copy( path );
+        TPtr ptr = pathCopy->Des();
+        ConvertUrlToPathL( ptr );
+        aDocHandler = ETrue;
+        return pathCopy;
+        }
+
+    TRAP( err,  path.Set( RemoveSchemeFromUrlL( KFilePattern() ) ) );
+    if( !err )
+        {
+        // Does our storage file exist?
+	    pathCopy = HBufC::NewLC( path.Length() );
+	    pathCopy->Des().Copy( path );
+        TPtr ptr = pathCopy->Des();
+        ConvertUrlToPathL( ptr );
+        RFs fs;
+        User::LeaveIfError( fs.Connect() );
+        TEntry storageFile;
+        TInt err = fs.Entry( ptr, storageFile );
+        fs.Close();
+        if ( err )
+            {
+            // It does not exist.
+            ConvertPathToUrlL( ptr );
+            aDocHandler = EFalse;
+            return pathCopy;
+            }
+        else
+            {
+            aDocHandler = ETrue;
+            return pathCopy;
+            }
+        }
+
+    User::Leave( err );
+    return pathCopy;
+    }