2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (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://www.apache.org/licenses/LICENSE-2.0
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.
17 * @file FCnt_ContentTransferImpl.cpp
18 * @brief This is the implementation file for the %_ContentTransferImpl class.
20 * This file contains implementation of the %_ContentTransferImpl class.
23 #include <FBaseSysLog.h>
24 #include <FBaseString.h>
25 #include <FBaseColIList.h>
26 #include <FBaseUtilUri.h>
27 #include <FIoDirectory.h>
28 #include <FCntIContentTransferListener.h>
29 #include <FCntContentTransfer.h>
30 #include <FCntContentTransferInfo.h>
31 #include <FIoRegistry.h>
33 #include <FSysEnvironment.h>
34 #include <FApp_AppInfo.h>
35 #include <FCnt_ContentTransferImpl.h>
36 #include <FSys_EnvironmentImpl.h>
37 #include <FIo_FileImpl.h>
38 #include <FIo_FileAttributesImpl.h>
39 #include <FSys_SystemTimeImpl.h>
40 #include "FCnt_ContentDownloadHandler.h"
41 #include "FCnt_ContentTransferEvent.h"
43 using namespace Tizen;
44 using namespace Tizen::App;
45 using namespace Tizen::Base;
46 using namespace Tizen::Base::Collection;
47 using namespace Tizen::Base::Utility;
48 using namespace Tizen::Base::Runtime;
49 using namespace Tizen::Io;
50 using namespace Tizen::System;
52 static RequestId downloadRequestId = 0;
53 static bool initSlot = false;
54 static const int MAX_DOWNLOAD_COUNT = 5;
56 namespace Tizen { namespace Content
59 static const wchar_t CONTENT_DOWNLOAD_TEMP_DIRECTORY[] = L"/tmp/content_";
60 static const wchar_t CONTENT_DOWNLOAD_PATH_MEDIA[] = L"/Media";
61 static const wchar_t CONTENT_DOWNLOAD_PATH_MEDIA_MMC[] = L"/Storagecard/Media";
62 static const wchar_t CONTENT_DOWNLOAD_PATH_HOME[] = L"/Home";
63 static const wchar_t CONTENT_DOWNLOAD_PATH_HOME_MMC[] = L"/HomeExt";
65 static const int CONTENT_TRANSFER_DEFAULT_PROGRESS_INTERVAL = 0;
66 static const int CONTENT_DOWNLOAD_CHECKING_PERIOD = 1000;
68 _ContentTransferImpl::_ContentTransferImpl(void)
69 : __requestId(INVALID_REQUEST_ID)
70 , __restRequestId(INVALID_REQUEST_ID)
72 , __percent(CONTENT_TRANSFER_DEFAULT_PROGRESS_INTERVAL)
73 , __timerStarted(false)
76 , __pContentDownloadUserData(null)
77 , __pContentDownloadUserDataSequence(null)
78 , __pContentDownloadHandler(null)
79 , __pContentDownloadHandlerSequence(null)
80 , __pTransferEvent(null)
81 , __pTransferInfoList(null)
87 _ContentTransferImpl::~_ContentTransferImpl(void)
93 _ContentTransferImpl::GetInstance(ContentTransfer& contentTransfer)
95 return contentTransfer.__pImpl;
98 const _ContentTransferImpl*
99 _ContentTransferImpl::GetInstance(const ContentTransfer& contentTransfer)
101 return contentTransfer.__pImpl;
105 _ContentTransferImpl::Construct(IContentTransferListener& listener)
107 // E_SUCCESS, E_OUT_OF_MEMORY, E_SYSTEM
110 result r = E_SUCCESS;
112 std::unique_ptr<_ContentDownloadHandler> pContentDownloadHandler(new (std::nothrow) _ContentDownloadHandler);
113 SysTryReturn(NID_CNT, pContentDownloadHandler != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
114 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadHandler.");
116 r = pContentDownloadHandler->Construct();
117 SysTryReturn(NID_CNT, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
118 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadHandler.");
120 std::unique_ptr<_ContentDownloadHandler[]> pContentDownloadHandlerSequence(new (std::nothrow) _ContentDownloadHandler[MAX_DOWNLOAD_COUNT]);
121 SysTryReturn(NID_CNT, pContentDownloadHandlerSequence != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
122 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadHandler array.");
124 for (int i = 0; i < MAX_DOWNLOAD_COUNT; i++)
126 r = (pContentDownloadHandlerSequence.get())[i].Construct();
127 SysTryReturn(NID_CNT, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
128 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadHandler array.");
131 std::unique_ptr<_ContentDownloadUserData> pContentDownloadUserData(new (std::nothrow) _ContentDownloadUserData);
132 SysTryReturn(NID_CNT, pContentDownloadUserData != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
133 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadUserData.");
135 std::unique_ptr<_ContentDownloadUserData[]> pContentDownloadUserDataSequence(new (std::nothrow) _ContentDownloadUserData[MAX_DOWNLOAD_COUNT]);
136 SysTryReturn(NID_CNT, pContentDownloadUserDataSequence != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
137 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadUserData.");
139 std::unique_ptr<_ContentTransferEvent> pTransferEvent(new (std::nothrow) _ContentTransferEvent);
140 SysTryReturn(NID_CNT, pTransferEvent != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
141 "[E_OUT_OF_MEMORY] Failed to construct ContentTransferEvent.");
143 r = pTransferEvent->AddListener(listener, true);
144 SysTryReturn(NID_CNT, !IsFailed(r), r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to perform AddListener to ContentTransferEvent.");
146 std::unique_ptr<ArrayList, AllElementsDeleter> pTransferInfoList(new (std::nothrow) ArrayList());
147 SysTryReturn(NID_CNT, pTransferInfoList != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
148 "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
150 r = pTransferInfoList->Construct();
151 SysTryReturn(NID_CNT, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
152 "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
154 std::unique_ptr<Timer> pTimer(new (std::nothrow) Timer());
155 SysTryReturn(NID_CNT, pTimer != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct Timer.");
157 r = pTimer->Construct(*this);
158 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to construct Timer.", GetErrorMessage(r));
160 InitializeEmptySlotInternal(pContentDownloadUserData.get());
162 SysTryReturn(NID_CNT, !IsFailed(r), r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to perform initiate the download slot.");
164 __pContentDownloadHandler = std::move(pContentDownloadHandler);
165 __pContentDownloadHandlerSequence = std::move(pContentDownloadHandlerSequence);
167 __pContentDownloadUserData = std::move(pContentDownloadUserData);
168 __pContentDownloadUserDataSequence = std::move(pContentDownloadUserDataSequence);
170 __pTransferEvent = std::move(pTransferEvent);
172 __pTransferInfoList = std::move(pTransferInfoList);
174 __pTimer = std::move(pTimer);
180 _ContentTransferImpl::InitializeEmptySlotInternal(_ContentDownloadUserData* pUserData)
183 result r = E_SUCCESS;
185 String tempPath(CONTENT_DOWNLOAD_TEMP_DIRECTORY);
188 SysTryReturnVoidResult(NID_CNT, pUserData != null, r = E_SYSTEM,
189 "[E_SYSTEM] ContentDownloadUserData instance must not be null.");
191 pUserData->SetMaxCount(MAX_DOWNLOAD_COUNT);
195 for (i = 0; i < MAX_DOWNLOAD_COUNT; i++)
197 pUserData->SetCheckDownloading(i, false);
200 String appId = _AppInfo::GetApplicationId();
201 r = tempPath.Append(appId);
202 SysTryReturnVoidResult(NID_CNT, !IsFailed(r), r, "[E_INVALID_ARG] Failed to perform Append operation.");
205 check = _FileImpl::IsFileExist(tempPath);
207 SysTryReturnVoidResult(NID_CNT, !IsFailed(r), r,
208 "[%s] Failed to perform IsFileExist operation for [%ls] path.", GetErrorMessage(r), tempPath.GetPointer());
212 r = Directory::Create(tempPath, false);
213 SysTryReturnVoidResult(NID_CNT, !IsFailed(r), r,
214 "[%s] Failed to perform Create operation for [%ls] path.", GetErrorMessage(r), tempPath.GetPointer());
223 _ContentTransferImpl::GetEmptySlotInternal(void) const
226 for (i = 0; i < MAX_DOWNLOAD_COUNT; i++)
228 if (!(__pContentDownloadUserData->GetCheckDownloading(i)))
237 _ContentTransferImpl::SetEmptySlotInternal(void)
239 for (int i = 0; i < MAX_DOWNLOAD_COUNT; i++)
241 if (!((__pContentDownloadUserDataSequence.get())[i].GetSlotFlag()))
243 __pContentDownloadUserData->SetCheckDownloading(i, false);
249 _ContentTransferImpl::SetUsedSlotInternal(int slot)
251 // TODO : If the error is occured in this command, set the mutex.
252 if (slot >= 0 && slot < MAX_DOWNLOAD_COUNT)
254 __pContentDownloadUserData->SetCheckDownloading(slot, true);
255 (__pContentDownloadUserDataSequence.get())[slot].SetSlotFlag(true);
260 _ContentTransferImpl::Cancel(RequestId reqId)
262 // E_SUCCESS, E_OBJ_NOT_FOUND, E_INVALID_ARG, E_INVALID_STATE
264 SysLog(NID_CNT, "Cancel the request ID(%d) in download.", reqId);
267 result r = E_SUCCESS;
268 String destFilePath = null;
269 ContentTransferInfo* pContentTransferInfo = null;
272 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
274 pContentTransferInfo = GetContentTransferInfoByRequestId(reqId);
275 SysTryReturn(NID_CNT, pContentTransferInfo != null, r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,
276 "[E_OBJ_NOT_FOUND] Unable to find the current Download operation.");
278 if (pContentTransferInfo->GetContentTransferStatus() == CONTENT_TRANSFER_STATUS_DOWNLOADING)
280 slot = pContentTransferInfo->GetSlotId();
281 r = (__pContentDownloadHandlerSequence.get())[slot].Cancel(pContentTransferInfo->GetRestRequestId(),
282 &(__pContentDownloadUserDataSequence.get())[slot]);
283 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to perform Cancel operation.");
287 // TODO : check timing issue.
289 SysLogException(NID_CNT, E_INVALID_STATE, "[E_INVALID_STATE] This [%d] request isn't under download.", reqId);
296 _ContentTransferImpl::SetDefaultTimeout(int sec)
309 _ContentTransferImpl::GetDefaultTimeout(void) const
315 _ContentTransferImpl::Remove(RequestId reqId)
317 // E_SUCCESS, E_OBJ_NOT_FOUND, E_OUT_OF_MEMORY, E_INVALID_STATE
319 SysLog(NID_CNT, "Remove the download request ID(%d) in queue.", reqId);
322 result r = E_SUCCESS;
323 ContentTransferInfo* pTransferInfo = null;
324 std::unique_ptr<IEnumerator> pEnum;
328 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
330 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
331 SysTryReturn(NID_CNT, pEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
332 "[E_OUT_OF_MEMORY] Remove operation can not perform for [%d] request ID.", reqId);
334 while (pEnum->MoveNext() == E_SUCCESS)
336 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
337 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,
338 "[E_OBJ_NOT_FOUND] ContentTransferInfo instance must not be null.");
340 if (pTransferInfo->GetRequestId() == reqId)
342 ContentTransferStatus status = pTransferInfo->GetContentTransferStatus();
343 if (status == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY ||
344 status == CONTENT_TRANSFER_STATUS_DOWNLOAD_COMPLETED)
349 else if (status == CONTENT_TRANSFER_STATUS_DOWNLOADING)
351 SysLogException(NID_CNT, E_INVALID_STATE, "[E_INVALID_STATE] This [%d] request operation is under download.", reqId);
352 return E_INVALID_STATE;
360 SysLogException(NID_CNT, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] [%d] request operation cannot found.", reqId);
361 return E_OBJ_NOT_FOUND;
365 __pTransferInfoList->RemoveAt(findIdx, true);
367 SysTryReturn(NID_CNT, !IsFailed(r), r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,
368 "[E_OBJ_NOT_FOUND] Failed to perform RemoveAt operation for a content in transfer info list.");
375 _ContentTransferImpl::RemoveAll(void)
377 // E_SUCCESS, E_OUT_OF_MEMORY, E_INVALID_STATE
379 SysLog(NID_CNT, "Remove all download request ID in queue.");
382 result r = E_SUCCESS;
383 ContentTransferInfo* pTransferInfo = null;
384 std::unique_ptr<IEnumerator> pTransferEnum;
385 std::unique_ptr<IEnumerator> pDeleteEnum;
386 ArrayList deleteList;
388 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
390 pTransferEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
391 SysTryReturn(NID_CNT, pTransferEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
392 "[E_OUT_OF_MEMORY] Failed to perform GetEnumeratorN operation.");
394 while (pTransferEnum->MoveNext() == E_SUCCESS)
396 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pTransferEnum->GetCurrent());
397 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_STATE, r,
398 "[E_INVALID_STATE] ContentTransferInfo instance must not be null.");
400 ContentTransferStatus status = pTransferInfo->GetContentTransferStatus();
401 if (status == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY || status == CONTENT_TRANSFER_STATUS_DOWNLOAD_COMPLETED)
403 deleteList.Add(*pTransferInfo);
407 pDeleteEnum = std::unique_ptr<IEnumerator>(deleteList.GetEnumeratorN());
408 SysTryReturn(NID_CNT, pDeleteEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
409 "[E_OUT_OF_MEMORY] Failed to perform GetEnumeratorN operation.");
411 while (pDeleteEnum->MoveNext() == E_SUCCESS)
413 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pDeleteEnum->GetCurrent());
414 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_STATE, r,
415 "[E_INVALID_STATE] ContentTransferInfo instance must not be null.");
417 __pTransferInfoList->Remove(*pTransferInfo, true);
419 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_STATE, E_INVALID_STATE,
420 "[E_INVALID_STATE] Failed to perform Remove operation for a content in transfer info list.");
427 _ContentTransferImpl::CancelAll(void)
429 // E_SUCCESS, E_OUT_OF_MEMORY, E_INVALID_STATE
431 SysLog(NID_CNT, "Cancel the all request ID in download.");
434 result r = E_SUCCESS;
435 std::unique_ptr<IEnumerator> pEnum;
436 ContentTransferInfo* pTransferInfo = null;
438 SysAssertf(__pTransferInfoList != null && __pContentDownloadUserDataSequence != null,
439 "Not yet constructed. Construct() should be called before use.");
441 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
442 SysTryReturn(NID_CNT, pEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
443 "[E_OUT_OF_MEMORY] Failed to perform GetEnumeratorN operation.");
445 while (pEnum->MoveNext() == E_SUCCESS)
447 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
448 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_STATE, r,
449 "[E_INVALID_STATE] ContentTransferInfo instance must not be null.");
451 ContentTransferStatus status = pTransferInfo->GetContentTransferStatus();
452 if (status == CONTENT_TRANSFER_STATUS_DOWNLOADING)
454 SysLog(NID_CNT, "========== Canceled download slot : %d ==========", pTransferInfo->GetSlotId());
456 r = (__pContentDownloadHandlerSequence.get())[pTransferInfo->GetSlotId()].Cancel(
457 pTransferInfo->GetRestRequestId(), &(__pContentDownloadUserDataSequence.get())[pTransferInfo->GetSlotId()]);
458 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_STATE, E_INVALID_STATE,
459 "[E_INVALID_STATE] Failed to perform Cancel operation.");
467 _ContentTransferImpl::GetContentTransferInfoListN(void) const
469 std::unique_ptr<ArrayList, AllElementsDeleter> pTransferInfoList;
470 std::unique_ptr<IEnumerator> pEnum;
471 ContentTransferInfo* pTransferInfoCopy = null;
472 ContentTransferInfo* pTransferInfo = null;
474 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
476 pTransferInfoList = std::unique_ptr<ArrayList, AllElementsDeleter>(new (std::nothrow) ArrayList());
477 SysTryLogReturn(NID_CNT, pTransferInfoList != null, null, "Failed to construct ArrayList.");
479 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
480 SysTryLogReturn(NID_CNT, pEnum != null, null, "Failed to perform GetEnumeratorN operation.");
482 while (pEnum->MoveNext() == E_SUCCESS)
484 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
485 SysTryLogReturn(NID_CNT, pTransferInfo != null, null, "ContentTransferInfo instance must not be null.");
487 pTransferInfoCopy = pTransferInfo->CopyN();
489 pTransferInfoList->Add(*pTransferInfoCopy);
492 return pTransferInfoList.release();
496 _ContentTransferImpl::GetContentTransferInfoListInProgressN(void) const
498 std::unique_ptr<ArrayList, AllElementsDeleter> pTransferInfoList;
499 std::unique_ptr<IEnumerator> pEnum;
500 ContentTransferInfo* pTransferInfoCopy = null;
501 ContentTransferInfo* pTransferInfo = null;
503 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
505 pTransferInfoList = std::unique_ptr<ArrayList, AllElementsDeleter>(new (std::nothrow) ArrayList());
506 SysTryLogReturn(NID_CNT, pTransferInfoList != null, null, "Failed to construct ArrayList.");
508 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
509 SysTryLogReturn(NID_CNT, pEnum != null, null, "Failed to perform GetEnumerator operation.");
511 while (pEnum->MoveNext() == E_SUCCESS)
513 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
514 SysTryLogReturn(NID_CNT, pTransferInfo != null, null, "ContentTransferInfo instance must not be null.");
516 ContentTransferStatus status = pTransferInfo->GetContentTransferStatus();
517 if (status == CONTENT_TRANSFER_STATUS_DOWNLOADING)
519 pTransferInfoCopy = pTransferInfo->CopyN();
520 pTransferInfoList->Add(*pTransferInfoCopy);
524 return pTransferInfoList.release();
528 _ContentTransferImpl::SetProgressIntervalByPercent(int percent)
530 if (percent > 0 && percent <= 100)
541 _ContentTransferImpl::Download(const Utility::Uri& uri, int fileSize, const String& destFilePath, bool replace,
542 RequestId& requestID, IContentTransferListener* pListener, int sec)
544 // E_SUCCESS, E_INVALID_ARG, E_INVALID_STATE, E_ILLEGAL_ACCESS, E_FILE_ALREADY_EXIST, E_PRIVILEGE_DENIED, E_IN_PROGRESS
546 SysLog(NID_CNT, "Download operation start with listener.");
549 result r = E_SUCCESS;
550 String sourcePath(L"");
551 String destPath(L"");
552 String tempPath(L"");
554 String checkName(L"");
555 String checkPath(L"");
558 int lengthString = 0;
559 FileAttributes fileAttr;
561 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
563 SysTryReturn(NID_CNT, fileSize >= 0, r = E_INVALID_ARG, E_INVALID_ARG,
564 "[E_INVALID_ARG] The size of the source file is less than 0.");
565 SysTryReturn(NID_CNT, !destFilePath.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
566 "[E_INVALID_ARG] The destination file path is empty.");
567 SysTryReturn(NID_CNT, !uri.ToString().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
568 "[E_INVALID_ARG] The source URI is empty.");
569 SysTryReturn(NID_CNT, !uri.GetHost().IsEmpty() && !uri.GetPath().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
570 "[E_INVALID_ARG] The source URI is empty.");
571 SysTryReturn(NID_CNT, sec >= 0, r = E_INVALID_ARG, E_INVALID_ARG,
572 "[E_INVALID_ARG] The timeout value is less than 0.");
574 destPath = destFilePath;
576 if (_FileImpl::IsSystemPath(destPath))
578 SysLogException(NID_CNT, E_ILLEGAL_ACCESS, "[E_ILLEGAL_ACCESS] [%ls] path isn't permitted.", destFilePath.GetPointer());
580 return E_ILLEGAL_ACCESS;
583 if (_FileImpl::IsFileExist(destPath))
587 SysLogException(NID_CNT, E_FILE_ALREADY_EXIST, "[E_FILE_ALREADY_EXIST] The download file is already exist.");
589 return E_FILE_ALREADY_EXIST;
592 SysTryReturn(NID_CNT, _FileImpl::IsMediaPath(destPath) == true || _FileImpl::IsAppPath(destPath) == true,
593 r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The file path is not a media or an app path.");
595 // read-only, directory or file
596 // check whether the destination file is read-only.
597 // check whether the destination path without the file extension is a directory or not.
598 r = _FileImpl::GetAttributes(destFilePath, fileAttr);
599 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
600 "[E_INVALID_ARG] Failed to perform GetAttributes operation for the destination path. ");
601 SysTryReturn(NID_CNT, !fileAttr.IsDirectory(), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
602 "[E_ILLEGAL_ACCESS] The file path is directory.");
603 SysTryReturn(NID_CNT, !fileAttr.IsReadOnly(), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
604 "[E_ILLEGAL_ACCESS] The file path is read only.");
608 // check the destination file path
610 SysTryReturn(NID_CNT, _FileImpl::IsMediaPath(destPath) == true || _FileImpl::IsAppPath(destPath) == true,
611 r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The file path is not a media or an app path.");
614 // check whether the destination path includes the file name
615 checkName = _FileImpl::GetFileName(destPath);
616 SysTryReturn(NID_CNT, !checkName.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
617 "[E_INVALID_ARG] The file name is empty.");
619 // 2nd: parent directory
620 lengthString = destFilePath.String::GetLength();
621 r = destPath.String::LastIndexOf('/', lengthString - 1, copySize);
622 SysTryReturn(NID_CNT, copySize > 0 && copySize < maxSize, r = E_INVALID_ARG, E_INVALID_ARG,
623 "[E_INVALID_ARG] The length of path is invalid size.");
625 // copy the parent path
626 r = destPath.SubString(0, copySize + 1, checkPath);
627 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
628 "[E_INVALID_ARG] Failed to perform SubString operation.");
630 // check the validation of the parent path
631 r = _FileImpl::GetAttributes(checkPath, fileAttr);
632 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
633 "[E_INVALID_ARG] Failed to perform GetAttributes operation.");
634 SysTryReturn(NID_CNT, fileAttr.IsDirectory(), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
635 "[E_ILLEGAL_ACCESS] The path is not directory path.");
638 __destFilePath = destPath;
639 scheme = uri.GetScheme();
641 if (scheme.CompareTo(L"http") == 0 || scheme.CompareTo(L"https") == 0)
643 sourcePath = uri.GetEncodedString();
645 r = AddTransferItem(uri, destPath, sourcePath, fileSize, CONTENT_TRANSFER_STATUS_DOWNLOAD_READY,
646 pListener, sec, false, requestID);
647 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to add a transfer item to queue.", GetErrorMessage(r));
649 // TODO : if timer is started, it doesn't need call it..
650 ContentTransferHandler();
652 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to handle the content transfer.", GetErrorMessage(r));
656 SysLogException(NID_CNT, E_INVALID_ARG, "[E_INVALID_ARG] It is unsupported URI(%ls) address format.", uri.ToString().GetPointer());
658 return E_INVALID_ARG;
665 _ContentTransferImpl::DownloadToBuffer(const Utility::Uri& uri, int fileSize, RequestId& reqId,
666 IContentTransferListener* pListener, int sec)
668 // E_SUCCESS, E_INVALID_ARG, E_INVALID_STATE, E_PRIVILEGE_DENIED
670 SysLog(NID_CNT, "DownloadToBuffer operation start with listener.");
673 result r = E_SUCCESS;
674 String sourcePath(L"");
678 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
680 SysTryReturn(NID_CNT, fileSize >= 0, r = E_INVALID_ARG, E_INVALID_ARG,
681 "[E_INVALID_ARG] The size of the source file is less than 0.");
682 SysTryReturn(NID_CNT, !uri.ToString().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
683 "[E_INVALID_ARG] The source URI is empty.");
684 SysTryReturn(NID_CNT, !uri.GetHost().IsEmpty() && !uri.GetPath().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
685 "[E_INVALID_ARG] The source URI is empty.");
686 SysTryReturn(NID_CNT, sec >= 0, E_INVALID_ARG, E_INVALID_ARG,
687 "[E_INVALID_ARG] The timeout value is less than 0.");
689 scheme = uri.GetScheme();
691 if (scheme.CompareTo(L"http") == 0 || scheme.CompareTo(L"https") == 0)
693 r = _SystemTimeImpl::GetTicks(ticks);
694 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_STATE, E_INVALID_STATE,
695 "[E_INVALID_STATE] Failed to perform GetTicks operation.");
697 String tempFilePath(CONTENT_DOWNLOAD_TEMP_DIRECTORY);
698 r = tempFilePath.Append(_AppInfo::GetApplicationId());
699 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to perform Append operation.");
701 r = tempFilePath.Append(L"/downloadtempfile");
702 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to perform Append operation.");
704 r = tempFilePath.Append(ticks);
705 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_STATE, E_INVALID_STATE,
706 "[E_INVALID_STATE] Failed to append long long type to temporary file path.");
708 r = tempFilePath.Append(downloadRequestId);
709 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
710 "[E_INVALID_ARG] Failed to append int type to temporary file path.");
712 sourcePath = uri.GetEncodedString();
714 r = AddTransferItem(uri, tempFilePath, sourcePath, fileSize,
715 CONTENT_TRANSFER_STATUS_DOWNLOAD_READY, pListener, sec, true, reqId);
716 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
717 "[E_INVALID_ARG] Failed to add a transfer item to queue.");
719 // TODO : if timer is started, it doesn't need call it..
720 __destFilePath = tempFilePath;
721 ContentTransferHandler();
723 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to handle the content transfer.", GetErrorMessage(r));
727 SysLogException(NID_CNT, E_INVALID_ARG, "[E_INVALID_ARG] It is unsupported URI(%ls) address format.", uri.ToString().GetPointer());
729 return E_INVALID_ARG;
736 _ContentTransferImpl::Download(const Utility::Uri& uri, const String& filePath,
737 RequestId& reqId, bool replace, int timeout, int progressInterval)
739 // E_SUCCESS, E_PRIVILEGE_DENIED, E_INVALID_ARG, E_INVALID_STATE, E_ILLEGAL_ACCESS, E_FILE_ALREADY_EXIST, E_IN_PROGRESS, E_OUT_OF_MEMORY, E_SYSTEM
741 SysLog(NID_CNT, "Download operation start without listener.");
744 result r = E_SUCCESS;
745 String srcFilePath(L"");
748 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
750 SysTryReturn(NID_CNT, !filePath.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
751 "[E_INVALID_ARG] The destination file path is empty.");
752 SysTryReturn(NID_CNT, !uri.ToString().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
753 "[E_INVALID_ARG] The source URI is empty.");
754 SysTryReturn(NID_CNT, !uri.GetHost().IsEmpty() && !uri.GetPath().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
755 "[E_INVALID_ARG] The source URI is empty.");
756 SysTryReturn(NID_CNT, timeout >= 0, r = E_INVALID_ARG, E_INVALID_ARG,
757 "[E_INVALID_ARG] The timeout value is less than 0.");
758 SysTryReturn(NID_CNT, progressInterval >= 0 && progressInterval <= 100, r = E_INVALID_ARG, E_INVALID_ARG,
759 "[E_INVALID_ARG] The progress interval is less than 0.");
761 if (!_AppInfo::IsOspCompat())
763 if (filePath.StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA, 0) || filePath.StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA_MMC, 0) ||
764 filePath.StartsWith(CONTENT_DOWNLOAD_PATH_HOME, 0) || filePath.StartsWith(CONTENT_DOWNLOAD_PATH_HOME_MMC, 0))
766 SysLogException(NID_CNT, E_INVALID_ARG,
767 "[E_INVALID_ARG] /Media/ , /Storagecard/Media/ , /Home/ , /HomeExt/ are not supported from Tizen 2.0.");
769 return E_INVALID_ARG;
771 if (!(filePath.StartsWith(Tizen::App::App::GetInstance()->GetAppRootPath(), 0) || filePath.StartsWith(Environment::GetMediaPath(), 0) ||
772 filePath.StartsWith(Environment::GetExternalStoragePath(), 0)))
774 SysLogException(NID_CNT, E_INVALID_ARG,
775 "[E_INVALID_ARG] The [%ls] path is not supported.", filePath.GetPointer());
777 return E_INVALID_ARG;
783 if (filePath.StartsWith(Tizen::App::App::GetInstance()->GetAppRootPath(), 0) || filePath.StartsWith(Environment::GetMediaPath(), 0) ||
784 filePath.StartsWith(Environment::GetExternalStoragePath(), 0))
786 SysLogException(NID_CNT, E_INVALID_ARG,
787 "[E_INVALID_ARG] This [%ls] path can be used from Tizen 2.0.", filePath.GetPointer());
789 return E_INVALID_ARG;
791 if (!(filePath.StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA, 0) || filePath.StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA_MMC, 0) ||
792 filePath.StartsWith(CONTENT_DOWNLOAD_PATH_HOME, 0) || filePath.StartsWith(CONTENT_DOWNLOAD_PATH_HOME_MMC, 0)))
794 SysLogException(NID_CNT, E_INVALID_ARG,
795 "[E_INVALID_ARG] The [%ls] is not supported.", filePath.GetPointer());
797 return E_INVALID_ARG;
801 __destFilePath = filePath;
803 r = CheckDestPath(__destFilePath, replace);
804 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to perform CheckDestPath operation.", GetErrorMessage(r));
806 scheme = uri.GetScheme();
808 if (scheme.CompareTo(L"http") == 0 || scheme.CompareTo(L"https") == 0)
810 srcFilePath = uri.GetEncodedString();
812 r = AddTransferItem(uri, __destFilePath, srcFilePath, CONTENT_TRANSFER_STATUS_DOWNLOAD_READY,
813 timeout, progressInterval, false, reqId);
814 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to add a transfer item to queue.", GetErrorMessage(r));
818 SysLogException(NID_CNT, E_INVALID_ARG,
819 "[E_INVALID_ARG] It is unsupported URI(%ls) address format.", uri.ToString().GetPointer());
821 return E_INVALID_ARG;
824 ContentTransferHandler();
826 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to handle the content transfer.", GetErrorMessage(r));
832 _ContentTransferImpl::DownloadToBuffer(const Utility::Uri& uri, RequestId& reqId, int timeout, int progressInterval)
834 // E_SUCCESS, E_PRIVILEGE_DENIED, E_INVALID_ARG, E_INVALID_STATE, E_ILLEGAL_ACCESS, E_IN_PROGRESS, E_OUT_OF_MEMORY
836 SysLog(NID_CNT, "DownloadToBuffer operation start without listener.");
838 result r = E_SUCCESS;
839 String srcFilePath(L"");
843 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
845 SysTryReturn(NID_CNT, !uri.ToString().IsEmpty(), E_INVALID_ARG, E_INVALID_ARG,
846 "[E_INVALID_ARG] The source URI is empty.");
847 SysTryReturn(NID_CNT, !uri.GetHost().IsEmpty() && !uri.GetPath().IsEmpty(), E_INVALID_ARG, E_INVALID_ARG,
848 "[E_INVALID_ARG] The source URI is empty.");
849 SysTryReturn(NID_CNT, timeout >= 0, E_INVALID_ARG, E_INVALID_ARG,
850 "[E_INVALID_ARG] The timeout value is less than 0.");
851 SysTryReturn(NID_CNT, progressInterval >= 0 && progressInterval <= 100, E_INVALID_ARG, E_INVALID_ARG,
852 "[E_INVALID_ARG] The progress interval is less than 0.");
854 scheme = uri.GetScheme();
855 if (scheme.CompareTo(L"http") == 0 || scheme.CompareTo(L"https") == 0)
857 r = _SystemTimeImpl::GetTicks(ticks);
858 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to perform GetTicks operation.", GetErrorMessage(r));
860 String tempDestFilePath(CONTENT_DOWNLOAD_TEMP_DIRECTORY);
861 r = tempDestFilePath.Append(_AppInfo::GetApplicationId());
862 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to perform Append operation.");
864 r = tempDestFilePath.Append(L"/downloadtempfile");
865 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to perform Append operation.");
867 r = tempDestFilePath.Append(ticks);
868 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to append long long type to temporary file path.", GetErrorMessage(r));
870 r = tempDestFilePath.Append(downloadRequestId);
871 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to append int type to temporary file path.", GetErrorMessage(r));
873 srcFilePath = uri.GetEncodedString();
875 r = AddTransferItem(uri, tempDestFilePath, srcFilePath, CONTENT_TRANSFER_STATUS_DOWNLOAD_READY,
876 timeout, progressInterval, true, reqId);
877 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to add a transfer item to queue.", GetErrorMessage(r));
881 SysLogException(NID_CNT, E_INVALID_ARG,
882 "[E_INVALID_ARG] It is unsupported URI(%ls) address format.", uri.ToString().GetPointer());
884 return E_INVALID_ARG;
887 ContentTransferHandler();
889 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to handle the content transfer.", GetErrorMessage(r));
895 _ContentTransferImpl::OnTimerExpired(Runtime::Timer& timer)
899 check = ContentTransferHandler();
901 SysAssertf(__pTimer != null, "Not yet constructed. Construct() should be called before use.");
905 __pTimer->Start(CONTENT_DOWNLOAD_CHECKING_PERIOD);
906 __timerStarted = true;
910 __timerStarted = false;
915 _ContentTransferImpl::GetRequestId(void) const
917 return ++downloadRequestId;
921 _ContentTransferImpl::GetContentTransferInfoByRequestId(RequestId requestId) const
924 result r = E_SUCCESS;
925 std::unique_ptr<IEnumerator> pEnum;
926 ContentTransferInfo* pTransferInfo = null;
928 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
933 SysLogException(NID_CNT, r, "[%s] Failed to perform GetEnumeratorN operation.", GetErrorMessage(r));
937 while (pEnum->MoveNext() == E_SUCCESS)
939 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
940 SysTryReturn(NID_CNT, pTransferInfo != null, null, E_INVALID_ARG,
941 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
943 if (pTransferInfo->GetRequestId() == requestId)
947 pTransferInfo = null;
950 return pTransferInfo;
954 _ContentTransferImpl::StartTimer(void)
957 result r = E_SUCCESS;
959 if (!(__timerStarted))
961 r = __pTimer->Start(CONTENT_DOWNLOAD_CHECKING_PERIOD);
962 SysTryReturnVoidResult(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, "[E_INVALID_ARG] Failed to start timer.");
964 __timerStarted = true;
969 _ContentTransferImpl::GetEmptySlot(int& slot) const
972 result r = E_SUCCESS;
974 slot = GetEmptySlotInternal();
976 if (slot < 0 || slot > MAX_DOWNLOAD_COUNT)
979 SysLog(NID_CNT, "Failed to get empty slot for download.");
986 _ContentTransferImpl::CheckDestPath(const String& destPath, bool replace)
988 result r = E_SUCCESS;
989 String destFilePath(L"");
990 String checkName(L"");
991 String checkPath(L"");
992 FileAttributes fileAttr;
995 int lengthString = 0;
998 destFilePath = destPath;
999 SysTryReturn(NID_CNT, !destFilePath.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
1000 "[E_INVALID_ARG] The destination file path is empty.");
1002 if (!_AppInfo::IsOspCompat())
1004 if (!(destFilePath.String::StartsWith(Environment::GetMediaPath(), 0) ||
1005 destFilePath.String::StartsWith(Environment::GetExternalStoragePath(), 0) ||
1006 destFilePath.String::StartsWith(Tizen::App::App::GetInstance()->GetAppRootPath(), 0)))
1008 SysLogException(NID_CNT, E_INVALID_ARG, "[E_INVALID_ARG] The destination path is not allowed path.");
1009 return E_INVALID_ARG;
1014 // the allowed destination path
1015 // /Media, /Storagecard/Media
1017 if (!(destFilePath.String::StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA, 0) ||
1018 destFilePath.String::StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA_MMC, 0) ||
1019 destFilePath.String::StartsWith(CONTENT_DOWNLOAD_PATH_HOME, 0) ||
1020 destFilePath.String::StartsWith(CONTENT_DOWNLOAD_PATH_HOME_MMC, 0)))
1022 SysLogException(NID_CNT, E_INVALID_ARG, "[E_INVALID_ARG] The destination path is not allowed path.");
1023 return E_INVALID_ARG;
1028 if (_FileImpl::IsFileExist(destFilePath) == true)
1030 // not allowed overwrite
1031 if (replace != true)
1033 SysLogException(NID_CNT, E_FILE_ALREADY_EXIST, "[E_FILE_ALREADY_EXIST] The file already exists in destination path.");
1034 return E_FILE_ALREADY_EXIST;
1037 // allowed overwrite
1038 r = _FileImpl::GetAttributes(destFilePath, fileAttr);
1039 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
1040 "[E_INVALID_ARG] Failed to perform GetAttributes operation. ");
1041 SysTryReturn(NID_CNT, !(fileAttr.IsDirectory()), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1042 "[E_ILLEGAL_ACCESS] The file path is directory path.");
1043 SysTryReturn(NID_CNT, !(fileAttr.IsReadOnly()), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1044 "[E_ILLEGAL_ACCESS] The file can only read.");
1049 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1051 // check the destination file path
1053 SysTryReturn(NID_CNT, _FileImpl::IsMediaPath(destFilePath) == true || _FileImpl::IsAppPath(destFilePath) == true,
1054 r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The file path is not a media or an app path.");
1058 // check whether the destination path includes the file name
1059 checkName = _FileImpl::GetFileName(destFilePath);
1060 SysTryReturn(NID_CNT, !checkName.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
1061 "[E_INVALID_ARG] Failed to get the file name from a path.");
1063 // 2nd: parent directory
1064 lengthString = destFilePath.String::GetLength();
1065 r = destFilePath.String::LastIndexOf('/', lengthString - 1, copySize);
1066 SysTryReturn(NID_CNT, copySize > 0 && copySize < maxSize, r = E_INVALID_ARG, E_INVALID_ARG,
1067 "[E_INVALID_ARG] Failed to get the size of path.");
1069 // copy the parent path
1070 r = destFilePath.SubString(0, copySize + 1, checkPath);
1071 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
1072 "[E_INVALID_ARG] Failed to perform SubString operation.");
1074 if (!_AppInfo::IsOspCompat())
1076 SysTryReturn(NID_CNT, destFilePath.String::StartsWith(Environment::GetMediaPath(), 0) ||
1077 destFilePath.String::StartsWith(Environment::GetExternalStoragePath(), 0) ||
1078 _FileImpl::IsAppPath(destFilePath) == true,
1079 r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The path is invalid media path.");
1081 if (!(_FileImpl::IsFileExist(checkPath)))
1083 r = dir.Create(checkPath);
1084 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
1085 "[E_INVALID_ARG] Failed to create the directory.");
1089 // check the validation of the parent path
1090 r = _FileImpl::GetAttributes(checkPath, fileAttr);
1091 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
1092 "[E_INVALID_ARG] Failed to perform GetAttributes operation.");
1093 SysTryReturn(NID_CNT, fileAttr.IsDirectory() == true, r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1094 "[E_ILLEGAL_ACCESS] The path is not a directory path.");
1101 _ContentTransferImpl::CheckDownloadStatus(const Uri& uri, const String& destPath)
1104 std::unique_ptr<IEnumerator> pEnum;
1105 ContentTransferInfo* pTransferInfoTemp = null;
1106 ContentTransferStatus statusTemp = CONTENT_TRANSFER_STATUS_NONE;
1107 result r = E_SUCCESS;
1109 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
1110 SysTryReturn(NID_CNT, pEnum != null, r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1111 "[%s] Failed to perform GetEnumeratorN operation.", GetErrorMessage(r));
1113 while (pEnum->MoveNext() == E_SUCCESS)
1115 pTransferInfoTemp = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
1116 SysTryReturn(NID_CNT, pTransferInfoTemp != null, r = E_INVALID_STATE, E_INVALID_STATE,
1117 "[E_INVALID_STATE] ContentTransferInfo instance must not be null.");
1119 statusTemp = pTransferInfoTemp->GetContentTransferStatus();
1121 if (statusTemp == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY ||
1122 statusTemp == CONTENT_TRANSFER_STATUS_DOWNLOADING)
1124 if (destPath.CompareTo(pTransferInfoTemp->GetDestPath()) == 0)
1126 if (uri.CompareTo(pTransferInfoTemp->GetUri()) == 0)
1128 SysLogException(NID_CNT, E_IN_PROGRESS, "[E_IN_PROGRESS] Transfer is in progress.");
1129 return E_IN_PROGRESS;
1133 SysLogException(NID_CNT, E_ILLEGAL_ACCESS, "[E_ILLEGAL_ACCESS] Access to source is illegal access.");
1134 return E_ILLEGAL_ACCESS;
1144 _ContentTransferImpl::AddTransferItem(const Uri& uri, const String& destPath, const String& sourcePath, int sourceFileSize,
1145 ContentTransferStatus status, IContentTransferListener* pListener, int sec, bool isBuffer, RequestId& requestId)
1148 result r = E_SUCCESS;
1149 std::unique_ptr<IEnumerator> pEnum;
1150 std::unique_ptr<ContentTransferInfo> pTransferInfo;
1151 ContentTransferInfo* pTransferInfoTemp = null;
1152 ContentTransferStatus statusTemp = CONTENT_TRANSFER_STATUS_NONE;
1153 requestId = INVALID_REQUEST_ID;
1155 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
1157 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
1158 SysTryReturn(NID_CNT, pEnum != null, r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1159 "[E_ILLEGAL_ACCESS] Failed to perform GetEnumeratorN operation.");
1161 while (pEnum->MoveNext() == E_SUCCESS)
1163 pTransferInfoTemp = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
1164 SysTryReturn(NID_CNT, pTransferInfoTemp != null, r = E_INVALID_ARG, E_INVALID_ARG,
1165 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
1167 statusTemp = pTransferInfoTemp->GetContentTransferStatus();
1169 if (statusTemp == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY || statusTemp == CONTENT_TRANSFER_STATUS_DOWNLOADING)
1171 if (destPath.CompareTo(pTransferInfoTemp->GetDestPath()) == 0)
1173 if (uri.CompareTo(pTransferInfoTemp->GetUri()) == 0)
1175 SysLogException(NID_CNT, E_IN_PROGRESS, "[E_IN_PROGRESS] The request is already in progress.");
1176 return E_IN_PROGRESS;
1180 SysLogException(NID_CNT, E_ILLEGAL_ACCESS,
1181 "[E_ILLEGAL_ACCESS] The destination path [%ls] is already in progress.", destPath.GetPointer());
1182 return E_ILLEGAL_ACCESS;
1188 pTransferInfo = std::unique_ptr<ContentTransferInfo>(new (std::nothrow) ContentTransferInfo);
1189 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
1190 "[E_OUT_OF_MEMORY] Failed to construct ContentTransferInfo.");
1192 requestId = GetRequestId();
1194 pTransferInfo->SetAllInfo(requestId, uri, destPath, sourcePath, sourceFileSize, status);
1198 pTransferInfo->SetListener(pListener);
1204 pTransferInfo->SetTimeout(sec);
1209 pTransferInfo->SetTimeout(0);
1212 if (__percent > 0 && __percent <= 100)
1214 pTransferInfo->SetProgressInterval(__percent);
1218 pTransferInfo->SetProgressInterval(0);
1221 if (isBuffer == true)
1223 __isBuffer = isBuffer;
1224 pTransferInfo->SetIsBuffer(true);
1227 r = __pTransferInfoList->Add(*(pTransferInfo.release()));
1228 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to add item to info list.");
1234 _ContentTransferImpl::AddTransferItem(const Uri& uri, const String& destPath, const String& sourcePath,
1235 ContentTransferStatus status, int timeout, int interval, bool isBuffer, RequestId& requestId)
1238 result r = E_SUCCESS;
1239 std::unique_ptr<ContentTransferInfo> pTransferInfo;
1240 requestId = INVALID_REQUEST_ID;
1242 r = CheckDownloadStatus(uri, destPath);
1243 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to perform CheckDownloadStatus operation.", GetErrorMessage(r));
1245 // pTransferInfo will be deallocated in the Response routine
1246 pTransferInfo = std::unique_ptr<ContentTransferInfo>(new (std::nothrow) ContentTransferInfo);
1247 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
1248 "[%s] Failed to construct ContentTransferInfo.", GetErrorMessage(r));
1250 requestId = GetRequestId();
1252 pTransferInfo->SetAllInfo(requestId, uri, destPath, sourcePath, 0, status);
1256 __timeout = timeout;
1257 pTransferInfo->SetTimeout(timeout);
1262 pTransferInfo->SetTimeout(0);
1265 if (interval > 0 && interval <= 100)
1267 __percent = interval;
1268 pTransferInfo->SetProgressInterval(interval);
1273 pTransferInfo->SetProgressInterval(0);
1276 if (isBuffer == true)
1278 __isBuffer = isBuffer;
1279 pTransferInfo->SetIsBuffer(true);
1282 r = __pTransferInfoList->Add(*(pTransferInfo.release()));
1283 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to add item to info list.");
1289 _ContentTransferImpl::SetDownloadSlotInfo(ContentTransferInfo* pTransferInfo, int& slot)
1292 result r = E_SUCCESS;
1293 String destPath(L"");
1295 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
1297 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_ARG, E_INVALID_ARG,
1298 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
1300 destPath = pTransferInfo->GetDestPath();
1302 r = GetEmptySlot(slot);
1303 SysLog(NID_CNT, "Set the download slot [%d].", slot);
1304 SysTryReturn(NID_CNT, !IsFailed(r) && slot != -1, r = E_INVALID_ARG, E_INVALID_ARG,
1305 "[E_INVALID_ARG] Failed to get the empty slot.");
1307 SetUsedSlotInternal(slot);
1309 (__pContentDownloadHandlerSequence.get())[slot].SetSlot(slot);
1310 (__pContentDownloadHandlerSequence.get())[slot].SetRequestId(pTransferInfo->GetRequestId());
1311 (__pContentDownloadHandlerSequence.get())[slot].SetTimeout(pTransferInfo->GetTimeout());
1312 (__pContentDownloadHandlerSequence.get())[slot].SetProgressIntervalByPercent(pTransferInfo->GetProgressInterval());
1313 (__pContentDownloadHandlerSequence.get())[slot].SetDownloadPath(destPath);
1315 (__pContentDownloadUserDataSequence.get())[slot].SetSlot(slot);
1316 (__pContentDownloadUserDataSequence.get())[slot].SetContentTransferInfo(pTransferInfo);
1317 (__pContentDownloadUserDataSequence.get())[slot].SetRequestId(pTransferInfo->GetRequestId());
1318 (__pContentDownloadUserDataSequence.get())[slot].SetPercent(pTransferInfo->GetProgressInterval());
1319 (__pContentDownloadUserDataSequence.get())[slot].SetContentTransferEvent(__pTransferEvent.get());
1320 (__pContentDownloadUserDataSequence.get())[slot].SetDestPath(destPath);
1322 if (__isBuffer == true)
1324 (__pContentDownloadUserDataSequence.get())[slot].SetDownloadBufferFlag(true);
1327 pTransferInfo->SetSlotId(slot);
1333 _ContentTransferImpl::RequestErrorEvent(result requestErrorCode, ContentTransferInfo* pTransferInfo)
1336 result r = E_SUCCESS;
1337 std::unique_ptr<_ContentTransferEventArg> pTransferEventArg;
1339 pTransferEventArg = std::unique_ptr<_ContentTransferEventArg>(new (std::nothrow) _ContentTransferEventArg);
1340 SysTryReturn(NID_CNT, pTransferEventArg != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
1341 "[E_OUT_OF_MEMORY] Failed to construct ContentTransferEventArg.");
1343 pTransferEventArg->SetResult(requestErrorCode);
1345 if (pTransferInfo->GetIsBuffer() == true)
1347 pTransferEventArg->SetEventType(Content::CONTENT_TRANSFER_EVENT_DOWNLOAD_TO_BUFFER_COMPLETED);
1352 pTransferEventArg->SetEventType(Content::CONTENT_TRANSFER_EVENT_DOWNLOAD_COMPLETED);
1355 pTransferEventArg->SetRequestId(pTransferInfo->GetRequestId());
1357 r = __pTransferEvent->Fire(*(pTransferEventArg.release()));
1358 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to perform fire operation on ContentTransferEvent.", GetErrorMessage(r));
1360 pTransferInfo->SetDownloadStatus(CONTENT_TRANSFER_STATUS_DOWNLOAD_COMPLETED);
1366 _ContentTransferImpl::RemoveCompletedTransferInfo(ArrayList* pTransferInfoList)
1369 std::unique_ptr<IEnumerator> pEnum;
1370 ContentTransferInfo* pTransferInfo = null;
1371 result r = E_SUCCESS;
1373 if (pTransferInfoList == null)
1378 pEnum = std::unique_ptr<IEnumerator>(pTransferInfoList->GetEnumeratorN());
1379 SysTryReturn(NID_CNT, pEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
1380 "[E_OUT_OF_MEMORY] Failed to perform GetEnumeratorN operation.");
1382 while (pEnum->MoveNext() == E_SUCCESS)
1384 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
1385 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_ARG, r,
1386 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
1388 __pTransferInfoList->Remove(*pTransferInfo, true);
1389 r = GetLastResult();
1390 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to remove a item from transfer info list.", GetErrorMessage(r));
1397 _ContentTransferImpl::ContentTransferHandler(void)
1400 result r = E_SUCCESS;
1401 std::unique_ptr<IEnumerator> pEnum;
1402 std::unique_ptr<ArrayList> pDeleteList;
1403 ContentTransferInfo* pTransferInfo = null;
1404 ContentTransferStatus status = CONTENT_TRANSFER_STATUS_NONE;
1405 int downloadCount = 0;
1406 RequestId restRequestId = INVALID_REQUEST_ID;
1411 String destPath(L"");
1412 String sourcePath(L"");
1414 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
1420 while (pEnum->MoveNext() == E_SUCCESS)
1422 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
1423 SysTryReturn(NID_CNT, pTransferInfo != null, check, E_INVALID_ARG,
1424 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
1426 status = pTransferInfo->GetContentTransferStatus();
1428 if (status == CONTENT_TRANSFER_STATUS_DOWNLOADING)
1431 if (downloadCount == MAX_DOWNLOAD_COUNT)
1441 else if (status == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY)
1446 r = GetLastResult();
1447 SysTryReturn(NID_CNT, !IsFailed(r), check, r, "[%s] Failed to perform StartTimer operation.", GetErrorMessage(r));
1453 // get empty buffer slot from download buffer
1454 // set slot information
1455 r = SetDownloadSlotInfo(pTransferInfo, slot);
1458 SysLogException(NID_CNT, r, "[%s] Failed to find an empty slot.", GetErrorMessage(r));
1465 SysLogException(NID_CNT, r, "[%s] Propagating.", GetErrorMessage(r));
1469 destPath = pTransferInfo->GetDestPath();
1470 sourcePath = pTransferInfo->GetUri().ToString();
1471 (__pContentDownloadHandlerSequence.get())[slot].SetSlot(slot);
1474 restRequestId = (__pContentDownloadHandlerSequence.get())[slot].HttpDownload(sourcePath,
1475 pTransferInfo->GetSourceFileSize(), destPath, &(__pContentDownloadUserDataSequence.get())[slot]);
1476 r = GetLastResult();
1477 SysTryLog(NID_CNT, restRequestId != INVALID_REQUEST_ID,
1478 "[%s] The rest request ID is invalid.", GetErrorMessage(r));
1482 r = RequestErrorEvent(r, pTransferInfo);
1483 SysTryReturn(NID_CNT, !IsFailed(r), check, E_INVALID_ARG,
1484 "[E_INVALID_ARG] Failed to perform RequestErrorEvent operation.");
1486 (__pContentDownloadUserDataSequence.get())[slot].SetSlotFlag(false);
1494 pTransferInfo->SetRestRequestId(restRequestId);
1495 pTransferInfo->SetDownloadStatus(CONTENT_TRANSFER_STATUS_DOWNLOADING);
1498 if (downloadCount == MAX_DOWNLOAD_COUNT)
1507 else if (status == CONTENT_TRANSFER_STATUS_DOWNLOAD_COMPLETED)
1509 SetEmptySlotInternal();
1511 // TODO : should i check to sync
1512 if (pDeleteList == null)
1514 pDeleteList = std::unique_ptr<ArrayList>(new (std::nothrow) ArrayList());
1515 SysTryReturn(NID_CNT, !IsFailed(r), check, E_OUT_OF_MEMORY,
1516 "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
1518 pDeleteList->Add(*pTransferInfo);
1523 r = RemoveCompletedTransferInfo(pDeleteList.get());
1524 SysTryReturn(NID_CNT, !IsFailed(r), check, E_INVALID_ARG,
1525 "[E_INVALID_ARG] Failed to remove the completed transfer info.");