--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgutils/unidatautils/unidatamodelplugins/unimmsdataplugin/src/unimmsdataplugin_p.cpp Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,453 @@
+/*
+ * 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 <e32cmn.h>
+#include <mtclreg.h>
+#include <mtclbase.h>
+#include <msvids.h>
+#include <txtetext.h>
+#include <txtrich.h>
+#include <txtfmlyr.h>
+#include <badesca.h>
+#include <eikrted.h>
+#include <mmsclient.h>
+#include <mmssettings.h>
+#include <mmsheaders.h>
+#include <MsgMediaInfo.h>
+#include <MsgMediaResolver.h>
+#include <QDateTime>
+
+#include "convergedmessage.h"
+#include "s60qconversions.h"
+#include "convergedmessageaddress.h"
+#include "unimmsdataplugin_p.h"
+#include "debugtraces.h"
+
+
+#define KSenduiMtmMmsUidValue 0x100058E1
+const TUid KSenduiMtmMmsUid = {KSenduiMtmMmsUidValue};
+
+_LIT(KUnixEpoch, "19700000:000000.000000");
+
+
+UniMMSDataPluginPrivate::UniMMSDataPluginPrivate():
+ mSession(NULL),
+ mMtmRegistry(NULL),
+ mUniDataModel(NULL),
+ mMmsClient(NULL)
+ {
+ done = EFalse;
+ mSession = CMsvSession::OpenSyncL(*this);
+ }
+
+void UniMMSDataPluginPrivate::initL()
+{
+ mMtmRegistry = CClientMtmRegistry::NewL(*mSession);
+ mMmsClient = static_cast<CMmsClientMtm*> (mMtmRegistry->NewMtmL(KSenduiMtmMmsUid));
+ User::LeaveIfError(mfsSession.Connect());
+ iMessageId = 0;
+}
+
+UniMMSDataPluginPrivate::~UniMMSDataPluginPrivate()
+{
+ if(mUniDataModel)
+ {
+ delete mUniDataModel;
+ }
+ mfsSession.Close();
+ delete mMmsClient;
+ delete mMtmRegistry;
+ 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::restoreL(CBaseMtm& mtm)
+{
+ initL();
+ mUniDataModel = CUniDataModel::NewL(mfsSession, mtm);
+ mUniDataModel->RestoreL(*this, ETrue);
+}
+
+CMsvSession* UniMMSDataPluginPrivate::session()
+{
+ return mSession;
+}
+
+void UniMMSDataPluginPrivate::HandleSessionEventL(TMsvSessionEvent /*aEvent*/,
+ TAny* /*aArg1*/,
+ TAny* /*aArg2*/, TAny* /*aArg3*/)
+{
+// do nothing
+}
+