javamanager/javainstaller/installer/src.s60/applicationregistrator/sifnotifier.cpp
changeset 35 85266cc22c7f
parent 26 dc7c549001d5
child 47 f40128debb5d
child 49 35baca0e7a2e
--- a/javamanager/javainstaller/installer/src.s60/applicationregistrator/sifnotifier.cpp	Thu May 27 12:49:31 2010 +0300
+++ b/javamanager/javainstaller/installer/src.s60/applicationregistrator/sifnotifier.cpp	Fri Jun 11 13:33:44 2010 +0300
@@ -161,7 +161,7 @@
     jstring aGlobalComponentId, jint aErrCategory, jint aErrCode,
     jstring aErrMsg, jstring aErrMsgDetails)
 {
-    __UHEAP_MARK;
+    //__UHEAP_MARK;
     HBufC *globalComponentId = CreateHBufCFromJavaStringLC(aEnv, aGlobalComponentId);
     HBufC *errMsg = NULL;
     if (NULL != aErrMsg)
@@ -174,24 +174,29 @@
         errMsgDetails = CreateHBufCFromJavaStringLC(aEnv, aErrMsgDetails);
     }
 
-    CSifOperationEndData *endData = CSifOperationEndData::NewLC(
-                                        *globalComponentId, (TErrorCategory)aErrCategory, aErrCode,
-                                        *errMsg, *errMsgDetails);
+    CSifOperationEndData *endData =
+        CSifOperationEndData::NewLC(
+            *globalComponentId, (TErrorCategory)aErrCategory, aErrCode,
+            (NULL != errMsg? *errMsg: KNullDesC()),
+            (NULL != errMsgDetails? *errMsgDetails: KNullDesC()));
 
+    // Do not use UHEAP macros around PublishCompletionL() because it
+    // creates a timer object which gets deleted only when the notifier
+    // object is deleted.
     aNotifier->PublishCompletionL(*endData);
 
     CleanupStack::PopAndDestroy(endData);
 
-    if (NULL != aErrMsg)
+    if (NULL != errMsgDetails)
+    {
+        CleanupStack::PopAndDestroy(errMsgDetails);
+    }
+    if (NULL != errMsg)
     {
         CleanupStack::PopAndDestroy(errMsg);
     }
-    if (NULL != aErrMsgDetails)
-    {
-        CleanupStack::PopAndDestroy(errMsgDetails);
-    }
     CleanupStack::PopAndDestroy(globalComponentId);
-    __UHEAP_MARKEND;
+    //__UHEAP_MARKEND;
 }
 
 /*
@@ -203,10 +208,25 @@
 (JNIEnv *aEnv, jclass, jint aHandle, jstring aGlobalComponentId,
  jint aErrCategory, jint aErrCode, jstring aErrMsg, jstring aErrMsgDetails)
 {
+    CActiveScheduler* newScheduler = 0;
+    if (0 == CActiveScheduler::Current())
+    {
+        // Create ActiveScheduler as it does not yet exist.
+        newScheduler = new CActiveScheduler;
+        CActiveScheduler::Install(newScheduler);
+    }
+
     CPublishSifOperationInfo *pNotifier =
         reinterpret_cast<CPublishSifOperationInfo*>(aHandle<<2);
     TRAPD(err, NotifyEndL(aEnv, pNotifier, aGlobalComponentId,
                           aErrCategory, aErrCode, aErrMsg, aErrMsgDetails));
+
+    if (newScheduler)
+    {
+        delete newScheduler;
+        newScheduler = 0;
+    }
+
     return err;
 }