--- a/javaextensions/pim/framework/src.s60/cpimmanager.cpp Mon Aug 23 14:24:31 2010 +0300
+++ b/javaextensions/pim/framework/src.s60/cpimmanager.cpp Thu Sep 02 13:22:59 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);