2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.1 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file MpThumbnailProvider.cpp
19 * @brief This is the implementation file for ThumbnailProvider class.
26 #include "MpThumbnailEvent.h"
27 #include "MpThumbnailEventArg.h"
28 #include "MpThumbnailJob.h"
29 #include "MpThumbnailProvider.h"
31 using namespace Tizen::App;
32 using namespace Tizen::Base;
33 using namespace Tizen::Base::Collection;
34 using namespace Tizen::Base::Runtime;
35 using namespace Tizen::Base::Utility;
36 using namespace Tizen::Content;
37 using namespace Tizen::Graphics;
38 using namespace Tizen::Media;
40 static const int W_THUMBNAIL = 112;
41 static const int H_THUMBNAIL = 112;
42 static const Tizen::Base::String DEFAULT_THUMBNAIL = L"34_thumb_07.png";
44 ThumbnailProvider* ThumbnailProvider::__pThumbnailProviderInstance = null;
46 ThumbnailProvider::ThumbnailProvider(void)
49 , __pDefaultThumbnail(null)
51 , __isForceClose(false)
54 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
57 ThumbnailProvider::~ThumbnailProvider(void)
60 if (__pThumbnailProviderInstance != null)
62 __pThumbnailProviderInstance->Stop();
63 __pThumbnailProviderInstance->Join();
66 if (__pMutexCmd != null)
71 if (__pCmdQueue != null)
76 DestroyDefaultThumbnailBitmap();
77 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
80 IThumbnailProviderHandler*
81 ThumbnailProvider::GetInstance(void)
84 if (__pThumbnailProviderInstance == null)
86 if (!IsFailed(CreateInstance()))
88 __pThumbnailProviderInstance->Start();
92 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
93 return __pThumbnailProviderInstance;
97 ThumbnailProvider::Construct(void)
100 __pMutexCmd = new (std::nothrow) Mutex();
101 result r = __pMutexCmd->Create();
102 TryCatch(r == E_SUCCESS, , "[%s] Unable to create mutex", GetErrorMessage(r));
104 if (__pCmdQueue != null)
109 __pCmdQueue = new (std::nothrow) ArrayList(SingleObjectDeleter);
110 r = __pCmdQueue->Construct();
111 TryCatch(r == E_SUCCESS, , "[%s] Unable to construct queue", GetErrorMessage(r));
113 CreateDefaultThumbnailBitmap();
114 __isForceClose = false;
115 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
116 return EventDrivenThread::Construct();
119 if (__pMutexCmd != null)
125 if (__pCmdQueue != null)
131 AppLogDebug("EXIT with exception(%s)", GetErrorMessage(GetLastResult()));
136 ThumbnailProvider::CreateInstance(void)
138 AppLogDebug("ENTER");
139 __pThumbnailProviderInstance = new (std::nothrow) ThumbnailProvider();
140 result r = __pThumbnailProviderInstance->Construct();
143 delete __pThumbnailProviderInstance;
144 __pThumbnailProviderInstance = null;
145 AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult()));
150 std::atexit(DestroyInstance);
151 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
156 ThumbnailProvider::DestroyInstance(void)
158 AppLogDebug("ENTER");
159 delete __pThumbnailProviderInstance;
160 __pThumbnailProviderInstance = null;
161 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
165 ThumbnailProvider::Release(void)
167 AppLogDebug("ENTER");
168 if (__pThumbnailProviderInstance != null)
170 delete __pThumbnailProviderInstance;
171 __pThumbnailProviderInstance = null;
173 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
177 ThumbnailProvider::RequestThumbnail(const ContentId& contentId, const ThumbnailEvent* event, Tizen::Base::Object* pParam)
179 AppLogDebug("ENTER");
180 AppLogDebug("[THREAD] Request Job - (MainThread)");
182 if (contentId.ToString().IsEmpty() == true || event == null
183 || __pMutexCmd == null || __pCmdQueue == null || __isForceClose == true)
185 AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult()));
190 __pMutexCmd->Acquire();
192 ThumbnailJob* pThumbnailJob = new (std::nothrow) ThumbnailJob();
193 pThumbnailJob->Construct(contentId, ++__requestId, event, pParam);
194 __pCmdQueue->Add(pThumbnailJob);
196 __pMutexCmd->Release();
198 SendUserEvent(null, null);
199 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
203 ThumbnailProvider::CancelThumbnailRequest(const ContentId& contentId, const ThumbnailEvent* event)
205 AppLogDebug("ENTER");
206 ThumbnailJob* pThumbnailJob = null;
208 __pMutexCmd->Acquire();
210 int loopCount = __pCmdQueue->GetCount();
211 for (int i = 0; i < loopCount; ++i)
213 pThumbnailJob = static_cast<ThumbnailJob*>(__pCmdQueue->GetAt(i));
215 if (pThumbnailJob != null
216 && pThumbnailJob->GetContentId() == contentId
217 && pThumbnailJob->GetEvent() == event)
219 AppLogDebug("ENTER i(%d) event(%x)", i, event);
220 __pCmdQueue->RemoveAt(i, true);
224 __pMutexCmd->Release();
225 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
229 ThumbnailProvider::CancelAllThumbnailRequest(const ThumbnailEvent* event)
231 AppLogDebug("ENTER");
232 ThumbnailJob* pThumbnailJob = null;
234 __pMutexCmd->Acquire();
235 int loopCount = __pCmdQueue->GetCount();
236 for (int i = 0; i < loopCount; ++i)
238 pThumbnailJob = static_cast<ThumbnailJob*>(__pCmdQueue->GetAt(i));
240 if (pThumbnailJob != null
241 && pThumbnailJob->GetEvent() == event)
243 AppLogDebug("ENTER i(%d) event(%x)", i, event);
244 __pCmdQueue->RemoveAt(i, true);
247 __pMutexCmd->Release();
248 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
252 ThumbnailProvider::ClearThumbnailRequests(void)
254 AppLogDebug("ENTER");
255 if(__pCmdQueue != null)
257 __pCmdQueue->RemoveAll(true);
259 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
262 const Tizen::Graphics::Bitmap*
263 ThumbnailProvider::GetDefaultThumbnail(void) const
265 AppLogDebug("ENTER");
266 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
267 return __pDefaultThumbnail;
271 ThumbnailProvider::OnStart(void)
273 AppLogDebug("ENTER");
274 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
279 ThumbnailProvider::OnStop(void)
281 AppLogDebug("ENTER");
282 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
286 ThumbnailProvider::Quit(void)
288 AppLogDebug("ENTER");
289 __pMutexCmd->Acquire();
290 __isForceClose = true;
291 ClearThumbnailRequests();
292 __pMutexCmd->Release();
293 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
294 return EventDrivenThread::Quit();
298 ThumbnailProvider::OnUserEventReceivedN(RequestId requestId, IList* pArgs)
300 AppLogDebug("ENTER");
301 AppLogDebug("[THREAD] Receive Job Message - (SubThread)");
302 if (__pMutexCmd == null || __pCmdQueue == null)
305 AppLogDebug("EXIT1(%s)", GetErrorMessage(GetLastResult()));
309 __pMutexCmd->Acquire();
310 if (__pCmdQueue->GetCount() > 0)
312 ThumbnailJob* pThumbnailJob = static_cast<ThumbnailJob*>(__pCmdQueue->GetAt(0));
313 if (pThumbnailJob == null)
315 __pCmdQueue->RemoveAt(0);
316 __pMutexCmd->Release();
320 unsigned long requestId = pThumbnailJob->GetRequestId();
321 ContentId contentId = pThumbnailJob->GetContentId();
322 // __pMutexCmd->Release();
324 ThumbnailInfo* pThumbnailInfo = GetThumbnailInfoN(contentId, pThumbnailJob->GetUserParamN());
325 if (pThumbnailInfo == null)
327 // __pMutexCmd->Acquire();
328 __pCmdQueue->RemoveAt(0, true);
329 __pMutexCmd->Release();
330 AppLogDebug("pThumbnailInfo null");
334 // __pMutexCmd->Acquire();
335 pThumbnailJob = static_cast<ThumbnailJob*>(__pCmdQueue->GetAt(0));
336 if (pThumbnailJob != null && requestId == pThumbnailJob->GetRequestId())
338 ThumbnailEvent* pThumbnailEvent = const_cast<ThumbnailEvent*>(pThumbnailJob->GetEvent());
339 if (pThumbnailEvent != null && __isForceClose == false)
341 ThumbnailEventArg* pSendingArg = new (std::nothrow) ThumbnailEventArg(pThumbnailInfo);
342 pThumbnailEvent->Fire(*pSendingArg);
343 pThumbnailInfo = null;
346 __pCmdQueue->RemoveAt(0, true);
347 if (pThumbnailInfo != null)
349 delete pThumbnailInfo;
350 pThumbnailInfo = null;
355 __pCmdQueue->RemoveAt(0, true);
356 delete pThumbnailInfo;
359 __pMutexCmd->Release();
362 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
366 ThumbnailProvider::GetThumbnailInfoN(const ContentId& contentId, Tizen::Base::Object* pParam) const
368 AppLogDebug("ENTER");
369 ThumbnailInfo* pNewThumbnailInfo = null;
370 Bitmap* pBitmap = null;
371 ContentInfo* pContentInfo = null;
373 ContentManager contentManager;
374 result r = contentManager.Construct();
375 TryCatch(r == E_SUCCESS, , "ContentManager.Construct() failed(%s)", GetErrorMessage(r));
377 pContentInfo = contentManager.GetContentInfoN(contentId);
378 TryCatch(GetLastResult() == E_SUCCESS, , "ContentManager.GetContentInfoN() failed(%s)", GetErrorMessage(r));
379 TryCatch(pContentInfo != null, delete pContentInfo, "pContentInfo is null(%s)", GetErrorMessage(GetLastResult()));
381 pBitmap = pContentInfo->GetThumbnailN();
384 pBitmap = GetThumbnailByDecodeN(pContentInfo->GetContentPath(), pContentInfo->GetContentType());
385 TryCatch(pBitmap != null, delete pContentInfo; pContentInfo = null , "GetThumbnailByDecodeN failed(%s)", GetErrorMessage(GetLastResult()));
387 pBitmap->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL));
389 pNewThumbnailInfo = new (std::nothrow) ThumbnailInfo();
390 pNewThumbnailInfo->Construct(contentId, *pBitmap, pParam);
394 return pNewThumbnailInfo;
397 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
402 ThumbnailProvider::GetThumbnailByDecodeN(const String& filePath, const ContentType contentType) const
404 AppLogDebug("ENTER");
405 Bitmap* pBitmap = null;
406 if (&filePath == null || filePath.GetLength() <= 0)
408 pBitmap = new (std::nothrow) Bitmap();
409 if (__pDefaultThumbnail != null)
411 pBitmap->Construct(*__pDefaultThumbnail,FloatRectangle(0,0,__pDefaultThumbnail->GetWidthF(),__pDefaultThumbnail->GetHeightF()));
412 pBitmap->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL));
416 pBitmap->Construct(Dimension(W_THUMBNAIL, H_THUMBNAIL), BITMAP_PIXEL_FORMAT_RGB565);
421 AudioMetadata* pAudioMeta = ContentManagerUtil::GetAudioMetaN(filePath);
422 TryReturn(pAudioMeta != null, null, "filepath is [%ls]", filePath.GetPointer());
424 pBitmap = pAudioMeta->GetAlbumArtN();
428 if (__pDefaultThumbnail != null)
430 pBitmap = new (std::nothrow) Bitmap();
431 pBitmap->Construct(*__pDefaultThumbnail,FloatRectangle(0,0,__pDefaultThumbnail->GetWidthF(),__pDefaultThumbnail->GetHeightF()));
432 pBitmap->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL));
434 AppLogDebug("There is not a AlbumArt image");
438 pBitmap->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL));
441 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
446 ThumbnailProvider::CreateDefaultThumbnailBitmap(void)
448 AppLogDebug("ENTER");
449 AppResource* pAppResource = Application::GetInstance()->GetAppResource();
450 __pDefaultThumbnail = pAppResource->GetBitmapN(DEFAULT_THUMBNAIL);
451 __pDefaultThumbnail->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL));
452 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
456 ThumbnailProvider::DestroyDefaultThumbnailBitmap(void)
458 AppLogDebug("ENTER");
459 delete __pDefaultThumbnail;
460 __pDefaultThumbnail = null;
461 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));