--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/remotestoragefw/remotefileengine/src/rsfwwaitnotemanager.cpp Thu Dec 17 09:07:59 2009 +0200
@@ -0,0 +1,564 @@
+/*
+* Copyright (c) 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: Global wait notes used in Remote File Engine
+*
+*/
+
+
+// INCLUDE FILES
+#include <pathinfo.h>
+#include <CAknMemorySelectionDialog.h>
+#include <RemoteFileEngine.rsg>
+#include <aknnotpi.rsg>
+#include <AknGlobalConfirmationQuery.h>
+#include <StringLoader.h>
+#include <CDirectoryLocalizer.h>
+#include <AknGlobalNote.h>
+#include <bautils.h>
+
+#include "rsfwwaitnotemanager.h"
+#include "rsfwrfeserver.h"
+#include "sysutil.h"
+#include "mdebug.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::CRsfwWaitNoteManager
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CRsfwWaitNoteManager::CRsfwWaitNoteManager() :
+ CActive( CActive::EPriorityUserInput )
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::ConstructL()
+ {
+ DEBUGSTRING(("CRsfwWaitNoteManager::ConstructL"));
+ CActiveScheduler::Add( this );
+ iOpState = ERemoteWaitNoteStateOk;
+
+ // read wait note txt:s from the localization file
+ TFileName resourceFile;
+ resourceFile.Copy(KResourceFile);
+ BaflUtils::NearestLanguageFile(CRsfwRfeServer::Env()->iFs,resourceFile);
+
+ DEBUGSTRING16(("opening resource file '%S'", &resourceFile));
+ iResourceFile.OpenL(CRsfwRfeServer::Env()->iFs, resourceFile);
+ iResourceFile.ConfirmSignatureL();
+ DEBUGSTRING(("resource file ok"));
+
+ // pre-read the most common strings
+ HBufC8* warningNoteLabel = iResourceFile.AllocReadL(R_WAIT_NOTE_DISC_WARNING);
+ CleanupStack::PushL(warningNoteLabel);
+ iResourceReader.SetBuffer(warningNoteLabel);
+ iNoteTxt = iResourceReader.ReadHBufCL();
+ CleanupStack::PopAndDestroy(warningNoteLabel);
+
+ iAvkonNoteId = 0;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRsfwWaitNoteManager* CRsfwWaitNoteManager::NewL()
+ {
+ CRsfwWaitNoteManager* self = new ( ELeave ) CRsfwWaitNoteManager();
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRsfwWaitNoteManager::~CRsfwWaitNoteManager()
+ {
+ Deque();
+ iResourceFile.Close();
+
+
+ if (iNoteTxt)
+ {
+ delete iNoteTxt;
+ }
+ if (iAuthRequest)
+ {
+ delete iAuthRequest;
+ }
+
+ if (iGlobalNoteRequest)
+ {
+ delete iGlobalNoteRequest;
+ }
+
+ if (iSaveToRequest)
+ {
+ delete iSaveToRequest;
+ iSaveToRequest = NULL;
+ }
+
+ iNotifier.Close();
+
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::StartWaitNoteL
+// Start to display a wait note.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CRsfwWaitNoteManager::StartWaitNoteL(
+ TRemoteOperationType aOpType,
+ CRsfwWaitNoteStateMachine* aOperation)
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::StartWaitNoteL"));
+
+ // It is possible that when this function is called there already is
+ // a wait note. In this case we allow the new operation and its wait note
+ // to override the ongoing concurrent operation's wait note.
+ // However, we want to protect some dialogs.
+ // These are
+ // 1) Wait note when uploading a file
+ // The reason for this is that the wait note is in fact the only indication
+ // the user gets about the status of writing a file to the server.
+ // 2) User query when uploading failed and we need to give time to read
+ // the dialogs about selecting a new location from a local media
+ if (!((iOpState == ERemoteWaitNoteStateInProgress) && (iOpType == ERemoteSaveToLocal)))
+ {
+ iOperation = aOperation;
+
+ // cancel whatever is there currently
+ CancelWaitNoteL(iNoteId);
+
+ DEBUGSTRING16(("CRsfwWaitNoteManager::CancelWaitNoteL returned"));
+
+ // don't make asynchronous request when there has been already any!
+ if(!IsActive())
+ {
+ if (aOpType <= ERemoteSaveToLocal)
+ {
+ DEBUGSTRING16(("calling iNotifier.Connect()"));
+ User::LeaveIfError(iNotifier.Connect());
+ DEBUGSTRING16(("called iNotifier.Connect()"));
+ }
+
+ switch( aOpType )
+ {
+ // these "basic request" pass the method and drive friendly name
+ // drive friendly name is not needed for wait notes, only for retryrequest
+ // so there could be even more simple IPC struct without it
+ // (on the other hand, current param struct would easily allow showing the friendly name
+ // with the wait notes)
+ case ERemoteOpConnecting:
+ case ERemoteOpDirDownloading:
+ case ERemoteUnavailableRetry:
+ {
+ iNotifier.StartNotifierAndGetResponse(iStatus, KRsfwNotifierPluginUID,
+ *iGlobalNoteRequest, *iGlobalNoteRequest);
+ }
+ break;
+ case ERemoteWarnDisconnect:
+ {
+ CAknGlobalConfirmationQuery* iQuery = CAknGlobalConfirmationQuery::NewL();
+ iQuery->ShowConfirmationQueryL(iStatus, *iNoteTxt);
+ break;
+ }
+ case ERemoteOpAuthDialog:
+ {
+ DEBUGSTRING16(("calling ERemoteOpAuthDialog/ERemoteUnavailableRetry"));
+ // same struct used for input and output params.
+ iNotifier.StartNotifierAndGetResponse(iStatus, KRsfwNotifierPluginUID,
+ *iAuthRequest, *iAuthRequest);
+ break;
+ }
+
+ case ERemoteSaveToLocal:
+ DEBUGSTRING16(("calling ERemoteOpAuthDialog/ERemoteSaveToLocal"));
+ iNotifier.StartNotifierAndGetResponse(iStatus, KRsfwNotifierPluginUID,
+ *iSaveToRequest, *iSaveToRequest);
+ break;
+ }
+
+ DEBUGSTRING16(("CRsfwWaitNoteManager calling SetActive()"));
+ SetActive();
+
+
+ DEBUGSTRING16(("CRsfwWaitNoteManager::StartWaitNoteL function returns"));
+ iOpType = aOpType;
+ iOpState = ERemoteWaitNoteStateInProgress;
+ return ++iNoteId;
+ }
+ else
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::StartWaitNoteL attempt to make request when object is active"));
+ DEBUGSTRING16(("CRsfwWaitNoteManager::StartWaitNoteL function returns 0"));
+ return 0; // caller didn't "get" the note
+ }
+ }
+ else
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::StartWaitNoteL function returns 0"));
+ return 0; // caller didn't "get" the note
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::CancelWaitNote
+// Cancel a wait note.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::CancelWaitNoteL(TInt aNoteId)
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::CancelWaitNoteL, iOpState = %d, iOpType = %d", iOpState, iOpType));
+ // Cancel a wait note if there is one and it is the same one that
+ // the caller thinks it is removing...
+ if ( (iOpState == ERemoteWaitNoteStateInProgress ) && (aNoteId == iNoteId))
+ {
+
+ if (iOpType <= ERemoteSaveToLocal)
+ {
+ // notifier plugin dialogs
+ User::LeaveIfError(iNotifier.CancelNotifier(KRsfwNotifierPluginUID));
+ iNotifier.Close();
+ }
+
+
+ // Dismiss qlobal query
+ if ( iQuery )
+ {
+ iQuery->CancelConfirmationQuery();
+ delete iQuery;
+ iQuery = NULL;
+ }
+
+
+
+ iOpState = ERemoteWaitNoteStateOk;
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::RunL
+// Handles an active object’s request completion event.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::RunL()
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::RunL, status=%d, optype=%d", iStatus.Int(), iOpType));
+ CancelWaitNoteL(iNoteId);
+
+ TInt errorCode = iStatus.Int();
+
+ switch (iOpType)
+ {
+ case ERemoteWarnDisconnect:
+ if (iStatus == EAknSoftkeyYes)
+ {
+ errorCode = KErrNone;
+ }
+ else
+ {
+ errorCode = KErrCancel;
+ }
+ break;
+ case ERemoteOpAuthDialog:
+ iAuthCredentials->iUserName = (*iAuthRequest)().iUserName;
+ iAuthCredentials->iPassword = (*iAuthRequest)().iPassword;
+ delete iAuthRequest;
+ iAuthRequest = NULL;
+ break;
+ case ERemoteUnavailableRetry:
+ case ERemoteOpConnecting:
+ case ERemoteOpDirDownloading:
+ delete iGlobalNoteRequest;
+ iGlobalNoteRequest = NULL;
+ break;
+ case ERemoteSaveToLocal:
+ iSaveParams->iFileName = (*iSaveToRequest)().iFileName;
+ delete iSaveToRequest;
+ iSaveToRequest = NULL;
+ break;
+ }
+
+ if (iOperation) // is some operation waiting for info about this wait note?
+ {
+ if (((iOpType == ERemoteOpDirDownloading) || (iOpType == ERemoteOpConnecting))
+ && (errorCode == KErrCancel))
+ {
+ DEBUGSTRING16(("calling iOperation->CancelTransaction()"));
+ // we received from the dialog information that user wants to cancel
+ // call CancelTransaction on the access protocol module
+ // this then must cancel our pending transaction
+ // so we finally get to the ErrorL() state of the state machine
+ iOperation->CancelTransaction();
+ }
+
+ else
+ {
+ DEBUGSTRING16(("calling iOperation->HandleRemoteAccessResponse()"));
+ iOperation->HandleRemoteAccessResponse(0, errorCode);
+ }
+ }
+
+ }
+
+// ----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::RunError
+// ----------------------------------------------------------------------------
+//
+TInt CRsfwWaitNoteManager::RunError(TInt /*aError*/)
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::RunError"));
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::DoCancel()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::ShowAddressNotFoundErrorL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::ShowAddressNotFoundErrorL(
+ const TDesC& aFriendlyName)
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::ShowAddressNotFoundErrorL (drive '%S')", &aFriendlyName));
+ RResourceFile resourceFile;
+ TResourceReader resourceReader;
+
+ // get the name of the localized resource file
+ TFileName resourceFileName;
+ resourceFileName.Copy(KResourceFile);
+ BaflUtils::NearestLanguageFile(CRsfwRfeServer::Env()->iFs,resourceFileName);
+
+ DEBUGSTRING16(("opening resource file '%S'", &resourceFileName));
+ // read localized string from resource file
+ resourceFile.OpenL(CRsfwRfeServer::Env()->iFs, resourceFileName);
+ CleanupClosePushL(resourceFile);
+ resourceFile.ConfirmSignatureL();
+ DEBUGSTRING(("resource file ok"));
+ HBufC8* noteBuffer = resourceFile.AllocReadLC(R_NOTE_ADDRESS_NOT_AVAILABLE);
+ resourceReader.SetBuffer(noteBuffer);
+ HBufC* noteText = resourceReader.ReadHBufCL();
+ CleanupStack::PushL(noteText);
+
+ // S60 .loc formatting
+ HBufC* formattedText = HBufC::NewLC(noteText->Length() + aFriendlyName.Length());
+ TPtr fprt = formattedText->Des();
+ StringLoader::Format(fprt, *noteText , -1, aFriendlyName);
+
+ // error dialog
+ CAknGlobalNote* errorDialog = CAknGlobalNote::NewLC();
+ errorDialog->ShowNoteL(EAknGlobalErrorNote, *formattedText);
+ CleanupStack::PopAndDestroy(5); // resourceFile, noteBuffer, noteText, formattedText, errordialog
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::SetAuthenticationDialogL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::SetAuthenticationDialogL(TRsfwAuthenticationDlgRequest& aAuthRequest)
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::SetAuthenticationDialogL"));
+ if (iAuthRequest)
+ {
+ delete iAuthRequest;
+ iAuthRequest = NULL;
+ }
+ iAuthRequest = new (ELeave) TRsfwAuthParamsPckg();
+
+ (*iAuthRequest)() = aAuthRequest;
+ iAuthCredentials = &aAuthRequest;
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::SetGlobalNoteRequestL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::SetGlobalNoteRequestL(TRsfwNotPluginRequest& aRequestStruct)
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::SetGlobalNoteRequestL"));
+ if (iGlobalNoteRequest)
+ {
+ delete iGlobalNoteRequest;
+ iGlobalNoteRequest = NULL;
+ }
+
+ iGlobalNoteRequest = new (ELeave) TRsfwRetryParamsPckg();
+ (*iGlobalNoteRequest)() = aRequestStruct;
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::SetSaveToDialogRequestL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::SetSaveToDialogRequestL(TRsfwSaveToDlgRequest& aSaveToRequest)
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::SetSaveToDialogRequestL"));
+ if (iSaveToRequest)
+ {
+ delete iSaveToRequest;
+ iSaveToRequest = NULL;
+ }
+
+ iSaveToRequest = new (ELeave) TRsfwSaveToParamsPckg();
+
+ (*iSaveToRequest)() = aSaveToRequest;
+ iSaveParams = &aSaveToRequest;
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::ShowFileSavedToDialogL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::ShowFileSavedToDialogL(const TDesC& aPath )
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::ShowFileSavedToDialogL"));
+ HBufC8* textbuffer = iResourceFile.AllocReadL(R_CONFIRM_FILE_SAVED_TO);
+ CleanupStack::PushL(textbuffer);
+ iResourceReader.SetBuffer(textbuffer);
+ HBufC* text = iResourceReader.ReadHBufCL();
+ CleanupStack::PushL(text);
+ HBufC* formattedText = NULL;
+
+ // extract the path
+ TParse parser;
+ parser.Set(aPath, NULL, NULL);
+ // try to get localized path
+ CDirectoryLocalizer* localizer = CDirectoryLocalizer::NewL();
+ CleanupStack::PushL(localizer);
+ // S60 localizer requires also drive letter,
+ // i.e. matches are like C:\\Data\\Images
+ localizer->SetFullPath(parser.DriveAndPath());
+ TPtrC localizedName = localizer->LocalizedName();
+
+ if (localizedName != KNullDesC)
+ {
+ formattedText = HBufC::NewMaxLC(text->Length() +
+ localizedName.Length());
+
+ TPtr formatPtr(formattedText->Des());
+ StringLoader::Format(formatPtr, *text, -1, localizedName);
+ }
+ else
+ {
+ formattedText = HBufC::NewMaxLC(text->Length() +
+ aPath.Length());
+
+ TPtr formatPtr(formattedText->Des());
+ StringLoader::Format(formatPtr, *text, -1, parser.Path());
+ }
+
+
+ CAknGlobalNote* dlg = CAknGlobalNote::NewLC();
+ dlg->ShowNoteL(EAknGlobalInformationNote, *formattedText );
+ CleanupStack::PopAndDestroy(5); // textbuffer, text, localizer, formattedtext, dlg
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::ShowFailedSaveNoteL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::ShowFailedSaveNoteL()
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::ShowFailedSaveNoteL"));
+ ShowGlobalInformationNoteL(R_SAVING_FAILED);
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::ShowFailedSaveNoteL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::ShowNoNetworkCoverageNoteL()
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::ShowNoNetworkCoverageNoteL"));
+ ShowGlobalInformationNoteL(R_NO_NETWORK_COVERAGE);
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::ShowOfflineNotPossibleNoteL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::ShowOfflineNotPossibleNoteL()
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::ShowOfflineNotPossibleNoteL"));
+ ShowGlobalInformationNoteL(R_OFFLINE_NOT_POSSIBLE);
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::ShowOutOfMemoryNoteL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::ShowOutOfMemoryNoteL()
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::ShowOutOfMemoryNoteL"));
+ ShowGlobalInformationNoteL(R_RAM_OUT_OF_MEMORY);
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::ShowGlobalInformationNoteL
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::ShowGlobalInformationNoteL(TInt aResourceId)
+ {
+ HBufC8* textbuffer = iResourceFile.AllocReadL(aResourceId);
+ CleanupStack::PushL(textbuffer);
+ iResourceReader.SetBuffer(textbuffer);
+ HBufC* text = iResourceReader.ReadHBufCL();
+ CleanupStack::PushL(text);
+ CAknGlobalNote* dlg = CAknGlobalNote::NewLC();
+ dlg->ShowNoteL(EAknGlobalInformationNote, *text );
+ CleanupStack::PopAndDestroy(3); // textBuffer, text, dlg
+ }
+
+// -----------------------------------------------------------------------------
+// CRsfwWaitNoteManager::ResetOperation
+// -----------------------------------------------------------------------------
+//
+void CRsfwWaitNoteManager::ResetOperation()
+ {
+ DEBUGSTRING16(("CRsfwWaitNoteManager::ResetOperation"));
+ iOperation = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+
+// End of File