#include <unique_ptr.h>
#include <FBaseSysLog.h>
#include <FIoFile.h>
+#include <FIoDirectory.h>
#include "FMedia_MediaUtil.h"
+#include "FBase_StringConverter.h"
using namespace Tizen::Base;
using namespace Tizen::Io;
{
File file;
result r = E_SUCCESS;
-
- String tmpPath = dstPath + L"_tmp";
+ String directoryName;
+ String fileName;
+ char* tempFileName = null;
+ std::unique_ptr<char[]> pDirectory;
+ std::unique_ptr<char[]> pFileName;
if (File::IsFileExist(dstPath) && overwrite == false)
{
return E_FILE_ALREADY_EXIST;
}
+ String tmpPath = File::GetFileName(dstPath);
+
+ r = dstPath.SubString(0, dstPath.GetLength() - tmpPath.GetLength() -1, directoryName);
+ SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagated. Faied to generate tempfile", GetErrorMessage(r));
+
+ r = dstPath.SubString(dstPath.GetLength() - tmpPath.GetLength(), fileName);
+ SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Propagated. Faied to generate tempfile", GetErrorMessage(r));
+
+ pDirectory.reset(_StringConverter::CopyToCharArrayN(directoryName));
+ SysTryReturn(NID_MEDIA, pDirectory.get() != null, r, r, "[E_OUT_OF_MEMORY] Propagated.");
+
+ pFileName.reset(_StringConverter::CopyToCharArrayN(fileName));
+ SysTryReturn(NID_MEDIA, pFileName.get() != null, r, r, "[E_OUT_OF_MEMORY] Propagated.");
+
+ r = Directory::Create(directoryName, true);
+ SysSecureTryReturn(NID_MEDIA, (r == E_SUCCESS || r == E_FILE_ALREADY_EXIST), r, r, "[%s] Propagated. Faied to create directory for %ls",
+ GetErrorMessage(r), directoryName.GetPointer());
+
+ tempFileName = tempnam(pDirectory.get(), pFileName.get());
+ SysTryReturn(NID_MEDIA, tempFileName != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Propagated. Faied to generate tempfile");
+
+ tmpPath = String(tempFileName);
+
r = file.Construct(tmpPath, "wb", true);
SysSecureTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagated. Temp File.Construct failed for %ls",
GetErrorMessage(r), tmpPath.GetPointer());
r = file.Move(tmpPath, dstPath);
SysSecureTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagated. File.Move failed for %ls",
GetErrorMessage(r), dstPath.GetPointer());
+
+ free(tempFileName);
return r;
CATCH:
+ if (tempFileName != null)
+ {
+ free(tempFileName);
+ }
file.Remove(tmpPath);
return r;
}