--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/camappengine/asynchfilesavequeue/src/asynchfsq.cpp Wed Sep 01 12:23:23 2010 +0100
@@ -0,0 +1,369 @@
+/*
+* 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 File Saving Queue
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <asynchfsq.h>
+#include <bautils.h> // for deleting files
+#include "asynchatom.h"
+
+// CONSTANTS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::CAsynchFSQ
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAsynchFSQ::CAsynchFSQ()
+ {
+ LOGTEXT( _L( "CAsynchFSQ::CAsynchFSQ() entering" ) );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAsynchFSQ::ConstructL()
+ {
+ LOGTEXT( _L( "CAsynchFSQ::ConstructL() entering" ) );
+ iPriority = EPriorityNormal;
+ iManualStart = EFalse;
+ LOGTEXT( _L( "CAsynchFSQ::ConstructL() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAsynchFSQ* CAsynchFSQ::NewL()
+ {
+ LOGTEXT( _L( "CAsynchFSQ::NewL() entering" ) );
+ CAsynchFSQ* self = new( ELeave ) CAsynchFSQ();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::~CAsynchFSQ
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CAsynchFSQ::~CAsynchFSQ()
+ {
+ LOGTEXT( _L( "CAsynchFSQ::~CAsynchFSQ() entering" ) );
+
+ // clean up queues
+ iQueue.ResetAndDestroy();
+
+ LOGTEXT( _L( "CAsynchFSQ::~CAsynchFSQ() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::SaveAndDestroy
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAsynchFSQ::SaveAndDestroy( TDesC8& aData, const TDesC& aPath, TBool aOverwrite )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::SaveAndDestroy() entering" ) );
+
+ TInt err = KErrNone;
+
+ // return if NULL descriptor.
+ if( !&aData )
+ {
+ return KErrArgument;
+ }
+
+ iOverwrite = aOverwrite;
+
+ LOGTEXT2( _L( "CAsynchFSQ::SaveAndDestroy() iQueue.Count()=%d" ), iQueue.Count() );
+ LOGTEXT2( _L( "CAsynchFSQ::SaveAndDestroy() ActionsLeft()=%d" ), ActionsLeft() );
+
+ // add data to our queue
+ err = Enqueue( EFileSave, aData, aPath, KNullDesC, ENullSchemaType, KNullDesC, KNullDesC );
+
+ LOGTEXT2( _L( "CAsynchFSQ::SaveAndDestroy() iManualStart=%d" ), iManualStart );
+
+ if ( !err && !iManualStart )
+ {
+ err = Go();
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQ::SaveAndDestroy() returning err=%d" ), err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::Go
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAsynchFSQ::Go()
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Go() entering" ) );
+ TInt err = KErrNone;
+
+ // make sure the queue has at least one object
+ if( iQueue.Count() == 0 )
+ {
+ err = KErrNotReady;
+ }
+
+ // activate AO's
+
+ for( TInt i = 0; i < iQueue.Count(); i++ )
+ {
+ if(( !err )&&( iQueue[i]->GetState() == EPending ))
+ {
+ err = iQueue[i]->Go();
+ }
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQ::Go() returning err=%d" ), err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::SetManualStart
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAsynchFSQ::SetManualStart( TBool aManualStart )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::ManualStart() entering" ) );
+ iManualStart = aManualStart;
+ LOGTEXT( _L( "CAsynchFSQ::ManualStart() returning" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::Delete
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAsynchFSQ::Delete( const TDesC& aPath )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Delete() entering" ) );
+ TInt err = KErrNotFound;
+
+ // search for path name and delete if found
+ for( TInt i = 0; i < iQueue.Count(); i++ )
+ {
+ if ( iQueue[i]->DoesLocalSave() )
+ {
+ if ( (iQueue[i]->GetPath()).Compare( aPath ) == 0 )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Delete() file found, deleting" ) );
+ err = iQueue[i]->DeleteLocal();
+ }
+ }
+ }
+
+ // if still not found,
+ // attempt to delete from file system
+ if ( err == KErrNotFound )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Delete() not in queues, trying file system" ) );
+ RFs fs;
+ TInt connectError = fs.Connect();
+ BaflUtils ba;
+ if( !connectError && ba.FileExists( fs, aPath ) )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Delete() exists, deleting from file system" ) );
+ err = KErrNone;
+ ba.DeleteFile( fs, aPath );
+ }
+ fs.Close();
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQ::Delete() returning err=%d" ), err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::Rename
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAsynchFSQ::Rename( const TDesC& aOld, const TDesC& aNew )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Rename() entering" ) );
+
+ TInt err = KErrNotFound;
+
+ // search for path name and delete if found
+ for( TInt i = 0; i < iQueue.Count(); i++ )
+ {
+ if ( iQueue[i]->DoesLocalSave() )
+ {
+ if ( (iQueue[i]->GetPath()).Compare( aOld ) == 0 )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Delete() file found, renaming" ) );
+ err = iQueue[i]->RenameLocal( aNew );
+ }
+ }
+ }
+
+ // if still not found,
+ // attempt to rename from file system
+ if ( err == KErrNotFound )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Rename() not in queues, trying file system" ) );
+ RFs fs;
+ TInt connectError = fs.Connect();
+ BaflUtils ba;
+ if( !connectError && ba.FileExists( fs, aOld ) )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Rename() exists, renaming in file system" ) );
+ err = KErrNone;
+ ba.RenameFile( fs, aOld, aNew );
+ }
+ fs.Close();
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQ::Rename() returning err=%d" ), err );
+ return err;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::SetThreadPriority
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAsynchFSQ::SetPriority( TInt aPriority )
+ {
+ LOGTEXT2( _L( "CAsynchFSQ::SetThreadPriority() entering aPriority=%d" ), aPriority );
+ iPriority = aPriority;
+ LOGTEXT( _L( "CAsynchFSQ::SetThreadPriority() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::SetCallback
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAsynchFSQ::SetCallback( MAsynchFSQObserver* aCallback )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::SetCallback() entering" ) );
+ iCallback = aCallback;
+ LOGTEXT( _L( "CAsynchFSQ::SetCallback() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::ActionsLeft
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAsynchFSQ::ActionsLeft()
+ {
+ TInt actionsLeft = 0;
+
+ for( TInt i = 0; i < iQueue.Count(); i++ )
+ {
+ actionsLeft += iQueue[i]->ActionsLeft();
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQ::ActionsLeft() actionsLeft=%d" ), actionsLeft );
+ return actionsLeft;
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::Cancel
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAsynchFSQ::Cancel()
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Cancel() entering" ) );
+
+ while( iQueue.Count() )
+ {
+ delete iQueue[0];
+ iQueue[0] = NULL;
+ iQueue.Remove( 0 ); // Data MUST be deleted first
+ }
+
+ LOGTEXT( _L( "CAsynchFSQ::Cancel() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::Notify
+// -----------------------------------------------------------------------------
+//
+void CAsynchFSQ::Notify( TInt aError )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Notify() entering" ) );
+ iCallback->MAsynchFSQEvent( aError );
+
+ // Scan and delete completed atoms
+ for( TInt i = 0; i < iQueue.Count(); i++ )
+ {
+ if( iQueue[i]->ActionsLeft() == 0 )
+ {
+ delete iQueue[i];
+ iQueue[i] = NULL;
+ iQueue.Remove( i ); // Data MUST be deleted first
+ i--;
+ }
+ }
+
+ LOGTEXT( _L( "CAsynchFSQ::Notify() exiting" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAsynchFSQ::Enqueue
+// -----------------------------------------------------------------------------
+//
+TInt CAsynchFSQ::Enqueue( TFSQActionType aActionType, TDesC8& aData,
+ const TDesC& aPath, const TDesC& aURL,
+ TFSQSchemaType aSchema, const TDesC& aUserName,
+ const TDesC& aPassword )
+ {
+ LOGTEXT( _L( "CAsynchFSQ::Enqueue() entering" ) );
+
+ TInt err = KErrNone;
+
+ TInt queueError = KErrNone;
+ TRAP( err,
+ // create atom
+ CAsynchFSQAtom* atom =
+ CAsynchFSQAtom::NewL( this,
+ iPriority,
+ aActionType,
+ aData,
+ aPath,
+ aURL,
+ aSchema,
+ aUserName,
+ aPassword );
+
+ //append to queue
+ iQueue.Append( atom );
+ );
+
+ if ( !err && queueError )
+ {
+ err = queueError;
+ }
+
+ LOGTEXT2( _L( "CAsynchFSQ::Enqueue() returning err=%d" ), err );
+ return err;
+ }
+
+// End of File