messagingapp/msgappfw/msghistory/src/msghistoryprivate.cpp
branchRCL_3
changeset 26 ebe688cedc25
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgappfw/msghistory/src/msghistoryprivate.cpp	Tue Aug 31 15:11:31 2010 +0300
@@ -0,0 +1,381 @@
+/*
+ * 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 <ccsrequesthandler.h>
+#include <ccsconversationentry.h>
+#include <ccsclientconversation.h>
+#include <xqconversions.h>
+
+//USER INCLUDES
+#include "msghistoryprivate.h"
+#include "msghistoryimpl.h"
+#include <msgitem.h>
+
+// CONSTANTS
+_LIT(KUnixEpoch, "19700000:000000.000000");
+
+const TInt KMaxConversationIPCLimit = 250;
+
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::MsgHistoryPrivate
+// @see header
+//---------------------------------------------------------------
+MsgHistoryPrivate::MsgHistoryPrivate( MsgHistoryImpl* ptr )
+:CActive(EPriorityStandard),
+currentState(EInit),
+q_ptr(ptr) 
+
+    { 
+    CActiveScheduler::Add(this);
+    handler = CCSRequestHandler::NewL();
+    handler->RequestResultsEventL(this);
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::MsgHistoryPrivate
+// @see header
+//---------------------------------------------------------------
+MsgHistoryPrivate::~MsgHistoryPrivate()
+    {
+    if ( handler )
+        delete handler;
+     if(msgs.count())
+        {
+         msgs.clear();
+        }
+    // Cancel the active Object 
+    Cancel();
+    }
+
+// ---------------------------------------------------------------------------
+// RunL
+// ---------------------------------------------------------------------------
+//
+void MsgHistoryPrivate::RunL()
+{
+    if (iStatus != KErrNone)
+    {
+        return;
+    }
+    //process
+    switch (currentState)
+    {
+       case EFetchMoreConversations:
+           GetMessagingHistory(contactId, msgs.count());
+            break;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// DoCancel
+// ---------------------------------------------------------------------------
+//
+void MsgHistoryPrivate::DoCancel()
+{
+    currentState = EInit;
+    contactId = -1;
+   
+}
+
+// ---------------------------------------------------------------------------
+// Make the active object alive.
+// ---------------------------------------------------------------------------
+//
+void MsgHistoryPrivate::IssueRequest()
+{
+    if (!IsActive())
+    {
+        iStatus = KRequestPending;
+        TRequestStatus* status = &iStatus;
+        SetActive();
+        User::RequestComplete(status, KErrNone);
+    }
+}
+//---------------------------------------------------------------
+// MsgHistoryPrivate::GetMessagingHistory
+// @see header
+//---------------------------------------------------------------
+TBool MsgHistoryPrivate::GetMessagingHistory( const TInt aContactId ,
+                                              TInt aKnownIndex)
+    {
+    contactId = aContactId;
+    TRAPD(err, handler->GetMessagingHistoryL(contactId,
+                                             aKnownIndex,
+                                             KMaxConversationIPCLimit));
+    if ( err == KErrNone )
+        return ETrue;
+
+    return EFalse;
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::ClearMessagingHistory
+// @see header
+//---------------------------------------------------------------
+TBool MsgHistoryPrivate::ClearMessagingHistory( const TInt aContactId )
+    {
+    TRAPD(err, handler->ClearMessagingHistoryL(aContactId));
+    if ( err == KErrNone )
+        return ETrue;
+
+    return EFalse;
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::MarkReadMessagingHistory
+// @see header
+//---------------------------------------------------------------
+TBool MsgHistoryPrivate::MarkReadMessagingHistory( const TInt aContactId )
+    {
+    TRAPD(err, handler->MarkMessagingHistoryReadL(aContactId));
+    if ( err == KErrNone )
+        return ETrue;
+
+    return EFalse;
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::Subscribe
+// @see header
+//---------------------------------------------------------------
+TBool MsgHistoryPrivate::Subscribe( const TInt aContactId )
+    {
+    TInt conversationId = -1;
+    TRAPD(err, 
+            conversationId = handler->GetConversationIdL(aContactId));
+    CCsClientConversation* clientConversation = CCsClientConversation::NewL();
+    clientConversation->SetConversationEntryId(conversationId);
+    // set the contact id, which will be used in case when the 
+    // conversation entry id is -1.
+    clientConversation->SetContactId(aContactId);
+    //set dummy entry
+    CCsConversationEntry *entry = CCsConversationEntry::NewL();
+    clientConversation->SetConversationEntryL(entry);
+
+    handler->RequestConversationChangeEventL(this, clientConversation);
+    delete clientConversation;
+    delete entry;        
+    if ( err == KErrNone )
+        return ETrue;
+
+    return EFalse;
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::UnSubscribe
+// @see header
+//---------------------------------------------------------------
+TBool MsgHistoryPrivate::UnSubscribe( const TInt aContactId )
+    {
+    TInt conversationId = -1;
+    TRAPD(err, 
+            conversationId = handler->GetConversationIdL(aContactId));
+    CCsClientConversation* clientConversation = CCsClientConversation::NewL();
+    clientConversation->SetConversationEntryId(conversationId);
+    // set the contact id, which will be used in case when the 
+    // conversation entry id is -1.
+    clientConversation->SetContactId(aContactId);
+    //set dummy entry
+    CCsConversationEntry *entry = CCsConversationEntry::NewL();
+    clientConversation->SetConversationEntryL(entry);
+
+    handler->RemoveConversationChangeEventL(this, clientConversation);
+    delete clientConversation;
+		
+	delete entry;
+    if ( err == KErrNone )
+        return ETrue;
+
+    return EFalse;
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::ConversationList
+// @see header
+//---------------------------------------------------------------
+void MsgHistoryPrivate::ConversationList
+( RPointerArray<CCsClientConversation>& /*aClientConversationList*/ )
+    {
+    // No implementation required.
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::Conversations
+// @see header
+//---------------------------------------------------------------
+void MsgHistoryPrivate::Conversations
+( RPointerArray<CCsConversationEntry>& aConversationEntryList,
+        TInt& aTotalCount)
+    {
+ 
+    for(TInt i = 0 ; i < aConversationEntryList.Count(); i++ )
+        {
+        MsgItem item;
+        PopulateMsgItem(item,*(aConversationEntryList[i]));
+        msgs.append(item);
+        }  
+    //emit signal, when all the messages in the conversation are fetched.
+    if(msgs.count()== aTotalCount)
+        {
+            currentState = EInit;
+            q_ptr->messagesReadyEvent(msgs);
+            msgs.clear();
+
+        }
+        else
+        {
+            currentState = EFetchMoreConversations;
+            IssueRequest();
+        }
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::AddConversation
+// @see header
+//---------------------------------------------------------------
+void MsgHistoryPrivate::AddConversation 
+( const CCsConversationEntry& aConversationEntry )
+    {
+    MsgItem item;
+    PopulateMsgItem(item, aConversationEntry);
+    q_ptr->messageAddedEvent(item);
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::ModifyConversation
+// @see header
+//---------------------------------------------------------------
+void MsgHistoryPrivate::ModifyConversation
+( const CCsConversationEntry& aConversationEntry )
+    {
+    MsgItem item;
+    PopulateMsgItem(item, aConversationEntry);
+    q_ptr->messageChangedEvent(item);
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::DeleteConversation
+// @see header
+//---------------------------------------------------------------
+void MsgHistoryPrivate::DeleteConversation
+( const CCsConversationEntry& aConversationEntry )
+    {
+    MsgItem item;
+    PopulateMsgItem(item, aConversationEntry);
+    q_ptr->messageDeletedEvent(item);
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::RefreshConversation
+// @see header
+//---------------------------------------------------------------
+void MsgHistoryPrivate::RefreshConversation()
+    {
+    // No implementation required.
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::populateMsgItem
+// @see header
+//---------------------------------------------------------------
+void MsgHistoryPrivate::PopulateMsgItem
+(MsgItem& item, const CCsConversationEntry& entry)
+    {
+    // id             
+    item.setId(entry.EntryId());
+    
+    // message type.        
+    item.setType((MsgItem::MsgType)entry.GetType());
+
+    // description
+    HBufC* description = entry.Description();    
+    if( description && description->Length())
+        {
+        item.setBody(XQConversions::s60DescToQString(*description)); 
+        }
+
+    // time stamp 
+    TTime unixEpoch(KUnixEpoch);
+    TTimeIntervalSeconds seconds;
+    TTime timeStamp(entry.TimeStamp() );
+    timeStamp.SecondsFrom(unixEpoch, seconds);    
+    item.setTimeStamp(seconds.Int());
+
+    //contact details
+    HBufC* contact = entry.Contact();
+    if( contact && contact->Length())
+        {
+        item.setPhoneNumber(XQConversions::s60DescToQString(*contact));      
+        }
+
+    //sending state
+    item.setState((MsgItem::MsgState)entry.GetSendState());    
+    
+    // direction
+    item.setDirection((MsgItem::MsgDirection)entry.ConversationDir());  
+    
+    //attributes
+    SetMsgAttributes(item, entry);    
+    }
+
+//---------------------------------------------------------------
+// MsgHistoryPrivate::SetMsgAttributes
+// @see header
+//---------------------------------------------------------------
+void MsgHistoryPrivate::SetMsgAttributes
+(MsgItem& item, const CCsConversationEntry& entry)
+    {
+    //draft
+    if(entry.IsAttributeSet(ECsAttributeDraft))
+        {
+        item.changeAttributes(MsgItem::MsgAttributeDraft); 
+        }
+    //sent
+    if(entry.IsAttributeSet(ECsAttributeSent))
+        {
+        item.changeAttributes(MsgItem::MsgAttributeSent);  
+        }
+    //new
+    if(entry.IsAttributeSet(ECsAttributeNew))
+        {
+        item.changeAttributes(MsgItem::MsgAttributeNew); 
+        }
+    //unread
+    if(entry.IsAttributeSet(ECsAttributeUnread))
+        {
+        item.changeAttributes(MsgItem::MsgAttributeUnread); 
+        }
+    //High priority
+    if(entry.IsAttributeSet(ECsAttributeHighPriority))
+        {
+        item.changeAttributes(MsgItem::MsgAttributeHighPriority); 
+        }
+    //low priority
+    if(entry.IsAttributeSet(ECsAttributeLowPriority))
+        {
+        item.changeAttributes(MsgItem::MsgAttributeLowPriority); 
+        }
+    //attachment
+    if(entry.IsAttributeSet(ECsAttributeAttachment))
+        {
+        item.changeAttributes(MsgItem::MsgAttributeAttachment); 
+        }
+    }
+
+//EOF