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_TEMP_FILE_PATH[] = L"/tmp/content/downloadtempfile";
61 static const wchar_t CONTENT_DOWNLOAD_PATH_MEDIA[] = L"/Media";
62 static const wchar_t CONTENT_DOWNLOAD_PATH_MEDIA_MMC[] = L"/Storagecard/Media";
63 static const wchar_t CONTENT_DOWNLOAD_PATH_HOME[] = L"/Home";
64 static const wchar_t CONTENT_DOWNLOAD_PATH_HOME_MMC[] = L"/HomeExt";
66 static const int CONTENT_TRANSFER_DEFAULT_PROGRESS_INTERVAL = 0;
67 static const int CONTENT_DOWNLOAD_CHECKING_PERIOD = 1000;
69 _ContentTransferImpl::_ContentTransferImpl(void)
70 : __requestId(INVALID_REQUEST_ID)
71 , __restRequestId(INVALID_REQUEST_ID)
73 , __percent(CONTENT_TRANSFER_DEFAULT_PROGRESS_INTERVAL)
74 , __timerStarted(false)
77 , __pContentDownloadUserData(null)
78 , __pContentDownloadUserDataSequence(null)
79 , __pContentDownloadHandler(null)
80 , __pContentDownloadHandlerSequence(null)
81 , __pTransferEvent(null)
82 , __pTransferInfoList(null)
88 _ContentTransferImpl::~_ContentTransferImpl(void)
94 _ContentTransferImpl::GetInstance(ContentTransfer& contentTransfer)
96 return contentTransfer.__pImpl;
99 const _ContentTransferImpl*
100 _ContentTransferImpl::GetInstance(const ContentTransfer& contentTransfer)
102 return contentTransfer.__pImpl;
106 _ContentTransferImpl::Construct(IContentTransferListener& listener)
108 // E_SUCCESS, E_OUT_OF_MEMORY, E_SYSTEM
111 result r = E_SUCCESS;
113 std::unique_ptr<_ContentDownloadHandler> pContentDownloadHandler(new (std::nothrow) _ContentDownloadHandler);
114 SysTryReturn(NID_CNT, pContentDownloadHandler != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
115 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadHandler.");
117 r = pContentDownloadHandler->Construct();
118 SysTryReturn(NID_CNT, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
119 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadHandler.");
121 std::unique_ptr<_ContentDownloadHandler[]> pContentDownloadHandlerSequence(new (std::nothrow) _ContentDownloadHandler[MAX_DOWNLOAD_COUNT]);
122 SysTryReturn(NID_CNT, pContentDownloadHandlerSequence != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
123 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadHandler array.");
125 for (int i = 0; i < MAX_DOWNLOAD_COUNT; i++)
127 r = (pContentDownloadHandlerSequence.get())[i].Construct();
128 SysTryReturn(NID_CNT, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
129 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadHandler array.");
132 std::unique_ptr<_ContentDownloadUserData> pContentDownloadUserData(new (std::nothrow) _ContentDownloadUserData);
133 SysTryReturn(NID_CNT, pContentDownloadUserData != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
134 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadUserData.");
136 std::unique_ptr<_ContentDownloadUserData[]> pContentDownloadUserDataSequence(new (std::nothrow) _ContentDownloadUserData[MAX_DOWNLOAD_COUNT]);
137 SysTryReturn(NID_CNT, pContentDownloadUserDataSequence != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
138 "[E_OUT_OF_MEMORY] Failed to construct ContentDownloadUserData.");
140 std::unique_ptr<_ContentTransferEvent> pTransferEvent(new (std::nothrow) _ContentTransferEvent);
141 SysTryReturn(NID_CNT, pTransferEvent != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
142 "[E_OUT_OF_MEMORY] Failed to construct ContentTransferEvent.");
144 r = pTransferEvent->AddListener(listener, true);
145 SysTryReturn(NID_CNT, !IsFailed(r), r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to perform AddListener to ContentTransferEvent.");
147 std::unique_ptr<ArrayList, AllElementsDeleter> pTransferInfoList(new (std::nothrow) ArrayList());
148 SysTryReturn(NID_CNT, pTransferInfoList != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
149 "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
151 r = pTransferInfoList->Construct();
152 SysTryReturn(NID_CNT, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
153 "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
155 std::unique_ptr<Timer> pTimer(new (std::nothrow) Timer());
156 SysTryReturn(NID_CNT, pTimer != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct Timer.");
158 r = pTimer->Construct(*this);
159 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to construct Timer.", GetErrorMessage(r));
161 InitializeEmptySlotInternal(pContentDownloadUserData.get());
163 SysTryReturn(NID_CNT, !IsFailed(r), r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to perform initiate the download slot.");
165 __pContentDownloadHandler = std::move(pContentDownloadHandler);
166 __pContentDownloadHandlerSequence = std::move(pContentDownloadHandlerSequence);
168 __pContentDownloadUserData = std::move(pContentDownloadUserData);
169 __pContentDownloadUserDataSequence = std::move(pContentDownloadUserDataSequence);
171 __pTransferEvent = std::move(pTransferEvent);
173 __pTransferInfoList = std::move(pTransferInfoList);
175 __pTimer = std::move(pTimer);
181 _ContentTransferImpl::InitializeEmptySlotInternal(_ContentDownloadUserData* pUserData)
184 result r = E_SUCCESS;
186 String tempPath(CONTENT_DOWNLOAD_TEMP_DIRECTORY);
189 SysTryReturnVoidResult(NID_CNT, pUserData != null, r = E_SYSTEM,
190 "[E_SYSTEM] ContentDownloadUserData instance must not be null.");
192 pUserData->SetMaxCount(MAX_DOWNLOAD_COUNT);
196 for (i = 0; i < MAX_DOWNLOAD_COUNT; i++)
198 pUserData->SetCheckDownloading(i, false);
202 check = _FileImpl::IsFileExist(tempPath);
204 SysTryReturnVoidResult(NID_CNT, !IsFailed(r), r,
205 "[%s] Failed to perform IsFileExist operation for [%ls] path.", GetErrorMessage(r), tempPath.GetPointer());
209 r = Directory::Create(tempPath, false);
210 SysTryReturnVoidResult(NID_CNT, !IsFailed(r), r,
211 "[%s] Failed to perform Create operation for [%ls] path.", GetErrorMessage(r), tempPath.GetPointer());
220 _ContentTransferImpl::GetEmptySlotInternal(void) const
223 for (i = 0; i < MAX_DOWNLOAD_COUNT; i++)
225 if (!(__pContentDownloadUserData->GetCheckDownloading(i)))
234 _ContentTransferImpl::SetEmptySlotInternal(void)
236 for (int i = 0; i < MAX_DOWNLOAD_COUNT; i++)
238 if (!((__pContentDownloadUserDataSequence.get())[i].GetSlotFlag()))
240 __pContentDownloadUserData->SetCheckDownloading(i, false);
246 _ContentTransferImpl::SetUsedSlotInternal(int slot)
248 // TODO : If the error is occured in this command, set the mutex.
249 if (slot >= 0 && slot < MAX_DOWNLOAD_COUNT)
251 __pContentDownloadUserData->SetCheckDownloading(slot, true);
252 (__pContentDownloadUserDataSequence.get())[slot].SetSlotFlag(true);
257 _ContentTransferImpl::Cancel(RequestId reqId)
259 // E_SUCCESS, E_OBJ_NOT_FOUND, E_INVALID_ARG, E_INVALID_STATE
261 SysLog(NID_CNT, "Cancel the request ID(%d) in download.", reqId);
264 result r = E_SUCCESS;
265 String destFilePath = null;
266 ContentTransferInfo* pContentTransferInfo = null;
269 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
271 pContentTransferInfo = GetContentTransferInfoByRequestId(reqId);
272 SysTryReturn(NID_CNT, pContentTransferInfo != null, r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,
273 "[E_OBJ_NOT_FOUND] Unable to find the current Download operation.");
275 if (pContentTransferInfo->GetContentTransferStatus() == CONTENT_TRANSFER_STATUS_DOWNLOADING)
277 slot = pContentTransferInfo->GetSlotId();
278 r = (__pContentDownloadHandlerSequence.get())[slot].Cancel(pContentTransferInfo->GetRestRequestId(),
279 &(__pContentDownloadUserDataSequence.get())[slot]);
280 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to perform Cancel operation.");
284 // TODO : check timing issue.
286 SysLogException(NID_CNT, E_INVALID_STATE, "[E_INVALID_STATE] This [%d] request isn't under download.", reqId);
293 _ContentTransferImpl::SetDefaultTimeout(int sec)
306 _ContentTransferImpl::GetDefaultTimeout(void) const
312 _ContentTransferImpl::Remove(RequestId reqId)
314 // E_SUCCESS, E_OBJ_NOT_FOUND, E_OUT_OF_MEMORY, E_INVALID_STATE
316 SysLog(NID_CNT, "Remove the download request ID(%d) in queue.", reqId);
319 result r = E_SUCCESS;
320 ContentTransferInfo* pTransferInfo = null;
321 std::unique_ptr<IEnumerator> pEnum;
325 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
327 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
328 SysTryReturn(NID_CNT, pEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
329 "[E_OUT_OF_MEMORY] Remove operation can not perform for [%d] request ID.", reqId);
331 while (pEnum->MoveNext() == E_SUCCESS)
333 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
334 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,
335 "[E_OBJ_NOT_FOUND] ContentTransferInfo instance must not be null.");
337 if (pTransferInfo->GetRequestId() == reqId)
339 ContentTransferStatus status = pTransferInfo->GetContentTransferStatus();
340 if (status == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY ||
341 status == CONTENT_TRANSFER_STATUS_DOWNLOAD_COMPLETED)
346 else if (status == CONTENT_TRANSFER_STATUS_DOWNLOADING)
348 SysLogException(NID_CNT, E_INVALID_STATE, "[E_INVALID_STATE] This [%d] request operation is under download.", reqId);
349 return E_INVALID_STATE;
357 SysLogException(NID_CNT, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] [%d] request operation cannot found.", reqId);
358 return E_OBJ_NOT_FOUND;
362 __pTransferInfoList->RemoveAt(findIdx, true);
364 SysTryReturn(NID_CNT, !IsFailed(r), r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,
365 "[E_OBJ_NOT_FOUND] Failed to perform RemoveAt operation for a content in transfer info list.");
372 _ContentTransferImpl::RemoveAll(void)
374 // E_SUCCESS, E_OUT_OF_MEMORY, E_INVALID_STATE
376 SysLog(NID_CNT, "Remove all download request ID in queue.");
379 result r = E_SUCCESS;
380 ContentTransferInfo* pTransferInfo = null;
381 std::unique_ptr<IEnumerator> pTransferEnum;
382 std::unique_ptr<IEnumerator> pDeleteEnum;
383 ArrayList deleteList;
385 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
387 pTransferEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
388 SysTryReturn(NID_CNT, pTransferEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
389 "[E_OUT_OF_MEMORY] Failed to perform GetEnumeratorN operation.");
391 while (pTransferEnum->MoveNext() == E_SUCCESS)
393 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pTransferEnum->GetCurrent());
394 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_STATE, r,
395 "[E_INVALID_STATE] ContentTransferInfo instance must not be null.");
397 ContentTransferStatus status = pTransferInfo->GetContentTransferStatus();
398 if (status == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY || status == CONTENT_TRANSFER_STATUS_DOWNLOAD_COMPLETED)
400 deleteList.Add(*pTransferInfo);
404 pDeleteEnum = std::unique_ptr<IEnumerator>(deleteList.GetEnumeratorN());
405 SysTryReturn(NID_CNT, pDeleteEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
406 "[E_OUT_OF_MEMORY] Failed to perform GetEnumeratorN operation.");
408 while (pDeleteEnum->MoveNext() == E_SUCCESS)
410 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pDeleteEnum->GetCurrent());
411 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_STATE, r,
412 "[E_INVALID_STATE] ContentTransferInfo instance must not be null.");
414 __pTransferInfoList->Remove(*pTransferInfo, true);
416 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_STATE, E_INVALID_STATE,
417 "[E_INVALID_STATE] Failed to perform Remove operation for a content in transfer info list.");
424 _ContentTransferImpl::CancelAll(void)
426 // E_SUCCESS, E_OUT_OF_MEMORY, E_INVALID_STATE
428 SysLog(NID_CNT, "Cancel the all request ID in download.");
431 result r = E_SUCCESS;
432 std::unique_ptr<IEnumerator> pEnum;
433 ContentTransferInfo* pTransferInfo = null;
435 SysAssertf(__pTransferInfoList != null && __pContentDownloadUserDataSequence != null,
436 "Not yet constructed. Construct() should be called before use.");
438 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
439 SysTryReturn(NID_CNT, pEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
440 "[E_OUT_OF_MEMORY] Failed to perform GetEnumeratorN operation.");
442 while (pEnum->MoveNext() == E_SUCCESS)
444 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
445 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_STATE, r,
446 "[E_INVALID_STATE] ContentTransferInfo instance must not be null.");
448 ContentTransferStatus status = pTransferInfo->GetContentTransferStatus();
449 if (status == CONTENT_TRANSFER_STATUS_DOWNLOADING)
451 SysLog(NID_CNT, "========== Canceled download slot : %d ==========", pTransferInfo->GetSlotId());
453 r = (__pContentDownloadHandlerSequence.get())[pTransferInfo->GetSlotId()].Cancel(
454 pTransferInfo->GetRestRequestId(), &(__pContentDownloadUserDataSequence.get())[pTransferInfo->GetSlotId()]);
455 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_STATE, E_INVALID_STATE,
456 "[E_INVALID_STATE] Failed to perform Cancel operation.");
464 _ContentTransferImpl::GetContentTransferInfoListN(void) const
466 std::unique_ptr<ArrayList, AllElementsDeleter> pTransferInfoList;
467 std::unique_ptr<IEnumerator> pEnum;
468 ContentTransferInfo* pTransferInfoCopy = null;
469 ContentTransferInfo* pTransferInfo = null;
471 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
473 pTransferInfoList = std::unique_ptr<ArrayList, AllElementsDeleter>(new (std::nothrow) ArrayList());
474 SysTryLogReturn(NID_CNT, pTransferInfoList != null, null, "Failed to construct ArrayList.");
476 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
477 SysTryLogReturn(NID_CNT, pEnum != null, null, "Failed to perform GetEnumeratorN operation.");
479 while (pEnum->MoveNext() == E_SUCCESS)
481 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
482 SysTryLogReturn(NID_CNT, pTransferInfo != null, null, "ContentTransferInfo instance must not be null.");
484 pTransferInfoCopy = pTransferInfo->CopyN();
486 pTransferInfoList->Add(*pTransferInfoCopy);
489 return pTransferInfoList.release();
493 _ContentTransferImpl::GetContentTransferInfoListInProgressN(void) const
495 std::unique_ptr<ArrayList, AllElementsDeleter> pTransferInfoList;
496 std::unique_ptr<IEnumerator> pEnum;
497 ContentTransferInfo* pTransferInfoCopy = null;
498 ContentTransferInfo* pTransferInfo = null;
500 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
502 pTransferInfoList = std::unique_ptr<ArrayList, AllElementsDeleter>(new (std::nothrow) ArrayList());
503 SysTryLogReturn(NID_CNT, pTransferInfoList != null, null, "Failed to construct ArrayList.");
505 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
506 SysTryLogReturn(NID_CNT, pEnum != null, null, "Failed to perform GetEnumerator operation.");
508 while (pEnum->MoveNext() == E_SUCCESS)
510 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
511 SysTryLogReturn(NID_CNT, pTransferInfo != null, null, "ContentTransferInfo instance must not be null.");
513 ContentTransferStatus status = pTransferInfo->GetContentTransferStatus();
514 if (status == CONTENT_TRANSFER_STATUS_DOWNLOADING)
516 pTransferInfoCopy = pTransferInfo->CopyN();
517 pTransferInfoList->Add(*pTransferInfoCopy);
521 return pTransferInfoList.release();
525 _ContentTransferImpl::SetProgressIntervalByPercent(int percent)
527 if (percent > 0 && percent <= 100)
538 _ContentTransferImpl::Download(const Utility::Uri& uri, int fileSize, const String& destFilePath, bool replace,
539 RequestId& requestID, IContentTransferListener* pListener, int sec)
541 // E_SUCCESS, E_INVALID_ARG, E_INVALID_STATE, E_ILLEGAL_ACCESS, E_FILE_ALREADY_EXIST, E_PRIVILEGE_DENIED, E_IN_PROGRESS
543 SysLog(NID_CNT, "Download operation start with listener.");
546 result r = E_SUCCESS;
547 String sourcePath(L"");
548 String destPath(L"");
549 String tempPath(L"");
551 String checkName(L"");
552 String checkPath(L"");
555 int lengthString = 0;
556 FileAttributes fileAttr;
558 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
560 SysTryReturn(NID_CNT, fileSize >= 0, r = E_INVALID_ARG, E_INVALID_ARG,
561 "[E_INVALID_ARG] The size of the source file is less than 0.");
562 SysTryReturn(NID_CNT, !destFilePath.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
563 "[E_INVALID_ARG] The destination file path is empty.");
564 SysTryReturn(NID_CNT, !uri.ToString().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
565 "[E_INVALID_ARG] The source URI is empty.");
566 SysTryReturn(NID_CNT, !uri.GetHost().IsEmpty() && !uri.GetPath().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
567 "[E_INVALID_ARG] The source URI is empty.");
568 SysTryReturn(NID_CNT, sec >= 0, r = E_INVALID_ARG, E_INVALID_ARG,
569 "[E_INVALID_ARG] The timeout value is less than 0.");
571 destPath = destFilePath;
573 if (_FileImpl::IsSystemPath(destPath))
575 SysLogException(NID_CNT, E_ILLEGAL_ACCESS, "[E_ILLEGAL_ACCESS] [%ls] path isn't permitted.", destFilePath.GetPointer());
577 return E_ILLEGAL_ACCESS;
580 if (_FileImpl::IsFileExist(destPath))
584 SysLogException(NID_CNT, E_FILE_ALREADY_EXIST, "[E_FILE_ALREADY_EXIST] The download file is already exist.");
586 return E_FILE_ALREADY_EXIST;
589 SysTryReturn(NID_CNT, _FileImpl::IsMediaPath(destPath) == true || _FileImpl::IsAppPath(destPath) == true,
590 r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The file path is not a media or an app path.");
592 // read-only, directory or file
593 // check whether the destination file is read-only.
594 // check whether the destination path without the file extension is a directory or not.
595 r = _FileImpl::GetAttributes(destFilePath, fileAttr);
596 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
597 "[E_INVALID_ARG] Failed to perform GetAttributes operation for the destination path. ");
598 SysTryReturn(NID_CNT, !fileAttr.IsDirectory(), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
599 "[E_ILLEGAL_ACCESS] The file path is directory.");
600 SysTryReturn(NID_CNT, !fileAttr.IsReadOnly(), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
601 "[E_ILLEGAL_ACCESS] The file path is read only.");
605 // check the destination file path
607 SysTryReturn(NID_CNT, _FileImpl::IsMediaPath(destPath) == true || _FileImpl::IsAppPath(destPath) == true,
608 r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The file path is not a media or an app path.");
611 // check whether the destination path includes the file name
612 checkName = _FileImpl::GetFileName(destPath);
613 SysTryReturn(NID_CNT, !checkName.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
614 "[E_INVALID_ARG] The file name is empty.");
616 // 2nd: parent directory
617 lengthString = destFilePath.String::GetLength();
618 r = destPath.String::LastIndexOf('/', lengthString - 1, copySize);
619 SysTryReturn(NID_CNT, copySize > 0 && copySize < maxSize, r = E_INVALID_ARG, E_INVALID_ARG,
620 "[E_INVALID_ARG] The length of path is invalid size.");
622 // copy the parent path
623 r = destPath.SubString(0, copySize + 1, checkPath);
624 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
625 "[E_INVALID_ARG] Failed to perform SubString operation.");
627 // check the validation of the parent path
628 r = _FileImpl::GetAttributes(checkPath, fileAttr);
629 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
630 "[E_INVALID_ARG] Failed to perform GetAttributes operation.");
631 SysTryReturn(NID_CNT, fileAttr.IsDirectory(), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
632 "[E_ILLEGAL_ACCESS] The path is not directory path.");
635 __destFilePath = destPath;
636 scheme = uri.GetScheme();
638 if (scheme.CompareTo(L"http") == 0 || scheme.CompareTo(L"https") == 0)
640 sourcePath = uri.GetEncodedString();
642 r = AddTransferItem(uri, destPath, sourcePath, fileSize, CONTENT_TRANSFER_STATUS_DOWNLOAD_READY,
643 pListener, sec, false, requestID);
644 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to add a transfer item to queue.", GetErrorMessage(r));
646 // TODO : if timer is started, it doesn't need call it..
647 ContentTransferHandler();
649 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to handle the content transfer.", GetErrorMessage(r));
653 SysLogException(NID_CNT, E_INVALID_ARG, "[E_INVALID_ARG] It is unsupported URI(%ls) address format.", uri.ToString().GetPointer());
655 return E_INVALID_ARG;
662 _ContentTransferImpl::DownloadToBuffer(const Utility::Uri& uri, int fileSize, RequestId& reqId,
663 IContentTransferListener* pListener, int sec)
665 // E_SUCCESS, E_INVALID_ARG, E_INVALID_STATE, E_PRIVILEGE_DENIED
667 SysLog(NID_CNT, "DownloadToBuffer operation start with listener.");
670 result r = E_SUCCESS;
671 String tempFilePath(CONTENT_DOWNLOAD_TEMP_FILE_PATH);
672 String sourcePath(L"");
676 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
678 SysTryReturn(NID_CNT, fileSize >= 0, r = E_INVALID_ARG, E_INVALID_ARG,
679 "[E_INVALID_ARG] The size of the source file is less than 0.");
680 SysTryReturn(NID_CNT, !uri.ToString().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
681 "[E_INVALID_ARG] The source URI is empty.");
682 SysTryReturn(NID_CNT, !uri.GetHost().IsEmpty() && !uri.GetPath().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
683 "[E_INVALID_ARG] The source URI is empty.");
684 SysTryReturn(NID_CNT, sec >= 0, E_INVALID_ARG, E_INVALID_ARG,
685 "[E_INVALID_ARG] The timeout value is less than 0.");
687 scheme = uri.GetScheme();
689 if (scheme.CompareTo(L"http") == 0 || scheme.CompareTo(L"https") == 0)
691 r = _SystemTimeImpl::GetTicks(ticks);
692 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_STATE, E_INVALID_STATE,
693 "[E_INVALID_STATE] Failed to perform GetTicks operation.");
695 r = tempFilePath.Append(ticks);
696 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_STATE, E_INVALID_STATE,
697 "[E_INVALID_STATE] Failed to append long long type to temporary file path.");
699 r = tempFilePath.Append(downloadRequestId);
700 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
701 "[E_INVALID_ARG] Failed to append int type to temporary file path.");
703 sourcePath = uri.GetEncodedString();
705 r = AddTransferItem(uri, tempFilePath, sourcePath, fileSize,
706 CONTENT_TRANSFER_STATUS_DOWNLOAD_READY, pListener, sec, true, reqId);
707 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
708 "[E_INVALID_ARG] Failed to add a transfer item to queue.");
710 // TODO : if timer is started, it doesn't need call it..
711 __destFilePath = tempFilePath;
712 ContentTransferHandler();
714 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to handle the content transfer.", GetErrorMessage(r));
718 SysLogException(NID_CNT, E_INVALID_ARG, "[E_INVALID_ARG] It is unsupported URI(%ls) address format.", uri.ToString().GetPointer());
720 return E_INVALID_ARG;
727 _ContentTransferImpl::Download(const Utility::Uri& uri, const String& filePath,
728 RequestId& reqId, bool replace, int timeout, int progressInterval)
730 // 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
732 SysLog(NID_CNT, "Download operation start without listener.");
735 result r = E_SUCCESS;
736 String srcFilePath(L"");
739 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
741 SysTryReturn(NID_CNT, !filePath.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
742 "[E_INVALID_ARG] The destination file path is empty.");
743 SysTryReturn(NID_CNT, !uri.ToString().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
744 "[E_INVALID_ARG] The source URI is empty.");
745 SysTryReturn(NID_CNT, !uri.GetHost().IsEmpty() && !uri.GetPath().IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
746 "[E_INVALID_ARG] The source URI is empty.");
747 SysTryReturn(NID_CNT, timeout >= 0, r = E_INVALID_ARG, E_INVALID_ARG,
748 "[E_INVALID_ARG] The timeout value is less than 0.");
749 SysTryReturn(NID_CNT, progressInterval >= 0 && progressInterval <= 100, r = E_INVALID_ARG, E_INVALID_ARG,
750 "[E_INVALID_ARG] The progress interval is less than 0.");
752 if (!_AppInfo::IsOspCompat())
754 if (filePath.StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA, 0) || filePath.StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA_MMC, 0) ||
755 filePath.StartsWith(CONTENT_DOWNLOAD_PATH_HOME, 0) || filePath.StartsWith(CONTENT_DOWNLOAD_PATH_HOME_MMC, 0))
757 SysLogException(NID_CNT, E_INVALID_ARG,
758 "[E_INVALID_ARG] /Media/ , /Storagecard/Media/ , /Home/ , /HomeExt/ are not supported from Tizen 2.0.");
760 return E_INVALID_ARG;
762 if (!(filePath.StartsWith(Tizen::App::App::GetInstance()->GetAppRootPath(), 0) || filePath.StartsWith(Environment::GetMediaPath(), 0) ||
763 filePath.StartsWith(Environment::GetExternalStoragePath(), 0)))
765 SysLogException(NID_CNT, E_INVALID_ARG,
766 "[E_INVALID_ARG] The [%ls] path is not supported.", filePath.GetPointer());
768 return E_INVALID_ARG;
774 if (filePath.StartsWith(Tizen::App::App::GetInstance()->GetAppRootPath(), 0) || filePath.StartsWith(Environment::GetMediaPath(), 0) ||
775 filePath.StartsWith(Environment::GetExternalStoragePath(), 0))
777 SysLogException(NID_CNT, E_INVALID_ARG,
778 "[E_INVALID_ARG] This [%ls] path can be used from Tizen 2.0.", filePath.GetPointer());
780 return E_INVALID_ARG;
782 if (!(filePath.StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA, 0) || filePath.StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA_MMC, 0) ||
783 filePath.StartsWith(CONTENT_DOWNLOAD_PATH_HOME, 0) || filePath.StartsWith(CONTENT_DOWNLOAD_PATH_HOME_MMC, 0)))
785 SysLogException(NID_CNT, E_INVALID_ARG,
786 "[E_INVALID_ARG] The [%ls] is not supported.", filePath.GetPointer());
788 return E_INVALID_ARG;
792 __destFilePath = filePath;
794 r = CheckDestPath(__destFilePath, replace);
795 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to perform CheckDestPath operation.", GetErrorMessage(r));
797 scheme = uri.GetScheme();
799 if (scheme.CompareTo(L"http") == 0 || scheme.CompareTo(L"https") == 0)
801 srcFilePath = uri.GetEncodedString();
803 r = AddTransferItem(uri, __destFilePath, srcFilePath, CONTENT_TRANSFER_STATUS_DOWNLOAD_READY,
804 timeout, progressInterval, false, reqId);
805 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to add a transfer item to queue.", GetErrorMessage(r));
809 SysLogException(NID_CNT, E_INVALID_ARG,
810 "[E_INVALID_ARG] It is unsupported URI(%ls) address format.", uri.ToString().GetPointer());
812 return E_INVALID_ARG;
815 ContentTransferHandler();
817 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to handle the content transfer.", GetErrorMessage(r));
823 _ContentTransferImpl::DownloadToBuffer(const Utility::Uri& uri, RequestId& reqId, int timeout, int progressInterval)
825 // E_SUCCESS, E_PRIVILEGE_DENIED, E_INVALID_ARG, E_INVALID_STATE, E_ILLEGAL_ACCESS, E_IN_PROGRESS, E_OUT_OF_MEMORY
827 SysLog(NID_CNT, "DownloadToBuffer operation start without listener.");
829 result r = E_SUCCESS;
830 String srcFilePath(L"");
831 String tempDestFilePath(CONTENT_DOWNLOAD_TEMP_FILE_PATH);
835 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
837 SysTryReturn(NID_CNT, !uri.ToString().IsEmpty(), E_INVALID_ARG, E_INVALID_ARG,
838 "[E_INVALID_ARG] The source URI is empty.");
839 SysTryReturn(NID_CNT, !uri.GetHost().IsEmpty() && !uri.GetPath().IsEmpty(), E_INVALID_ARG, E_INVALID_ARG,
840 "[E_INVALID_ARG] The source URI is empty.");
841 SysTryReturn(NID_CNT, timeout >= 0, E_INVALID_ARG, E_INVALID_ARG,
842 "[E_INVALID_ARG] The timeout value is less than 0.");
843 SysTryReturn(NID_CNT, progressInterval >= 0 && progressInterval <= 100, E_INVALID_ARG, E_INVALID_ARG,
844 "[E_INVALID_ARG] The progress interval is less than 0.");
846 scheme = uri.GetScheme();
847 if (scheme.CompareTo(L"http") == 0 || scheme.CompareTo(L"https") == 0)
849 r = _SystemTimeImpl::GetTicks(ticks);
850 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to perform GetTicks operation.", GetErrorMessage(r));
852 r = tempDestFilePath.Append(ticks);
853 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to append long long type to temporary file path.", GetErrorMessage(r));
855 r = tempDestFilePath.Append(downloadRequestId);
856 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to append int type to temporary file path.", GetErrorMessage(r));
858 srcFilePath = uri.GetEncodedString();
860 r = AddTransferItem(uri, tempDestFilePath, srcFilePath, CONTENT_TRANSFER_STATUS_DOWNLOAD_READY,
861 timeout, progressInterval, true, reqId);
862 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to add a transfer item to queue.", GetErrorMessage(r));
866 SysLogException(NID_CNT, E_INVALID_ARG,
867 "[E_INVALID_ARG] It is unsupported URI(%ls) address format.", uri.ToString().GetPointer());
869 return E_INVALID_ARG;
872 ContentTransferHandler();
874 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to handle the content transfer.", GetErrorMessage(r));
880 _ContentTransferImpl::OnTimerExpired(Runtime::Timer& timer)
884 check = ContentTransferHandler();
886 SysAssertf(__pTimer != null, "Not yet constructed. Construct() should be called before use.");
890 __pTimer->Start(CONTENT_DOWNLOAD_CHECKING_PERIOD);
891 __timerStarted = true;
895 __timerStarted = false;
900 _ContentTransferImpl::GetRequestId(void) const
902 return ++downloadRequestId;
906 _ContentTransferImpl::GetContentTransferInfoByRequestId(RequestId requestId) const
909 result r = E_SUCCESS;
910 std::unique_ptr<IEnumerator> pEnum;
911 ContentTransferInfo* pTransferInfo = null;
913 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
918 SysLogException(NID_CNT, r, "[%s] Failed to perform GetEnumeratorN operation.", GetErrorMessage(r));
922 while (pEnum->MoveNext() == E_SUCCESS)
924 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
925 SysTryReturn(NID_CNT, pTransferInfo != null, null, E_INVALID_ARG,
926 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
928 if (pTransferInfo->GetRequestId() == requestId)
932 pTransferInfo = null;
935 return pTransferInfo;
939 _ContentTransferImpl::StartTimer(void)
942 result r = E_SUCCESS;
944 if (!(__timerStarted))
946 r = __pTimer->Start(CONTENT_DOWNLOAD_CHECKING_PERIOD);
947 SysTryReturnVoidResult(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, "[E_INVALID_ARG] Failed to start timer.");
949 __timerStarted = true;
954 _ContentTransferImpl::GetEmptySlot(int& slot) const
957 result r = E_SUCCESS;
959 slot = GetEmptySlotInternal();
961 if (slot < 0 || slot > MAX_DOWNLOAD_COUNT)
964 SysLog(NID_CNT, "Failed to get empty slot for download.");
971 _ContentTransferImpl::CheckDestPath(const String& destPath, bool replace)
973 result r = E_SUCCESS;
974 String destFilePath(L"");
975 String checkName(L"");
976 String checkPath(L"");
977 FileAttributes fileAttr;
980 int lengthString = 0;
983 destFilePath = destPath;
984 SysTryReturn(NID_CNT, !destFilePath.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
985 "[E_INVALID_ARG] The destination file path is empty.");
987 if (!_AppInfo::IsOspCompat())
989 if (!(destFilePath.String::StartsWith(Environment::GetMediaPath(), 0) ||
990 destFilePath.String::StartsWith(Environment::GetExternalStoragePath(), 0) ||
991 destFilePath.String::StartsWith(Tizen::App::App::GetInstance()->GetAppRootPath(), 0)))
993 SysLogException(NID_CNT, E_INVALID_ARG, "[E_INVALID_ARG] The destination path is not allowed path.");
994 return E_INVALID_ARG;
999 // the allowed destination path
1000 // /Media, /Storagecard/Media
1002 if (!(destFilePath.String::StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA, 0) ||
1003 destFilePath.String::StartsWith(CONTENT_DOWNLOAD_PATH_MEDIA_MMC, 0) ||
1004 destFilePath.String::StartsWith(CONTENT_DOWNLOAD_PATH_HOME, 0) ||
1005 destFilePath.String::StartsWith(CONTENT_DOWNLOAD_PATH_HOME_MMC, 0)))
1007 SysLogException(NID_CNT, E_INVALID_ARG, "[E_INVALID_ARG] The destination path is not allowed path.");
1008 return E_INVALID_ARG;
1013 if (_FileImpl::IsFileExist(destFilePath) == true)
1015 // not allowed overwrite
1016 if (replace != true)
1018 SysLogException(NID_CNT, E_FILE_ALREADY_EXIST, "[E_FILE_ALREADY_EXIST] The file already exists in destination path.");
1019 return E_FILE_ALREADY_EXIST;
1022 // allowed overwrite
1023 r = _FileImpl::GetAttributes(destFilePath, fileAttr);
1024 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
1025 "[E_INVALID_ARG] Failed to perform GetAttributes operation. ");
1026 SysTryReturn(NID_CNT, !(fileAttr.IsDirectory()), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1027 "[E_ILLEGAL_ACCESS] The file path is directory path.");
1028 SysTryReturn(NID_CNT, !(fileAttr.IsReadOnly()), r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1029 "[E_ILLEGAL_ACCESS] The file can only read.");
1034 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1036 // check the destination file path
1038 SysTryReturn(NID_CNT, _FileImpl::IsMediaPath(destFilePath) == true || _FileImpl::IsAppPath(destFilePath) == true,
1039 r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The file path is not a media or an app path.");
1043 // check whether the destination path includes the file name
1044 checkName = _FileImpl::GetFileName(destFilePath);
1045 SysTryReturn(NID_CNT, !checkName.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG,
1046 "[E_INVALID_ARG] Failed to get the file name from a path.");
1048 // 2nd: parent directory
1049 lengthString = destFilePath.String::GetLength();
1050 r = destFilePath.String::LastIndexOf('/', lengthString - 1, copySize);
1051 SysTryReturn(NID_CNT, copySize > 0 && copySize < maxSize, r = E_INVALID_ARG, E_INVALID_ARG,
1052 "[E_INVALID_ARG] Failed to get the size of path.");
1054 // copy the parent path
1055 r = destFilePath.SubString(0, copySize + 1, checkPath);
1056 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
1057 "[E_INVALID_ARG] Failed to perform SubString operation.");
1059 if (!_AppInfo::IsOspCompat())
1061 SysTryReturn(NID_CNT, destFilePath.String::StartsWith(Environment::GetMediaPath(), 0) ||
1062 destFilePath.String::StartsWith(Environment::GetExternalStoragePath(), 0) ||
1063 _FileImpl::IsAppPath(destFilePath) == true,
1064 r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The path is invalid media path.");
1066 if (!(_FileImpl::IsFileExist(checkPath)))
1068 r = dir.Create(checkPath);
1069 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
1070 "[E_INVALID_ARG] Failed to create the directory.");
1074 // check the validation of the parent path
1075 r = _FileImpl::GetAttributes(checkPath, fileAttr);
1076 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG,
1077 "[E_INVALID_ARG] Failed to perform GetAttributes operation.");
1078 SysTryReturn(NID_CNT, fileAttr.IsDirectory() == true, r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1079 "[E_ILLEGAL_ACCESS] The path is not a directory path.");
1086 _ContentTransferImpl::CheckDownloadStatus(const Uri& uri, const String& destPath)
1089 std::unique_ptr<IEnumerator> pEnum;
1090 ContentTransferInfo* pTransferInfoTemp = null;
1091 ContentTransferStatus statusTemp = CONTENT_TRANSFER_STATUS_NONE;
1092 result r = E_SUCCESS;
1094 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
1095 SysTryReturn(NID_CNT, pEnum != null, r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1096 "[%s] Failed to perform GetEnumeratorN operation.", GetErrorMessage(r));
1098 while (pEnum->MoveNext() == E_SUCCESS)
1100 pTransferInfoTemp = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
1101 SysTryReturn(NID_CNT, pTransferInfoTemp != null, r = E_INVALID_STATE, E_INVALID_STATE,
1102 "[E_INVALID_STATE] ContentTransferInfo instance must not be null.");
1104 statusTemp = pTransferInfoTemp->GetContentTransferStatus();
1106 if (statusTemp == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY ||
1107 statusTemp == CONTENT_TRANSFER_STATUS_DOWNLOADING)
1109 if (destPath.CompareTo(pTransferInfoTemp->GetDestPath()) == 0)
1111 if (uri.CompareTo(pTransferInfoTemp->GetUri()) == 0)
1113 SysLogException(NID_CNT, E_IN_PROGRESS, "[E_IN_PROGRESS] Transfer is in progress.");
1114 return E_IN_PROGRESS;
1118 SysLogException(NID_CNT, E_ILLEGAL_ACCESS, "[E_ILLEGAL_ACCESS] Access to source is illegal access.");
1119 return E_ILLEGAL_ACCESS;
1129 _ContentTransferImpl::AddTransferItem(const Uri& uri, const String& destPath, const String& sourcePath, int sourceFileSize,
1130 ContentTransferStatus status, IContentTransferListener* pListener, int sec, bool isBuffer, RequestId& requestId)
1133 result r = E_SUCCESS;
1134 std::unique_ptr<IEnumerator> pEnum;
1135 std::unique_ptr<ContentTransferInfo> pTransferInfo;
1136 ContentTransferInfo* pTransferInfoTemp = null;
1137 ContentTransferStatus statusTemp = CONTENT_TRANSFER_STATUS_NONE;
1138 requestId = INVALID_REQUEST_ID;
1140 SysAssertf(__pTransferInfoList != null, "Not yet constructed. Construct() should be called before use.");
1142 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
1143 SysTryReturn(NID_CNT, pEnum != null, r = E_ILLEGAL_ACCESS, E_ILLEGAL_ACCESS,
1144 "[E_ILLEGAL_ACCESS] Failed to perform GetEnumeratorN operation.");
1146 while (pEnum->MoveNext() == E_SUCCESS)
1148 pTransferInfoTemp = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
1149 SysTryReturn(NID_CNT, pTransferInfoTemp != null, r = E_INVALID_ARG, E_INVALID_ARG,
1150 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
1152 statusTemp = pTransferInfoTemp->GetContentTransferStatus();
1154 if (statusTemp == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY || statusTemp == CONTENT_TRANSFER_STATUS_DOWNLOADING)
1156 if (destPath.CompareTo(pTransferInfoTemp->GetDestPath()) == 0)
1158 if (uri.CompareTo(pTransferInfoTemp->GetUri()) == 0)
1160 SysLogException(NID_CNT, E_IN_PROGRESS, "[E_IN_PROGRESS] The request is already in progress.");
1161 return E_IN_PROGRESS;
1165 SysLogException(NID_CNT, E_ILLEGAL_ACCESS,
1166 "[E_ILLEGAL_ACCESS] The destination path [%ls] is already in progress.", destPath.GetPointer());
1167 return E_ILLEGAL_ACCESS;
1173 pTransferInfo = std::unique_ptr<ContentTransferInfo>(new (std::nothrow) ContentTransferInfo);
1174 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
1175 "[E_OUT_OF_MEMORY] Failed to construct ContentTransferInfo.");
1177 requestId = GetRequestId();
1179 pTransferInfo->SetAllInfo(requestId, uri, destPath, sourcePath, sourceFileSize, status);
1183 pTransferInfo->SetListener(pListener);
1189 pTransferInfo->SetTimeout(sec);
1194 pTransferInfo->SetTimeout(0);
1197 if (__percent > 0 && __percent <= 100)
1199 pTransferInfo->SetProgressInterval(__percent);
1203 pTransferInfo->SetProgressInterval(0);
1206 if (isBuffer == true)
1208 __isBuffer = isBuffer;
1209 pTransferInfo->SetIsBuffer(true);
1212 r = __pTransferInfoList->Add(*(pTransferInfo.release()));
1213 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to add item to info list.");
1219 _ContentTransferImpl::AddTransferItem(const Uri& uri, const String& destPath, const String& sourcePath,
1220 ContentTransferStatus status, int timeout, int interval, bool isBuffer, RequestId& requestId)
1223 result r = E_SUCCESS;
1224 std::unique_ptr<ContentTransferInfo> pTransferInfo;
1225 requestId = INVALID_REQUEST_ID;
1227 r = CheckDownloadStatus(uri, destPath);
1228 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to perform CheckDownloadStatus operation.", GetErrorMessage(r));
1230 // pTransferInfo will be deallocated in the Response routine
1231 pTransferInfo = std::unique_ptr<ContentTransferInfo>(new (std::nothrow) ContentTransferInfo);
1232 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
1233 "[%s] Failed to construct ContentTransferInfo.", GetErrorMessage(r));
1235 requestId = GetRequestId();
1237 pTransferInfo->SetAllInfo(requestId, uri, destPath, sourcePath, 0, status);
1241 __timeout = timeout;
1242 pTransferInfo->SetTimeout(timeout);
1247 pTransferInfo->SetTimeout(0);
1250 if (interval > 0 && interval <= 100)
1252 __percent = interval;
1253 pTransferInfo->SetProgressInterval(interval);
1258 pTransferInfo->SetProgressInterval(0);
1261 if (isBuffer == true)
1263 __isBuffer = isBuffer;
1264 pTransferInfo->SetIsBuffer(true);
1267 r = __pTransferInfoList->Add(*(pTransferInfo.release()));
1268 SysTryReturn(NID_CNT, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to add item to info list.");
1274 _ContentTransferImpl::SetDownloadSlotInfo(ContentTransferInfo* pTransferInfo, int& slot)
1277 result r = E_SUCCESS;
1278 String destPath(L"");
1280 SysAssertf(__pContentDownloadHandler != null, "Not yet constructed. Construct() should be called before use.");
1282 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_ARG, E_INVALID_ARG,
1283 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
1285 destPath = pTransferInfo->GetDestPath();
1287 r = GetEmptySlot(slot);
1288 SysLog(NID_CNT, "Set the download slot [%d].", slot);
1289 SysTryReturn(NID_CNT, !IsFailed(r) && slot != -1, r = E_INVALID_ARG, E_INVALID_ARG,
1290 "[E_INVALID_ARG] Failed to get the empty slot.");
1292 SetUsedSlotInternal(slot);
1294 (__pContentDownloadHandlerSequence.get())[slot].SetSlot(slot);
1295 (__pContentDownloadHandlerSequence.get())[slot].SetRequestId(pTransferInfo->GetRequestId());
1296 (__pContentDownloadHandlerSequence.get())[slot].SetTimeout(pTransferInfo->GetTimeout());
1297 (__pContentDownloadHandlerSequence.get())[slot].SetProgressIntervalByPercent(pTransferInfo->GetProgressInterval());
1298 (__pContentDownloadHandlerSequence.get())[slot].SetDownloadPath(destPath);
1300 (__pContentDownloadUserDataSequence.get())[slot].SetSlot(slot);
1301 (__pContentDownloadUserDataSequence.get())[slot].SetContentTransferInfo(pTransferInfo);
1302 (__pContentDownloadUserDataSequence.get())[slot].SetRequestId(pTransferInfo->GetRequestId());
1303 (__pContentDownloadUserDataSequence.get())[slot].SetPercent(pTransferInfo->GetProgressInterval());
1304 (__pContentDownloadUserDataSequence.get())[slot].SetContentTransferEvent(__pTransferEvent.get());
1305 (__pContentDownloadUserDataSequence.get())[slot].SetDestPath(destPath);
1307 if (__isBuffer == true)
1309 (__pContentDownloadUserDataSequence.get())[slot].SetDownloadBufferFlag(true);
1312 pTransferInfo->SetSlotId(slot);
1318 _ContentTransferImpl::RequestErrorEvent(result requestErrorCode, ContentTransferInfo* pTransferInfo)
1321 result r = E_SUCCESS;
1322 std::unique_ptr<_ContentTransferEventArg> pTransferEventArg;
1324 pTransferEventArg = std::unique_ptr<_ContentTransferEventArg>(new (std::nothrow) _ContentTransferEventArg);
1325 SysTryReturn(NID_CNT, pTransferEventArg != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
1326 "[E_OUT_OF_MEMORY] Failed to construct ContentTransferEventArg.");
1328 pTransferEventArg->SetResult(requestErrorCode);
1330 if (pTransferInfo->GetIsBuffer() == true)
1332 pTransferEventArg->SetEventType(Content::CONTENT_TRANSFER_EVENT_DOWNLOAD_TO_BUFFER_COMPLETED);
1337 pTransferEventArg->SetEventType(Content::CONTENT_TRANSFER_EVENT_DOWNLOAD_COMPLETED);
1340 pTransferEventArg->SetRequestId(pTransferInfo->GetRequestId());
1342 r = __pTransferEvent->Fire(*(pTransferEventArg.release()));
1343 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to perform fire operation on ContentTransferEvent.", GetErrorMessage(r));
1345 pTransferInfo->SetDownloadStatus(CONTENT_TRANSFER_STATUS_DOWNLOAD_COMPLETED);
1351 _ContentTransferImpl::RemoveCompletedTransferInfo(ArrayList* pTransferInfoList)
1354 std::unique_ptr<IEnumerator> pEnum;
1355 ContentTransferInfo* pTransferInfo = null;
1356 result r = E_SUCCESS;
1358 if (pTransferInfoList == null)
1363 pEnum = std::unique_ptr<IEnumerator>(pTransferInfoList->GetEnumeratorN());
1364 SysTryReturn(NID_CNT, pEnum != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
1365 "[E_OUT_OF_MEMORY] Failed to perform GetEnumeratorN operation.");
1367 while (pEnum->MoveNext() == E_SUCCESS)
1369 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
1370 SysTryReturn(NID_CNT, pTransferInfo != null, r = E_INVALID_ARG, r,
1371 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
1373 __pTransferInfoList->Remove(*pTransferInfo, true);
1374 r = GetLastResult();
1375 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] Failed to remove a item from transfer info list.", GetErrorMessage(r));
1382 _ContentTransferImpl::ContentTransferHandler(void)
1385 result r = E_SUCCESS;
1386 std::unique_ptr<IEnumerator> pEnum;
1387 std::unique_ptr<ArrayList> pDeleteList;
1388 ContentTransferInfo* pTransferInfo = null;
1389 ContentTransferStatus status = CONTENT_TRANSFER_STATUS_NONE;
1390 int downloadCount = 0;
1391 RequestId restRequestId = INVALID_REQUEST_ID;
1396 String destPath(L"");
1397 String sourcePath(L"");
1399 pEnum = std::unique_ptr<IEnumerator>(__pTransferInfoList->GetEnumeratorN());
1405 while (pEnum->MoveNext() == E_SUCCESS)
1407 pTransferInfo = dynamic_cast<ContentTransferInfo*>(pEnum->GetCurrent());
1408 SysTryReturn(NID_CNT, pTransferInfo != null, check, E_INVALID_ARG,
1409 "[E_INVALID_ARG] ContentTransferInfo instance must not be null.");
1411 status = pTransferInfo->GetContentTransferStatus();
1413 if (status == CONTENT_TRANSFER_STATUS_DOWNLOADING)
1416 if (downloadCount == MAX_DOWNLOAD_COUNT)
1426 else if (status == CONTENT_TRANSFER_STATUS_DOWNLOAD_READY)
1431 r = GetLastResult();
1432 SysTryReturn(NID_CNT, !IsFailed(r), check, r, "[%s] Failed to perform StartTimer operation.", GetErrorMessage(r));
1438 // get empty buffer slot from download buffer
1439 // set slot information
1440 r = SetDownloadSlotInfo(pTransferInfo, slot);
1443 SysLogException(NID_CNT, r, "[%s] Failed to find an empty slot.", GetErrorMessage(r));
1450 SysLogException(NID_CNT, r, "[%s] Propagating.", GetErrorMessage(r));
1454 destPath = pTransferInfo->GetDestPath();
1455 sourcePath = pTransferInfo->GetUri().ToString();
1456 (__pContentDownloadHandlerSequence.get())[slot].SetSlot(slot);
1459 restRequestId = (__pContentDownloadHandlerSequence.get())[slot].HttpDownload(sourcePath,
1460 pTransferInfo->GetSourceFileSize(), destPath, &(__pContentDownloadUserDataSequence.get())[slot]);
1461 r = GetLastResult();
1462 SysTryLog(NID_CNT, restRequestId != INVALID_REQUEST_ID,
1463 "[%s] The rest request ID is invalid.", GetErrorMessage(r));
1467 r = RequestErrorEvent(r, pTransferInfo);
1468 SysTryReturn(NID_CNT, !IsFailed(r), check, E_INVALID_ARG,
1469 "[E_INVALID_ARG] Failed to perform RequestErrorEvent operation.");
1471 (__pContentDownloadUserDataSequence.get())[slot].SetSlotFlag(false);
1479 pTransferInfo->SetRestRequestId(restRequestId);
1480 pTransferInfo->SetDownloadStatus(CONTENT_TRANSFER_STATUS_DOWNLOADING);
1483 if (downloadCount == MAX_DOWNLOAD_COUNT)
1492 else if (status == CONTENT_TRANSFER_STATUS_DOWNLOAD_COMPLETED)
1494 SetEmptySlotInternal();
1496 // TODO : should i check to sync
1497 if (pDeleteList == null)
1499 pDeleteList = std::unique_ptr<ArrayList>(new (std::nothrow) ArrayList());
1500 SysTryReturn(NID_CNT, !IsFailed(r), check, E_OUT_OF_MEMORY,
1501 "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
1503 pDeleteList->Add(*pTransferInfo);
1508 r = RemoveCompletedTransferInfo(pDeleteList.get());
1509 SysTryReturn(NID_CNT, !IsFailed(r), check, E_INVALID_ARG,
1510 "[E_INVALID_ARG] Failed to remove the completed transfer info.");