messagingapp/msgutils/unidatautils/unidatamodelplugins/unimmsdataplugin/src/unimmsdataplugin_p.cpp
changeset 25 84d9eb65b26f
child 37 518b245aa84c
--- /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
+}
+