javaextensions/pim/framework/src.s60/cpimmanager.cpp
changeset 76 4ad59aaee882
parent 26 dc7c549001d5
child 80 d6dafc5d983f
child 83 26b2b12093af
--- a/javaextensions/pim/framework/src.s60/cpimmanager.cpp	Thu Sep 02 20:20:40 2010 +0300
+++ b/javaextensions/pim/framework/src.s60/cpimmanager.cpp	Fri Sep 17 08:28:21 2010 +0300
@@ -17,35 +17,44 @@
 
 
 // INCLUDE FILES
-#include "cpimmanager.h"
+
 #include <e32std.h>
 #include <badesca.h>
-#include "pimcommon.h"
+#include <calsession.h>
+#include <flogger.h>
+#ifdef RD_JAVA_PIM_MULTICAL_ENABLED
+#include <calcalendarinfo.h>
+#include <calenmulticaluids.hrh>
+#endif
+#include "cpimmanager.h"
+#include "cpimcontactlist.h"
+#include "cpimcontactvalidator.h"
+#include "cpimeventvalidator.h"
+#include "cpimtodovalidator.h"
+#include "cpimeventlist.h"
+#include "cpimtodolist.h"
+#include "cpimversit.h"
+#include "cpimcmadapteraccess.h"
+#include "cpimeventadapteraccess.h"
+#include "cpimtodoadapteraccess.h"
+#include "cpimlocalizationmanager.h"
+#include "fs_methodcall.h"
+#include "jstringutils.h"
+#include "logger.h"
 #include "mpimcontactadaptermanager.h"
 #include "mpimeventadaptermanager.h"
 #include "mpimtodoadaptermanager.h"
 #include "mpimcontactlistadapter.h"
 #include "mpimeventlistadapter.h"
 #include "mpimtodolistadapter.h"
-#include "cpimversit.h"
 #include "mpimlocalizationmanager.h"
 #include "mpimlocalizationdata.h"
-#include "cpimcontactlist.h"
-#include "cpimeventlist.h"
-#include "cpimtodolist.h"
-#include "cpimcontactvalidator.h"
-#include "cpimeventvalidator.h"
-#include "cpimtodovalidator.h"
 #include "mpimadapteraccess.h"
-#include "cpimcmadapteraccess.h"
-#include "cpimeventadapteraccess.h"
-#include "cpimtodoadapteraccess.h"
+#include "pimcommon.h"
 #include "pimpanics.h"
 #include "pimjnitools.h"
 #include "pimutils.h"
-#include "jstringutils.h"
-#include "logger.h"
-#include "cpimlocalizationmanager.h"
+#include "s60commonutils.h"
 
 // CONSTANTS
 
@@ -55,10 +64,12 @@
  * low, at the time of writing 1 to 4.
  */
 const TInt KManagerArrayGranularity = 2;
-
+#ifdef RD_JAVA_PIM_MULTICAL_ENABLED
+const TInt KBuffLength = 24;
+#endif
 
 CPIMManager::CPIMManager() :
-        java::util::FunctionServer("CPIMManager"), iAdapterAccesses()
+        java::util::FunctionServer("CPIMManager"), iAdapterAccesses(), iCalSessions()
 {
     JELOG2(EPim);
 }
@@ -69,18 +80,86 @@
     iContactValidator = CPIMContactValidator::NewL();
     iEventValidator = CPIMEventValidator::NewL();
     iToDoValidator = CPIMToDoValidator::NewL();
-
+    iDesCArray = new(ELeave) CDesCArrayFlat(KManagerArrayGranularity);
     iLocalizationManager
     = (MPIMLocalizationManager*)(CPIMLocalizationManager::NewL());
 
     createServerToNewThread();
+    CallMethodL(this, &CPIMManager::createCalSessionL, this);
+}
+
+void CPIMManager::createCalSessionL()
+{
+    iCalSession = CCalSession::NewL();
+    //CleanupStack::PushL(iCalSession);
+    iCalSessionArray = iCalSession->ListCalFilesL();
+
+    TInt index = 0;
+    TInt find = iCalSessionArray->Find(iCalSession->DefaultFileNameL(),index);
+
+    if (!find)
+    {
+        iCalSessionArray->Delete(index);
+    }
+
+    TRAPD(err, iCalSession->OpenL(iCalSession->DefaultFileNameL()));
+    if (KErrNotFound == err)
+    {
+        iCalSession->CreateCalFileL(iCalSession->DefaultFileNameL());
+        iCalSession->OpenL(iCalSession->DefaultFileNameL());
+    }
+    else
+    {
+        User::LeaveIfError(err);
+    }
+    //CleanupStack::Pop(iCalSession);
+
+#ifdef RD_JAVA_PIM_MULTICAL_ENABLED
+    TInt iterate = 0;
+    TBool softDelete = EFalse;
+
+    while (iterate < iCalSessionArray->Count())
+    {
+        CCalSession* aCalSession = CCalSession::NewL(*iCalSession);
+        CleanupStack::PushL(aCalSession);
+        aCalSession->OpenL(iCalSessionArray->MdcaPoint(iterate));
+        CCalCalendarInfo* caleninfo = aCalSession->CalendarInfoL();
+        CleanupStack::PushL(caleninfo);
+        aCalSession->SetCalendarInfoL(*caleninfo);
+
+        TBuf8<KBuffLength> keyBuff;
+        keyBuff.Zero();
+        keyBuff.AppendNum(EMarkAsDelete);
+        TPckgC<TBool> pkgSoftDelete(softDelete);
+        TRAPD(err,pkgSoftDelete.Set(caleninfo->PropertyValueL(keyBuff)));
+        if (KErrNone == err)
+        {
+            softDelete = pkgSoftDelete();
+        }
+
+        if (softDelete)
+        {
+
+            CleanupStack::PopAndDestroy(caleninfo);
+            CleanupStack::PopAndDestroy(aCalSession);
+        }
+        else
+        {
+            iCalSessions.AppendL(aCalSession);
+            iDesCArray->AppendL(iCalSessionArray->MdcaPoint(iterate));
+            CleanupStack::PopAndDestroy(caleninfo);
+            CleanupStack::Pop(aCalSession);
+        }
+        iterate++;
+    }
+    delete iCalSessionArray;
+    iCalSessionArray = NULL;
+#endif
 }
 
 pimbasemanager* pimbasemanager::getInstance()
 {
     JELOG2(EPim);
-    // Create CPIMManager
-
     CPIMManager* self = NULL;
     TInt error = KErrNone;
     TRAP(error, self = CPIMManager::NewL());
@@ -135,9 +214,18 @@
     delete iEventValidator;
     iEventValidator = NULL;
     delete iToDoValidator;
+    CallMethod(this, &CPIMManager::DeleteSessions, this);
+    delete iDesCArray;
     iToDoValidator = NULL;
     stopServer();
 }
+void CPIMManager::DeleteSessions()
+{
+    JELOG2(EPim);
+    iCalSessions.ResetAndDestroy();
+    delete iCalSession;
+    iCalSession = NULL;
+}
 
 void CPIMManager::dispose()
 {
@@ -163,21 +251,24 @@
 }
 
 pimbaselist* CPIMManager::openPimList(const TPIMListType& aPimListType,
-                                      jstring aPimListName, JNIEnv* aJniEnv)
+                                      jstring aPimListName, jstring aCalName,
+                                      JNIEnv* aJniEnv)
 {
     JELOG2(EPim);
     const JStringUtils listName(*aJniEnv, aPimListName);
     const TDesC* listNameArg = (aPimListName ? &listName : NULL);
+    const JStringUtils calName(*aJniEnv, aCalName);
+    const TDesC* calNameArg = (aCalName ? &calName : NULL);
     pimbaselist* list = NULL;
     TInt error = KErrNone;
-    TRAP(error, list = DoOpenPimListL(aPimListType, listNameArg));
+    TRAP(error, list = DoOpenPimListL(aPimListType, listNameArg, calNameArg));
     if (error != KErrNone)
         throw error;
     return list;
 }
 
 pimbaselist* CPIMManager::DoOpenPimListL(const TPIMListType& aPimListType,
-        const TDesC* aPimListName)
+        const TDesC* aPimListName, const TDesC* aCalNameArg)
 {
     JELOG2(EPim);
     pimbaselist* list = NULL;
@@ -188,20 +279,18 @@
     }
     else if (aPimListType == EPIMEventList)
     {
-        list = DoOpenEventListL(aPimListName);
+        list = DoOpenEventListL(aPimListName, aCalNameArg);
     }
     else if (aPimListType == EPIMToDoList)
     {
-        list = DoOpenToDoListL(aPimListName);
+        list = DoOpenToDoListL(aPimListName, aCalNameArg);
     }
     else
     {
         // invalid list type
         User::Leave(KErrArgument);
     }
-
     // Check results
-
     if (!list)
     {
         if (aPimListName)
@@ -241,9 +330,6 @@
             retVal->AppendL(lists[listIndex]);
         }
     }
-
-    // Done
-
     CleanupStack::Pop(retVal);
     return retVal;
 
@@ -276,6 +362,276 @@
     return javaStringArray;
 }
 
+
+
+
+
+void CPIMManager::DoListCalendarsL()
+{
+
+#ifdef RD_JAVA_PIM_MULTICAL_ENABLED
+    iCalList = iCalSession->ListCalFilesL();
+
+    TInt index = 0;
+    TInt find = iCalList->Find(iCalSession->DefaultFileNameL(),index);
+
+    if (!find)
+    {
+        iCalList->Delete(index);
+    }
+    iCalSessionArray = iCalList;
+    TInt iterate = 0;
+    TInt aPosition = 0;
+    while (iterate < iCalList->Count())
+    {
+        aPosition = 0;
+
+        TInt findInCurrentArray = iDesCArray->Find(iCalList->MdcaPoint(iterate),aPosition, ECmpNormal16);
+        CCalSession* aCalSession;
+        if (findInCurrentArray == 0)
+        {
+            aCalSession = iCalSessions[aPosition];
+        }
+        else
+        {
+            aCalSession = CCalSession::NewL(*iCalSession);
+            CleanupStack::PushL(aCalSession);
+            aCalSession->OpenL(iCalList->MdcaPoint(iterate));
+        }
+        // check for soft deleted calendars, incase of calendars being held by other applications, this will be followed.
+        CCalCalendarInfo* caleninfo = aCalSession->CalendarInfoL();
+        CleanupStack::PushL(caleninfo);
+        aCalSession->SetCalendarInfoL(*caleninfo);
+        TBool softDelete = EFalse;
+        TBuf8<KBuffLength> keyBuff;
+        keyBuff.Zero();
+        keyBuff.AppendNum(EMarkAsDelete);
+
+        TPckgC<TBool> pkgSoftDelete(softDelete);
+
+        TRAPD(err,pkgSoftDelete.Set(caleninfo->PropertyValueL(keyBuff)));
+
+        if (KErrNone == err)
+        {
+            softDelete = pkgSoftDelete();
+        }
+
+        if (!softDelete && findInCurrentArray != 0)
+        {
+            iCalSessions.AppendL(aCalSession);
+            CleanupStack::Pop(aCalSession);
+            iDesCArray->AppendL(iCalList->MdcaPoint(iterate));
+        }
+        else if (softDelete && findInCurrentArray == 0)
+        {
+            CleanupStack::PopAndDestroy(caleninfo);
+            caleninfo = NULL;
+            delete aCalSession;
+            iCalSessions[aPosition] = NULL;
+            iCalSessions.Remove(aPosition);
+            iDesCArray->Delete(aPosition);
+
+        }
+        else if (softDelete && findInCurrentArray != 0)
+        {
+            CleanupStack::PopAndDestroy(caleninfo);
+            CleanupStack::PopAndDestroy(aCalSession);
+            caleninfo=NULL;
+            aCalSession = NULL;
+        }
+        if (caleninfo != NULL)
+        {
+            CleanupStack::PopAndDestroy(caleninfo);
+            caleninfo = NULL;
+        }
+        iterate++;
+
+    }
+
+    iCalList = iDesCArray;
+    iCalList->AppendL(iCalSession->DefaultFileNameL());
+    delete iCalSessionArray;
+    iCalSessionArray = NULL;
+#endif
+
+}
+
+
+jobjectArray CPIMManager::listCalendars(jintArray aError,
+                                        JNIEnv* aJniEnv)
+{
+
+    jobjectArray javaStringArray = NULL;
+    TInt error = KErrNone;
+    TRAP(error, CallMethodL(this, &CPIMManager::DoListCalendarsL, this));
+    if (error == KErrNone)
+    {
+        javaStringArray = CreateJavaStringArray(aJniEnv, *iCalList, EFalse);
+        if (!javaStringArray)
+        {
+            SetJavaErrorCode(aJniEnv, aError, KErrNoMemory);
+        }
+        iCalList = NULL;
+        TInt index = 0;
+        TInt find = 0;
+        TRAPD(error,find = iDesCArray->Find(iCalSession->DefaultFileNameL(),index));
+        if (error == KErrNone)
+            if (!find)
+            {
+                iDesCArray->Delete(index);
+            }
+            else
+            {
+                SetJavaErrorCode(aJniEnv, aError, error);
+            }
+    }
+    else
+    {
+
+        SetJavaErrorCode(aJniEnv, aError, error);
+    }
+    return javaStringArray;
+}
+
+jobjectArray CPIMManager::listCalendarNames(jintArray aError,
+        JNIEnv* aJniEnv)
+{
+    jobjectArray javaStringArray = NULL;
+    TInt error = KErrNone;
+    TRAP(error, CallMethodL(this, &CPIMManager::DoListCalendarNamesL, this));
+    if (error == KErrNone)
+    {
+        javaStringArray = CreateJavaStringArray(aJniEnv, *iCalListName, EFalse);
+        if (!javaStringArray)
+        {
+            SetJavaErrorCode(aJniEnv, aError, KErrNoMemory);
+        }
+        delete iCalListName;
+        iCalListName = NULL;
+    }
+    else
+    {
+        SetJavaErrorCode(aJniEnv, aError, error);
+    }
+    return javaStringArray;
+}
+
+void CPIMManager::DoListCalendarNamesL()
+{
+#ifdef RD_JAVA_PIM_MULTICAL_ENABLED
+    iCalListName = new(ELeave) CDesCArrayFlat(KManagerArrayGranularity);
+    //CleanupStack::PushL(iCalListName);
+    for (int iterate = 0; iterate < iDesCArray->Count(); iterate++)
+    {
+        CCalCalendarInfo* caleninfo = iCalSessions[iterate]->CalendarInfoL();
+        CleanupStack::PushL(caleninfo);
+        iCalListName->AppendL(caleninfo->NameL());
+
+        CleanupStack::PopAndDestroy(caleninfo);
+    }
+    CCalCalendarInfo* caleninfo = iCalSession->CalendarInfoL();
+    CleanupStack::PushL(caleninfo);
+    iCalListName->AppendL(caleninfo->NameL());
+
+    CleanupStack::PopAndDestroy(caleninfo);
+    //CleanupStack::Pop(iCalListName);
+#endif
+}
+void CPIMManager::createCalendar(jstring aCalName,jstring aDisplayName, JNIEnv* aJniEnv)
+{
+    const JStringUtils calName(*aJniEnv, aCalName);
+    const JStringUtils displayName(*aJniEnv, aDisplayName);
+    const TDesC* displayNameArg = (aDisplayName ? &displayName : NULL);
+    const TDesC* calNameArg = (aCalName ? &calName : NULL);
+    TInt error = KErrNone;
+    TRAP(error, CallMethodL(this, &CPIMManager::DoCreateCalFileL, *calNameArg,*displayNameArg, this));
+    if (error != KErrNone)
+        throw error;
+}
+
+void CPIMManager::DoCreateCalFileL(const TDesC& aFileName, const TDesC& aDisplayName)
+{
+    #ifdef RD_JAVA_PIM_MULTICAL_ENABLED
+
+    CCalSession* aCalSession = CCalSession::NewL(*iCalSession);
+    CleanupStack::PushL(aCalSession);
+    CCalCalendarInfo* calendarInfo = CCalCalendarInfo::NewL();
+    CleanupStack::PushL(calendarInfo);
+
+    aCalSession->CreateCalFileL(aFileName,*calendarInfo);
+    CleanupStack::PopAndDestroy(calendarInfo);
+    aCalSession->OpenL(aFileName);
+    CCalCalendarInfo* calendarinfostack = aCalSession->CalendarInfoL();
+    CleanupStack::PushL(calendarinfostack);
+
+    calendarinfostack->SetNameL(aDisplayName);
+    calendarinfostack->SetEnabled(ETrue);
+    aCalSession->SetCalendarInfoL(*calendarinfostack);
+    CleanupStack::PopAndDestroy(calendarinfostack);
+    iCalSessions.AppendL(aCalSession);
+    iDesCArray->AppendL(aFileName);
+    CleanupStack::Pop(aCalSession);
+
+    #endif
+}
+
+void CPIMManager::deleteCalendar(jstring aCalName, JNIEnv* aJniEnv)
+{
+    const JStringUtils calName(*aJniEnv, aCalName);
+    const TDesC* calNameArg = (aCalName ? &calName : NULL);
+    TInt error = KErrNone;
+    TRAP(error, CallMethodL(this, &CPIMManager::DoDeleteCalFileL, *calNameArg, this));
+    if (error != KErrNone)
+        throw error;
+
+}
+
+
+void CPIMManager::DoDeleteCalFileL(const TDesC& aFileName)
+{
+	  #ifdef RD_JAVA_PIM_MULTICAL_ENABLED
+
+    if (aFileName != iCalSession->DefaultFileNameL())
+    {
+        TInt aPosition = 0;
+        TInt findInCurrentArray = iDesCArray->Find(aFileName, aPosition, ECmpNormal16);
+        if (findInCurrentArray == 0)
+        {
+            CCalCalendarInfo* caleninfo = iCalSessions[aPosition]->CalendarInfoL();
+            CleanupStack::PushL(caleninfo);
+
+            caleninfo->SetEnabled(EFalse);
+
+            TBuf8<KBuffLength> keyBuff;
+
+            keyBuff.Zero();
+            keyBuff.AppendNum(EMarkAsDelete);
+            TPckgC<TBool> pkgSoftDelete(ETrue);
+            caleninfo->SetPropertyL(keyBuff, pkgSoftDelete);
+
+            CleanupStack::PopAndDestroy(caleninfo);
+            TRAP_IGNORE(iCalSessions[aPosition]->DeleteCalFileL(aFileName));
+
+            delete iCalSessions[aPosition];
+            iCalSessions[aPosition]= NULL;
+            iCalSessions.Remove(aPosition);
+
+            iDesCArray->Delete(aPosition);
+        }
+        else
+        {
+            User::Leave(KErrNotFound);
+        }
+
+    }
+    else
+    {
+        User::Leave(KErrAccessDenied);
+    }
+
+    #endif
+}
+
 const CPIMContactValidator& CPIMManager::ContactValidator()
 {
     JELOG2(EPim);
@@ -309,26 +665,20 @@
         if (iAdapterAccesses[i]->OpenContactListL(aListName,
                 &contactAdapterManager, &contactListAdapter, &localizationData))
         {
-            // got one
             CleanupDeletePushL(contactAdapterManager);
             CleanupDeletePushL(contactListAdapter);
-
             contactList = CPIMContactList::NewL(contactAdapterManager,
                                                 contactListAdapter, localizationData, *iContactValidator);
-
             CleanupStack::Pop(contactListAdapter);
             CleanupStack::Pop(contactAdapterManager);
-
             break;
         }
-
-        // else try next Adapter Access
     }
 
     return contactList;
 }
 
-CPIMEventList* CPIMManager::DoOpenEventListL(const TDesC* aListName)
+CPIMEventList* CPIMManager::DoOpenEventListL(const TDesC* aListName, const TDesC* aCalNameArg)
 {
     JELOG2(EPim);
     CPIMEventList* eventList = NULL;
@@ -337,22 +687,40 @@
     MPIMEventListAdapter* eventListAdapter = NULL;
     MPIMLocalizationData* localizationData = NULL;
 
+
+    CCalSession* calSession = NULL;
+    TInt findInCurrentArray = 0;
+    TInt aPosition = 0;
+    if (aCalNameArg == NULL || *aCalNameArg == iCalSession->DefaultFileNameL())
+    {
+        calSession = iCalSession;
+    }
+    else
+    {
+        findInCurrentArray = iDesCArray->Find(*aCalNameArg, aPosition);
+
+        if (findInCurrentArray == 0)
+        {
+            calSession = iCalSessions[aPosition];
+        }
+        else
+        {
+            User::Leave(KErrNotFound);
+        }
+    }
+
     const TInt n = iAdapterAccesses.Count();
     for (TInt i = 0; i < n; i++)
     {
-        if (iAdapterAccesses[i]->OpenEventListL(aListName,
+        if (iAdapterAccesses[i]->OpenEventListL(calSession, aListName,
                                                 &eventAdapterManager, &eventListAdapter, &localizationData))
         {
-            // got one
             CleanupDeletePushL(eventAdapterManager);
             CleanupDeletePushL(eventListAdapter);
-
             eventList = CPIMEventList::NewL(eventAdapterManager,
                                             eventListAdapter, localizationData, *iEventValidator);
-
             CleanupStack::Pop(eventListAdapter);
             CleanupStack::Pop(eventAdapterManager);
-
             break;
         }
 
@@ -362,7 +730,7 @@
     return eventList;
 }
 
-CPIMToDoList* CPIMManager::DoOpenToDoListL(const TDesC* aListName)
+CPIMToDoList* CPIMManager::DoOpenToDoListL(const TDesC* aListName, const TDesC* aCalNameArg)
 {
     JELOG2(EPim);
     CPIMToDoList* toDoList = NULL;
@@ -370,12 +738,34 @@
     MPIMToDoAdapterManager* toDoAdapterManager = NULL;
     MPIMToDoListAdapter* toDoListAdapter = NULL;
     MPIMLocalizationData* localizationData = NULL;
+    TInt aPosition = 0;
+    TInt findInCurrentArray = 0;
 
+
+    CCalSession* calSession = NULL;
+
+    if (aCalNameArg == NULL || *aCalNameArg == iCalSession->DefaultFileNameL())
+    {
+        calSession = iCalSession;
+    }
+    else
+    {
+        findInCurrentArray = iDesCArray->Find(*aCalNameArg, aPosition);
+
+        if (findInCurrentArray == 0)
+        {
+            calSession = iCalSessions[aPosition];
+        }
+        else
+        {
+            User::Leave(KErrNotFound);
+        }
+    }
     const TInt n = iAdapterAccesses.Count();
     for (TInt i = 0; i < n; i++)
     {
-        if (iAdapterAccesses[i]->OpenToDoListL(aListName, &toDoAdapterManager,
-                                               &toDoListAdapter, &localizationData))
+        if (iAdapterAccesses[i]->OpenToDoListL(calSession, aListName,
+                                               &toDoAdapterManager, &toDoListAdapter,&localizationData))
         {
             // got one
             CleanupDeletePushL(toDoAdapterManager);