diff -r 4697dfb2d7ad -r 238255e8b033 messagingapp/msgutils/unidatamodel/unimmsdataplugin/src/unimmsdataplugin_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgutils/unidatamodel/unimmsdataplugin/src/unimmsdataplugin_p.cpp Fri Apr 16 14:56:15 2010 +0300 @@ -0,0 +1,598 @@ +/* + * Copyright (c) 2009 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: + * + */ + +//SYSTEM INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +#include + +#include "convergedmessage.h" +#include "s60qconversions.h" +#include "convergedmessageaddress.h" +#include "unimmsdataplugin_p.h" +#include "UniDataModel.h" +#include "debugtraces.h" +#include "sessioneventhandler.h" + + +#define KSenduiMtmMmsUidValue 0x100058E1 +const TUid KSenduiMtmMmsUid = +{KSenduiMtmMmsUidValue}; +_LIT(KUnixEpoch, "19700000:000000.000000"); + +const TInt KMmsArrayAllocationNumber = 6; + +UniMMSDataPluginPrivate::UniMMSDataPluginPrivate(): + mSession(NULL), + mMtmRegistry(NULL), + mUniDataModel(NULL), + mMmsClient(NULL), + mInsertingMedia(NULL), + iEditor(NULL), + iDom(NULL), + iDRMHelper(NULL), + iSessionHandler(NULL) + { + + done = EFalse; + iSessionHandler = new SessionEventHandler(); + mSession = CMsvSession::OpenSyncL(*iSessionHandler); + iSessionHandler->start(); + } + +void UniMMSDataPluginPrivate::initL() +{ + mMtmRegistry = CClientMtmRegistry::NewL(*mSession); + mMmsClient + = static_cast (mMtmRegistry->NewMtmL(KSenduiMtmMmsUid)); + + User::LeaveIfError(mfsSession.Connect()); + iMessageId = 0; +} + +UniMMSDataPluginPrivate::~UniMMSDataPluginPrivate() +{ + delete iEditor; + delete iDom; + if(mUniDataModel) + { + delete mUniDataModel; + } + mfsSession.Close(); + delete mMmsClient; + delete mMtmRegistry; + delete iSessionHandler; + delete mSession; +} + +int UniMMSDataPluginPrivate::setMessageId(int messageId) +{ + TInt error = KErrNone; + TRAP(error, setMessageIdL(messageId)); + return error; +} + +void UniMMSDataPluginPrivate::setMessageIdL(int messageId) +{ + if (done == EFalse) + { + initL(); + } + + if (iMessageId != messageId) + { + if (done) + { + reset(); + } + done = ETrue; + iMessageId = messageId; + mMmsClient->SwitchCurrentEntryL(iMessageId); + mMmsClient->LoadMessageL(); + mUniDataModel = CUniDataModel::NewL(mfsSession, *mMmsClient); + mUniDataModel->RestoreL(*this, EFalse); + } +} + +void UniMMSDataPluginPrivate::reset() +{ + delete mUniDataModel; + mUniDataModel = NULL; +} + +void UniMMSDataPluginPrivate::body(QString& aBodyText) +{ + + CRichText& textBody = mMmsClient->Body(); + TInt len = textBody.DocumentLength(); + HBufC* buf = HBufC::NewL(len); + TPtr bufPtr = buf->Des(); + aBodyText = S60QConversions::s60DescToQString(bufPtr); +} + +int UniMMSDataPluginPrivate::messageSize() +{ + return mMmsClient->MessageSize(); +} + + +QString UniMMSDataPluginPrivate::subject() +{ + TPtrC sub = mMmsClient->SubjectL(); + return S60QConversions::s60DescToQString(sub); +} + + + + +void UniMMSDataPluginPrivate::toRecipientList( + ConvergedMessageAddressList& mAddressList) +{ + CMsvEntry* cEntry = mSession->GetEntryL(KMsvGlobalInBoxIndexEntryIdValue); + CleanupStack::PushL(cEntry); + TRAPD (error, cEntry->SetEntryL( iMessageId )); + if (error != KErrNone) + { + CleanupStack::PopAndDestroy(); // cEntry + return; + } + CMsvStore* store = cEntry->ReadStoreL(); + CleanupStack::PushL(store); + CMmsSettings* settings = CMmsSettings::NewL(); + CleanupStack::PushL(settings); + CMmsHeaders* mmsHeaders = CMmsHeaders::NewL(settings->MmsVersion()); + CleanupStack::PushL(mmsHeaders); + mmsHeaders->RestoreL(*store); + TPtrC name; + TPtrC address; + TPtrC to; + for (TInt id = 0; id < mmsHeaders->ToRecipients().MdcaCount(); id++) + { + to.Set( (mmsHeaders->ToRecipients())[id]); + extractNameAndAddress(to, name, address); + // populate address + ConvergedMessageAddress + * messageAddress = + new ConvergedMessageAddress(S60QConversions::s60DescToQString(address), + S60QConversions::s60DescToQString(name)); + mAddressList.append(messageAddress); + } + + CleanupStack::PopAndDestroy(3); // mmsHeaders, settings, store + + CleanupStack::PopAndDestroy(); // cEntry +} + +void UniMMSDataPluginPrivate::ccRecipientList( + ConvergedMessageAddressList& mAddressList) +{ + CMsvEntry* cEntry = mSession->GetEntryL(KMsvGlobalInBoxIndexEntryIdValue); + CleanupStack::PushL(cEntry); + TRAPD (error, cEntry->SetEntryL( iMessageId )); + if (error != KErrNone) + { + CleanupStack::PopAndDestroy(); // cEntry + return; + } + CMsvStore* store = cEntry->ReadStoreL(); + CleanupStack::PushL(store); + CMmsSettings* settings = CMmsSettings::NewL(); + CleanupStack::PushL(settings); + CMmsHeaders* mmsHeaders = CMmsHeaders::NewL(settings->MmsVersion()); + CleanupStack::PushL(mmsHeaders); + mmsHeaders->RestoreL(*store); + //CDesCArray& ccList = mmsHeaders->CcRecipients(); + + TPtrC cc; + TPtrC name; + TPtrC address; + for (TInt id = 0; id < mmsHeaders->CcRecipients().MdcaCount(); id++) + { + cc.Set( (mmsHeaders->CcRecipients())[id]); + extractNameAndAddress(cc, name, address); + // populate address + ConvergedMessageAddress + * messageAddress = + new ConvergedMessageAddress(S60QConversions::s60DescToQString(address), + S60QConversions::s60DescToQString(name)); + mAddressList.append(messageAddress); + } + + CleanupStack::PopAndDestroy(3); // mmsHeaders, settings, store + + CleanupStack::PopAndDestroy(); // cEntry +} + +void UniMMSDataPluginPrivate::bccRecipientList( + ConvergedMessageAddressList& mAddressList) +{ + CMsvEntry* cEntry = mSession->GetEntryL(KMsvGlobalInBoxIndexEntryIdValue); + CleanupStack::PushL(cEntry); + TRAPD (error, cEntry->SetEntryL( iMessageId )); + if (error != KErrNone) + { + CleanupStack::PopAndDestroy(); // cEntry + return; + } + CMsvStore* store = cEntry->ReadStoreL(); + CleanupStack::PushL(store); + CMmsSettings* settings = CMmsSettings::NewL(); + CleanupStack::PushL(settings); + CMmsHeaders* mmsHeaders = CMmsHeaders::NewL(settings->MmsVersion()); + CleanupStack::PushL(mmsHeaders); + mmsHeaders->RestoreL(*store); + //CDesCArray& bccList = mmsHeaders->BccRecipients(); + + TPtrC bcc; + TPtrC name; + TPtrC address; + for (TInt id = 0; id < mmsHeaders->BccRecipients().MdcaCount(); id++) + { + bcc.Set( (mmsHeaders->BccRecipients())[id]); + extractNameAndAddress(bcc, name, address); + // populate address + ConvergedMessageAddress + * messageAddress = + new ConvergedMessageAddress(S60QConversions::s60DescToQString(address), + S60QConversions::s60DescToQString(name)); + mAddressList.append(messageAddress); + } + + CleanupStack::PopAndDestroy(3); // mmsHeaders, settings, store + + CleanupStack::PopAndDestroy(); // cEntry +} + +void UniMMSDataPluginPrivate::fromAddress(QString& messageAddress) +{ + + TPtrC sender = mMmsClient->Sender(); + messageAddress = S60QConversions::s60DescToQString(sender); +} + +UniMessageInfoList UniMMSDataPluginPrivate::attachmentList() +{ + UniMessageInfoList attlist; + int attcount = mUniDataModel->AttachmentList().Count(); + + QString path; + QString mimetype; + int size; + for (int i = 0; i < attcount; i++) + { + CUniObject *obj = mUniDataModel->AttachmentList().GetByIndex(i); + + mimetype = S60QConversions::s60Desc8ToQString(obj->MimeType()); + path + = S60QConversions::s60DescToQString(obj->MediaInfo()->FullFilePath()); + size = obj->Size(EFalse); + + UniMessageInfo *msgobj = new UniMessageInfo(path, size, mimetype); + attlist << msgobj; + } + + return attlist; +} + +QString UniMMSDataPluginPrivate::messageType() +{ + QString str("mms"); + return str; +} + +MsgPriority UniMMSDataPluginPrivate::messagePriority() +{ + return Normal; +} + +int UniMMSDataPluginPrivate::attachmentCount() +{ + return mUniDataModel->AttachmentList().Count(); +} + +bool UniMMSDataPluginPrivate::hasAttachment() +{ + int count = mUniDataModel->AttachmentList().Count(); + if (count > 0) + { + return true; + } + else + { + return false; + } +} + +int UniMMSDataPluginPrivate::objectCount() +{ + return mUniDataModel->ObjectList().Count(); +} + +UniMessageInfoList UniMMSDataPluginPrivate::objectList() +{ + UniMessageInfoList objlist; + int objcount = mUniDataModel->ObjectList().Count(); + + QString path; + QString mimetype; + int size; + for (int i = 0; i < objcount; i++) + { + CUniObject *obj = mUniDataModel->ObjectList().GetByIndex(i); + + mimetype = S60QConversions::s60Desc8ToQString(obj->MimeType()); + path + = S60QConversions::s60DescToQString(obj->MediaInfo()->FullFilePath()); + size = obj->Size(EFalse); + + UniMessageInfo *msgobj = new UniMessageInfo(path, size, mimetype); + objlist << msgobj; + } + + return objlist; +} + +/* + * For now not reqd + */ +int UniMMSDataPluginPrivate::slideCount() +{ + return mUniDataModel->SmilModel().SlideCount(); +} + +UniMessageInfoList UniMMSDataPluginPrivate::slideContent(TInt slidenum) +{ + UniMessageInfoList slidecontent; + + int slideobjcount = mUniDataModel->SmilModel().SlideObjectCount(slidenum); + + QString path; + QString mimetype; + int size; + for (int i = 0; i < slideobjcount; i++) + { + CUniObject *obj = mUniDataModel->SmilModel().GetObjectByIndex(slidenum, + i); + + mimetype = S60QConversions::s60Desc8ToQString(obj->MimeType()); + path + = S60QConversions::s60DescToQString(obj->MediaInfo()->FullFilePath()); + size = obj->Size(EFalse); + + UniMessageInfo *msgobj = new UniMessageInfo(path, size, mimetype); + slidecontent << msgobj; + } + + return slidecontent; +} + +int UniMMSDataPluginPrivate::timeStamp() +{ + QDateTime retTimeStamp; + TTime timeStamp = mMmsClient->Entry().Entry().iDate; + TTime unixEpoch(KUnixEpoch); + TTimeIntervalSeconds seconds; + timeStamp.SecondsFrom(unixEpoch, seconds); + return seconds.Int(); +} + +void UniMMSDataPluginPrivate::extractNameAndAddress(const TDesC& aMsvAddress, + TPtrC& aName, + TPtrC& aAddress) +{ + // For address information separation (start) + const TUint KMsgMmsAddressStartChar('<'); + + // For address information separation (end) + const TUint KMsgMmsAddressEndChar('>'); + + TInt addressStart = aMsvAddress.LocateReverse(KMsgMmsAddressStartChar); + TInt addressEnd = aMsvAddress.LocateReverse(KMsgMmsAddressEndChar); + + if (addressStart != KErrNotFound && addressEnd != KErrNotFound + && addressEnd > addressStart) + { + // verified address, will be used as selected from contacts manager + aName.Set(aMsvAddress.Ptr(), addressStart); + aAddress.Set(aMsvAddress.Mid(addressStart + 1).Ptr(), (addressEnd + - addressStart) - 1); + if (!aAddress.Length()) + { + aAddress.Set(aName); + aName.Set(KNullDesC); // empty string + } + } + else + { + // unverified string, will be used as entered in the header field + aName.Set(KNullDesC); // empty string + aAddress.Set(aMsvAddress.Ptr(), aMsvAddress.Length()); // a whole string to address + } + + if (aName.CompareF(aAddress) == 0) + { + aName.Set(KNullDesC); // empty string + } +} + +void UniMMSDataPluginPrivate::RestoreReady(TInt /*aParseResult*/, + TInt /*aError*/) +{ +} + +void UniMMSDataPluginPrivate::addObjectL( int aSlideNum,UniMessageInfo* aInfo ) +{ + TInt error = KErrNone; + + HBufC* filePath = S60QConversions::qStringToS60Desc(aInfo->path()); + if(filePath) + { + CleanupStack::PushL(filePath); + + RFile file = mUniDataModel->MediaResolver().FileHandleL( *filePath); + CleanupClosePushL( file ); + + mInsertingMedia = mUniDataModel->MediaResolver().CreateMediaInfoL( file ); + + //TODO try using the commented code after testing on diff env or on hardware + //mUniDataModel->MediaResolver().ParseInfoDetailsL( mInsertingMedia, file ); + iDRMHelper = CDRMHelper::NewL(); + mInsertingMedia->ParseInfoDetailsL( file, *iDRMHelper, *this ); + + mUniDataModel->SmilModel().AddObjectL( *this, aSlideNum, mInsertingMedia ); + + //Since the ownership is transferred dont delete these + mInsertingMedia = NULL; + iDRMHelper = NULL; + + + CleanupStack::PopAndDestroy( &file ); + CleanupStack::PopAndDestroy( filePath ); + } +} + +void UniMMSDataPluginPrivate::ObjectSaveReady( TInt /*aError*/ ) +{ + +} + +void UniMMSDataPluginPrivate::MediaInfoParsed() +{ + +} +void UniMMSDataPluginPrivate::addTextObjectL(int aSlideNum,QString aText ) +{ + TInt error = KErrNone; + + //Delete this always + delete iEditor; + iEditor = NULL; + + HBufC* textContent = S60QConversions::qStringToS60Desc(aText); + if(textContent) + { + CleanupStack::PushL(textContent); + + iEditor = new CEikRichTextEditor; + iEditor->ConstructL(NULL,0,0,CEikEdwin::ENoAutoSelection| + CEikEdwin::EOwnsWindow,0,0); + iEditor->RichText()->InsertL(0,*textContent); + + mUniDataModel->SmilModel().AddTextObjectL( aSlideNum,iEditor); + CleanupStack::PopAndDestroy( textContent ); + } +} + +void UniMMSDataPluginPrivate::addSlideL( int aSlideNum ) +{ + TInt error = KErrNone; + mUniDataModel->SmilModel().AddSlideL(aSlideNum); +} + +void UniMMSDataPluginPrivate::composeSmilL(CMsvStore& aEditStore) +{ + TInt error = KErrNone; + + delete iDom; + iDom = NULL; + + iDom = mUniDataModel->SmilModel().ComposeL(); + + mUniDataModel->SmilList().CreateSmilAttachmentL( *this,aEditStore, iDom ); +} + +void UniMMSDataPluginPrivate::saveObjects() +{ + mUniDataModel->ObjectList().SaveAll( *this, CMsvAttachment::EMsvFile ); +} + +void UniMMSDataPluginPrivate::SmilComposeEvent( TInt /*aError*/ ) +{ + +} + +TMsvAttachmentId UniMMSDataPluginPrivate::getSmilAttachmentByIndex() +{ + return mUniDataModel->SmilList().GetSmilAttachmentByIndex( 0 ); +} + +void UniMMSDataPluginPrivate::restoreL(CBaseMtm& mtm) +{ + initL(); + mUniDataModel = CUniDataModel::NewL(mfsSession, mtm); + mUniDataModel->RestoreL(*this, ETrue); +} + +void UniMMSDataPluginPrivate::addAttachmentL( UniMessageInfo* aInfo ) +{ + TInt error = KErrNone; + + HBufC* filePath = S60QConversions::qStringToS60Desc(aInfo->path()); + if(filePath) + { + CleanupStack::PushL(filePath); + + RFile file = mUniDataModel->MediaResolver().FileHandleL( *filePath); + CleanupClosePushL( file ); + + mInsertingMedia = mUniDataModel->MediaResolver().CreateMediaInfoL( file ); + + //TODO try using the commented code after testing on diff env or on hardware + //mUniDataModel->MediaResolver().ParseInfoDetailsL( mInsertingMedia, file ); + iDRMHelper = CDRMHelper::NewL(); + mInsertingMedia->ParseInfoDetailsL( file, *iDRMHelper, *this ); + + mUniDataModel->AddAttachmentL( *this, mInsertingMedia, + CMsvAttachment::EMsvFile ); + + //Since the ownership is transferred dont delete these + mInsertingMedia = NULL; + iDRMHelper = NULL; + + + CleanupStack::PopAndDestroy( &file ); + CleanupStack::PopAndDestroy( filePath ); + } +} + +void UniMMSDataPluginPrivate::removeSlide(int aSlideNumber) +{ + mUniDataModel->SmilModel().RemoveSlide(aSlideNumber); +} + + +CMsvSession* UniMMSDataPluginPrivate::session() +{ + return mSession; +} +