--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/camappengine/asynchfilesavequeue/src/asynchatom.cpp Wed Sep 01 12:23:23 2010 +0100
@@ -0,0 +1,718 @@
+/*
+* Copyright (c) 2002-2007 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: Asynchronous FSQ Atom
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <asynchfsq.h>
+#include <sysutil.h> // for disk space query
+#include <bautils.h> // for deleting files
+#include "asynchatom.h"
+
+// CONSTANTS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::CAsynchFSQAtom
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAsynchFSQAtom::CAsynchFSQAtom() : CActive( EPriorityNormal )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::CAsynchFSQAtom() entering" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAsynchFSQAtom::ConstructL( CAsynchFSQ* aOwner,
+ TInt aPriority,
+ TFSQActionType aActionType,
+ TDesC8& aData,
+ const TDesC& aPath,
+ const TDesC& aURL,
+ TFSQSchemaType aSchema,
+ const TDesC& aUserName,
+ const TDesC& aPassword )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::ConstructL() entering" ) );
+ iOwner = aOwner;
+ iState = EPending;
+ iDelayedFileName = NULL;
+ SetPriority(aPriority);
+ iSchema = aSchema;
+
+ // prep to copy
+ iData = NULL;
+ iPath = NULL;
+ iURL = NULL;
+ iUserName = NULL;
+ iPassword = NULL;
+
+ // copy
+ iActionType = aActionType;
+
+ iData = &aData;
+ if ( aPath != KNullDesC )
+ {
+ iPath = HBufC::NewL( aPath.Length() );
+ iPath->Des().Append( aPath );
+ }
+ if ( aURL != KNullDesC )
+ {
+ iURL = HBufC::NewL( aURL.Length() );
+ iURL->Des().Append( aURL );
+ }
+ if ( aUserName != KNullDesC )
+ {
+ iUserName = HBufC::NewL( aUserName.Length() );
+ iUserName->Des().Append( aUserName );
+ }
+ if ( aPassword != KNullDesC )
+ {
+ iPassword = HBufC::NewL( aPassword.Length() );
+ iPassword->Des().Append( aPassword );
+ }
+
+ LOGTEXT( _L( "CAsynchFSQAtom::ConstructL() adding AO" ) );
+ CActiveScheduler::Add( this );
+ LOGTEXT( _L( "CAsynchFSQAtom::ConstructL() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAsynchFSQAtom* CAsynchFSQAtom::NewL( CAsynchFSQ* aOwner,
+ TInt aPriority,
+ TFSQActionType aActionType,
+ TDesC8& aData,
+ const TDesC& aPath,
+ const TDesC& aURL,
+ TFSQSchemaType aSchema,
+ const TDesC& aUserName,
+ const TDesC& aPassword )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::NewL() entering" ) );
+ CAsynchFSQAtom* self = new( ELeave ) CAsynchFSQAtom();
+ CleanupStack::PushL( self );
+ self->ConstructL( aOwner,
+ aPriority,
+ aActionType,
+ aData,
+ aPath,
+ aURL,
+ aSchema,
+ aUserName,
+ aPassword );
+
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::~CAsynchFSQAtom
+// Destructor for the atom class
+// -----------------------------------------------------------------------------
+//
+CAsynchFSQAtom::~CAsynchFSQAtom()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() entering" ) );
+
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() canceling" ) );
+ Cancel();
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() canceled" ) );
+
+ // Close file
+ iFile.Close();
+
+ // Close file system
+ iFs.Close();
+
+ // Free leftover data
+ if( iData )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() deleting iData" ) );
+ delete iData;
+ iData = NULL;
+ }
+
+ if( iPath )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() deleting iPath" ) );
+ delete iPath;
+ iPath = NULL;
+ }
+
+ if( iURL )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() deleting iURL" ) );
+ delete iURL;
+ iURL = NULL;
+ }
+
+ if( iUserName )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() deleting iUserName" ) );
+ delete iUserName;
+ iUserName = NULL;
+ }
+
+ if( iPassword )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() deleting iPassword" ) );
+ delete iPassword;
+ iPassword = NULL;
+ }
+
+ if( iDelayedFileName )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() deleting iDelayedFileName" ) );
+ delete iDelayedFileName;
+ iPassword = NULL;
+ }
+
+ LOGTEXT( _L( "CAsynchFSQAtom::~CAsynchFSQAtom() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::Go
+// -----------------------------------------------------------------------------
+//
+TInt CAsynchFSQAtom::Go()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::Go() entering" ) );
+ TInt err = KErrNone;
+
+ if (( iState != EPending )||( IsActive() ))
+ {
+ err = KErrInUse;
+ }
+ else
+ {
+ // set new state
+ switch ( iActionType )
+ {
+ case EFileSave:
+ case EFileSaveAndWebUpload:
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::Go() iState => ESaving" ) );
+ iState = ESaving;
+ break;
+ }
+ case EWebUpload:
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::Go() iState => EUploading" ) );
+ iState = EUploading;
+ break;
+ }
+ default:
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::Go() undefined activity requested" ) );
+ err = KErrNotSupported;
+ break;
+ }
+ }
+
+ // initiate AO activity
+ LOGTEXT( _L( "CAsynchFSQAtom::Go() setting active" ) );
+ SetActive();
+ TRequestStatus* statusPtr = &iStatus;
+ User::RequestComplete( statusPtr, KErrNone );
+ LOGTEXT( _L( "CAsynchFSQAtom::Go() request completed" ) );
+ }
+
+ LOGTEXT( _L( "CAsynchFSQAtom::Go() returning" ) );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::GetState
+// -----------------------------------------------------------------------------
+//
+TFSQAtomState CAsynchFSQAtom::GetState()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::GetState() entering & returning" ) );
+ return iState;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::DoesLocalSave
+// -----------------------------------------------------------------------------
+//
+TBool CAsynchFSQAtom::DoesLocalSave()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::DoesLocalSave() entering" ) );
+ TBool ret = EFalse;
+ if (( iActionType == EFileSave )||( iActionType == EFileSaveAndWebUpload ))
+ {
+ ret = ETrue;
+ }
+ LOGTEXT2( _L( "CAsynchFSQAtom::DoesLocalSave() returning, ret=%d" ),ret );
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::GetPath
+// -----------------------------------------------------------------------------
+//
+const TDesC& CAsynchFSQAtom::GetPath() const
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::GetPath() entering & returning" ) );
+ return *iPath;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::DeleteLocal
+// -----------------------------------------------------------------------------
+//
+TInt CAsynchFSQAtom::DeleteLocal()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::DeleteLocal() entering" ) );
+ TInt err = KErrNone;
+
+ // delete or delayed delete
+ if (( iState == EPending ) || ( iState == ESaving )||( iState == ESavePending ))
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::DeleteLocal() delayed delete" ) );
+ // we are currently saving, so we have to delete later
+ iDelayedLocalDelete = ETrue;
+ }
+ else
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::DeleteLocal() deleting now" ) );
+ // delete now
+ err = KErrNotFound;
+ RFs fs;
+ TInt connectError = fs.Connect();
+ BaflUtils ba;
+ if( !connectError && ba.FileExists( fs, *iPath ) )
+ {
+ err = KErrNone;
+ ba.DeleteFile( fs, *iPath );
+ }
+ fs.Close();
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQAtom::DeleteLocal() returning, err=%d" ),err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::RenameLocal
+// -----------------------------------------------------------------------------
+//
+TInt CAsynchFSQAtom::RenameLocal( const TDesC& aNew )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::RenameLocal() entering" ) );
+ TInt err = KErrNone;
+
+ // delete or delayed delete
+ if (( iState == EPending ) || ( iState == ESaving )||( iState == ESavePending ))
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::RenameLocal() delayed rename" ) );
+ // we are currently saving, so we have to delete later
+ iDelayedLocalRename = ETrue;
+ TRAP( err,
+ iDelayedFileName = HBufC::NewL( aNew.Length() );
+ iDelayedFileName->Des().Append( aNew );
+ );
+ }
+ else
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::RenameLocal() renaming now" ) );
+ err = KErrNotFound;
+ RFs fs;
+ TInt connectError = fs.Connect();
+ BaflUtils ba;
+ if( !connectError && ba.FileExists( fs, *iPath ) )
+ {
+ err = KErrNone;
+ ba.RenameFile( fs, *iPath, aNew );
+ }
+ fs.Close();
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQAtom::RenameLocal() returning, err=%d" ),err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::SaveL
+// -----------------------------------------------------------------------------
+//
+void CAsynchFSQAtom::SaveL()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveL() entering" ) );
+ iError = KErrNone;
+
+ if ( iState != ESaving )
+ {
+ // the state machine is lost
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveL() bad state, leaving..." ) );
+ User::Leave( KErrGeneral );
+ }
+
+ // Init
+ iError = iFs.Connect();
+ LOGTEXT2( _L( "CAsynchFSQAtom::SaveL() fsSession.Connect iError=%d" ),iError );
+
+ // Get drive number
+ TInt drive = 0;
+ if( !iError )
+ {
+ iError = RFs::CharToDrive( iPath->Des()[0], drive );
+ LOGTEXT2( _L( "CAsynchFSQAtom::SaveL() CharToDrive iError=%d" ),iError );
+ }
+
+ // Check disk space
+ if ( !iError )
+ {
+ TBool fullDisk = EFalse;
+ TRAPD( utilErr,
+ fullDisk = SysUtil::DiskSpaceBelowCriticalLevelL(
+ &iFs, iData->Length(), drive ) );
+ if( utilErr )
+ {
+ LOGTEXT2( _L( "CAsynchFSQAtom::SaveL() SysUtil iError=%d" ),iError );
+ iError = utilErr;
+ }
+ else if( fullDisk )
+ {
+ iError = KErrDiskFull;
+ }
+ }
+
+ // Attempt to create the file
+ if( !iError )
+ {
+ if ( iOverwrite )
+ {
+ iError = iFile.Replace( iFs, iPath->Des(), EFileWrite );
+ LOGTEXT2( _L( "CAsynchFSQAtom::SaveL() file.Replace iError=%d" ),iError );
+ }
+ else
+ {
+ iError = iFile.Create( iFs, iPath->Des(), EFileWrite );
+ LOGTEXT2( _L( "CAsynchFSQAtom::SaveL() file.Open iError=%d" ),iError );
+ }
+ }
+
+ // Write the file
+ if( !iError )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveL() about to write" ) );
+ SetActive();
+ iFile.Write( *iData, iStatus );
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveL() write requested" ) );
+ }
+
+ // Update state
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveL() iState => ESavePending" ) );
+ iState = ESavePending;
+
+ // leave if error
+ if ( iError )
+ {
+ LOGTEXT2( _L( "CAsynchFSQAtom::SaveL() Leaving with iError=%d" ),iError );
+ User::Leave( iError );
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQAtom::SaveL() exiting, iError=%d" ), iError );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::SaveCleanupL
+// -----------------------------------------------------------------------------
+//
+void CAsynchFSQAtom::SaveCleanupL()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() entering" ) );
+
+ if ( iState != ESavePending )
+ {
+ // the state machine is lost
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() bad state, leaving..." ) );
+ User::Leave( KErrGeneral );
+ }
+
+ // Flush file.
+ if( !iError )
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() flushing" ) );
+ iError = iFile.Flush();
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() flushed" ) );
+ }
+
+ // Close file
+ iFile.Close();
+
+ // Delayed rename, if needed
+ if (( !iError ) && ( iDelayedLocalRename ))
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() doing delayed rename" ) );
+ BaflUtils ba;
+ if( ba.FileExists( iFs, *iPath ) )
+ {
+ iError = KErrNone;
+ TPtrC newPath = *iDelayedFileName;
+ ba.RenameFile( iFs, *iPath, newPath );
+ }
+ iDelayedLocalRename = EFalse;
+ }
+
+ // Delayed delete, if needed
+ if (( !iError ) && ( iDelayedLocalDelete ))
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() doing delayed delete" ) );
+ iError = KErrNotFound;
+ BaflUtils ba;
+ if( ba.FileExists( iFs, *iPath ) )
+ {
+ iError = KErrNone;
+ ba.DeleteFile( iFs, *iPath );
+ }
+ iDelayedLocalDelete = EFalse;
+ LOGTEXT2( _L( "CAsynchFSQAtom::SaveCleanupL() delete done, iError=%d" ), iError );
+ }
+
+ // Close file system
+ iFs.Close();
+
+ // Update state
+ switch ( iActionType )
+ {
+ case EFileSave:
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() iState => EComplete" ) );
+ iState = EComplete;
+ break;
+ }
+ case EFileSaveAndWebUpload:
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() iState => EUploading" ) );
+ iState = EUploading;
+
+ // re-initiate AO activity
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() setting active" ) );
+ SetActive();
+ TRequestStatus* statusPtr = &iStatus;
+ User::RequestComplete( statusPtr, KErrNone );
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() request completed" ) );
+ break;
+ }
+ default:
+ {
+ // the state machine is lost
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() bad action, leaving" ) );
+ User::Leave( KErrGeneral );
+ break;
+ }
+ }
+
+ // report completion
+ LOGTEXT2( _L( "CAsynchFSQAtom::SaveCleanupL() notifying, iError=%d" ), iError );
+ iOwner->Notify( iError );
+
+ LOGTEXT( _L( "CAsynchFSQAtom::SaveCleanupL() exiting" ));
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::UploadL
+// -----------------------------------------------------------------------------
+//
+void CAsynchFSQAtom::UploadL()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadL() entering" ) );
+ iError = KErrNone;
+
+ if ( iState != EUploading )
+ {
+ // the state machine is lost
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadL() bad state, leaving..." ) );
+ User::Leave( KErrGeneral );
+ }
+
+ // This activity is not yet supported, so just feign completion
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadL() iState => EComplete" ) );
+ iState = EUploadPending;
+
+ // re-initiate AO activity
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadL() setting active" ) );
+ SetActive();
+ TRequestStatus* statusPtr = &iStatus;
+ User::RequestComplete( statusPtr, KErrNone );
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadL() request completed" ) );
+
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadL() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::UploadCleanup
+// -----------------------------------------------------------------------------
+//
+void CAsynchFSQAtom::UploadCleanupL()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadCleanupL() entering" ) );
+
+ if ( iState != ESaving )
+ {
+ // the state machine is lost
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadCleanupL() bad state, leaving..." ) );
+ User::Leave( KErrGeneral );
+ }
+
+ // This activity is not yet supported, so just feign completion
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadCleanupL() iState => EComplete" ) );
+ iState = EComplete;
+
+ // report completion
+ LOGTEXT2( _L( "CAsynchFSQAtom::UploadCleanupL() notifying, iError=%d" ), iError );
+ iOwner->Notify( iError );
+
+ LOGTEXT( _L( "CAsynchFSQAtom::UploadCleanupL() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::ActionsLeft
+// -----------------------------------------------------------------------------
+//
+TInt CAsynchFSQAtom::ActionsLeft()
+ {
+ TInt actionsLeft = 0;
+
+ // logically, this section is liable to change if more
+ // action types are added to the class
+ switch ( iState )
+ {
+ case EPending:
+ {
+ if ( iActionType == EFileSaveAndWebUpload )
+ {
+ actionsLeft = 2;
+ }
+ else
+ {
+ actionsLeft = 1;
+ }
+ break;
+ }
+ case ESaving:
+ case ESavePending:
+ {
+ if ( iActionType == EFileSave )
+ {
+ actionsLeft = 1;
+ }
+ else
+ {
+ actionsLeft = 2;
+ }
+ break;
+ }
+ case EUploading:
+ case EUploadPending:
+ {
+ actionsLeft = 1;
+ break;
+ }
+ case EComplete:
+ {
+ actionsLeft = 0;
+ break;
+ }
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQAtom::ActionsLeft() returning, actionsLeft=%d" ), actionsLeft );
+ return actionsLeft;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::RunL
+// -----------------------------------------------------------------------------
+//
+void CAsynchFSQAtom::RunL()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::RunL() entering" ) );
+
+ switch ( iState )
+ {
+ case ESaving:
+ {
+ SaveL();
+ break;
+ }
+ case ESavePending:
+ {
+ SaveCleanupL();
+ break;
+ }
+ case EUploading:
+ {
+ UploadL();
+ break;
+ }
+ case EUploadPending:
+ {
+ UploadCleanupL();
+ break;
+ }
+ default:
+ {
+ // the state machine is lost
+ LOGTEXT( _L( "CAsynchFSQAtom::RunL() bad state, leaving..." ) );
+ User::Leave( KErrGeneral );
+ break;
+ }
+ }
+
+ LOGTEXT( _L( "CAsynchFSQAtom::RunL() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CAsynchFSQAtom::RunError( TInt aError )
+ {
+ LOGTEXT2( _L( "CAsynchFSQAtom::RunError() entering, aError=%d" ), aError );
+ // notify and wait for teardown
+ iState = EComplete;
+ iOwner->Notify( aError );
+ LOGTEXT( _L( "CAsynchFSQAtom::RunError() returning" ) );
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQAtom::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CAsynchFSQAtom::DoCancel()
+ {
+ LOGTEXT( _L( "CAsynchFSQAtom::DoCancel() entering" ) );
+
+ LOGTEXT( _L( "CAsynchFSQAtom::DoCancel() exit" ) );
+ }
+
+
+// End of File