messagingappbase/msgavkon/msgnotifiers/src/MsgConfirmSendQuery.cpp
changeset 0 72b543305e3a
--- /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 <e32base.h>
+#include <bautils.h>
+#include <s32mem.h>
+
+#include <data_caging_path_literals.hrh>
+
+#include <aknmessagequerydialog.h>
+
+#include <tmsvpackednotifierrequest.h>
+
+// SIS registry
+#include <swi/sisregistrysession.h>
+#include <swi/sisregistrypackage.h>
+
+#include <mtclreg.h>
+#include <msvreg.h>
+
+#include <StringLoader.h>
+
+#include <avkon.rsg>
+#include <MsgNotifiers.rsg>
+
+#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