logsui/logsengine/logssymbianos/src/logsdbconnector.cpp
changeset 15 76d2cf7a585e
parent 8 6c9acdc6adc0
child 17 90fe74753f71
--- a/logsui/logsengine/logssymbianos/src/logsdbconnector.cpp	Fri Aug 06 14:57:47 2010 +0300
+++ b/logsui/logsengine/logssymbianos/src/logsdbconnector.cpp	Mon Aug 23 18:14:51 2010 +0300
@@ -30,6 +30,14 @@
 
 // CONSTANTS
 
+// Telephony Configuration API
+// Keys under this category are used in defining telephony configuration.
+const TUid logsTelConfigurationCRUid = {0x102828B8};
+
+// Amount of digits to be used in contact matching.
+// This allows a customer to variate the amount of digits to be matched.
+const TUint32 logsTelMatchDigits = 0x00000001;
+
 
 // ----------------------------------------------------------------------------
 // LogsDbConnector::LogsDbConnector
@@ -151,7 +159,6 @@
         return -1;
     }
     mReader->updateDetails(clearCached);    
-    readCompleted( mEvents.count() ); //to notify of model update
     return 0;    
 }
 
@@ -199,6 +206,16 @@
                 logsReadSizeCompressEnabled, LogsEvent::DirUndefined);
         mCompressionEnabled = true;
     }
+    
+    //Get number of digits used to match   
+    int matchLen;
+    TRAPD( err, getTelNumMatchLenL(matchLen) )
+    if ( err ){
+        LOGS_QDEBUG( "logs [ENG]    Getting tel num match len failed, use default" );
+        matchLen = logsDefaultMatchLength;
+    }
+    LOGS_QDEBUG_2( "logs [ENG]    Tel number match length", matchLen )
+    LogsCommonData::getInstance().setTelNumMatchLen(matchLen);
 }
 
 // ----------------------------------------------------------------------------
@@ -218,14 +235,22 @@
 // LogsDbConnector::clearEvent
 // ----------------------------------------------------------------------------
 //
-bool LogsDbConnector::clearEvents(const QList<int>& eventIds)
+bool LogsDbConnector::clearEvents(const QList<LogsEvent*>& events)
 {
     bool asyncClearingStarted(false);
     if ( mLogsRemove ){
         bool async(false);
-        int err = mLogsRemove->clearEvents(eventIds, async);
+        int err = mLogsRemove->clearEvents(events, async);
         asyncClearingStarted = ( !err && async );
-    }    
+    } 
+    
+    if ( asyncClearingStarted ){
+        // Lock reader while removing events one-by-one as reading
+        // might have chance to run while removing is still in progress
+        // which looks bad at UI layer.
+        mReader->lock(true);
+    }
+    
     return asyncClearingStarted;
 }
 
@@ -233,7 +258,7 @@
 // LogsDbConnector::markEventsSeen
 // ----------------------------------------------------------------------------
 //
-bool LogsDbConnector::markEventsSeen(const QList<int>& eventIds)
+bool LogsDbConnector::markEventsSeen(const QList<LogsEvent*>& events)
 {
     LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::markEventsSeen()" )
     
@@ -241,13 +266,16 @@
         return false;
     }
     
-    foreach( int currId, eventIds ){
-        if ( !mEventsSeen.contains(currId) ){
-            mEventsSeen.append(currId);
+    foreach( LogsEvent* ev, events ){
+        if ( !mEventsSeen.contains(*ev) ){
+            mEventsSeen.append(*ev);
+            foreach ( const LogsEvent& mergedEv, ev->mergedDuplicates() ){
+                if ( !mEventsSeen.contains(mergedEv) ){
+                    mEventsSeen.append(mergedEv);
+                }
+            }
         }
     }
-
-    LOGS_QDEBUG_2( "logs [ENG] -> event ids:", mEventsSeen );  
     
     int err = doMarkEventSeen();
     LOGS_QDEBUG_2( "logs [ENG] <- LogsDbConnector::markEventsSeen(), marking err:", 
@@ -357,7 +385,7 @@
             }
         }
         emit dataRemoved(removedIndexes);
-        deleteRemoved( numEventsLeftInMemory );
+        deleteInvalidEvents( numEventsLeftInMemory );
         mReader->stop();
     }
     LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::compressData()" )
@@ -416,10 +444,10 @@
 }
 
 // ----------------------------------------------------------------------------
-// LogsDbConnector::deleteRemoved
+// LogsDbConnector::deleteInvalidEvents
 // ----------------------------------------------------------------------------
 //
-void LogsDbConnector::deleteRemoved(int newEventCount)
+void LogsDbConnector::deleteInvalidEvents(int newEventCount)
 {
     // Remove events which are not anymore in db nor in model,
     // such events are always at end of list
@@ -435,6 +463,7 @@
 void LogsDbConnector::removeCompleted()
 {
     LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::removeCompleted()" )
+    mReader->lock(false);
     emit clearingCompleted(0);
     LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::removeCompleted()" )
 }
@@ -447,6 +476,7 @@
 {
     LOGS_QDEBUG_2( "logs [ENG] <-> LogsDbConnector::logsRemoveErrorOccured(), err:", err )
     
+    mReader->lock(false);
     emit clearingCompleted(err);
     // TODO: error handling
     
@@ -457,7 +487,7 @@
 // LogsDbConnector::readCompleted
 // ----------------------------------------------------------------------------
 //
-void LogsDbConnector::readCompleted(int readCount)
+void LogsDbConnector::readCompleted()
 {
     LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::readCompleted()" )
     LOGS_QDEBUG_EVENT_ARR(mEvents)
@@ -466,24 +496,24 @@
     mRemovedEventIndexes.clear();
     mUpdatedEventIndexes.clear();
     mAddedEventIndexes.clear();
+    mModelEvents.clear();
+    QList<LogsEvent*> toBeDeletedEvents;
     for ( int i = 0; i < mEvents.count(); i++ ){
-        if ( !mEvents.at(i)->isInView() ){
-            mRemovedEventIndexes.append( mEvents.at(i)->index() );
-        } else if ( mEvents.at(i)->eventState() == LogsEvent::EventUpdated ) {
-            mUpdatedEventIndexes.append( mEvents.at(i)->index() );
-        } else if ( mEvents.at(i)->eventState() == LogsEvent::EventAdded ) {
-            mAddedEventIndexes.append( mEvents.at(i)->index() );
-        }
-    }
-
-    bool doModelDataReset( !mRemovedEventIndexes.isEmpty() ||
-                           !mAddedEventIndexes.isEmpty() || 
-                           !mUpdatedEventIndexes.isEmpty() );
-    if ( doModelDataReset ){
-        mModelEvents.clear();
-        int numValidEvents = qMin(mEvents.count(), readCount);
-        for ( int i = 0; i < numValidEvents; i++ ){    
-            mModelEvents.append(mEvents.at(i));
+        LogsEvent* currEvent = mEvents.at(i);
+        if ( !currEvent->isInView() ){
+            if ( currEvent->index() >= 0 ){
+                mRemovedEventIndexes.append( currEvent->index() );
+            }
+            toBeDeletedEvents.append( mEvents.takeAt(i) );
+            i--;
+        } else {
+            currEvent->setIndex(i);
+            if ( currEvent->eventState() == LogsEvent::EventUpdated ) {
+                mUpdatedEventIndexes.append(i);
+            } else if ( currEvent->eventState() == LogsEvent::EventAdded ) {
+                mAddedEventIndexes.append(i);
+            }
+            mModelEvents.append(currEvent);
         }
     }
     
@@ -508,7 +538,7 @@
         }
     }
     
-    deleteRemoved(readCount);
+    qDeleteAll(toBeDeletedEvents);
 
     LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::readCompleted()" )
 }
@@ -585,7 +615,7 @@
 {
     int err = -1;
     if ( mEventsSeen.count() > 0 ){
-        err = mReader->markEventSeen(mEventsSeen.at(0));
+        err = mReader->markEventSeen(mEventsSeen.at(0).logId());
     }
     return err;
 }
@@ -610,3 +640,17 @@
     }
     return continueModify;
 }
+
+// ----------------------------------------------------------------------------
+// LogsDbConnector::getTelNumMatchLenL
+// ----------------------------------------------------------------------------
+//
+void LogsDbConnector::getTelNumMatchLenL(int& matchLen)
+{
+    TInt tempMatchLen;
+    CRepository* repository = CRepository::NewL(logsTelConfigurationCRUid);
+    CleanupStack::PushL(repository);
+    User::LeaveIfError( repository->Get(logsTelMatchDigits, tempMatchLen) );
+    CleanupStack::PopAndDestroy(repository);
+    matchLen = tempMatchLen;
+}