commonuis/CommonUi/src/DocGameHandler.cpp
changeset 0 2f259fa3e83a
child 67 5f6e7f84c9d1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonuis/CommonUi/src/DocGameHandler.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,251 @@
+/*
+* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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 game data handler.
+*
+*/
+
+
+// INCLUDE FILES
+#include <s32mem.h>
+#include <s32file.h>
+#include "DocGameHandler.h"
+#include "pathinfo.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ==================== LOCAL FUNCTIONS ====================
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CDocGameHandler::CDocGameHandler(
+    const TDataType& aDataType,
+    const TUid& aUid,
+    CDocumentHandler* aDocDispatcher,
+    TDocServiceMode aServiceMode ): 
+        CDocDefaultHandler( aDataType, aUid, 
+                            aDocDispatcher, aServiceMode )
+    {
+    }
+
+
+
+// EPOC default constructor can leave.
+void CDocGameHandler::ConstructL()
+    {
+    BaseConstructL();
+    iGameId = KGameEngineUID;
+    }
+
+// Two-phased constructor.
+CDocGameHandler* CDocGameHandler::NewL(    
+    const TDataType& aDataType,
+    const TUid& aUid,
+    CDocumentHandler* aDocDispatcher,
+    TDocServiceMode aServiceMode )
+    {
+    CDocGameHandler* self = new (ELeave) CDocGameHandler( aDataType, 
+                                           aUid, aDocDispatcher, 
+                                           aServiceMode );
+       
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+    
+// Destructor
+CDocGameHandler::~CDocGameHandler()
+    {
+    
+    } 
+
+void CDocGameHandler::ParseGameInfoFromFileL( const TDesC& aFilename )
+    {
+    RFile file;
+    User::LeaveIfError( file.Open( iFs, aFilename, EFileRead ) );
+    RFileReadStream reader( file );    
+    iGameId = reader.ReadInt32L();
+    reader.ReadInt8L();             // Data Type
+    reader.ReadInt32L();            // Data Length
+    TInt size = reader.ReadInt8L();// Size of Name String
+    if ( size > 0 )
+        {
+        reader.ReadL( iDestFile, size );// Name String
+        }
+    reader.Close();
+    file.Close();
+    }
+    
+// TODO: Does this method work, how to test this?    
+void CDocGameHandler::ParseGameInfoFromFileL( const RFile& aFile )
+    {
+    RFileReadStream reader( const_cast<RFile&>(aFile) );    
+    iGameId = reader.ReadInt32L();
+    reader.ReadInt8L();             // Data Type
+    reader.ReadInt32L();            // Data Length
+    TInt size = reader.ReadInt8L();// Size of Name String
+    if ( size > 0 )
+        {
+        reader.ReadL( iDestFile, size );// Name String
+        }
+    reader.Close();
+    }    
+
+void CDocGameHandler::ParseGameInfoFromBufL( const TDesC8& aBuffer )
+    {   
+    RDesReadStream reader( aBuffer );
+    iGameId = reader.ReadInt32L();  // GameId
+    reader.ReadInt8L();             // Data Type
+    reader.ReadInt32L();            // Data Length
+    TInt size = reader.ReadInt8L(); // Size of Name String
+    if ( size > 0 )
+        {
+        reader.ReadL( iDestFile, size );// Name String
+        }
+    reader.Close();  
+    }
+
+//
+// Changes iUid to "real". Changes iDataType to "real" value.
+//
+TInt CDocGameHandler::CheckGameDataTypeL( TInt32 aGameId )
+    {
+    TInt error = KErrNone;
+    if ( aGameId > KMaxGameEngineDataID )
+        {
+        TBuf8<256> completedType = iDataType.Des8();                
+        completedType.Append( _L("-") );
+        completedType.AppendNumFixedWidth( aGameId, EHex, 8 );      
+        iDataType = TDataType( completedType );
+        }
+    error = iApaLs->AppForDataType( iDataType, iUid );
+    if ( error != KErrNone )
+        {
+        User::Leave( error );
+        }
+
+    if ( iUid.iUid == 0)
+        {
+        iUid.iUid = KGameEngineUID;
+        }
+
+    PopulateAppInfo();
+    if ( iAppInfo.iFullName.Length() == 0 )
+        {
+        User::Leave( KMimeNotSupported );
+        }
+    return error;
+    }
+
+  
+void CDocGameHandler::PopulateAppInfo()
+    {    
+    CDocDefaultHandler::PopulateAppInfo( iUid );    
+    }
+
+// ---------------------------------------------------------
+// CDocDefaultHandler::GetDataDirL( 
+//    const TDataType& aDataType, 
+//    const TUid& aUid, 
+//    TDes& aPath 
+//    TDes& aDataSize)
+// Get the data directory for the mime type
+// ---------------------------------------------------------
+//        
+TInt CDocGameHandler::GetDataDirL( 
+    const TDataType& aDataType, 
+    const TUid& aUid, 
+    TDes& aPath,
+    TInt aDataSize)
+    {    
+    if ( iUid.iUid != 0 )
+        {
+        if (CDocDefaultHandler::GetDataDirL( aDataType, aUid, aPath, aDataSize ) == KErrCancel)
+            {
+            return KErrCancel;
+            }
+        }
+  
+    if ( iSavedAsTemp )
+        User::Leave( KMimeNotSupported );
+
+    if ( iUid.iUid != KGameEngineUID )
+        {
+        aPath.Insert( 0,  PathInfo::GamesPath() );
+        }
+    TParsePtr parse( aPath );
+    if ( parse.NamePresent() )                  // There is no '\' in the end.
+        {
+        aPath.Append( _L( "\\" ) );              // Append it. We need it!
+        }
+
+    return SetAndReturnStatus( KErrNone );
+    }
+
+TInt CDocGameHandler::CopyOrMoveL( const TUint aAttr )
+    {
+    ParseGameInfoFromFileL( iSourceFile );
+    User::LeaveIfError( CheckGameDataTypeL( iGameId ) );
+    TInt error = CDocDefaultHandler::CopyOrMoveL( aAttr );
+    if ( iUid.iUid == KGameEngineUID )
+        {
+        NotifyGameEngine( iUid );
+        }
+    HandleServerAppExit(0);
+    return SetAndReturnStatus( error );
+    }
+    
+TInt CDocGameHandler::CopyHandleL( const RFile& aSourceFile, const TUint aAttr  )
+    {
+    ParseGameInfoFromFileL( aSourceFile );
+    User::LeaveIfError( CheckGameDataTypeL( iGameId ) );
+    TInt error = CDocDefaultHandler::CopyHandleL( aSourceFile, aAttr );
+    if ( iUid.iUid == KGameEngineUID )
+        {
+        NotifyGameEngine( iUid );
+        }
+    HandleServerAppExit(0);
+    return SetAndReturnStatus( error );
+    }    
+
+TBool CDocGameHandler::IsViewerOperation( TDocOperation /*aOperation*/ )
+    {
+    return EFalse;
+    }
+
+    
+TInt CDocGameHandler::NotifyGameEngine( const TUid& /*aUid*/ )
+    {
+
+    // TODO: Is there needed some notify?
+    return 0;
+    }
+    
+//  End of File