--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/omaprovisioning/provisioning/ProvisioningSC/Src/CWPBioMsgHandler.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,386 @@
+/*
+* 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: Stores smart card provisioned settings into Inbox
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CWPBioMsgHandler.h"
+#include "CWPEngine.pan"
+
+#include <biodb.h> // Message DB API
+#include <msvapi.h>
+#include <msvuids.h> // KUidMsvMessageEntry
+#include <biouids.h> // KUidBioMessageTypeMtm
+#include <WPAdapterUtil.h>
+#include <mtclreg.h> // mtm
+#include <mtclbase.h>
+#include <txtrich.h>
+#include <smsclnt.h>
+#include <smuthdr.h>
+#include <smutset.h>
+#include <ProvisioningSC.rsg>
+#include <pushmessage.h>
+#include <e32std.h>
+#include <sysutil.h>
+#include "CWPPushMessage.h"
+#include "WPProvScPaths.h"
+#include "ProvisioningDebug.h"
+
+#include <csmsgetdetdescinterface.h>
+
+// CONSTANTS
+const TInt KHeaderSize = 1;
+
+_LIT( KResourceName, "ProvisioningSC" );
+
+GLDEF_C void Panic( TWPPanic aPanic )
+ {
+ User::Panic( KWPProvSCName, aPanic );
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::CWPBioMsgHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CWPBioMsgHandler::CWPBioMsgHandler() : iSession(NULL), iMtm(NULL),
+ iMtmRegistry(NULL)
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CWPBioMsgHandler::ConstructL()
+ {
+ iSession = CMsvSession::OpenSyncL( *this );
+ iMtmRegistry = CClientMtmRegistry::NewL( *iSession );
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CWPBioMsgHandler* CWPBioMsgHandler::NewL()
+ {
+ CWPBioMsgHandler* handler = CWPBioMsgHandler::NewLC();
+ CleanupStack::Pop();
+ return handler;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CWPBioMsgHandler* CWPBioMsgHandler::NewLC()
+ {
+ CWPBioMsgHandler* self = new( ELeave ) CWPBioMsgHandler;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::~CWPBioMsgHandler
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CWPBioMsgHandler::~CWPBioMsgHandler()
+ {
+ delete iMtm;
+ delete iMtmRegistry;
+ delete iSession;
+ delete iMessage;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::HandleSessionEventL
+// Handles async open msvsession
+// -----------------------------------------------------------------------------
+//
+void CWPBioMsgHandler::HandleSessionEventL(TMsvSessionEvent aEvent,
+ TAny* /* aArg1 */, TAny* /*aArg2*/,
+ TAny* /*aArg3*/)
+ {
+ switch ( aEvent )
+ {
+ case EMsvServerReady:
+ {
+ break;
+ }
+ case EMsvCloseSession:
+ {
+ iSession->CloseMessageServer();
+ break;
+ }
+ case EMsvServerTerminated:
+ {
+ iSession->CloseMessageServer();
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::StoreMessageL
+// Stores provisioned settings into Inbox
+// -----------------------------------------------------------------------------
+//
+void CWPBioMsgHandler::StoreMessageL( CWPPushMessage& aMessage )
+ {
+ FLOG( _L( "[ProvisioningSC] CWPBioMsgHandler::StoreMessageL:" ) );
+
+ TMsvEntry entry;
+ // create blank entry
+ PrepareEntryL( entry );
+ // Look up the details
+ TFileName fileName;
+ #ifndef __WINS__
+ fileName = RProcess().FileName();
+ #else
+ Dll::FileName( fileName );
+ #endif
+
+ HBufC* details = WPAdapterUtil::ReadHBufCL( fileName,
+ KResourceName,
+ R_FROM_SERVICEPROVIDER );
+ CleanupStack::PushL( details ); // 1
+ entry.iDetails.Set( *details );
+ entry.iBioType = iBioUid.iUid;
+ entry.iMtm = KUidBIOMessageTypeMtm;
+ // Look up and set the description
+ TInt index;
+ CBIODatabase* bioDB = CBIODatabase::NewLC( iSession->FileSession() ); // 2
+ bioDB->GetBioIndexWithMsgIDL( iBioUid, index);
+ HBufC* description = bioDB->BifReader( index ).Description().AllocL();
+ entry.iDescription.Set( *description );
+ CleanupStack::PopAndDestroy(); // bioDB 2
+ CleanupStack::PushL( description ); // 2
+ // store entry
+ StoreEntryL( aMessage, entry );
+ CleanupStack::PopAndDestroy( 2 ); // description, details
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::StoreMessageL
+// Stores note into Inbox
+// -----------------------------------------------------------------------------
+//
+void CWPBioMsgHandler::StoreMessageL( TInt aResource, CWPPushMessage& aMessage )
+ {
+ FLOG( _L( "[ProvisioningSC] CWPBioMsgHandler::StoreMessageL2:" ) );
+
+ // create an invisible blank entry
+ TMsvEntry entry;
+ PrepareEntryL( entry );
+ entry.iMtm = KUidMsgTypeSMS;
+
+ // Store entry in inbox
+ CMsvEntry* msvEntry = iSession->GetEntryL( KMsvGlobalInBoxIndexEntryId );
+ CleanupStack::PushL( msvEntry );
+ msvEntry->CreateL( entry );
+ msvEntry->Session().CleanupEntryPushL( entry.Id() );
+ msvEntry->SetEntryL( entry.Id() );
+
+ // Save the message body
+ CMsvStore* store = msvEntry->EditStoreL();
+ CleanupStack::PushL( store );
+ CParaFormatLayer* paraFormat = CParaFormatLayer::NewL();
+ CleanupStack::PushL( paraFormat );
+ CCharFormatLayer* charFormat = CCharFormatLayer::NewL();
+ CleanupStack::PushL( charFormat );
+ CRichText* body = CRichText::NewL( paraFormat, charFormat );
+ CleanupStack::PushL( body );
+
+ TFileName fileName;
+ #ifndef __WINS__
+ fileName = RProcess().FileName();
+ #else
+ Dll::FileName( fileName );
+ #endif
+
+ // Look up text
+ HBufC* text = WPAdapterUtil::ReadHBufCL( fileName,
+ KResourceName,
+ aResource );
+ CleanupStack::PushL( text );
+
+ // set text
+ body->InsertL( 0, *text );
+ store->StoreBodyTextL( *body );
+
+ // Store the actual message for post-mortem analysis
+ aMessage.StoreL( *store );
+
+ // Save the SMS header and create a description field
+ CSmsHeader* header = CSmsHeader::NewL( CSmsPDU::ESmsDeliver, *body );
+ CleanupStack::PushL( header );
+ TBuf<KSmsDescriptionLength> description;
+
+ CSmsGetDetDescInterface* smsPlugin = CSmsGetDetDescInterface::NewL();
+ CleanupStack::PushL( smsPlugin );
+ smsPlugin->GetDescription( header->Message(), description );
+ CleanupStack::PopAndDestroy( smsPlugin );
+
+ entry.iDescription.Set( description );
+ header->StoreL( *store );
+ store->CommitL();
+ CleanupStack::PopAndDestroy( 5 ); // header,text,body,charformat,paraFormat
+
+ // Complete processing the message
+ entry.SetReadOnly( EFalse );
+ entry.SetVisible( ETrue );
+ entry.SetInPreparation( EFalse );
+ msvEntry->ChangeL( entry );
+ CleanupStack::PopAndDestroy(); //store
+ msvEntry->Session().CleanupEntryPop(); //entry
+ CleanupStack::PopAndDestroy( ); // msvEntry
+
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::CreateMessageL
+// passes the ownership of the created push message
+// -----------------------------------------------------------------------------
+//
+CWPPushMessage* CWPBioMsgHandler::CreateMessageLC( TDesC8& aProvisioningDoc )
+ {
+ FLOG( _L( "[ProvisioningSC] CWPBioMsgHandler::CreateMessageLC begin" ) );
+ CWPPushMessage* message = CWPPushMessage::NewLC();
+ CPushMessage* pushMsg = CreatePushMessageL( aProvisioningDoc );
+ CleanupStack::PushL( pushMsg ); // 2
+ TPtrC8 bodyValue;
+ TPtrC8 headerValue;
+ if (pushMsg->GetMessageBody( bodyValue )
+ && pushMsg->GetHeader( headerValue ) )
+ {
+ // set member message, takes copy of arguments
+ message->SetL( headerValue, bodyValue );
+ }
+ // set member uid
+ BioMessageTypeL( *pushMsg );
+ CleanupStack::PopAndDestroy(); // pushMsg, 2
+ FLOG( _L( "[ProvisioningSC] CWPBioMsgHandler::CreateMessageLC end" ) );
+ return message;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::CreatePushMessageL
+// Stores note into Inbox
+// -----------------------------------------------------------------------------
+//
+CPushMessage* CWPBioMsgHandler::CreatePushMessageL( TDesC8& aProvisioningDoc )
+ {
+ TBuf8<KHeaderSize> header;
+ header.Append( 0xB6 ); // Wap push header value
+ HBufC8* hdrBuf = header.AllocLC();
+ HBufC8* bodyBuf = aProvisioningDoc.AllocLC();
+ CPushMessage* pushMsg = CPushMessage::NewL( hdrBuf, bodyBuf );
+ CleanupStack::Pop( 2 ); // hdrBuf, bodyBuf
+ return pushMsg;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::PrepareEntryL
+//
+// -----------------------------------------------------------------------------
+//
+void CWPBioMsgHandler::PrepareEntryL( TMsvEntry& aEntry )
+ {
+ // Current time
+ TTime time;
+
+ // Get Universal time
+ time.UniversalTime();
+
+ aEntry.iType = KUidMsvMessageEntry;
+ aEntry.SetVisible(EFalse);
+ aEntry.SetInPreparation(ETrue);
+ aEntry.SetReadOnly(EFalse);
+ aEntry.SetUnread(ETrue);
+ aEntry.iDate = time;
+ aEntry.iServiceId = KMsvLocalServiceIndexEntryId;
+ aEntry.iError = KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::StoreEntryL
+//
+// -----------------------------------------------------------------------------
+//
+void CWPBioMsgHandler::StoreEntryL( CWPPushMessage& aPushMsg, TMsvEntry& aEntry)
+ {
+ if( SysUtil::FFSSpaceBelowCriticalLevelL( NULL, aPushMsg.Body().Length() ) )
+ {
+ FLOG( _L( "[ProvisioningSC] CWPBioMsgHandler::StoreEntryL KErrDiskfull:" ) );
+ User::Leave( KErrDiskFull );
+ }
+ // Store entry in inbox
+ CMsvEntry* msvEntry = iSession->GetEntryL( KMsvGlobalInBoxIndexEntryId );
+ CleanupStack::PushL( msvEntry ); // 1
+ msvEntry->CreateL( aEntry );
+ msvEntry->Session().CleanupEntryPushL( aEntry.Id() );
+ msvEntry->SetEntryL( aEntry.Id() );
+
+ // Save the message
+ CMsvStore* store = msvEntry->EditStoreL();
+ CleanupStack::PushL( store ); // 2
+ aPushMsg.StoreL( *store );
+ store->CommitL();
+
+ // Complete processing the message
+ aEntry.SetReadOnly( EFalse );
+ aEntry.SetVisible( ETrue );
+ aEntry.SetInPreparation( EFalse );
+ msvEntry->ChangeL( aEntry );
+
+ CleanupStack::PopAndDestroy(); // store, 2
+ msvEntry->Session().CleanupEntryPop(); //msvEntry's entry
+ CleanupStack::PopAndDestroy(); // msvEntry, 1
+ }
+
+// -----------------------------------------------------------------------------
+// CWPBioMsgHandler::BioMessageTypeL
+// -----------------------------------------------------------------------------
+//
+void CWPBioMsgHandler::BioMessageTypeL( CPushMessage& aMessage )
+ {
+ // need to create local RFs for BIO otherwise raises exception
+ RFs localFS;
+ User::LeaveIfError( localFS.Connect() );
+ CleanupClosePushL( localFS );
+ CBIODatabase* bioDB = CBIODatabase::NewLC( localFS );
+ TPtrC contentTypePtr;
+ aMessage.GetContentType( contentTypePtr );
+ iBioUid = KNullUid;
+ // Ignored return type: KErrNone if found or KErrNotFound if not found
+ bioDB->IsBioMessageL( EBioMsgIdIana, contentTypePtr, NULL, iBioUid );
+ CleanupStack::PopAndDestroy(2); // bioDB, localFS
+ }
+
+// End of File