logsui/logsengine/src/logsevent.cpp
changeset 15 76d2cf7a585e
parent 8 6c9acdc6adc0
child 17 90fe74753f71
--- a/logsui/logsengine/src/logsevent.cpp	Fri Aug 06 14:57:47 2010 +0300
+++ b/logsui/logsengine/src/logsevent.cpp	Mon Aug 23 18:14:51 2010 +0300
@@ -48,12 +48,13 @@
     mIsRead(false),
     mIsALS(false),
     mDuration(0),
-    mIndex(0),
+    mIndex(-1),
     mIsInView(false),
     mEventState(EventAdded),
     mIsLocallySeen(false),
     mIsPrivate(false),
-    mIsUnknown(false)
+    mIsUnknown(false),
+    mContactMatched(false)
 {
 }
 
@@ -87,6 +88,8 @@
     mIsLocallySeen = event.mIsLocallySeen;
     mIsPrivate = event.mIsPrivate;
     mIsUnknown = event.mIsUnknown;
+    mContactMatched = event.mContactMatched;
+    mMergedDuplicates = event.mMergedDuplicates;
 }
 
 // ----------------------------------------------------------------------------
@@ -174,6 +177,24 @@
 }
 
 // ----------------------------------------------------------------------------
+// LogsEvent::setContactMatched
+// ----------------------------------------------------------------------------
+//
+void LogsEvent::setContactMatched( bool value )
+{
+    mContactMatched = value;
+}
+
+// ----------------------------------------------------------------------------
+// LogsEvent::contactMatched
+// ----------------------------------------------------------------------------
+//
+bool LogsEvent::contactMatched()
+{
+   return mContactMatched;
+}
+
+// ----------------------------------------------------------------------------
 // LogsEvent::validate
 // ----------------------------------------------------------------------------
 //
@@ -379,13 +400,23 @@
     serializedEvent >> mIsPrivate;
     serializedEvent >> mIsUnknown;
     
-    LogsEventData* logsEventData = new LogsEventData(serializedEvent);
-    if ( serializedEvent.status() == QDataStream::ReadPastEnd ){
+    bool hasEventData = false;
+    serializedEvent >> hasEventData;
+    if ( hasEventData ){
+        LogsEventData* logsEventData = new LogsEventData(serializedEvent);
+        mLogsEventData = logsEventData;
+    } else {
         mLogsEventData = 0;
-        delete logsEventData;
-    } else {
-        mLogsEventData = logsEventData;
     }
+
+    int mergedDuplCount = 0;
+    serializedEvent >> mergedDuplCount;
+    for ( int i = 0; i < mergedDuplCount; i++ ){
+        LOGS_QDEBUG( "logs [ENG]    deserializing merged duplicates")
+        LogsEvent duplEvent( serializedEvent );
+        mMergedDuplicates.append( duplEvent );
+    }
+    
     LOGS_QDEBUG( "logs [ENG] <- LogsEvent::LogsEvent deserialize")
     
 }
@@ -418,9 +449,16 @@
     serializeDestination << mIsPrivate;
     serializeDestination << mIsUnknown; 
     
-    if ( mLogsEventData ){
+    bool hasEventData = mLogsEventData;
+    serializeDestination << hasEventData;
+    if ( hasEventData ){
         mLogsEventData->serialize(serializeDestination);
     }
+
+    serializeDestination << mMergedDuplicates.count();
+    foreach ( LogsEvent duplEvent, mMergedDuplicates ){
+        duplEvent.serialize( serializeDestination );
+    }
     
     LOGS_QDEBUG( "logs [ENG] <- LogsEvent::serialize")
     return true;
@@ -672,6 +710,9 @@
 void LogsEvent::markedAsSeenLocally(bool markedAsSeen)
 {
     mIsLocallySeen = markedAsSeen;
+    for ( int i = 0; i < mMergedDuplicates.count(); i++ ){
+        mMergedDuplicates[i].markedAsSeenLocally(markedAsSeen);
+    }
 }
 
 // ----------------------------------------------------------------------------
@@ -682,27 +723,92 @@
 {
    return ( mIsLocallySeen || mIsRead );
 }          
-    
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
 bool LogsEvent::isRemotePartyPrivate() const
 {
    return mIsPrivate;
-}          
+}
 
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
 bool LogsEvent::isRemotePartyUnknown() const
 {
     return mIsUnknown;
 }
 
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
 void LogsEvent::setRemotePartyPrivate(bool markedAsPrivate)
 {
     mIsPrivate = markedAsPrivate;
 }
 
-
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
 void LogsEvent::setRemotePartyUnknown(bool markedAsUnknown)
 {
     mIsUnknown = markedAsUnknown;
 }
 
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void LogsEvent::merge(LogsEvent& event)
+{
+    if ( isUnseenEvent(*this) && isUnseenEvent(event) ){
+        setDuplicates( duplicates() + event.duplicates() + 1 );
+    }
+    if ( !mMergedDuplicates.contains(event) ){
+        mMergedDuplicates.append(event);
+    }
+}
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+QList<LogsEvent>& LogsEvent::mergedDuplicates()
+{
+    return mMergedDuplicates;
+}
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+bool LogsEvent::operator==(const LogsEvent& other) 
+{
+    return this->logId() == other.logId();
+}
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+bool LogsEvent::isCommunicationPossible() const
+{
+    return ( !isRemotePartyPrivate() && !isRemotePartyUnknown() );
+}
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+bool LogsEvent::isUnseenEvent( const LogsEvent& event ) const
+{
+    return ( event.direction() == LogsEvent::DirMissed && !event.isSeenLocally() );
+}
+
 // End of file