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(¶mPckg, &iconInfo); |
143 TIpcArgs args(¶mPckg,&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, |
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(¶mPckg, 0); |
572 TIpcArgs args(¶mPckg); |
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(¶msPckg); |
|
597 SendReceive(EBatchUnloadIcon, args); |
|
598 } |
|
599 } |
423 } |
600 } |
424 |
601 |
425 /** |
602 /** |
426 * HbThemeClientPrivate::unLoadMultiIcon() |
603 * HbThemeClientPrivate::unLoadMultiIcon() |
427 * |
604 * |