Fix : Extract the gps information according to a locale
[platform/framework/native/content.git] / src / FCnt_ContentManagerUtilImpl.cpp
index 15a44ca..3393c15 100755 (executable)
@@ -22,6 +22,7 @@
 
 #include <new>
 #include <stdlib.h>
+#include <aul/aul.h>
 #include <mime_type.h>
 #include <FAppApp.h>
 #include <FBaseByteBuffer.h>
@@ -47,7 +48,6 @@
 #include "FCnt_ImageMetadataImpl.h"
 #include "FCnt_VideoMetadataImpl.h"
 
-
 using namespace std;
 using namespace Tizen::App;
 using namespace Tizen::Base;
@@ -59,6 +59,7 @@ using namespace Tizen::System;
 
 namespace Tizen { namespace Content
 {
+
 // Types of content, format supported and default values
 static const int _IMAGE_BUFF_LENGTH = 100;
 static const int _THUMBNAIL_IMAGE_WIDTH = 80;
@@ -104,9 +105,14 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal)
        pMetadata->height = dim.height;
        pMetadata->contentPath = contentPath;
 
+       String tizenPath(L"");
+       String changedPath(L"");
+       r = ChangeMediaFilePath(contentPath, tizenPath, changedPath);
+       SysTryReturn(NID_CNT, r == E_SUCCESS, null, r, "[%s] Failed to perform ChangeMediaFilePath.", GetErrorMessage(r));
+
        if (imgType == IMG_FORMAT_JPG)
        {
-               unique_ptr<char[]> pFileName(_StringConverter::CopyToCharArrayN(contentPath));
+               unique_ptr<char[]> pFileName(_StringConverter::CopyToCharArrayN(tizenPath));
                SysTryReturn(NID_CNT, pFileName != null, null, E_OUT_OF_MEMORY,
                                "[E_OUT_OF_MEMORY] The memory is insufficient.");
 
@@ -122,6 +128,9 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal)
                        char latitudeRef = 0; // to store latitude reference (quadrasphere designation 'N', 'S', 'W' or 'E')
                        char longitudeRef = 0; // to store longitude reference (quadrasphere designation 'N', 'S', 'W' or 'E')
                        unsigned int entryCount = 0;
+                       bool isOrientation = false;
+                       bool isLatitude = false;
+                       bool isLongitude = false;
 
                        for (int i = 0; i < EXIF_IFD_COUNT; i++)
                        {
@@ -161,11 +170,13 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal)
                                                SysTryReturn(NID_CNT, pMetadata->pDateTime != null, null, E_OUT_OF_MEMORY,
                                                                "[E_OUT_OF_MEMORY] The memory is insufficient.");
                                        }
-                                       else if (tag == EXIF_TAG_ORIENTATION)
+                                       else if (tag == EXIF_TAG_ORIENTATION && !isOrientation)
                                        {
                                                //get the byte order(little endian or big endian) before extracting orientation type
                                                byteOrder = exif_data_get_byte_order(pEntries[j]->parent->parent);
                                                pMetadata->orientation = static_cast<ImageOrientationType>(exif_get_short(pEntries[j]->data, byteOrder));
+
+                                               isOrientation = true;
                                        }
                                        else if (tag == EXIF_TAG_SOFTWARE)
                                        {
@@ -177,11 +188,25 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal)
                                        {
                                                latitudeRef = buf[0]; // GPS Latitude reference value will be 'N'(NORTH) or 'S'(SOUTH)
                                        }
-                                       else if (tag == EXIF_TAG_GPS_LATITUDE)
+                                       else if (tag == EXIF_TAG_GPS_LATITUDE && !isLatitude)
                                        {
                                                String tempLatitude(buf);
-                                               String delim(L",");
+                                               int firstComma = 0;
+                                               int lastComma = 0;
+
+                                               r = tempLatitude.IndexOf(',', 0, firstComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform IndexOf operation.", GetErrorMessage(r));
+
+                                               r = tempLatitude.SetCharAt('/', firstComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform SetCharAt operation.", GetErrorMessage(r));
+
+                                               r = tempLatitude.LastIndexOf(',', tempLatitude.GetLength() - 1, lastComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform IndexOf operation.", GetErrorMessage(r));
+
+                                               r = tempLatitude.SetCharAt('/', lastComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform SetCharAt operation.", GetErrorMessage(r));
 
+                                               String delim(L"/");
                                                StringTokenizer strTok(tempLatitude, delim);
                                                String token[3] = {L"", };
 
@@ -191,15 +216,15 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal)
                                                        strTok.GetNextToken(token[count++]);
                                                }
 
-                                               double ddVal = _LocalizedNumParser::ToDouble(token[0], "C"); // degree value
+                                               double ddVal = _LocalizedNumParser::ToDouble(token[0], ""); // degree value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
-                                               double mmVal = _LocalizedNumParser::ToDouble(token[1], "C"); // minutes value
+                                               double mmVal = _LocalizedNumParser::ToDouble(token[1], ""); // minutes value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
-                                               double ssVal = _LocalizedNumParser::ToDouble(token[2], "C"); // seconds value
+                                               double ssVal = _LocalizedNumParser::ToDouble(token[2], ""); // seconds value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
@@ -210,16 +235,31 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal)
                                                {
                                                        pMetadata->latitude = (pMetadata->latitude * (double)(-1));
                                                }
+                                               isLatitude = true;
                                        }
                                        else if (tag == EXIF_TAG_GPS_LONGITUDE_REF)
                                        {
                                                longitudeRef = buf[0]; // GPS Longitude reference value will be 'W'(WEST) or 'E'(EAST)
                                        }
-                                       else if (tag == EXIF_TAG_GPS_LONGITUDE)
+                                       else if (tag == EXIF_TAG_GPS_LONGITUDE && !isLongitude)
                                        {
                                                String tempLongitude(buf);
-                                               String delim(L",");
+                                               int firstComma = 0;
+                                               int lastComma = 0;
 
+                                               r = tempLongitude.IndexOf(',', 0, firstComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform IndexOf operation.", GetErrorMessage(r));
+
+                                               r = tempLongitude.SetCharAt('/', firstComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform SetCharAt operation.", GetErrorMessage(r));
+
+                                               r = tempLongitude.LastIndexOf(',', tempLongitude.GetLength() - 1, lastComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform IndexOf operation.", GetErrorMessage(r));
+
+                                               r = tempLongitude.SetCharAt('/', lastComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform SetCharAt operation.", GetErrorMessage(r));
+
+                                               String delim(L"/");
                                                StringTokenizer strTok(tempLongitude, delim);
                                                String token[3] = {L"", };
 
@@ -229,15 +269,15 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal)
                                                        strTok.GetNextToken(token[count++]);
                                                }
 
-                                               double ddVal = _LocalizedNumParser::ToDouble(token[0], "C"); // degree value
+                                               double ddVal = _LocalizedNumParser::ToDouble(token[0], ""); // degree value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
-                                               double mmVal = _LocalizedNumParser::ToDouble(token[1], "C"); // minutes value
+                                               double mmVal = _LocalizedNumParser::ToDouble(token[1], ""); // minutes value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
-                                               double ssVal = _LocalizedNumParser::ToDouble(token[2], "C"); // seconds value
+                                               double ssVal = _LocalizedNumParser::ToDouble(token[2], ""); // seconds value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
@@ -248,6 +288,7 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal)
                                                {
                                                        pMetadata->longitude = (pMetadata->longitude * (double)(-1));
                                                }
+                                               isLongitude = true;
                                        }
                                        else if (tag == EXIF_TAG_WHITE_BALANCE)
                                        {
@@ -288,11 +329,16 @@ _ContentManagerUtilImpl::GetAudioMetaN(const String& contentPath)
 
        pMetadata->contentPath = contentPath;
 
+       String tizenPath(L"");
+       String changedPath(L"");
+       result r = ChangeMediaFilePath(contentPath, tizenPath, changedPath);
+       SysTryReturn(NID_CNT, r == E_SUCCESS, null, r, "[%s] Failed to perform ChangeMediaFilePath.", GetErrorMessage(r));
+
        // Create the metadata extractor handle
        metadata_extractor_h tempExtractor = NULL;
 
        int retVal = metadata_extractor_create(&tempExtractor);
-       result r = ErrorMapToRetVal(retVal);
+       r = ErrorMapToRetVal(retVal);
        SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
                        "[%s] metadata_extractor_create failed.", GetErrorMessage(r));
 
@@ -301,7 +347,7 @@ _ContentManagerUtilImpl::GetAudioMetaN(const String& contentPath)
                        "[E_OUT_OF_MEMORY] The memory is insufficient.");
 
        // Set file path of content to extract the metadata
-       unique_ptr<char[]> pFileName(_StringConverter::CopyToCharArrayN(contentPath));
+       unique_ptr<char[]> pFileName(_StringConverter::CopyToCharArrayN(tizenPath));
        SysTryReturn(NID_CNT, pFileName != null, null, E_OUT_OF_MEMORY,
                        "[E_OUT_OF_MEMORY] The memory is insufficient.");
 
@@ -630,11 +676,16 @@ _ContentManagerUtilImpl::GetVideoMetaN(const String& contentPath)
 
        pMetadata->contentPath = contentPath;
 
+       String tizenPath(L"");
+       String changedPath(L"");
+       result r = ChangeMediaFilePath(contentPath, tizenPath, changedPath);
+       SysTryReturn(NID_CNT, r == E_SUCCESS, null, r, "[%s] Failed to perform ChangeMediaFilePath.", GetErrorMessage(r));
+
        // Create the metadata extractor handle
        metadata_extractor_h tempExtractor = NULL;
 
        int retVal = metadata_extractor_create(&tempExtractor);
-       result r = ErrorMapToRetVal(retVal);
+       r = ErrorMapToRetVal(retVal);
        SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
                        "[%s] metadata_extractor_create failed.", GetErrorMessage(r));
 
@@ -643,7 +694,7 @@ _ContentManagerUtilImpl::GetVideoMetaN(const String& contentPath)
                                "[E_OUT_OF_MEMORY] The memory insufficient.");
 
        // Set file path of content to extract the metadata
-       unique_ptr<char[]> pFileName(_StringConverter::CopyToCharArrayN(contentPath));
+       unique_ptr<char[]> pFileName(_StringConverter::CopyToCharArrayN(tizenPath));
        SysTryReturn(NID_CNT, pFileName != null, null, E_OUT_OF_MEMORY,
                        "[E_OUT_OF_MEMORY] The memory is insufficient.");
 
@@ -860,6 +911,9 @@ _ContentManagerUtilImpl::GetImageMetaN(const ByteBuffer& byteBuffer)
        ImageFormat imgType = IMG_FORMAT_NONE;
        int imageWidth = 0;
        int imageHeight = 0;
+       bool isOrientation = false;
+       bool isLatitude = false;
+       bool isLongitude = false;
 
        result r = ImageBuffer::GetImageInfo(byteBuffer, imgType, imageWidth, imageHeight);
        SysTryReturn(NID_CNT, r == E_SUCCESS, null, E_INVALID_ARG,
@@ -923,11 +977,13 @@ _ContentManagerUtilImpl::GetImageMetaN(const ByteBuffer& byteBuffer)
                                                SysTryReturn(NID_CNT, pMetadata->pDateTime != null, null, E_OUT_OF_MEMORY,
                                                                "[E_OUT_OF_MEMORY] The memory is insufficient.");
                                        }
-                                       else if (tag == EXIF_TAG_ORIENTATION)
+                                       else if (tag == EXIF_TAG_ORIENTATION && !isOrientation)
                                        {
                                                //get the byte order(little endian or big endian) before extracting orientation type
                                                byteOrder = exif_data_get_byte_order(pEntries[j]->parent->parent);
                                                pMetadata->orientation = static_cast<ImageOrientationType>(exif_get_short(pEntries[j]->data, byteOrder));
+
+                                               isOrientation = true;
                                        }
                                        else if (tag == EXIF_TAG_SOFTWARE)
                                        {
@@ -939,11 +995,25 @@ _ContentManagerUtilImpl::GetImageMetaN(const ByteBuffer& byteBuffer)
                                        {
                                                latitudeRef = buf[0]; // GPS Latitude reference value will be 'N'(NORTH) or 'S'(SOUTH)
                                        }
-                                       else if (tag == EXIF_TAG_GPS_LATITUDE)
+                                       else if (tag == EXIF_TAG_GPS_LATITUDE && !isLatitude)
                                        {
                                                String tempLatitude(buf);
-                                               String delim(L",");
+                                               int firstComma = 0;
+                                               int lastComma = 0;
+
+                                               r = tempLatitude.IndexOf(',', 0, firstComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform IndexOf operation.", GetErrorMessage(r));
 
+                                               r = tempLatitude.SetCharAt('/', firstComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform SetCharAt operation.", GetErrorMessage(r));
+
+                                               r = tempLatitude.LastIndexOf(',', tempLatitude.GetLength() - 1, lastComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform IndexOf operation.", GetErrorMessage(r));
+
+                                               r = tempLatitude.SetCharAt('/', lastComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform SetCharAt operation.", GetErrorMessage(r));
+
+                                               String delim(L"/");
                                                StringTokenizer strTok(tempLatitude, delim);
                                                String token[3] = {L"", };
 
@@ -953,15 +1023,15 @@ _ContentManagerUtilImpl::GetImageMetaN(const ByteBuffer& byteBuffer)
                                                        strTok.GetNextToken(token[count++]);
                                                }
 
-                                               double ddVal = _LocalizedNumParser::ToDouble(token[0], "C"); // degree value
+                                               double ddVal = _LocalizedNumParser::ToDouble(token[0], ""); // degree value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
-                                               double mmVal = _LocalizedNumParser::ToDouble(token[1], "C"); // minutes value
+                                               double mmVal = _LocalizedNumParser::ToDouble(token[1], ""); // minutes value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
-                                               double ssVal = _LocalizedNumParser::ToDouble(token[2], "C"); // seconds value
+                                               double ssVal = _LocalizedNumParser::ToDouble(token[2], ""); // seconds value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
@@ -972,16 +1042,31 @@ _ContentManagerUtilImpl::GetImageMetaN(const ByteBuffer& byteBuffer)
                                                {
                                                        pMetadata->latitude = (pMetadata->latitude * (double)(-1));
                                                }
+                                               isLatitude = true;
                                        }
                                        else if (tag == EXIF_TAG_GPS_LONGITUDE_REF)
                                        {
                                                longitudeRef = buf[0]; // GPS Longitude reference value will be 'W'(WEST) or 'E'(EAST)
                                        }
-                                       else if (tag == EXIF_TAG_GPS_LONGITUDE)
+                                       else if (tag == EXIF_TAG_GPS_LONGITUDE && !isLongitude)
                                        {
                                                String tempLongitude(buf);
-                                               String delim(L",");
+                                               int firstComma = 0;
+                                               int lastComma = 0;
+
+                                               r = tempLongitude.IndexOf(',', 0, firstComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform IndexOf operation.", GetErrorMessage(r));
 
+                                               r = tempLongitude.SetCharAt('/', firstComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform SetCharAt operation.", GetErrorMessage(r));
+
+                                               r = tempLongitude.LastIndexOf(',', tempLongitude.GetLength() - 1, lastComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform IndexOf operation.", GetErrorMessage(r));
+
+                                               r = tempLongitude.SetCharAt('/', lastComma);
+                                               SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[%s] Failed to perform SetCharAt operation.", GetErrorMessage(r));
+
+                                               String delim(L"/");
                                                StringTokenizer strTok(tempLongitude, delim);
                                                String token[3] = {L"", };
 
@@ -991,15 +1076,15 @@ _ContentManagerUtilImpl::GetImageMetaN(const ByteBuffer& byteBuffer)
                                                        strTok.GetNextToken(token[count++]);
                                                }
 
-                                               double ddVal = _LocalizedNumParser::ToDouble(token[0], "C"); // degree value
+                                               double ddVal = _LocalizedNumParser::ToDouble(token[0], ""); // degree value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
-                                               double mmVal = _LocalizedNumParser::ToDouble(token[1], "C"); // minutes value
+                                               double mmVal = _LocalizedNumParser::ToDouble(token[1], ""); // minutes value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
-                                               double ssVal = _LocalizedNumParser::ToDouble(token[2], "C"); // seconds value
+                                               double ssVal = _LocalizedNumParser::ToDouble(token[2], ""); // seconds value
                                                r = GetLastResult();
                                                SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[E_INVALID_ARG] Failed to perform ToDouble operation.");
 
@@ -1010,6 +1095,7 @@ _ContentManagerUtilImpl::GetImageMetaN(const ByteBuffer& byteBuffer)
                                                {
                                                        pMetadata->longitude = (pMetadata->longitude * (double)(-1));
                                                }
+                                               isLongitude = true;
                                        }
                                        else if (tag == EXIF_TAG_WHITE_BALANCE)
                                        {
@@ -1589,38 +1675,68 @@ _ContentManagerUtilImpl::CheckContentType(const String& contentPath, bool intern
        ClearLastResult();
 
        ContentType contentType = CONTENT_TYPE_UNKNOWN;
+       String mimeType(L"");
 
        if (!internal)
        {
                SysTryReturn(NID_CNT, VerifyFilePathCompatibility(contentPath), contentType, E_INVALID_ARG,
                                "[E_INVALID_ARG] The path is not compatible.");
        }
-       SysTryReturn(NID_CNT, contentPath.GetLength() != 0, contentType, E_INVALID_ARG,
+
+       String tizenPath(L"");
+       String changedPath(L"");
+       result r = ChangeMediaFilePath(contentPath, tizenPath, changedPath);
+       SysTryReturn(NID_CNT, !IsFailed(r), contentType, r, "[%s] Failed to perform ChangeMediaFilePathCompat.", GetErrorMessage(r));
+
+       SysTryReturn(NID_CNT, changedPath.GetLength() != 0, contentType, E_INVALID_ARG,
                        "[E_INVALID_ARG] The length of contentPath is 0.");
-       SysTryReturn(NID_CNT, _FileImpl::IsFileExist(contentPath), contentType, E_FILE_NOT_FOUND,
+       SysTryReturn(NID_CNT, _FileImpl::IsFileExist(changedPath), contentType, E_FILE_NOT_FOUND,
                        "[E_FILE_NOT_FOUND] The file corresponding to contentPath could not be found.");
 
-       String fileExt = _FileImpl::GetFileExtension(contentPath);
-       result r = GetLastResult();
-       SysTryReturn(NID_CNT, !IsFailed(r), contentType, r, "[%s] GetFileExtension failed.", GetErrorMessage(r));
+       String fileExt = _FileImpl::GetFileExtension(changedPath);
+       r = GetLastResult();
 
-       unique_ptr<char[]> pFormat(_StringConverter::CopyToCharArrayN(fileExt));
-       SysTryReturn(NID_CNT, pFormat != null, contentType, E_OUT_OF_MEMORY,
-                       "[E_OUT_OF_MEMORY] The memory is insufficient.");
+       if (!IsFailed(r))
+       {
+               unique_ptr<char[]> pFormat(_StringConverter::CopyToCharArrayN(fileExt));
+               SysTryReturn(NID_CNT, pFormat != null, contentType, E_OUT_OF_MEMORY,
+                               "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+               char* pTempMimeType = null;
+               int retVal = mime_type_get_mime_type(pFormat.get(), &pTempMimeType);
+               SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, contentType, E_INVALID_ARG,
+                               "[E_INVALID_ARG] mime_type_get_mime_type failed.");
+               SysTryReturn(NID_CNT, pTempMimeType != null, contentType, E_INVALID_ARG,
+                               "[E_INVALID_ARG] mime_type_get_mime_type failed.");
+
+               unique_ptr<char, CharDeleter> pMimeType;
+               pMimeType.reset(pTempMimeType);
+
+               SysLog(NID_CNT, "The MIME type for %ls is %s", fileExt.GetPointer(), pTempMimeType);
+
+               r = mimeType.Append(pMimeType.get());
+               SysTryReturn(NID_CNT, !IsFailed(r), contentType, E_OUT_OF_MEMORY,
+                               "[E_OUT_OF_MEMORY] Failed to perform Append operation.");
+       }
+       else
+       {
+               ClearLastResult();
 
-       char* pTempMimeType = null;
-       int retVal = mime_type_get_mime_type(pFormat.get(), &pTempMimeType);
-       SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, contentType, E_INVALID_ARG,
-                       "[E_INVALID_ARG] mime_type_get_mime_type failed.");
-       SysTryReturn(NID_CNT, pTempMimeType != null, contentType, E_INVALID_ARG,
-                       "[E_INVALID_ARG] mime_type_get_mime_type failed.");
+               SysLog(NID_CNT, "[%s] Failed to perform GetFileExtension operation.", GetErrorMessage(r));
 
-       unique_ptr<char, CharDeleter> pMimeType;
-       pMimeType.reset(pTempMimeType);
+               unique_ptr<char[]> pTempPath(_StringConverter::CopyToCharArrayN(tizenPath));
+               SysTryReturn(NID_CNT, pTempPath != null, contentType, E_OUT_OF_MEMORY,
+                               "[E_OUT_OF_MEMORY] The memory is insufficient.");
 
-       SysLog(NID_CNT, "The MIME type for %ls is %s", fileExt.GetPointer(), pTempMimeType);
+               char tempType[255] = {0, };
+               int ret = aul_get_mime_from_file(pTempPath.get(), tempType, sizeof(tempType));
+               SysTryReturn(NID_CNT, ret == AUL_R_OK, contentType, E_INVALID_ARG,
+                               "[E_INVALID_ARG] Failed to perform aul_get_mime_from_file operation.");
 
-       String mimeType(pMimeType.get());
+               r = mimeType.Append(tempType);
+               SysTryReturn(NID_CNT, !IsFailed(r), contentType, E_OUT_OF_MEMORY,
+                               "[E_OUT_OF_MEMORY] Failed to perform Append operation.");
+       }
 
        if (mimeType.Contains(L"image"))
        {
@@ -1637,12 +1753,9 @@ _ContentManagerUtilImpl::CheckContentType(const String& contentPath, bool intern
        }
        else if (mimeType.Contains(L"video"))
        {
-               String format;
-               fileExt.ToLowerCase(format);
-
-               if (format == L"3gp" || format == L"mp4")
+               if (mimeType == L"video/3gpp" || mimeType == L"video/mp4")
                {
-                       return CheckStream(contentPath);
+                       return CheckStream(tizenPath);
                }
                return CONTENT_TYPE_VIDEO;
        }
@@ -1700,8 +1813,9 @@ _ContentManagerUtilImpl::CheckStream(const String& contentPath)
        }
        else
        {
+               // The return value is CONTENT_TYPE_VIDEO because CreaetContent have to success, even if the content is invalid.
                r = ErrorMapToRetVal(retVal);
-               SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, contentType, r,
+               SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, CONTENT_TYPE_VIDEO, r,
                                "[%s] metadata_extractor_get_metadata failed.", GetErrorMessage(r));
        }
 
@@ -1712,8 +1826,9 @@ _ContentManagerUtilImpl::CheckStream(const String& contentPath)
        }
        else
        {
+               // The return value is CONTENT_TYPE_VIDEO because CreaetContent have to success, even if the content is invalid.
                r = ErrorMapToRetVal(retVal);
-               SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, contentType, r,
+               SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, CONTENT_TYPE_VIDEO, r,
                                "[%s] metadata_extractor_get_metadata failed.", GetErrorMessage(r));
        }
 
@@ -1840,4 +1955,42 @@ _ContentManagerUtilImpl::MoveToMediaDirectory(const String& srcContentPath, cons
 
        return r;
 }
+
+result
+_ContentManagerUtilImpl::ChangeMediaFilePath(const String& contentPath, String& tizenPath, String& changedPath)
+{
+       result r = E_SUCCESS;
+
+       tizenPath = contentPath;
+       changedPath = contentPath;
+
+       // If the api version is 2.0, the content path has to be changed.
+       if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
+       {
+               if ((contentPath.StartsWith(Environment::GetMediaPath(), 0)) || (contentPath.StartsWith(Environment::GetExternalStoragePath(), 0)))
+               {
+                       tizenPath = contentPath;
+
+                       r = _FileImpl::ConvertPhysicalToVirtualPath(contentPath, changedPath);
+                       SysTryReturnResult(NID_CNT, !IsFailed(r), E_INVALID_ARG,
+                                       "[%s] Failed to convert physical path to virtual path.", GetErrorMessage(E_INVALID_ARG));
+               }
+               else if ((contentPath.StartsWith(OSP_MEDIA_PHONE, 0)) || (contentPath.StartsWith(OSP_MEDIA_MMC, 0)) || (contentPath.StartsWith(OSP_HOME, 0)))
+               {
+                       changedPath = contentPath;
+
+                       r = _FileImpl::ConvertVirtualToPhysicalPath(contentPath, tizenPath);
+                       SysTryReturnResult(NID_CNT, !IsFailed(r), E_INVALID_ARG,
+                                       "[%s] Failed to convert virtual path to physical path.", GetErrorMessage(E_INVALID_ARG));
+               }
+               else
+               {
+                       SysLogException(NID_CNT, E_INVALID_ARG, "[%s] The path is not supported.", GetErrorMessage(E_INVALID_ARG));
+                       return E_INVALID_ARG;
+               }
+       }
+
+       return r;
+}
+
 }}