--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsnotifierplugins/src/sennotplugindlgimpl.cpp Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,567 @@
+/*
+* 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:
+*
+*/
+
+
+
+
+
+
+
+
+// INCLUDE FILES
+#include <aknnotewrappers.h>
+#include <AknNotifyStd.h>
+#include <ConeResLoader.h>
+#include <StringLoader.h>
+
+#ifndef RD_SEN_COMPILE_SIS_PACKAGE_FILES
+ #include <SenNotifierPluginDlgImpl.rsg>
+#else
+ #include <WsNotifierPluginDlgImpl.rsg>
+#endif
+
+// This may be angle bracketed later..
+#include "logger.h"
+#include "sennotplugindlg.h" // client api
+#include "sennotplugindlgimpl.h"
+
+#include <implementationproxy.h>
+
+
+#ifdef EKA2 // 3.0
+ #ifndef RD_SEN_COMPILE_SIS_PACKAGE_FILES
+ _LIT(KResourceFilePath, "\\private\\10003a4a\\SenNotifierPluginDlgImpl.RSC");
+ #else
+ _LIT(KResourceFilePath, "\\private\\10003a4a\\WsNotifierPluginDlgImpl.RSC");
+ #endif
+#else // not EKA2 (2.0, 2.1, 2.6, 2.8)
+ #ifndef RD_SEN_COMPILE_SIS_PACKAGE_FILES
+ _LIT(KResourceFilePath, "\\system\\notifiers\\SenNotifierPluginDlgImpl.RSC");
+ #else
+ _LIT(KResourceFilePath, "\\system\\notifiers\\WsNotifierPluginDlgImpl.RSC");
+ #endif
+#endif // EKA2
+
+#ifdef EKA2
+void CreateNotifierL(CArrayPtr<MEikSrvNotifierBase2>* aNotifiers)
+ {
+ MEikSrvNotifierBase2* notifier;
+ notifier = CSenNotPluginDlgImpl::NewL();
+ CleanupStack::PushL(notifier);
+ aNotifiers->AppendL(notifier);
+ CleanupStack::Pop(notifier);
+ }
+#else
+void CreateNotifierL(CArrayPtr<MEikSrvNotifierBase>* aNotifiers)
+ {
+ MEikSrvNotifierBase* notifier;
+ notifier = CSenNotPluginDlgImpl::NewL();
+ CleanupStack::PushL(notifier);
+ aNotifiers->AppendL(notifier);
+ CleanupStack::Pop(notifier);
+ }
+#endif
+
+#ifdef EKA2
+EXPORT_C CArrayPtr<MEikSrvNotifierBase2>* NotifierArray()
+ {
+ DOLOG(_L("\n\n\n\n"));
+ DOLOG(_L("[ Creating notifier array ]"));
+ CArrayPtrFlat<MEikSrvNotifierBase2>* notifiers
+ = new CArrayPtrFlat<MEikSrvNotifierBase2>(1);
+ if (notifiers)
+ {
+ TRAPD(err, CreateNotifierL(notifiers));
+ if(err)
+ {
+ notifiers->ResetAndDestroy();
+ delete notifiers;
+ notifiers = NULL;
+ DOLOG(_L("[ Creating notifier array: Error. Returning NULL ]"));
+ }
+ }
+ DOLOG(_L("[ Creating notifier array: Done ]"));
+ return(notifiers);
+ }
+#else
+EXPORT_C CArrayPtr<MEikSrvNotifierBase>* NotifierArray()
+ {
+ DOLOG(_L("\n\n\n\n"));
+ DOLOG(_L("[ Creating notifier array ]"));
+ CArrayPtrFlat<MEikSrvNotifierBase>* notifiers
+ = new CArrayPtrFlat<MEikSrvNotifierBase>(1);
+ if (notifiers)
+ {
+ TRAPD(err, CreateNotifierL(notifiers));
+ if(err)
+ {
+ notifiers->ResetAndDestroy();
+ delete notifiers;
+ notifiers = NULL;
+ DOLOG(_L("[ Creating notifier array: Error. Returning NULL ]"));
+ }
+ }
+ DOLOG(_L("[ Creating notifier array: Done ]"));
+ return(notifiers);
+ }
+#endif
+
+CSenNotPluginDlgImpl* CSenNotPluginDlgImpl::NewL()
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::NewL: Starting ]"));
+ CSenNotPluginDlgImpl* dlg = new(ELeave)CSenNotPluginDlgImpl();
+ CleanupStack::PushL(dlg);
+ dlg->ConstructL();
+ CleanupStack::Pop(dlg);
+ DOLOG(_L("[ CSenNotPluginDlgImpl::NewL: Done ]"));
+ return dlg;
+ }
+
+CSenNotPluginDlgImpl::~CSenNotPluginDlgImpl()
+ {
+ Cancel();
+ Cleanup();
+ }
+
+CSenNotPluginDlgImpl::CSenNotPluginDlgImpl() : CActive(EPriorityStandard),
+ iMethod(TSenNotPluginRequest::ENoMethod)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CSenNotPluginDlgImpl::ConstructL()
+ {
+ }
+
+void CSenNotPluginDlgImpl::RunL()
+ {
+ if(iMethod == TSenNotPluginRequest::ENoMethod)
+ return; // Notifier canceled or request signaled by other means
+
+ HandleAsyncRequestL(); // show dialog
+ Cleanup();
+ }
+
+TInt CSenNotPluginDlgImpl::RunError(TInt aError)
+ {
+ iMessage.Complete(aError);
+ Cleanup();
+ return KErrNone;
+ }
+
+void CSenNotPluginDlgImpl::DoCancel()
+ {
+ }
+
+/**
+ * Called when all resources allocated by notifiers shoudl be freed.
+ */
+void CSenNotPluginDlgImpl::Release()
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::Release: Deleting this ]"));
+ delete this;
+ }
+
+/**
+ * Called when a notifier is first loaded to allow any initial construction that is required.
+ */
+#ifdef EKA2
+MEikSrvNotifierBase2::TNotifierInfo CSenNotPluginDlgImpl::RegisterL()
+#else
+MEikSrvNotifierBase::TNotifierInfo CSenNotPluginDlgImpl::RegisterL()
+#endif
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::RegisterL ]"));
+ iInfo.iUid = KSenNotifierPluginUID;
+ //iInfo.iChannel = EAknNotifierChannelConfirmationQuery; //KNotifierOutputChannelScreen;
+ iInfo.iChannel = TUid::Uid(7641863);
+ iInfo.iPriority = ENotifierPriorityLow; //ENotifierPriorityVHigh;
+ DOLOG(_L("[ CSenNotPluginDlgImpl::RegisterL: Done ]"));
+ return iInfo;
+ }
+
+/**
+ * Return the priority a notifier takes and the channels it acts on. The return value may be varied
+ * at run-time.
+ */
+#ifdef EKA2
+MEikSrvNotifierBase2::TNotifierInfo CSenNotPluginDlgImpl::Info() const
+#else
+MEikSrvNotifierBase::TNotifierInfo CSenNotPluginDlgImpl::Info() const
+#endif
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::Info ]"));
+ return iInfo;
+ }
+
+/**
+ * Start the notifier with data aBuffer and return an initial response.
+ */
+TPtrC8 CSenNotPluginDlgImpl::StartL(const TDesC8& /*aBuffer*/)
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::StartL(aBuffer): Not implemented ]"));
+ //Create and launch confirmation dialog using static function.
+ //The function returns True when the OK button is pressed.
+ DOLOG(_L("[ CSenNotPluginDlgImpl::StartL(aBuffer): Done ]"));
+ return TPtrC8(NULL, 0);
+ }
+
+void CSenNotPluginDlgImpl::HandleAsyncRequestL()
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::HandleAsyncRequestL: Starting ]"));
+
+ // Load resource file
+ CEikonEnv* eikEnv = CEikonEnv::Static();
+ if(!eikEnv)
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::HandleAsyncRequestL: EikEnv is NULL ]"));
+ }
+ else
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::HandleAsyncRequestL: EikEnv is valid ]"));
+ }
+
+ // Figure out the resource file drive trusting that
+ // it must be the same drive from which the DLL was loaded.
+
+ TParse parse;
+ TFileName tempFileName;
+
+ Dll::FileName(tempFileName);
+ parse.SetNoWild(tempFileName, NULL, NULL);
+ // We need to set the default path to be used for future file access, because
+ // it is always initialised to c: and the voice control files may be stored
+ // on the d: drive.
+
+ TFileName filename;
+ filename.Append(parse.Drive());
+ filename.Append(KResourceFilePath);
+
+// TFileName filename(KResourceFile);
+
+
+ DOLOG(filename);
+
+ RConeResourceLoader resLoader(*eikEnv);
+ if(resLoader.Open(filename) != KErrNone)
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::HandleAsyncRequestL: Failed to open resource file ]"));
+ }
+ else
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::HandleAsyncRequestL: Resource file opened OK. ]"));
+ }
+
+ CleanupClosePushL(resLoader);
+
+ TInt result = KErrGeneral;
+ switch(iMethod)
+ {
+ case TSenNotPluginRequest::EAuthenticationDlg:
+ result = ShowAuthenticationDialogL((TAuthenticationDlgRequest*)&((*iRequest)()),
+ (TAuthenticationDlgResponse*)&((*iResponse)()));
+ break;
+ case TSenNotPluginRequest::EAllowRegisterDlg:
+ result = ShowAllowRegisterDialogL((TAllowRegisterDlgRequest*)&((*iRequest)()),
+ (TAllowRegisterDlgResponse*)&((*iResponse)()));
+ break;
+ case TSenNotPluginRequest::EAllowUnRegisterDlg:
+ result = ShowAllowUnRegisterDialogL((TAllowUnRegisterDlgRequest*)&((*iRequest)()),
+ (TAllowUnRegisterDlgResponse*)&((*iResponse)()));
+ break;
+ case TSenNotPluginRequest::EAskSaveDlg:
+ result = ShowAskSaveDialogL((TAskSaveDlgRequest*)&((*iRequest)()),
+ (TAskSaveDlgResponse*)&((*iResponse)()));
+ break;
+ default:
+ break;
+ }
+
+ if(iCancelled)
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::HandleAsyncRequestL: Operation had been cancelled. Completing with KErrCancel ]"));
+ iMessage.Complete(KErrCancel);
+ }
+ else
+ {
+ if(result == KErrNone)
+#ifdef EKA2
+ iMessage.WriteL(iReplySlot, *iResponse);
+#else
+ iMessage.WriteL(iReplyPtr, *iResponse);
+#endif
+ iMessage.Complete(result);
+ }
+
+ CleanupStack::PopAndDestroy(); // resLoader
+ DOLOG(_L("[ CSenNotPluginDlgImpl::HandleAsyncRequestL: Done ]"));
+
+ }
+
+/**
+ * Start the notifier with data aBuffer. aMessage should be completed when the notifier is deactivated.
+ * May be called multiple times if more than one client starts the notifier. The notifier is immediately
+ * responsible for completing aMessage.
+ */
+#ifdef EKA2
+void CSenNotPluginDlgImpl::StartL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage)
+#else
+void CSenNotPluginDlgImpl::StartL(const TDesC8& aBuffer, const TAny* aReturnVal, RMessage aMessage)
+#endif
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::StartL(aBuffer, aReturnVal, aMessage): Starting ]"));
+
+ if(iMethod != TSenNotPluginRequest::ENoMethod)
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::StartL(aBuffer, aReturnVal, aMessage): Busy. Returning KErrInUse ]"));
+ aMessage.Complete(KErrInUse);
+ return;
+ }
+
+ Cleanup();
+
+ iRequest = new(ELeave)TPckgBuf<TSenNotPluginRequest>();
+ iRequest->Copy(aBuffer.Ptr(), sizeof(TSenNotPluginRequest));
+ iResponse = new(ELeave)TPckgBuf<TSenNotPluginResponse>();
+
+ iMethod = (*iRequest)().Method();
+ iMessage = aMessage;
+#ifdef EKA2
+ iReplySlot = aReplySlot;
+#else
+ iReplyPtr = aReturnVal;
+#endif
+
+ iStatus = KRequestPending;
+ TRequestStatus* status = &iStatus;
+ SetActive();
+ User::RequestComplete(status, KErrNone);
+
+ DOLOG(_L("[ CSenNotPluginDlgImpl::StartL(aBuffer, aReturnVal, aMessage): Done ]"));
+ }
+
+
+TInt CSenNotPluginDlgImpl::ShowAuthenticationDialogL(TAuthenticationDlgRequest* aRequest,
+ TAuthenticationDlgResponse* aResponse)
+ {
+ // Note: default password is currently unsupported!
+ DOLOG(_L("[ CSenNotPluginDlgImpl::ShowAuthenticationDialogL: Starting ]"));
+
+ TBuf<KSenMaxUsernameLength> username(aRequest->Username());
+ TBuf<KSenMaxPasswordLength> password; // Empty
+
+ DOLOG(_L("[ CSenNotPluginDlgImpl::ShowAuthenticationDialogL: Creating dialog ]"));
+ CAknMultiLineDataQueryDialog* dlg = CAknMultiLineDataQueryDialog::NewL(username, password);
+ iDialog = dlg;
+ TRAPD(err,
+ DOLOG(_L("[ CSenNotPluginDlgImpl::ShowAuthenticationDialogL: Showing dialog ]"));
+ TBool okButtonSelected = iDialog->ExecuteLD(R_CUSTOM_USERNAMEPASSWD_DIALOG);
+ if(okButtonSelected)
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::ShowAuthenticationDialogL: Ok button was selected ]"));
+ aResponse->SetData(username, password, okButtonSelected);
+ }
+ else
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::ShowAuthenticationDialogL: Cancel button was selected ]"));
+ aResponse->SetData(KNullDesC, KNullDesC, okButtonSelected);
+ }
+ )
+ dlg = NULL;
+
+#ifdef __CUSTOM_LOG_ENABLED__
+ TBuf<128> errorBuf(_L("CSenNotPluginDlgImpl::ShowAuthenticationDialogL: Done with error code = "));
+ errorBuf.AppendNum(err);
+ DOLOG(errorBuf);
+#endif
+
+ return err;
+ }
+
+TInt CSenNotPluginDlgImpl::ShowAllowRegisterDialogL(TAllowRegisterDlgRequest* /*aRequest*/,
+ TAllowRegisterDlgResponse* aResponse)
+ {
+ HBufC* prompt = StringLoader::LoadL(R_SENNOTDLG_ALLOW_REGISTER_QUERY);
+ CleanupStack::PushL(prompt);
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+ CleanupStack::PushL( dlg );
+ dlg->SetPromptL(*prompt);
+ CleanupStack::Pop( dlg );
+ CleanupStack::PopAndDestroy(prompt);
+ iDialog = dlg;
+ TRAPD(err,
+ if(dlg->ExecuteLD(R_COMMON_YES_NO_QUERY))
+ {
+ aResponse->SetOkButton(ETrue);
+ }
+ else
+ {
+ aResponse->SetOkButton(EFalse);
+ }
+ )
+ iDialog = NULL;
+
+ return err;
+ }
+
+TInt CSenNotPluginDlgImpl::ShowAllowUnRegisterDialogL(TAllowUnRegisterDlgRequest* /*aRequest*/,
+ TAllowUnRegisterDlgResponse* aResponse)
+ {
+ HBufC* prompt = StringLoader::LoadL(R_SENNOTDLG_ALLOW_UNREGISTER_QUERY);
+ CleanupStack::PushL(prompt);
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+ CleanupStack::PushL( dlg );
+ dlg->SetPromptL(*prompt);
+ CleanupStack::Pop( dlg );
+ CleanupStack::PopAndDestroy(prompt);
+ iDialog = dlg;
+ TRAPD(err,
+ if(dlg->ExecuteLD(R_COMMON_YES_NO_QUERY))
+ {
+ aResponse->SetOkButton(ETrue);
+ }
+ else
+ {
+ aResponse->SetOkButton(EFalse);
+ }
+ )
+ iDialog = NULL;
+ return err;
+ }
+
+TInt CSenNotPluginDlgImpl::ShowAskSaveDialogL(TAskSaveDlgRequest* /*aRequest*/,
+ TAskSaveDlgResponse* aResponse)
+ {
+ HBufC* prompt = StringLoader::LoadL(R_SENNOTDLG_ASK_SAVE_QUERY);
+ CleanupStack::PushL(prompt);
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+ CleanupStack::PushL( dlg );
+ dlg->SetPromptL(*prompt);
+ CleanupStack::Pop( dlg );
+ CleanupStack::PopAndDestroy(prompt);
+ iDialog = dlg;
+ TRAPD(err,
+ if(dlg->ExecuteLD(R_COMMON_YES_NO_QUERY))
+ {
+ aResponse->SetOkButton(ETrue);
+ }
+ else
+ {
+ aResponse->SetOkButton(EFalse);
+ }
+ )
+ iDialog = NULL;
+ return err;
+ }
+
+
+void CSenNotPluginDlgImpl::Cleanup()
+ {
+ iMethod = TSenNotPluginRequest::ENoMethod;
+ iCancelled = EFalse;
+#ifdef EKA2
+ iReplySlot = NULL;
+#else
+ iReplyPtr = NULL;
+#endif
+ delete iRequest;
+ iRequest = NULL;
+ delete iResponse;
+ iResponse = NULL;
+ }
+
+
+/**
+ * The notifier has been deactivated so resources can be freed and outstanding messages completed.
+ */
+void CSenNotPluginDlgImpl::Cancel()
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::Cancel: Starting ]"));
+
+ if(iMethod == TSenNotPluginRequest::ENoMethod)
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::Cancel: No outstanding request. Freeing resources ]"));
+ Cleanup();
+ }
+ else
+ {
+ if(iDialog)
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::Cancel: dialog is being displayed. Cancelling it ]"));
+/* if(iMethod == TSenNotPluginRequest::EAuthenticationDlg)
+ {
+ ((CUsernamePasswdDialog*)iDialog)->CancelDialogL(); // Will delete dialog
+ iDialog = NULL; //
+ }
+ else*/
+ {
+ TKeyEvent keyEvent;
+ keyEvent.iCode = EKeyEscape;
+ keyEvent.iScanCode = EStdKeyEscape;
+ keyEvent.iModifiers = EModifierAutorepeatable;
+ keyEvent.iRepeats = 50;
+ TInt leaveCode(KErrNone);
+ TRAP(leaveCode, iDialog->OfferKeyEventL(keyEvent, EEventKey));
+ if (leaveCode != KErrNone) iCancelled = EFalse;
+ }
+
+ DOLOG(_L("[ CSenNotPluginDlgImpl::Cancel: dialog cancel initiated ]"));
+ // Note: Execution will continue in RunL, where cleanup must be performed
+ iCancelled = ETrue;
+ }
+ else
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::Cancel: Pending request, but not executing it. Freeing resource ]"));
+ Cleanup(); // This will effectively cancel asynchronous operation
+ }
+ }
+ }
+
+/**
+ * Update a currently active notifier with data aBuffer.
+ */
+TPtrC8 CSenNotPluginDlgImpl::UpdateL(const TDesC8& /*aBuffer*/)
+ {
+ DOLOG(_L("[ CSenNotPluginDlgImpl::UpdateL ]"));
+ return TPtrC8(NULL, 0);
+ }
+
+#ifdef EKA2
+// ----------------------------------------------------------
+//
+// ECOM
+//
+// -----------------------------------------------------------
+
+const TImplementationProxy ImplementationTable[] =
+ {
+#ifndef RD_SEN_COMPILE_SIS_PACKAGE_FILES
+ IMPLEMENTATION_PROXY_ENTRY(0x101F9765,NotifierArray)
+#else
+ IMPLEMENTATION_PROXY_ENTRY(0x101F9744,NotifierArray)
+#endif
+
+ };
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+ {
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy) ;
+ return ImplementationTable;
+ }
+#endif
+
+// End of File