diff -r 000000000000 -r 72b543305e3a mobilemessaging/smum/src/BioOpenOp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/smum/src/BioOpenOp.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,283 @@ +/* +* 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: +* Bio message opening operation. +* +*/ + + + +// INCLUDE FILES +#include // CCoeEnv needed for file session +// Messaging includes +#include // for CMtmStore +#include // for KBiosMtmParse +#include // CBIODatabase +// Local includes +#include "BioOpenOp.h" +#include "SMSU.H" // for CSmsMtmUi +#include "smsui.pan" // SMUM panic codes + +// CONSTANTS +const TUid KUidSmsMtm={0x1000102c}; +const TUid KUidBioMtm={0x10001262}; + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CBioOpenOp::NewL +// +// --------------------------------------------------------- +CBioOpenOp* CBioOpenOp::NewL(CMsvSession& aSession, TRequestStatus& aObserverStatus, TMsvId aId, TUint aFlags) + { + CBioOpenOp* self=new(ELeave) CBioOpenOp(aSession,aObserverStatus,aId); + CleanupStack::PushL(self); + self->ConstructL(aFlags); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CBioOpenOp::CBioOpenOp +// +// --------------------------------------------------------- +CBioOpenOp::CBioOpenOp(CMsvSession& aSession,TRequestStatus& aObserverStatus, TMsvId aId) + : CMsvOperation(aSession,CActive::EPriorityStandard,aObserverStatus), + iMsvId(aId), iState(EUnknown) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------- +// CBioOpenOp::ConstructL +// +// --------------------------------------------------------- +void CBioOpenOp::ConstructL(TUint aFlags) + { + iMtmStore=CMtmStore::NewL(iMsvSession); + + // Get SMS MTM UI and set its context + iSmsMtmUi=&(iMtmStore->ClaimMtmUiL(KUidSmsMtm)); + iSmsMtmUiClaimed=ETrue; + iSmsMtmUi->SetPreferences(aFlags); + iSmsMtmUi->BaseMtm().SetCurrentEntryL(iMsvSession.GetEntryL(iMsvId)); + + // Get Bio MTM UI and set its context + iBioMtmUi=&(iMtmStore->ClaimMtmUiL(KUidBioMtm)); + iBioMtmUiClaimed=ETrue; + iBioMtmUi->BaseMtm().SetCurrentEntryL(iMsvSession.GetEntryL(iMsvId)); + + // + // Check if needs parsing + // + CBIODatabase* bioDb = CBIODatabase::NewLC(CCoeEnv::Static()->FsSession()); + CMsvEntry* entry = iMsvSession.GetEntryL(iMsvId); + CleanupStack::PushL(entry); + TMsvEntry tentry = entry->Entry(); + TUid bioUid; + bioUid.iUid = tentry.iBioType; + + TBool parserAvailable( EFalse ); + if ( bioDb->GetBioParserNameL( bioUid ).Length() ) + { + parserAvailable = ETrue; + } + // Set the description + TInt bioDbIndex; + bioDb->GetBioIndexWithMsgIDL(bioUid, bioDbIndex); + HBufC* descr = bioDb->BifReader(bioDbIndex).Description().AllocLC(); + tentry.iDescription.Set(*descr); + // save entry, because description was changed + entry->ChangeL(tentry); + CleanupStack::PopAndDestroy(descr); + + CleanupStack::PopAndDestroy(2, bioDb); // entry bioDatabase + if ( parserAvailable ) + { + // Start off first operation + DoParseL(); // (after parsing it calls DoEditL() ) + } + else + { + DoEditL(); + } + } + +// --------------------------------------------------------- +// CBioOpenOp::~CBioOpenOp +// +// --------------------------------------------------------- +CBioOpenOp::~CBioOpenOp() + { + Cancel(); + delete iOperation; + + if(iMtmStore) + { + if(iSmsMtmUiClaimed) + { + iMtmStore->ReleaseMtmUi(KUidSmsMtm); + } + if(iBioMtmUiClaimed) + { + iMtmStore->ReleaseMtmUi(KUidBioMtm); + } + delete iMtmStore; + } + } + +// --------------------------------------------------------- +// CBioOpenOp::DoParseL +// +// --------------------------------------------------------- +void CBioOpenOp::DoParseL() + { + __ASSERT_DEBUG(iOperation==NULL,Panic(EBioOperationNotNull)); + + // Set iMtm of message as BIO MTM + CMsvEntry* entry=iMsvSession.GetEntryL(iMsvId); + CleanupStack::PushL(entry); + TMsvEntry tentry; + tentry=entry->Entry(); + tentry.iMtm=KUidBioMtm; + entry->ChangeL(tentry); + CleanupStack::PopAndDestroy(); // entry + + // Parse message + TBuf8<1> blankParams; + CMsvEntrySelection* sel=new(ELeave) CMsvEntrySelection(); + CleanupStack::PushL(sel); + sel->AppendL(iMsvId); // Message Server will use UID of 1st message to load in MTM server. + + SetActive(); + iOperation=iBioMtmUi->InvokeAsyncFunctionL(KBiosMtmParse,*sel,iStatus,blankParams); + CleanupStack::PopAndDestroy(); // sel + + iState=EParsing; + iObserverRequestStatus = KRequestPending; + } + +// --------------------------------------------------------- +// CBioOpenOp::DoEditL +// +// --------------------------------------------------------- +void CBioOpenOp::DoEditL() + { + delete iOperation; + iOperation=NULL; + + // Launch SMS editor + SetActive(); + iOperation=STATIC_CAST(CSmsMtmUi*,iSmsMtmUi)->LaunchEditorApplicationL(iStatus,iMsvSession,CSmsMtmUi::EEditExisting); + iState=EEditing; + } + +// --------------------------------------------------------- +// CBioOpenOp::RunL +// +// --------------------------------------------------------- +void CBioOpenOp::RunL() + { + __ASSERT_DEBUG(iOperation,Panic(EBioOperationDoesNotExist)); + + switch(iState) + { + case EParsing: // The parse has completed. + { + // Set iMtm of message back to SMS MTM + { + CMsvEntry* entry=iMsvSession.GetEntryL(iMsvId); + CleanupStack::PushL(entry); + TMsvEntry tentry(entry->Entry()); + tentry.iMtm=KUidSmsMtm; + tentry.SetReadOnly(EFalse); + entry->ChangeL(tentry); + CleanupStack::PopAndDestroy(); // entry + } + + TBuf bufNotUsed1; + TInt intNotUsed2; + TInt intNotUsed3; + TInt intNotUsed4; + TInt intNotUsed5; + const TInt err=iBioMtmUi->GetProgress(iOperation->FinalProgress(),bufNotUsed1,intNotUsed2,intNotUsed3,intNotUsed4,intNotUsed5); + + if(KErrNone==err) + { + DoEditL(); + } + else + { + CompleteObserver(); + } + } + break; + case EEditing: // Edit has completed. + CompleteObserver(); + break; + case EUnknown: + break; + default: + break; + } + } + +// --------------------------------------------------------- +// CBioOpenOp::ProgressL +// +// --------------------------------------------------------- +const TDesC8& CBioOpenOp::ProgressL() + { + if(iOperation) + { + return iOperation->ProgressL(); + } + return KNullDesC8; + } + +// --------------------------------------------------------- +// CBioOpenOp::DoCancel +// +// --------------------------------------------------------- +void CBioOpenOp::DoCancel() + { + if(iOperation) + { + iOperation->Cancel(); + } + CompleteObserver(); + } + +// --------------------------------------------------------- +// CBioOpenOp::RunError +// +// --------------------------------------------------------- +TInt CBioOpenOp::RunError(TInt /*aError*/) + { + CompleteObserver(); + return KErrNone; + } + +// --------------------------------------------------------- +// CBioOpenOp::CompleteObserver +// +// --------------------------------------------------------- +void CBioOpenOp::CompleteObserver() + { + TRequestStatus* status = &iObserverRequestStatus; + User::RequestComplete(status,KErrNone); + iState=EUnknown; + } + +// end of file