diff -r 000000000000 -r 72b543305e3a messagingappbase/msgavkon/msgnotifiers/src/MsgConfirmSendQuery.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/msgavkon/msgnotifiers/src/MsgConfirmSendQuery.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,329 @@ +/* +* Copyright (c) 2002 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: +* CMsgConfirmSendQuery implementation file +* +*/ + + + +#include +#include +#include + +#include + +#include + +#include + +// SIS registry +#include +#include + +#include +#include + +#include + +#include +#include + +#include "MsgConfirmSendNotifier.h" +#include "MsgConfirmSendQuery.h" + +// LOCAL CONSTANTS AND MACROS + +_LIT( KMsgNotifiersResourceFile, "MsgNotifiers.rsc" ); + +// --------------------------------------------------------- +// CMsgConfirmSendQuery::NewL +// +// Two-phased constructor. +// --------------------------------------------------------- +// +CMsgConfirmSendQuery* CMsgConfirmSendQuery::NewL( CMsgConfirmSendNotifier& aNotifier ) + { + CMsgConfirmSendQuery* self = new ( ELeave ) CMsgConfirmSendQuery( aNotifier ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CMsgConfirmSendQuery::ConstructL +// +// Symbian OS default constructor can leave. +// --------------------------------------------------------- +// +void CMsgConfirmSendQuery::ConstructL() + { + iCoe = CEikonEnv::Static(); + if ( !iCoe ) + { + User::Leave( KErrGeneral ); + } + + TFileName resourceFile; + TParse parse; + parse.Set( KMsgNotifiersResourceFile, &KDC_RESOURCE_FILES_DIR, NULL ); + resourceFile = parse.FullName(); + + BaflUtils::NearestLanguageFile( iCoe->FsSession(), resourceFile ); + iResourceFileOffset = iCoe->AddResourceFileL( resourceFile ); + + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------- +// CMsgConfirmSendQuery::CMsgConfirmSendQuery +// +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CMsgConfirmSendQuery::CMsgConfirmSendQuery( CMsgConfirmSendNotifier& aNotifier ) + : CActive( CActive::EPriorityStandard ), + iNotifier( aNotifier ) + { + } + +// --------------------------------------------------------- +// CMsgConfirmSendQuery::~CMsgConfirmSendQuery +// +// Destructor +// --------------------------------------------------------- +// +CMsgConfirmSendQuery::~CMsgConfirmSendQuery() + { + Cancel(); + if ( iCoe && iResourceFileOffset ) + { + iCoe->DeleteResourceFile( iResourceFileOffset ); + } + delete iAppName; + delete iMtmName; + delete iSelection; + } + +// --------------------------------------------------------- +// CMsgConfirmSendQuery::RunL +// +// From active object framework +// --------------------------------------------------------- +// +void CMsgConfirmSendQuery::RunL() + { + // "Cancel" returns "0" + TInt ret( 0 ); + + HBufC* label = CreateMessageTextLC(); + CAknMessageQueryDialog* query = CAknMessageQueryDialog::NewL( *label ); + ret = query->ExecuteLD( R_CONFIRM_QUERY ); + CleanupStack::PopAndDestroy( label ); + + iNotifier.HandleActiveEvent( ret ); + } + +// --------------------------------------------------------- +// CMsgConfirmSendQuery::DoCancel +// +// From active object framework +// --------------------------------------------------------- +// +void CMsgConfirmSendQuery::DoCancel() + { + } + +// --------------------------------------------------------- +// CMsgConfirmSendQuery::Start +// +// Starts the active object +// --------------------------------------------------------- +// +void CMsgConfirmSendQuery::ShowQueryL( const TDesC8& aBuffer, TBool aSendAs ) + { + if ( IsActive() ) + { + Cancel(); + } + + //delete iBuf; + //iBuf = NULL; + //iBuf = aBuffer.AllocL(); + //iClient.ShowQuery( *iBuf, iStatus ); + + if ( aSendAs ) + { + ResolveSendAsConfirmDetailsL( aBuffer ); + } + else + { + ResolveSendUiConfirmDetailsL( aBuffer ); + } + + // Complete self: + iStatus = KRequestPending; + TRequestStatus* pStatus = &iStatus; + SetActive(); + User::RequestComplete( pStatus, KErrNone ); + } + + +// --------------------------------------------------------- +// CMsgConfirmSendSession::ResolveSendAsConfirmDetailsL +// --------------------------------------------------------- +// +void CMsgConfirmSendQuery::ResolveSendAsConfirmDetailsL( const TDesC8& aBuffer ) + { + TSecurityInfo securityInfo; + CMsvEntrySelection* selection = new ( ELeave ) CMsvEntrySelection(); + CleanupStack::PushL( selection ); + TMsvPackedNotifierRequest::UnpackL( aBuffer, *selection, securityInfo ); + + TInt count = selection->Count(); + if ( count == 0 ) + { + User::Leave( KErrArgument ); + } + + CDummyObserver* dummyObs = new ( ELeave ) CDummyObserver; + CleanupStack::PushL( dummyObs ); + CMsvSession* session = CMsvSession::OpenSyncL( *dummyObs ); + CleanupStack::PushL( session ); + + TMsvId dummy; + TMsvEntry entry; + User::LeaveIfError( session->GetEntry( selection->At( 0 ), dummy, entry ) ); + + iMultipleMessages = ( count > 1 ); + iMultipleRecipients = entry.MultipleRecipients(); + + // Assume all entries have same MTM. + NameFromMtmL( session, entry.iMtm ); + NameFromSecurityInfoL( securityInfo ); + + CleanupStack::PopAndDestroy( 3, selection ); // selection, dummyObs, session + } + +// --------------------------------------------------------- +// CMsgConfirmSendSession::ResolveSendUiConfirmDetailsL +// --------------------------------------------------------- +// +void CMsgConfirmSendQuery::ResolveSendUiConfirmDetailsL( const TDesC8& aBuffer ) + { + iMultipleMessages = EFalse; + iMultipleRecipients = EFalse; + + RDesReadStream stream( aBuffer ); + delete iMtmName; + iMtmName = NULL; + TInt length = stream.ReadInt32L(); + if ( length ) + { + iMtmName = HBufC::NewL( stream, length ); + } + else + { + iMtmName = StringLoader::LoadL( R_CONFIRM_UNKNOWN_MTM, iCoe ); + } + TSecurityInfo securityInfo; + securityInfo.iSecureId = stream.ReadUint32L(); + NameFromSecurityInfoL( securityInfo ); + } + +// --------------------------------------------------------- +// CMsgConfirmSendSession::NameFromSecurityInfoL +// --------------------------------------------------------- +// +void CMsgConfirmSendQuery::NameFromSecurityInfoL( TSecurityInfo& securityInfo ) + { + delete iAppName; + iAppName = NULL; + Swi::RSisRegistrySession sisSession; + if ( sisSession.Connect() == KErrNone ) + { + Swi::CSisRegistryPackage* sisRegistry = NULL; + TRAPD( err, sisRegistry = sisSession.SidToPackageL( securityInfo.iSecureId ) ); + if ( !err ) + { + iAppName = sisRegistry->Name().AllocL(); + } + delete sisRegistry; + sisSession.Close(); + } + if ( !iAppName || !iAppName->Length() ) + { + iAppName = StringLoader::LoadL( R_CONFIRM_UNKNOWN_APP, iCoe ); + } + } + +// --------------------------------------------------------- +// CMsgConfirmSendSession::NameFromMtmL +// --------------------------------------------------------- +// +void CMsgConfirmSendQuery::NameFromMtmL( CMsvSession* aSession, TUid aMtmTypeUid ) + { + delete iMtmName; + iMtmName = NULL; + //HBufC* name( NULL ); + // Create a client registry + CClientMtmRegistry* clientReg = CClientMtmRegistry::NewL( *aSession ); + CleanupStack::PushL( clientReg ); + + // Resolve human readable name for the MTM + if ( clientReg->IsPresent( aMtmTypeUid ) ) + { + iMtmName = clientReg->RegisteredMtmDllInfo( aMtmTypeUid ).HumanReadableName().AllocL(); + } + if ( !iMtmName || !iMtmName->Length() ) + { + iMtmName = StringLoader::LoadL( R_CONFIRM_UNKNOWN_MTM, iCoe ); + } + CleanupStack::PopAndDestroy( clientReg ); + } + +// --------------------------------------------------------- +// CMsgConfirmSendQuery::CreateMessageTextLC +// --------------------------------------------------------- +// +HBufC* CMsgConfirmSendQuery::CreateMessageTextLC() + { + TInt resourceId = R_CONFIRM_SEND_MANY_MSG; + if ( !iMultipleMessages ) + { + resourceId = iMultipleRecipients + ? R_CONFIRM_SEND_MANY_RECIP + : R_CONFIRM_SEND_ONE; + } + + CPtrCArray* array = new ( ELeave ) CPtrCArray( 2 ); + CleanupStack::PushL( array ); + + array->AppendL( *iAppName ); + array->AppendL( *iMtmName ); + + HBufC* label = StringLoader::LoadL( + resourceId, + *array, + iCoe ); + + CleanupStack::PopAndDestroy( array ); + CleanupStack::PushL( label ); + return label; + } + + +// End of File