diff -r 000000000000 -r 62f9d29f7211 webservices/wsnotifierplugins/src/sennotplugindlgimpl.cpp --- /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 +#include +#include +#include + +#ifndef RD_SEN_COMPILE_SIS_PACKAGE_FILES + #include +#else + #include +#endif + +// This may be angle bracketed later.. +#include "logger.h" +#include "sennotplugindlg.h" // client api +#include "sennotplugindlgimpl.h" + +#include + + +#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* aNotifiers) + { + MEikSrvNotifierBase2* notifier; + notifier = CSenNotPluginDlgImpl::NewL(); + CleanupStack::PushL(notifier); + aNotifiers->AppendL(notifier); + CleanupStack::Pop(notifier); + } +#else +void CreateNotifierL(CArrayPtr* aNotifiers) + { + MEikSrvNotifierBase* notifier; + notifier = CSenNotPluginDlgImpl::NewL(); + CleanupStack::PushL(notifier); + aNotifiers->AppendL(notifier); + CleanupStack::Pop(notifier); + } +#endif + +#ifdef EKA2 +EXPORT_C CArrayPtr* NotifierArray() + { + DOLOG(_L("\n\n\n\n")); + DOLOG(_L("[ Creating notifier array ]")); + CArrayPtrFlat* notifiers + = new CArrayPtrFlat(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* NotifierArray() + { + DOLOG(_L("\n\n\n\n")); + DOLOG(_L("[ Creating notifier array ]")); + CArrayPtrFlat* notifiers + = new CArrayPtrFlat(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(); + iRequest->Copy(aBuffer.Ptr(), sizeof(TSenNotPluginRequest)); + iResponse = new(ELeave)TPckgBuf(); + + 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 username(aRequest->Username()); + TBuf 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