diff -r 773449708c84 -r 4ad59aaee882 javaextensions/pim/framework/src.s60/cpimmanager.cpp --- 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 #include -#include "pimcommon.h" +#include +#include +#ifdef RD_JAVA_PIM_MULTICAL_ENABLED +#include +#include +#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 keyBuff; + keyBuff.Zero(); + keyBuff.AppendNum(EMarkAsDelete); + TPckgC 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 keyBuff; + keyBuff.Zero(); + keyBuff.AppendNum(EMarkAsDelete); + + TPckgC 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 keyBuff; + + keyBuff.Zero(); + keyBuff.AppendNum(EMarkAsDelete); + TPckgC 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);