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 GlThumbnailProvider.cpp
19 * @brief This is the implementation file for ThumbnailProvider class.
25 #include "GlResourceManager.h"
26 #include "GlThumbnailEvent.h"
27 #include "GlThumbnailEventArg.h"
28 #include "GlThumbnailJob.h"
29 #include "GlThumbnailProvider.h"
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 ThumbnailProvider* ThumbnailProvider::__pThumbnailProviderInstance = null;
41 ArrayList* ThumbnailProvider::__pThumbnailEventListener = null;
43 ThumbnailProvider::ThumbnailProvider(void)
47 , __isAppTerminating(false)
50 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
53 ThumbnailProvider::~ThumbnailProvider(void)
56 if (__pThumbnailProviderInstance != null)
58 __pThumbnailProviderInstance->Stop();
59 __pThumbnailProviderInstance->Join();
62 if (__pThumbnailEventListener != null)
64 delete __pThumbnailEventListener;
67 if (__pMutexCmd != null)
72 if (__pCmdQueue != null)
76 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
80 ThumbnailProvider::GetInstance(void)
83 if (__pThumbnailProviderInstance == null)
86 __pThumbnailProviderInstance->Start();
88 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
90 return __pThumbnailProviderInstance;
94 ThumbnailProvider::Construct(void)
98 __pThumbnailEventListener = new (std::nothrow) ArrayList(SingleObjectDeleter);
99 result r = __pThumbnailEventListener->Construct();
100 TryCatch(r == E_SUCCESS, , "[%s] Unable to set event listener", GetErrorMessage(r));
102 __pMutexCmd = new (std::nothrow) Mutex();
103 r = __pMutexCmd->Create();
104 TryCatch(r == E_SUCCESS, , "[%s] Unable to create mutex", GetErrorMessage(r));
106 if (__pCmdQueue != null)
110 __pCmdQueue = new (std::nothrow) ArrayList(SingleObjectDeleter);
111 r = __pCmdQueue->Construct();
112 TryCatch(r == E_SUCCESS, , "[%s] Unable to construct queue", GetErrorMessage(r));
113 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
115 return EventDrivenThread::Construct();
118 if (__pThumbnailEventListener != null)
120 delete __pThumbnailEventListener;
121 __pThumbnailEventListener = null;
124 if (__pMutexCmd != null)
130 if (__pCmdQueue != null)
135 AppLogDebug("EXIT with exception(%s)", GetErrorMessage(GetLastResult()));
141 ThumbnailProvider::CreateInstance(void)
143 AppLogDebug("ENTER");
144 __pThumbnailProviderInstance = new (std::nothrow) ThumbnailProvider();
145 result r = __pThumbnailProviderInstance->Construct();
147 if (IsFailed(r) == true)
149 delete __pThumbnailProviderInstance;
150 __pThumbnailProviderInstance = null;
151 AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult()));
156 std::atexit(DestroyInstance);
157 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
161 ThumbnailProvider::DestroyInstance(void)
163 AppLogDebug("ENTER");
164 delete __pThumbnailProviderInstance;
165 __pThumbnailProviderInstance = null;
166 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
170 ThumbnailProvider::Release(void)
172 AppLogDebug("ENTER");
173 if (__pThumbnailProviderInstance != null)
175 delete __pThumbnailProviderInstance;
176 __pThumbnailProviderInstance = null;
178 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
182 ThumbnailProvider::RequestThumbnail(const ContentId& contentId, const ThumbnailEvent* event)
184 AppLogDebug("ENTER");
185 AppLogDebug("[THREAD] Request Job - (MainThread)");
187 if (contentId.ToString().IsEmpty() == true || event == null
188 || __pMutexCmd == null || __pCmdQueue == null)
190 AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult()));
194 __pMutexCmd->Acquire();
196 ThumbnailJob* pThumbnailJob = new (std::nothrow) ThumbnailJob();
197 pThumbnailJob->Construct(contentId, ++__requestId, event);
198 __pCmdQueue->Add(pThumbnailJob);
200 __pMutexCmd->Release();
202 SendUserEvent(null, null);
203 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
207 ThumbnailProvider::ClearThumbnailRequests(const bool appTerminating)
209 AppLogDebug("ENTER");
210 if (__pMutexCmd != null)
212 __pMutexCmd->Acquire();
213 if (__pCmdQueue != null && __pCmdQueue->GetCount() > 0)
215 __pCmdQueue->RemoveAll(true);
218 if (appTerminating == true)
220 __isAppTerminating = true;
222 __pMutexCmd->Release();
224 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
228 ThumbnailProvider::OnStart(void)
230 AppLogDebug("ENTER");
231 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
237 ThumbnailProvider::OnStop(void)
239 AppLogDebug("ENTER");
240 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
244 ThumbnailProvider::OnUserEventReceivedN(RequestId requestId, IList* pArgs)
246 AppLogDebug("ENTER");
247 AppLogDebug("[THREAD] Receive Job Message - (SubThread)");
248 ThumbnailJob* pThumbnailJob = null;
249 ThumbnailInfo* pThumbnailInfo = null;
252 if (__pMutexCmd == null || __pCmdQueue == null)
255 AppLogDebug("EXIT1(%s)", GetErrorMessage(GetLastResult()));
259 __pMutexCmd->Acquire();
260 if (__pCmdQueue->GetCount() > 0)
262 pThumbnailJob = static_cast<ThumbnailJob*>(__pCmdQueue->GetAt(0));
263 if (pThumbnailJob == null)
265 __pCmdQueue->RemoveAt(0);
266 __pMutexCmd->Release();
270 unsigned long requestId = pThumbnailJob->GetRequestId();
271 ContentId contentId = pThumbnailJob->GetContentId();
272 __pMutexCmd->Release();
274 pThumbnailInfo = GetThumbnailInfoN(contentId);
276 __pMutexCmd->Acquire();
277 pThumbnailJob = static_cast<ThumbnailJob*>(__pCmdQueue->GetAt(0));
279 if (pThumbnailJob != null && pThumbnailInfo != null && requestId == pThumbnailJob->GetRequestId())
281 ContentType contentType = pThumbnailInfo->GetContentType();
282 if (contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_VIDEO)
284 ThumbnailEvent* pThumbnailEvent = const_cast<ThumbnailEvent*>(pThumbnailJob->GetEvent());
285 if (pThumbnailEvent != null)
287 if (__isAppTerminating != true)
289 ThumbnailEventArg* pSendingArg = new (std::nothrow)ThumbnailEventArg(pThumbnailInfo);
290 pThumbnailEvent->Fire(*pSendingArg);
296 delete pThumbnailInfo;
298 __pCmdQueue->RemoveAt(0, true);
302 delete pThumbnailInfo;
305 __pMutexCmd->Release();
309 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
313 ThumbnailProvider::GetThumbnailInfoN(const ContentId& contentId) const
315 AppLogDebug("ENTER");
316 ThumbnailInfo* pNewThumbnailInfo = null;
318 ContentManager contentManager;
319 result r = contentManager.Construct();
322 Bitmap* pBitmap = null;
325 ContentInfo* pContentInfo = contentManager.GetContentInfoN(contentId);
327 if (pContentInfo != null)
329 String path = pContentInfo->GetContentPath();
330 if (path.EndsWith(L"tif") != true
331 && path.EndsWith(L"tiff") != true
332 && path.EndsWith(L"wbmp") != true
333 && path.EndsWith(L"TIF") != true
334 && path.EndsWith(L"TIFF") != true
335 && path.EndsWith(L"WBMP") != true)
337 pBitmap = pContentInfo->GetThumbnailN();
342 pBitmap = GetThumbnailByDecodeN(pContentInfo->GetContentPath(), pContentInfo->GetContentType());
345 pBitmap = ResourceManager::GetBitmapN(IDB_NO_CONTENTS_BROKEN);
348 pBitmap->Scale(DIMENSION_DEFAULT_THUMBNAIL);
350 ContentType contentType = pContentInfo->GetContentType();
352 if (contentType == CONTENT_TYPE_VIDEO)
354 VideoContentInfo* pVideoContentInfo = static_cast<VideoContentInfo*>(pContentInfo);
355 duration = pVideoContentInfo->GetDuration();
358 pNewThumbnailInfo = new (std::nothrow) ThumbnailInfo();
359 pNewThumbnailInfo->Construct(contentId, pContentInfo->GetContentPath(), *pBitmap, contentType, duration);
363 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
365 return pNewThumbnailInfo;
369 ThumbnailProvider::GetThumbnailByDecodeN(const String& filePath, const ContentType contentType) const
371 AppLogDebug("ENTER");
372 Bitmap* pBitmap = null;
373 if (&filePath == null || filePath.GetLength() <= 0)
375 pBitmap = new (std::nothrow) Bitmap();
376 pBitmap->Construct(DIMENSION_DEFAULT_THUMBNAIL, BITMAP_PIXEL_FORMAT_RGB565);
380 if (contentType == CONTENT_TYPE_IMAGE)
382 ImageBuffer pImageBuffer;
383 result r = pImageBuffer.Construct(filePath);
386 pBitmap = pImageBuffer.GetBitmapN(BITMAP_PIXEL_FORMAT_ARGB8888, BUFFER_SCALING_AUTO);
389 else if (contentType == CONTENT_TYPE_VIDEO)
391 VideoFrameExtractor extractor;
392 result r = extractor.Construct(filePath, MEDIA_PIXEL_FORMAT_RGB565LE);
395 ImageBuffer* pImageBuffer = extractor.GetFrameN(0);
396 if (pImageBuffer != null)
398 pBitmap = pImageBuffer->GetBitmapN(BITMAP_PIXEL_FORMAT_RGB565, BUFFER_SCALING_AUTO);
404 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
410 ThumbnailProvider::GetFileNameFromFullPath(const String& fullPath, bool withExt) const
412 AppLogDebug("ENTER");
413 if (fullPath.CompareTo(EMPTY_SPACE) == 0)
415 AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult()));
420 String delim(DIRECTORY_SEPARATOR);
421 StringTokenizer st(fullPath,delim);
423 while (st.HasMoreTokens())
425 st.GetNextToken(token);
430 AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult()));
436 String subDelim(FILE_EXT_SEPARATOR);
437 StringTokenizer subSt(token, subDelim);
439 subSt.GetNextToken(subToken);
440 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));