X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2FFCnt_ContentManagerUtilImpl.cpp;h=0b82aa000adf8df9436fb2dd48689b811315f62c;hb=29a8a27e446d54bcf1689ee188d996541f2d713b;hp=10d08e4d9a6a4c59b7ee6bd8249c99e4fd83c8bf;hpb=d8e4ac6482899cd5ee602303b1a565e231bea257;p=platform%2Fframework%2Fnative%2Fcontent.git diff --git a/src/FCnt_ContentManagerUtilImpl.cpp b/src/FCnt_ContentManagerUtilImpl.cpp index 10d08e4..0b82aa0 100755 --- a/src/FCnt_ContentManagerUtilImpl.cpp +++ b/src/FCnt_ContentManagerUtilImpl.cpp @@ -66,6 +66,7 @@ static const int _THUMBNAIL_IMAGE_WIDTH = 80; static const int _THUMBNAIL_IMAGE_HEIGHT = 60; static const int _MINUTES = 60; static const int _SECONDS = 3600; +static const double DEFAULT_COORDINATE = -200.0; ImageMetadata* _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal) @@ -105,9 +106,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 pFileName(_StringConverter::CopyToCharArrayN(contentPath)); + unique_ptr pFileName(_StringConverter::CopyToCharArrayN(tizenPath)); SysTryReturn(NID_CNT, pFileName != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); @@ -124,6 +130,8 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal) 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++) { @@ -181,11 +189,32 @@ _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","); + if (!tempLatitude.Contains(L",")) + { + pMetadata->latitude = DEFAULT_COORDINATE; + isLatitude = true; + continue; + } + + 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"", }; @@ -195,15 +224,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."); @@ -214,16 +243,38 @@ _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","); + if (!tempLongitude.Contains(L",")) + { + pMetadata->longitude = DEFAULT_COORDINATE; + isLongitude = true; + continue; + } + + 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"", }; @@ -233,15 +284,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."); @@ -252,6 +303,7 @@ _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal) { pMetadata->longitude = (pMetadata->longitude * (double)(-1)); } + isLongitude = true; } else if (tag == EXIF_TAG_WHITE_BALANCE) { @@ -292,11 +344,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)); @@ -305,7 +362,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 pFileName(_StringConverter::CopyToCharArrayN(contentPath)); + unique_ptr pFileName(_StringConverter::CopyToCharArrayN(tizenPath)); SysTryReturn(NID_CNT, pFileName != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); @@ -634,11 +691,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)); @@ -647,7 +709,7 @@ _ContentManagerUtilImpl::GetVideoMetaN(const String& contentPath) "[E_OUT_OF_MEMORY] The memory insufficient."); // Set file path of content to extract the metadata - unique_ptr pFileName(_StringConverter::CopyToCharArrayN(contentPath)); + unique_ptr pFileName(_StringConverter::CopyToCharArrayN(tizenPath)); SysTryReturn(NID_CNT, pFileName != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); @@ -864,6 +926,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, @@ -927,11 +992,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(exif_get_short(pEntries[j]->data, byteOrder)); + + isOrientation = true; } else if (tag == EXIF_TAG_SOFTWARE) { @@ -943,11 +1010,32 @@ _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","); + if (!tempLatitude.Contains(L",")) + { + pMetadata->latitude = DEFAULT_COORDINATE; + isLatitude = true; + continue; + } + + 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"", }; @@ -957,15 +1045,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."); @@ -976,16 +1064,38 @@ _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","); + if (!tempLongitude.Contains(L",")) + { + pMetadata->longitude = DEFAULT_COORDINATE; + isLongitude = true; + continue; + } + + 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"", }; @@ -995,15 +1105,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."); @@ -1014,6 +1124,7 @@ _ContentManagerUtilImpl::GetImageMetaN(const ByteBuffer& byteBuffer) { pMetadata->longitude = (pMetadata->longitude * (double)(-1)); } + isLongitude = true; } else if (tag == EXIF_TAG_WHITE_BALANCE) { @@ -1600,13 +1711,19 @@ _ContentManagerUtilImpl::CheckContentType(const String& contentPath, bool intern 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(); + String fileExt = _FileImpl::GetFileExtension(changedPath); + r = GetLastResult(); if (!IsFailed(r)) { @@ -1636,7 +1753,7 @@ _ContentManagerUtilImpl::CheckContentType(const String& contentPath, bool intern SysLog(NID_CNT, "[%s] Failed to perform GetFileExtension operation.", GetErrorMessage(r)); - unique_ptr pTempPath(_StringConverter::CopyToCharArrayN(contentPath)); + unique_ptr pTempPath(_StringConverter::CopyToCharArrayN(tizenPath)); SysTryReturn(NID_CNT, pTempPath != null, contentType, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); @@ -1667,7 +1784,7 @@ _ContentManagerUtilImpl::CheckContentType(const String& contentPath, bool intern { if (mimeType == L"video/3gpp" || mimeType == L"video/mp4") { - return CheckStream(contentPath); + return CheckStream(tizenPath); } return CONTENT_TYPE_VIDEO; } @@ -1725,8 +1842,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)); } @@ -1737,8 +1855,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)); } @@ -1866,4 +1985,41 @@ _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; +} + }}