src/hbcore/theme/hbthemeclient_symbian_p.cpp
changeset 23 e6ad4ef83b23
parent 21 4633027730f5
child 28 b7da29130b0e
equal deleted inserted replaced
21:4633027730f5 23:e6ad4ef83b23
    41 * constructor
    41 * constructor
    42 */
    42 */
    43 HbThemeClientPrivate::HbThemeClientPrivate():
    43 HbThemeClientPrivate::HbThemeClientPrivate():
    44     clientConnected(false)
    44     clientConnected(false)
    45 {
    45 {
    46     if(THEME_SERVER_NAME != HbMemoryUtils::getCleanAppName()) {
    46     if (THEME_SERVER_NAME != HbMemoryUtils::getCleanAppName()) {
    47         themelistener = new CHbThemeListenerPrivate(this);
    47         themelistener = new CHbThemeListenerPrivate(this);
    48     }
    48     }
    49 
       
    50 
    49 
    51 #ifdef HB_SGIMAGE_ICON
    50 #ifdef HB_SGIMAGE_ICON
    52     sgDriverInit = false;
    51     sgDriverInit = false;
    53 #endif
    52 #endif
       
    53 
       
    54     queueCheckInvoker = CIdle::New(CActive::EPriorityLow); // important to set the proper prio here
    54 }
    55 }
    55 
    56 
    56 /**
    57 /**
    57 * HbThemeClientPrivate::connectToServer()
    58 * HbThemeClientPrivate::connectToServer()
    58 *
    59 *
    78         }
    79         }
    79     }
    80     }
    80 #ifdef HB_SGIMAGE_ICON
    81 #ifdef HB_SGIMAGE_ICON
    81     if (!error && !sgDriverInit) {
    82     if (!error && !sgDriverInit) {
    82         error = sgDriver.Open();
    83         error = sgDriver.Open();
    83     	if (error == KErrNone) {
    84         if (error == KErrNone) {
    84             sgDriverInit = true;
    85             sgDriverInit = true;
    85         }
    86         }
    86     }
    87     }
    87 #endif
    88 #endif
    88     return (clientConnected = (KErrNone == error));
    89     return (clientConnected = (KErrNone == error));
   100     return(TVersion(KThemeServerMajorVersionNumber,
   101     return(TVersion(KThemeServerMajorVersionNumber,
   101                     KThemeServerMinorVersionNumber,
   102                     KThemeServerMinorVersionNumber,
   102                     KThemeServerBuildVersionNumber));
   103                     KThemeServerBuildVersionNumber));
   103 }
   104 }
   104 
   105 
       
   106 class QueueEntry : public CActive
       
   107 {
       
   108 public:
       
   109     QueueEntry(HbThemeClientPrivate *tc);
       
   110     ~QueueEntry();
       
   111 
       
   112     void DoCancel();
       
   113     void RunL();
       
   114 
       
   115     void init(const HbThemeClient::IconReqInfo &reqInfo,
       
   116               HbAsyncIconInfoCallback callback,
       
   117               void *callbackParam);
       
   118 
       
   119     void issueRequest();
       
   120 
       
   121     HbThemeClientPrivate *mTc;
       
   122     TPckg<HbSharedIconInfo> *mInfoPckg;
       
   123     TPckg<TIconParams> *mParamsPckg;
       
   124     void *mCallbackParam;
       
   125     HbAsyncIconInfoCallback mCallback;
       
   126     HbSharedIconInfo mInfo;
       
   127     TIconParams mParams;
       
   128     TFileName mIconPathBuf;
       
   129 };
       
   130 
       
   131 // Never call this directly, use scheduleQueueCheck() to have it
       
   132 // invoked asynchronously when there is nothing better to do.
       
   133 static TInt checkQueue(TAny *param)
       
   134 {
       
   135     HbThemeClientPrivate *tc = static_cast<HbThemeClientPrivate *>(param);
       
   136     // Only one request can be sent a time. The themeserver is single-threaded
       
   137     // and has no special async support so it blocks anyway.
       
   138     if (tc->reqQueue.isEmpty()) {
       
   139         return 0;
       
   140     }
       
   141     foreach (QueueEntry *e, tc->reqQueue) {
       
   142         if (e->IsActive()) {
       
   143             return 0;
       
   144         }
       
   145     }
       
   146     tc->reqQueue.head()->issueRequest();
       
   147     return 0;
       
   148 }
       
   149 
       
   150 QueueEntry::QueueEntry(HbThemeClientPrivate *tc)
       
   151     : CActive(EPriorityStandard),
       
   152       mTc(tc), mInfoPckg(0), mParamsPckg(0), mCallbackParam(0)
       
   153 {
       
   154     CActiveScheduler::Add(this);
       
   155 }
       
   156 
       
   157 QueueEntry::~QueueEntry()
       
   158 {
       
   159     Cancel();
       
   160     delete mParamsPckg;
       
   161     delete mInfoPckg;
       
   162 }
       
   163 
       
   164 void QueueEntry::DoCancel()
       
   165 {
       
   166     // No cancel support on server-side, so complete here. This also means that
       
   167     // Cancel() can only be called from the dtor. See cancelGetSharedIconInfo().
       
   168     TRequestStatus *rs = &iStatus;
       
   169     User::RequestComplete(rs, KErrCancel);
       
   170 }
       
   171 
       
   172 void QueueEntry::RunL()
       
   173 {
       
   174     if (iStatus != KErrCancel) {
       
   175         mTc->reqQueue.removeOne(this);
       
   176         if (iStatus != KErrNone) {
       
   177             mInfo.type = INVALID_FORMAT;
       
   178         }
       
   179         if (!mCallback || !mCallback(mInfo, mCallbackParam)) {
       
   180             // Requestor is not interested, may not even exist anymore, so unload.
       
   181             HbThemeClient::IconReqInfo reqInfo;
       
   182             reqInfo.iconPath = QString::fromUtf16(mParams.fileName.Ptr(), mParams.fileName.Length());
       
   183             reqInfo.size = QSizeF(mParams.width, mParams.height);
       
   184             reqInfo.aspectRatioMode = (Qt::AspectRatioMode) mParams.aspectRatioMode;
       
   185             reqInfo.mode = (QIcon::Mode) mParams.mode;
       
   186             reqInfo.mirrored = (bool) mParams.mirrored;
       
   187             reqInfo.color = mParams.colorflag ? QColor(mParams.rgba) : QColor();
       
   188             reqInfo.renderMode = (HbRenderingMode) mParams.renderMode;
       
   189             mTc->unloadIcon(reqInfo);
       
   190         }
       
   191         mTc->scheduleQueueCheck();
       
   192         delete this;
       
   193     }
       
   194 }
       
   195 
       
   196 void QueueEntry::init(const HbThemeClient::IconReqInfo &reqInfo,
       
   197                       HbAsyncIconInfoCallback callback,
       
   198                       void *callbackParam)
       
   199 {
       
   200     mCallback = callback;
       
   201     mCallbackParam = callbackParam;
       
   202     mInfo.type = INVALID_FORMAT;
       
   203     mIconPathBuf = TFileName(reqInfo.iconPath.utf16());
       
   204     mParams.fileName = mIconPathBuf;
       
   205     mParams.width = reqInfo.size.width();
       
   206     mParams.height = reqInfo.size.height();
       
   207     mParams.aspectRatioMode = (TUint8) reqInfo.aspectRatioMode;
       
   208     mParams.mode = (TUint8) reqInfo.mode;
       
   209     mParams.options = (TUint8) reqInfo.options;
       
   210     mParams.mirrored = (TBool) reqInfo.mirrored;
       
   211     mParams.rgba = (TUint32) reqInfo.color.rgba();
       
   212     mParams.colorflag = reqInfo.color.isValid();
       
   213     mParams.renderMode = reqInfo.renderMode;
       
   214     mInfoPckg = new TPckg<HbSharedIconInfo>(mInfo);
       
   215     mParamsPckg = new TPckg<TIconParams>(mParams);
       
   216 }
       
   217 
       
   218 void QueueEntry::issueRequest()
       
   219 {
       
   220     TIpcArgs args(mParamsPckg, mInfoPckg);
       
   221     mTc->SendReceive(EIconLookup, args, iStatus);
       
   222     SetActive();
       
   223 }
       
   224 
   105 /**
   225 /**
   106  * HbThemeClientPrivate::getSharedIconInfo()
   226  * HbThemeClientPrivate::getSharedIconInfo()
   107  *
   227  *
   108  * Returns the shared icon information
   228  * Returns the shared icon information, asynchronous version.
   109 */
   229 */
   110 HbSharedIconInfo HbThemeClientPrivate::getSharedIconInfo(const QString &iconPath,
   230 void HbThemeClientPrivate::getSharedIconInfo(const HbThemeClient::IconReqInfo &reqInfo,
   111                         const QSizeF &size,
   231                                              HbAsyncIconInfoCallback callback,
   112                         Qt::AspectRatioMode aspectRatioMode,
   232                                              void *callbackParam)
   113                         QIcon::Mode mode,
   233 {
   114                         bool mirrored,
   234     if (!clientConnected) {
   115                         HbIconLoader::IconLoaderOptions options,
   235         HbSharedIconInfo info;
   116                         const QColor &color,
   236         info.type = INVALID_FORMAT;
   117                         HbRenderingMode renderMode)
   237         callback(info, callbackParam);
       
   238         return;
       
   239     }
       
   240     QueueEntry *e = new QueueEntry(this);
       
   241     e->init(reqInfo, callback, callbackParam);
       
   242     reqQueue.enqueue(e);
       
   243     scheduleQueueCheck();
       
   244 }
       
   245 
       
   246 void HbThemeClientPrivate::scheduleQueueCheck()
       
   247 {
       
   248     if (queueCheckInvoker && !queueCheckInvoker->IsActive()) {
       
   249         queueCheckInvoker->Start(TCallBack(checkQueue, this));
       
   250     }
       
   251 }
       
   252 
       
   253 /**
       
   254  * HbThemeClientPrivate::cancelGetSharedIconInfo
       
   255  *
       
   256  * Cancels a previous async getSharedIconInfo request.
       
   257  * If callbackParam is 0 then it is ignored and only \a callback is used in the matching.
       
   258  * Otherwise both \a callback and \a callbackParam must match.
       
   259 */
       
   260 void HbThemeClientPrivate::cancelGetSharedIconInfo(HbAsyncIconInfoCallback callback,
       
   261                                                    void *callbackParam)
       
   262 {
       
   263     for (int i = 0; i < reqQueue.count(); ++i) {
       
   264         QueueEntry *e = reqQueue.at(i);
       
   265         if (e->mCallback == callback && (!callbackParam || callbackParam == e->mCallbackParam)) {
       
   266             if (e->IsActive()) {
       
   267                 // There is no real cancelation support, the themeserver is busy
       
   268                 // and is blocked at this point, so just let it go and ignore
       
   269                 // the future results. Calling Cancel() would potentially result
       
   270                 // in a stray signal.
       
   271                 e->mCallback = 0;
       
   272             } else {
       
   273                 delete e;
       
   274                 reqQueue.removeAt(i--);
       
   275             }
       
   276         }
       
   277     }
       
   278 }
       
   279 
       
   280 inline TIconParams reqInfoToParams(const HbThemeClient::IconReqInfo &reqInfo)
       
   281 {
       
   282     TIconParams params;
       
   283     params.fileName.Copy(TPtrC(static_cast<const TUint16 *>(reqInfo.iconPath.utf16()),
       
   284                                reqInfo.iconPath.length()));
       
   285     params.width = reqInfo.size.width();
       
   286     params.height = reqInfo.size.height();
       
   287     params.aspectRatioMode = (TUint8)  reqInfo.aspectRatioMode;
       
   288     params.mode = (TUint8) reqInfo.mode;
       
   289     params.options = (TUint8) reqInfo.options;
       
   290     params.mirrored = (TBool) reqInfo.mirrored;
       
   291     params.rgba = (TUint32) reqInfo.color.rgba();
       
   292     params.colorflag = reqInfo.color.isValid();
       
   293     params.renderMode = reqInfo.renderMode;
       
   294     return params;
       
   295 }
       
   296 
       
   297 /**
       
   298  * HbThemeClientPrivate::getSharedIconInfo()
       
   299  *
       
   300  * Returns the shared icon information, synchronous version.
       
   301 */
       
   302 HbSharedIconInfo HbThemeClientPrivate::getSharedIconInfo(const HbThemeClient::IconReqInfo &reqInfo)
   118 {
   303 {
   119     HbSharedIconInfo sharedIconInfo;
   304     HbSharedIconInfo sharedIconInfo;
   120     sharedIconInfo.type = INVALID_FORMAT;
   305     sharedIconInfo.type = INVALID_FORMAT;
   121 
   306 
   122     if ( !clientConnected ) {
   307     if (!clientConnected) {
   123         return sharedIconInfo;
   308         return sharedIconInfo;
   124     }
   309     }
   125 
   310 
   126     TBuf<256> buffer(iconPath.utf16());
       
   127     TPckg<HbSharedIconInfo> iconInfo(sharedIconInfo);
   311     TPckg<HbSharedIconInfo> iconInfo(sharedIconInfo);
   128 
   312     TIconParams params = reqInfoToParams(reqInfo);
   129     TIconParams params;
       
   130     params.fileName = buffer;
       
   131     params.width = size.width();
       
   132     params.height = size.height();
       
   133     params.aspectRatioMode = (TUint8)aspectRatioMode;
       
   134     params.mode = (TUint8)mode;
       
   135     params.options = (TUint8)options;
       
   136     params.mirrored = (TBool)mirrored;
       
   137     params.rgba = (TUint32) color.rgba();
       
   138     params.colorflag = color.isValid();
       
   139     params.renderMode = renderMode;
       
   140 
   313 
   141     TPckg<TIconParams> paramPckg(params);
   314     TPckg<TIconParams> paramPckg(params);
   142 
   315     TIpcArgs args(&paramPckg, &iconInfo);
   143     TIpcArgs args(&paramPckg,&iconInfo);
       
   144 
   316 
   145     TInt err = SendReceive(EIconLookup, args);
   317     TInt err = SendReceive(EIconLookup, args);
   146     if (KErrNone != err) {
   318     if (KErrNone != err) {
   147         sharedIconInfo.type  = INVALID_FORMAT;
   319         sharedIconInfo.type = INVALID_FORMAT;
   148     }
   320     }
   149     return sharedIconInfo;
   321     return sharedIconInfo;
   150 }
   322 }
   151 
   323 
   152 /**
   324 /**
   153  * getMultiPartIconInfo
   325  * getMultiPartIconInfo
   154  */
   326  */
   155 
       
   156 HbSharedIconInfo HbThemeClientPrivate::getMultiPartIconInfo(
   327 HbSharedIconInfo HbThemeClientPrivate::getMultiPartIconInfo(
   157         const QStringList &multiPartIconList,
   328         const QStringList &multiPartIconList,
   158         const HbMultiPartSizeData &multiPartIconData,
   329         const HbMultiPartSizeData &multiPartIconData,
   159         const QSizeF &size,
   330         const QSizeF &size,
   160         Qt::AspectRatioMode aspectRatioMode,
   331         Qt::AspectRatioMode aspectRatioMode,
   172     }
   343     }
   173 
   344 
   174     TPckg<HbSharedIconInfo> iconInfo(sharedIconInfo);
   345     TPckg<HbSharedIconInfo> iconInfo(sharedIconInfo);
   175     TMultiIconSymbParams params;
   346     TMultiIconSymbParams params;
   176 
   347 
   177     TBuf<256> iconId(multiPartIconData.multiPartIconId.utf16());
   348     TFileName iconId(multiPartIconData.multiPartIconId.utf16());
   178     params.multiPartIconId.Copy(iconId);
   349     params.multiPartIconId.Copy(iconId);
   179     for (int i = 0; i < multiPartIconList.length(); i++) {
   350     for (int i = 0; i < multiPartIconList.length(); i++) {
   180         TBuf<256> pieceIconId(multiPartIconList[i].utf16());
   351         TFileName pieceIconId(multiPartIconList[i].utf16());
   181         params.multiPartIconList[i].Copy(pieceIconId);
   352         params.multiPartIconList[i].Copy(pieceIconId);
   182     }
   353     }
   183      int noOfPieces = 1;
   354      int noOfPieces = 1;
   184      if (multiPartIconData.multiPartIconId.contains("_3PV", Qt::CaseInsensitive)
   355      if (multiPartIconData.multiPartIconId.contains("_3PV", Qt::CaseInsensitive)
   185            || multiPartIconData.multiPartIconId.contains("_3PH", Qt::CaseInsensitive)) {
   356            || multiPartIconData.multiPartIconId.contains("_3PH", Qt::CaseInsensitive)) {
   229     if ( !clientConnected ) {
   400     if ( !clientConnected ) {
   230         return 0;
   401         return 0;
   231     }
   402     }
   232     HbCss::StyleSheet *styleSheet(0);
   403     HbCss::StyleSheet *styleSheet(0);
   233 
   404 
   234     TBuf<256> fileDes(fileName.utf16());
   405     TFileName fileDes(fileName.utf16());
   235     TBuf<5> layerPriority;
   406     TBuf<5> layerPriority;
   236     layerPriority.AppendNum((TInt)priority);
   407     layerPriority.AppendNum((TInt)priority);
   237 
   408 
   238     HbSharedStyleSheetInfo stylesheetInfo;
   409     HbSharedStyleSheetInfo stylesheetInfo;
   239     TPckg<HbSharedStyleSheetInfo> sharedInfo(stylesheetInfo);
   410     TPckg<HbSharedStyleSheetInfo> sharedInfo(stylesheetInfo);
   302         return 0;
   473         return 0;
   303     }
   474     }
   304 
   475 
   305     HbEffectFxmlData *fxmlData = 0;
   476     HbEffectFxmlData *fxmlData = 0;
   306 
   477 
   307     TBuf<256> fileDes(filePath.utf16());
   478     TFileName fileDes(filePath.utf16());
   308     HbSharedEffectInfo effectInfo;
   479     HbSharedEffectInfo effectInfo;
   309 
   480 
   310     TPckg<HbSharedEffectInfo> sharedInfo(effectInfo);
   481     TPckg<HbSharedEffectInfo> sharedInfo(effectInfo);
   311 
   482 
   312     TIpcArgs args(&fileDes, &sharedInfo);
   483     TIpcArgs args(&fileDes, &sharedInfo);
   349 #endif
   520 #endif
   350     if ( !clientConnected ) {
   521     if ( !clientConnected ) {
   351         return false;
   522         return false;
   352     }
   523     }
   353 
   524 
   354     TBuf<256> fileDes(filePath.utf16());
   525     TFileName fileDes(filePath.utf16());
   355     TInt retVal = KErrGeneral;
   526     TInt retVal = KErrGeneral;
   356 
   527 
   357     TPckg<TInt> sharedInfo(retVal);
   528     TPckg<TInt> sharedInfo(retVal);
   358 
   529 
   359     TIpcArgs args(&fileDes, &sharedInfo);
   530     TIpcArgs args(&fileDes, &sharedInfo);
   386     return false;
   557     return false;
   387 }
   558 }
   388 
   559 
   389 /**
   560 /**
   390  * HbThemeClientPrivate::unloadIcon()
   561  * HbThemeClientPrivate::unloadIcon()
   391  *
   562 */
   392  * unload icon
   563 void HbThemeClientPrivate::unloadIcon(const HbThemeClient::IconReqInfo &reqInfo)
   393 */
   564 {
   394 void HbThemeClientPrivate::unloadIcon(const QString &iconPath,
   565     if (!clientConnected) {
   395                         const QSizeF &size,
       
   396                         Qt::AspectRatioMode aspectRatioMode,
       
   397                         QIcon::Mode mode,
       
   398                         bool mirrored,
       
   399                         const QColor &color,
       
   400                         HbRenderingMode renderMode)
       
   401 {
       
   402     if ( !clientConnected ) {
       
   403         return;
   566         return;
   404     }
   567     }
   405 
   568 
   406     TBuf<256> buffer(iconPath.utf16());
   569     TIconParams params = reqInfoToParams(reqInfo);
   407 
       
   408     TIconParams params;
       
   409     params.fileName = buffer;
       
   410     params.width = size.width();
       
   411     params.height = size.height();
       
   412     params.aspectRatioMode = (TUint8)aspectRatioMode;
       
   413     params.mode = (TUint8)mode;
       
   414     params.options = (TUint8)0;
       
   415     params.mirrored = (TBool)mirrored;
       
   416     params.rgba = (TUint32) color.rgba();
       
   417     params.colorflag = color.isValid();
       
   418     params.renderMode = (TUint8)renderMode;
       
   419 
   570 
   420     TPckg<TIconParams> paramPckg(params);
   571     TPckg<TIconParams> paramPckg(params);
   421     TIpcArgs args(&paramPckg, 0);
   572     TIpcArgs args(&paramPckg);
   422     SendReceive(EUnloadIcon, args);
   573     SendReceive(EUnloadIcon, args);
       
   574 }
       
   575 
       
   576 /**
       
   577  * HbThemeClientPrivate::batchUnloadIcon()
       
   578 */
       
   579 void HbThemeClientPrivate::batchUnloadIcon(const QVector<HbThemeClient::IconReqInfo> &reqInfos)
       
   580 {
       
   581     if (!clientConnected) {
       
   582         return;
       
   583     }
       
   584     int idx = 0;
       
   585     typedef TIconParams Params[BATCH_SIZE_LIMIT];
       
   586     Params paramList;
       
   587     for (int i = 0, ie = reqInfos.count(); i != ie; ++i) {
       
   588         paramList[idx++] = reqInfoToParams(reqInfos.at(i));
       
   589         if (idx == BATCH_SIZE_LIMIT || i == ie - 1) {
       
   590             // There may be unused entries in the last batch.
       
   591             for (int j = idx; j < BATCH_SIZE_LIMIT; ++j) {
       
   592                 paramList[j].fileName.Zero();
       
   593             }
       
   594             idx = 0;
       
   595             TPckg<Params> paramsPckg(paramList);
       
   596             TIpcArgs args(&paramsPckg);
       
   597             SendReceive(EBatchUnloadIcon, args);
       
   598         }
       
   599     }
   423 }
   600 }
   424 
   601 
   425 /**
   602 /**
   426  * HbThemeClientPrivate::unLoadMultiIcon()
   603  * HbThemeClientPrivate::unLoadMultiIcon()
   427  *
   604  *
   441 
   618 
   442     TIconListParams params;
   619     TIconListParams params;
   443     int noOfPieces = iconPathList.length();
   620     int noOfPieces = iconPathList.length();
   444 
   621 
   445     for (int i = 0; i < noOfPieces; i++) {
   622     for (int i = 0; i < noOfPieces; i++) {
   446 
       
   447         TFileName pieceIconId(iconPathList[i].utf16());
   623         TFileName pieceIconId(iconPathList[i].utf16());
   448         params.iconList[i].Copy(pieceIconId);
   624         params.iconList[i].Copy(pieceIconId);
   449         params.sizeList[i] = sizeList[i];
   625         params.sizeList[i] = sizeList[i];
   450     }
   626     }
   451     params.aspectRatioMode = (TUint8)aspectRatioMode;
   627     params.aspectRatioMode = (TUint8)aspectRatioMode;
   472         return 0;
   648         return 0;
   473     }
   649     }
   474 
   650 
   475     HbWidgetLoader::LayoutDefinition *layoutDef(0);
   651     HbWidgetLoader::LayoutDefinition *layoutDef(0);
   476 
   652 
   477     TBuf<256> fileDes(fileName.utf16());
   653     TFileName fileDes(fileName.utf16());
   478     TBuf<256> layoutDes(layout.utf16());
   654     TFileName layoutDes(layout.utf16());
   479     TBuf<256> sectionDes(section.utf16());
   655     TFileName sectionDes(section.utf16());
   480 
   656 
   481     HbSharedWMLInfo widgetmlInfo;
   657     HbSharedWMLInfo widgetmlInfo;
   482     TPckg<HbSharedWMLInfo> wmlInfo(widgetmlInfo);
   658     TPckg<HbSharedWMLInfo> wmlInfo(widgetmlInfo);
   483 
   659 
   484     TIpcArgs args(&fileDes,&layoutDes,&sectionDes,&wmlInfo);
   660     TIpcArgs args(&fileDes,&layoutDes,&sectionDes,&wmlInfo);
   535 /**
   711 /**
   536  * Destructor
   712  * Destructor
   537  */
   713  */
   538 HbThemeClientPrivate::~HbThemeClientPrivate()
   714 HbThemeClientPrivate::~HbThemeClientPrivate()
   539 {
   715 {
       
   716     // Make a copy and destroy the elements after emptying the real queue so
       
   717     // checkQueue() can safely be called during the destruction of the elements.
       
   718     QueueType qc = reqQueue;
       
   719     reqQueue.clear();
       
   720     foreach (QueueEntry *e, qc) {
       
   721         delete e;
       
   722     }
       
   723     delete queueCheckInvoker; // destroy only when no QueueEntries are alive
       
   724 
   540     RSessionBase::Close();
   725     RSessionBase::Close();
       
   726 
   541 #ifdef HB_SGIMAGE_ICON
   727 #ifdef HB_SGIMAGE_ICON
   542     if (sgDriverInit) {
   728     if (sgDriverInit) {
   543         sgDriver.Close();
   729         sgDriver.Close();
   544         sgDriverInit = false;
   730         sgDriverInit = false;
   545     }
   731     }
   546 #endif
   732 #endif
       
   733 
   547     delete themelistener;
   734     delete themelistener;
   548 }
   735 }
   549 
   736 
   550 /**
   737 /**
   551  * StartServer
   738  * StartServer