messagingapp/msgutils/unidatamodel/unimmsdataplugin/src/unimmsdataplugin_p.cpp
changeset 23 238255e8b033
--- /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 <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 <DRMHelper.h>
+
+
+#include <QDateTime>
+
+#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<CMmsClientMtm*> (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;
+}
+