calendarui/multicaluidialog/src/multicaluidialogmodel.cpp
branchRCL_3
changeset 66 bd7edf625bdd
child 67 1539a383d7b6
child 86 ed599363c2d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/multicaluidialog/src/multicaluidialogmodel.cpp	Wed Sep 01 12:32:31 2010 +0100
@@ -0,0 +1,349 @@
+/*
+ * 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 : Implemrntation class for calenmultidbutility .
+ *                 
+ *
+ */
+// system include.
+#include <calsession.h>
+#include <calentryview.h>
+#include <calentry.h>
+#include <CalenInterimUtils2.h>
+#include <calcalendarinfo.h>
+#include <calcalendariterator.h>
+#include <calenmulticaluids.hrh>
+#include <ErrorUI.h>
+
+// user include.
+#include "multicaluidialogmodel.h"
+#include "calendarui_debug.h"
+#include "CleanupResetAndDestroy.h"
+
+const TInt KBuffLength = 24;
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::CMultiCalUiDialogModel
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CMultiCalUiDialogModel::CMultiCalUiDialogModel()
+    {
+    TRACE_ENTRY_POINT
+    TRACE_EXIT_POINT
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::NewL
+// First phase constructor
+// ----------------------------------------------------------------------------
+//
+CMultiCalUiDialogModel* CMultiCalUiDialogModel::NewL()
+    {
+    TRACE_ENTRY_POINT
+    CMultiCalUiDialogModel* self = CMultiCalUiDialogModel::NewLC();
+    CleanupStack::Pop(self);
+    TRACE_EXIT_POINT
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::NewLC
+// First phase constructor
+// ----------------------------------------------------------------------------
+//
+CMultiCalUiDialogModel* CMultiCalUiDialogModel::NewLC()
+    {
+    TRACE_ENTRY_POINT
+    CMultiCalUiDialogModel* self = new (ELeave) CMultiCalUiDialogModel();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    TRACE_EXIT_POINT
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::~CMultiCalUiDialogModel
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+CMultiCalUiDialogModel::~CMultiCalUiDialogModel()
+    {
+    TRACE_ENTRY_POINT
+
+    iCalendarInfoList.ResetAndDestroy();
+
+    if (iCalendarsSession)
+        {
+        delete iCalendarsSession;
+        iCalendarsSession = NULL;
+        }
+
+    iCalEntryViewArray.ResetAndDestroy();
+
+    iCalSessionArray.ResetAndDestroy();
+
+    iCalendarStatus.Reset();
+
+    if (iInterimUtils)
+        {
+        delete iInterimUtils;
+        iInterimUtils = NULL;
+        }
+
+    iCalEntries.Reset();
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::SetCalEntry
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+void CMultiCalUiDialogModel::SetCalEntryL(
+        const RPointerArray<CCalEntry>& aCalEntries)
+    {
+    TRACE_ENTRY_POINT
+    //We take only the pointers to entries , we dont own it
+    //So never do iCalEntries.ResetAndDestroy() only Reset
+    for (TInt i = 0; i < aCalEntries.Count(); i++)
+        {
+        iCalEntries.AppendL(aCalEntries[i]);
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::GetMultiDbInfo
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+RPointerArray<CCalCalendarInfo>& CMultiCalUiDialogModel::GetCalendarInfoArray()
+    {
+    TRACE_ENTRY_POINT
+    TRACE_EXIT_POINT;
+    return iCalendarInfoList;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::ConstructL
+// Second phase constructor
+// ----------------------------------------------------------------------------
+//
+void CMultiCalUiDialogModel::ConstructL()
+    {
+    TRACE_ENTRY_POINT
+    //iCalSessionArray takes ownership of this.
+    CCalSession* defaultSession = CCalSession::NewL();
+    
+    TRAPD(err,GetAllCalendarInfoL(iCalendarInfoList));
+    
+    //Something happened and 
+    if(err!=KErrNone)
+        {
+        CErrorUI* errorUi = CErrorUI::NewLC();
+        errorUi->ShowGlobalErrorNoteL( err );
+        CleanupStack::PopAndDestroy( errorUi );
+        }
+    
+    for (TInt index = 0; index < iCalendarInfoList.Count(); index++)
+        {
+        iCalendarStatus.Append(0);
+
+        if (!index) //First create the default session
+            {
+            const TPtrC name = iCalendarInfoList[index]->FileNameL();
+            defaultSession->OpenL(name);
+            iCalSessionArray.Append(defaultSession);
+            CCalEntryView* entryView = CCalEntryView::NewL(*defaultSession);
+            CleanupStack::PushL(entryView);
+            iCalEntryViewArray.Append(entryView);
+            CleanupStack::Pop(entryView);
+            }
+        else
+            {
+            CCalSession* session = CCalSession::NewL(*defaultSession);
+            CleanupStack::PushL(session);
+            const TPtrC name = iCalendarInfoList[index]->FileNameL();
+            session->OpenL(name);
+            CleanupStack::Pop(session);
+            iCalSessionArray.Append(session);
+            CCalEntryView* entryView = CCalEntryView::NewL(*session);
+            CleanupStack::PushL(entryView);
+            iCalEntryViewArray.Append(entryView);
+            CleanupStack::Pop(entryView);
+            }
+        }
+
+    iInterimUtils = CCalenInterimUtils2::NewL();
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::SetCalendarStatus
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+void CMultiCalUiDialogModel::SetCalendarStatus(TInt aIndex, TBool aStatus)
+    {
+    TRACE_ENTRY_POINT
+    __ASSERT_ALWAYS(aIndex >= 0,User::Invariant());
+    iCalendarStatus.Remove(aIndex);
+    iCalendarStatus.Insert(aStatus,aIndex);
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::GetCalendarStatus
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+TBool CMultiCalUiDialogModel::GetCalendarStatus(TInt aIndex)
+    {
+    TRACE_ENTRY_POINT
+    __ASSERT_ALWAYS(aIndex >= 0,User::Invariant());
+    TRACE_EXIT_POINT;
+    return iCalendarStatus[aIndex];
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::MarkedCalendarsCount
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+TInt CMultiCalUiDialogModel::MarkedCalendarsCount()
+    {
+    TRACE_ENTRY_POINT
+    TInt count = NULL;
+    for (TInt i = 0; i < iCalendarStatus.Count(); i++)
+        {
+        if (iCalendarStatus[i])
+            {
+            count++;
+            }
+        }TRACE_EXIT_POINT;
+    return count;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::StoreCalEntryL
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+void CMultiCalUiDialogModel::StoreCalEntryL()
+    {
+    TRACE_ENTRY_POINT
+    //Create copy for entires.
+    RPointerArray<CCalEntry> copyEntries;
+    //Store the copy into calendars
+    for (TInt i = 0; i < iCalEntryViewArray.Count(); i++)
+        {
+        if (iCalendarStatus[i])
+            {
+            TInt numSuccess;            
+            CreateCopyL(copyEntries);
+            iCalEntryViewArray[i]->StoreL(copyEntries, numSuccess);
+            copyEntries.ResetAndDestroy();
+            }
+        }
+
+    
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::CreateCopyL
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+void CMultiCalUiDialogModel::CreateCopyL(
+        RPointerArray<CCalEntry>& aCalCopyEntries)
+    {
+    TRACE_ENTRY_POINT;
+
+    CleanupResetAndDestroyPushL(aCalCopyEntries);
+    for (TInt i = 0; i < iCalEntries.Count(); i++)
+        {
+        const CCalEntry* sourceEntry = iCalEntries[i];
+
+        HBufC8* guid = iInterimUtils->GlobalUidL();
+        CleanupStack::PushL(guid);
+
+        CCalEntry* copyEntry = CCalEntry::NewL(sourceEntry->EntryTypeL(),
+                guid, CCalEntry::EMethodNone, 0);
+
+        CleanupStack::Pop(guid); // ownership was passed
+        CleanupStack::PushL(copyEntry);
+
+        sourceEntry->DescriptionL(); // make sure entry is fully loaded
+        copyEntry->CopyFromL(*sourceEntry, CCalEntry::EDontCopyId);
+        copyEntry->DescriptionL(); // make sure entry is fully copied
+
+        aCalCopyEntries.AppendL(copyEntry);
+
+        CleanupStack::Pop(copyEntry);
+        }
+    CleanupStack::Pop(&aCalCopyEntries);
+    TRACE_EXIT_POINT;;
+    }
+
+// ----------------------------------------------------------------------------
+// CMultiCalUiDialogModel::GetAllCalendarInfoL
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+void CMultiCalUiDialogModel::GetAllCalendarInfoL(RPointerArray<
+        CCalCalendarInfo>& aCalendarInfoList)
+    {
+    TRACE_ENTRY_POINT
+
+    if (!iCalendarsSession)
+        {
+        iCalendarsSession = CCalSession::NewL();
+        }
+    CCalCalendarIterator* calIter = CCalCalendarIterator::NewL(
+            *iCalendarsSession);
+    CleanupStack::PushL(calIter);
+
+    for( CCalCalendarInfo* calendarInfo = calIter->FirstL();
+            calendarInfo!=NULL;calendarInfo = calIter->NextL())
+        {
+            TBuf8<KBuffLength> keyBuff;
+            // Mark the meta property as SoftDeleted
+            keyBuff.Zero();
+            keyBuff.AppendNum(EMarkAsDelete);
+            TBool softDelete = EFalse;
+            TPckgC<TBool> pkgSoftDelete( softDelete );
+            TRAPD(err,pkgSoftDelete.Set(calendarInfo->PropertyValueL(keyBuff)));
+            if( KErrNone == err )
+                {
+                softDelete = pkgSoftDelete();
+                }
+            if(!softDelete)
+                {
+                aCalendarInfoList.Append(calendarInfo);
+                }
+            else
+                {
+                delete calendarInfo;
+                }
+        }
+    CleanupStack::PopAndDestroy(calIter);
+
+    TRACE_EXIT_POINT;
+    }
+
+// end of file