webservices/wsnotifierplugins/src/sennotplugindlgimpl.cpp
changeset 0 62f9d29f7211
child 14 ab1e518f96da
--- /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