meetingrequest/mrservices/src/cesmrconflictchecker.cpp
branchRCL_3
changeset 80 726fba06891a
parent 64 3533d4323edc
--- a/meetingrequest/mrservices/src/cesmrconflictchecker.cpp	Wed Sep 15 11:52:37 2010 +0300
+++ b/meetingrequest/mrservices/src/cesmrconflictchecker.cpp	Wed Oct 13 14:11:15 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 *  Description : ESMR conflict checker implementation
-*  Version     : %version: e002sa33#9 %
+*  Version     : %version: e002sa33#10.1.2 %
 *
 */
 
@@ -22,6 +22,7 @@
 #include "esmrhelper.h"
 #include "esmrentryhelper.h"
 #include "esmrinternaluid.h"
+#include "cesmrcaluserutil.h"
 
 #include <calcommon.h>
 #include <calinstance.h>
@@ -96,7 +97,7 @@
     {
     FUNC_LOG;
     const CalCommon::TCalViewFilter instanceFilter =
-            CalCommon::EIncludeAppts;
+            CalCommon::EIncludeAppts | CalCommon::EIncludeEvents;
 
     TDateTime start = aStart.DateTime();
     TDateTime end   = aEnd.DateTime();
@@ -295,7 +296,8 @@
 
         allCalenInstanceView[i]->FindInstanceL(
                 aInstances,
-                CalCommon::EIncludeAppts,
+                CalCommon::EIncludeAppts |
+                CalCommon::EIncludeEvents ,
                 timeRange );
         }
 
@@ -367,7 +369,7 @@
                 MoveInstancesL( tmpInstanceArray, aInstances );
                 if ( !aFindAllConflicts )
                     {
-                    break;
+                    //break;
                     }
                 }
             }
@@ -399,7 +401,7 @@
                 MoveInstancesL( tmpInstanceArray, aInstances );
                 if ( !aFindAllConflicts )
                     {
-                    break;
+                    //break;
                     }
                 }
 
@@ -479,7 +481,7 @@
                         MoveInstancesL( tmpInstanceArray, aInstances );
                         if ( !aFindAllConflicts )
                             {
-                            break;
+                            //break;
                             }
                         }
                     }
@@ -523,7 +525,7 @@
                         MoveInstancesL( tmpInstanceArray, aInstances );
                         if ( !aFindAllConflicts )
                             {
-                            break;
+                           // break;
                             }
                         }
                     }
@@ -545,6 +547,50 @@
     }
 
 /**
+ * Judge is one CCalEntry is a all day event
+ * @param aEntry the entry be checked
+ * @return ETure if it is a all day event
+ */
+TBool IsAllDayEventL( const CCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    // for judge all day event
+    CCalEntry* tmpEntry = ESMRHelper::CopyEntryLC(
+						aEntry,
+						aEntry.MethodL(),
+                        ESMRHelper::ECopyFull );
+    
+    CESMRCalUserUtil* entryUtil = CESMRCalUserUtil::NewLC( *tmpEntry );
+    TBool allDayEvent( entryUtil->IsAlldayEventL() );
+    CleanupStack::PopAndDestroy( entryUtil );
+    CleanupStack::PopAndDestroy( tmpEntry );
+    
+    return allDayEvent;
+    }
+/**
+ * Get the first visible instance from the iterater.
+ * @param aIterater the handler of the iterater.
+ * @return the first instance
+ */
+CCalInstance* FirstInstanceL ( CCalInstanceIterator* aIterater)
+	{
+	FUNC_LOG;
+	CCalInstance* previous = aIterater->PreviousL();
+	while( previous )
+		{
+		CleanupStack::PushL( previous );
+		CleanupStack::PopAndDestroy( previous );
+		previous = aIterater->PreviousL();
+		}
+	
+	CCalInstance* next = aIterater->NextL();
+	CleanupStack::PushL( next );
+	CleanupStack::PopAndDestroy( next );
+	previous = aIterater->PreviousL();
+	return previous;
+	}
+
+/**
  * Finds conflict for recurrent entry
  */
 void FindConflictsForRepeatingMeetingL(
@@ -562,38 +608,67 @@
         CleanupStack::PushL( instance );
         RCPointerArray< CCalInstance > tmpInstanceArray;
         CleanupClosePushL( tmpInstanceArray );
+        CCalEntry& parent = instance->Entry();
+        CCalInstanceView* instanceView = aDb.InstanceViewL( aEntry );
 
-        CCalEntry& parent = instance->Entry();
-        CCalInstanceView* instanceView = aDb.InstanceViewL( parent );
+        // create the iterator for instances by current entry
         CCalInstanceIterator* iterator = instanceView->FindInstanceByUidL(
-                        parent.UidL(),
-                        parent.StartTimeL() );
+        		aEntry.UidL(),
+        		aEntry.StartTimeL() );
+        
         CleanupStack::PushL( iterator );
         CCalEntry* entry = ESMRHelper::CopyEntryLC(
                             parent,
                             parent.MethodL(),
                             ESMRHelper::ECopyFull );
-
-        while ( iterator->HasMore() )
-            {
-            CCalInstance* next = iterator->NextL();
-            CleanupStack::PushL( next );
-            entry->SetStartAndEndTimeL( next->StartTimeL(), next->EndTimeL() );
-            CleanupStack::PopAndDestroy( next );
-            FindConflictsForEntryL( *entry,
-                                    tmpInstanceArray,
-                                    aDb );
-
-            if ( tmpInstanceArray.Count() )
-                {
-                MoveInstancesL( tmpInstanceArray, aInstances );
-
-                if ( !aFindAllConflicts )
-                    {
-                    break;
-                    }
-                }
-            }
+        // For CCalInstanceIterator class don't have any function on how to get current instance, 
+        // handle the special situation for it.
+        if( iterator ->Count() == 1 )
+        	{
+			entry->SetStartAndEndTimeL( aEntry.StartTimeL(), aEntry.EndTimeL() );
+			
+			FindConflictsForEntryL( *entry,
+									tmpInstanceArray,
+									aDb );
+			
+			if ( tmpInstanceArray.Count() )
+				{
+			    MoveInstancesL( tmpInstanceArray, aInstances );
+				}
+        	}
+        else
+        	{
+			 // For CCalInstanceIterator class don't have any function on how to get current instance,
+			 // handle the first instance action when find conflict.
+			 CCalInstance* previous = FirstInstanceL( iterator );
+			 CleanupStack::PushL( previous );
+			 entry->SetStartAndEndTimeL( previous->StartTimeL(), previous->EndTimeL() );
+			 CleanupStack::PopAndDestroy( previous );
+			 FindConflictsForEntryL( *entry, tmpInstanceArray, aDb );
+			 
+			 if ( tmpInstanceArray.Count() )
+				{
+				MoveInstancesL( tmpInstanceArray, aInstances );
+				}
+			 // does the normal find conflict action. From the second to the end.
+			 while ( iterator->HasMore() )
+				{
+				CCalInstance* next = iterator->NextL();
+				CleanupStack::PushL( next );
+				entry->SetStartAndEndTimeL( next->StartTimeL(), next->EndTimeL() );
+	
+				CleanupStack::PopAndDestroy( next );
+	
+				FindConflictsForEntryL( *entry,
+										tmpInstanceArray,
+										aDb );
+	
+				if ( tmpInstanceArray.Count() )
+					{
+					MoveInstancesL( tmpInstanceArray, aInstances );
+					}
+				}
+        	}
 
         CleanupStack::PopAndDestroy( entry );