From 7b795050a1ca3bace60959d52d2ce0ea217ff197 Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Fri, 29 Sep 2017 12:06:35 +0900 Subject: [PATCH 01/16] Reinforce coverage Change-Id: I387ff9ec8c67a0cfc8ec787a81d42a80b33a4168 Signed-off-by: Minje Ahn --- src/metadata_editor.cpp | 46 +++++++++++++++++----------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 5953d9d..7d4004e 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -21,6 +21,7 @@ #include #include #include +#include static int __ID3_getTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* frameID, char** value); static int __ID3_setTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* frameID, const char* value); @@ -576,13 +577,10 @@ static int __MP4_getNumberOfPictures(metadata_editor_s* _metadata, char** value) TagLib::MP4::ItemListMap& itemMap = tag->itemListMap(); TagLib::MP4::ItemListMap::ConstIterator it = itemMap.find("covr"); if (it != itemMap.end()) { // Item was found - uint number = it->second.toCoverArtList().size(); // Get the size of CoverList (i.e. number of pictures in file) - metadata_editor_info("There are %u picture(s) in file", number); char buf[META_MAX_BUF_LEN] = {0, }; - snprintf(buf, META_MAX_BUF_LEN, "%u", number); // Convert integer value of size to its c-string representation - int length = strlen(buf); - metadata_editor_retvm_if(length == 0, METADATA_EDITOR_ERROR_NONE, "Empty string"); - *value = strndup(buf, length); + snprintf(buf, META_MAX_BUF_LEN, "%u", it->second.toCoverArtList().size()); // Convert integer value of size to its c-string representation + if (strlen(buf) > 0) + *value = g_strdup(buf); return METADATA_EDITOR_ERROR_NONE; } else { // Item was not found metadata_editor_info("No item in file"); @@ -1398,14 +1396,11 @@ extern "C" int metadata_editor_update_metadata(metadata_editor_h metadata) { if (!tag1 || tag1->isEmpty()) { // If no ID3v1 tag - prevent its creation if (_file->save(TagLib::MPEG::File::ID3v2 | TagLib::MPEG::File::APE)) return METADATA_EDITOR_ERROR_NONE; - else - return METADATA_EDITOR_ERROR_OPERATION_FAILED; } else { // otherwise - save all tags in file if (_file->save(TagLib::MPEG::File::AllTags)) return METADATA_EDITOR_ERROR_NONE; - else - return METADATA_EDITOR_ERROR_OPERATION_FAILED; } + return METADATA_EDITOR_ERROR_OPERATION_FAILED; } case METADATA_EDITOR_FORMAT_MP4: { TagLib::MP4::File* _file = (TagLib::MP4::File*)_metadata->file; @@ -1811,26 +1806,19 @@ extern "C" int metadata_editor_remove_picture(metadata_editor_h metadata, int in metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); TagLib::ID3v2::FrameList lst = tag2->frameListMap()["APIC"]; // Check if there are pictures in the tag - if (lst.isEmpty()) { - metadata_editor_error("No pictures in file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } else { // pictures exist in file - // Check if index is correct or not - if ((index < 0) || (lst.size() <= (uint)index)) { - metadata_editor_error("Index of picture is out of range"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } else { // everything is correct - begin extraction - metadata_editor_info("Removing of picture number %d", index); - int i = 0; - // Among all frames we must choose that one with specified index. "i" will be counter - for (TagLib::ID3v2::FrameList::Iterator it = lst.begin(); it != lst.end(); ++it, ++i) { - if (i != index) continue; - tag2->removeFrame(*it); - break; - } - return METADATA_EDITOR_ERROR_NONE; - } + metadata_editor_retvm_if(lst.isEmpty(), METADATA_EDITOR_ERROR_OPERATION_FAILED, "No pictures in file"); + + // Check if index is correct or not + metadata_editor_retvm_if((index < 0) || (lst.size() <= (uint)index), METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Index of picture is out of range"); + metadata_editor_info("Removing of picture number %d", index); + int i = 0; + // Among all frames we must choose that one with specified index. "i" will be counter + for (TagLib::ID3v2::FrameList::Iterator it = lst.begin(); it != lst.end(); ++it, ++i) { + if (i != index) continue; + tag2->removeFrame(*it); + break; } + return METADATA_EDITOR_ERROR_NONE; } case METADATA_EDITOR_FORMAT_MP4: { TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; -- 2.7.4 From 806db55afc0ce5a88950d96e53e30b0ec295207b Mon Sep 17 00:00:00 2001 From: hj kim Date: Wed, 24 Jan 2018 14:17:03 +0900 Subject: [PATCH 02/16] Fix Doxygen mistakes Change-Id: I5338485c225160dc101280459f4dbb01a631c0b1 --- include/metadata_editor.h | 76 +++++++++++++++---------------- include/metadata_editor_private.h | 6 +-- include/metadata_editor_type.h | 19 +++++--- packaging/capi-media-metadata-editor.spec | 2 +- 4 files changed, 54 insertions(+), 49 deletions(-) diff --git a/include/metadata_editor.h b/include/metadata_editor.h index 07d6a50..d012f1a 100755 --- a/include/metadata_editor.h +++ b/include/metadata_editor.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef __TIZEN_METADATA_EDITOR_H__ -#define __TIZEN_METADATA_EDITOR_H__ +#ifndef __TIZEN_MULTIMEDIA_METADATA_EDITOR_H__ +#define __TIZEN_MULTIMEDIA_METADATA_EDITOR_H__ #include @@ -36,12 +36,12 @@ extern "C" { /** - * @brief Create metadata + * @brief Creates metadata. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * - * @remarks You must release @a metadata using metadata_editor_destroy(). + * @remarks The @a metadata should be released using metadata_editor_destroy(). * - * @param [in] metadata The handle to metadata + * @param[in] metadata The handle to metadata * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter @@ -52,14 +52,14 @@ int metadata_editor_create(metadata_editor_h *metadata); /** - * @brief Set file path to read or write metadata + * @brief Sets file path to read or write metadata. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * * @remarks In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * - * @param [in] metadata The handle to metadata - * @param [in] path path to read or write metadata + * @param[in] metadata The handle to metadata + * @param[in] path path to read or write metadata * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter @@ -74,17 +74,17 @@ int metadata_editor_set_path(metadata_editor_h metadata, const char *path); /** - * @brief Get the metadata corresponding to the attribute. + * @brief Gets the metadata corresponding to the attribute. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * - * @remarks You must release @a value using @c free(). \n + * @remarks The @a value should be released using free(). \n * If the attribute value of the metadata is empty, return value is NULL. \n * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * - * @param [in] metadata The handle to metadata - * @param [in] attribute key attribute name to get - * @param [out] value The value of the attribute + * @param[in] metadata The handle to metadata + * @param[in] attribute key attribute name to get + * @param[out] value The value of the attribute * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter @@ -98,16 +98,16 @@ int metadata_editor_get_metadata(metadata_editor_h metadata, metadata_editor_att /** - * @brief Set the attribute of the metadata. - * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif + * @brief Sets the attribute of the metadata. * @details This function set the attribute of the metadata for updating the metadata. \n + * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * - * @remarks You must release @a value using @c free(). \n + * @remarks The @a value should be released using free(). \n * You must call metadata_editor_update_metadata() for applying to the metadata of the media file. if not, you will see the existing metadata when you call metadata_editor_get_metadata(). * - * @param [in] metadata The handle to metadata - * @param [in] attribute key attribute name to get - * @param [in] value The value of the attribute + * @param[in] metadata The handle to metadata + * @param[in] attribute key attribute name to get + * @param[in] value The value of the attribute * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter @@ -120,14 +120,14 @@ int metadata_editor_set_metadata(metadata_editor_h metadata, metadata_editor_att /** - * @brief Update the modified metadata - * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif + * @brief Updates the modified metadata. * @details This function update the metadata in the media file that is modified by metadata_editor_set_metadata(). + * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * * @remarks In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * - * @param [in] metadata The handle to metadata + * @param[in] metadata The handle to metadata * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter @@ -140,18 +140,18 @@ int metadata_editor_set_metadata(metadata_editor_h metadata, metadata_editor_att int metadata_editor_update_metadata(metadata_editor_h metadata); /** - * @brief Get the picture in the media file + * @brief Gets the picture in the media file. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * - * @remarks You must release @a picture using @c free(). \n + * @remarks The @a picture abd @a mime_type should be released using free(). \n * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * - * @param [in] metadata The handle to metadata - * @param [in] index picture order - * @param [out] picture encoded picture - * @param [out] size encoded picture size - * @param [out] mime_type the mime type of picture + * @param[in] metadata The handle to metadata + * @param[in] index picture order + * @param[out] picture encoded picture + * @param[out] size encoded picture size + * @param[out] mime_type the MIME of the picture * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter @@ -164,7 +164,7 @@ int metadata_editor_update_metadata(metadata_editor_h metadata); int metadata_editor_get_picture(metadata_editor_h metadata, int index, void **picture, int *size, char **mime_type); /** - * @brief Append the picture to the media file + * @brief Appends the picture to the media file. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * * @remarks You must call metadata_editor_update_metadata() for applying to the metadata of the media file. if not, you will see the existing metadata when you call metadata_editor_get_metadata(). \n @@ -172,8 +172,8 @@ int metadata_editor_get_picture(metadata_editor_h metadata, int index, void **pi * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * - * @param [in] metadata The handle to metadata - * @param [in] picture_path The path of picture for adding to the metadata + * @param[in] metadata The handle to metadata + * @param[in] picture_path The path of picture for adding to the metadata * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter @@ -187,13 +187,13 @@ int metadata_editor_get_picture(metadata_editor_h metadata, int index, void **pi int metadata_editor_append_picture(metadata_editor_h metadata, const char *picture_path); /** - * @brief Remove artwork image from media file + * @brief Removes artwork image from media file. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * * @remarks You must call metadata_editor_update_metadata() for applying to the metadata of the media file. if not, you will see the existing metadata when you call metadata_editor_get_metadata(). \n * - * @param [in] metadata The handle to metadata - * @param [in] index artwork image order + * @param[in] metadata The handle to metadata + * @param[in] index artwork image order * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter @@ -206,10 +206,10 @@ int metadata_editor_append_picture(metadata_editor_h metadata, const char *pictu int metadata_editor_remove_picture(metadata_editor_h metadata, int index); /** - * @brief Destroy metadata + * @brief Destroys metadata. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * - * @param [in] metadata The handle to metadata + * @param[in] metadata The handle to metadata * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter @@ -228,4 +228,4 @@ int metadata_editor_destroy(metadata_editor_h metadata); } #endif /* __cplusplus */ -#endif /* __TIZEN_METADATA_EDITOR_H__ */ +#endif /* __TIZEN_MULTIMEDIA_METADATA_EDITOR_H__ */ diff --git a/include/metadata_editor_private.h b/include/metadata_editor_private.h index 4207292..767fdbb 100755 --- a/include/metadata_editor_private.h +++ b/include/metadata_editor_private.h @@ -15,8 +15,8 @@ */ -#ifndef __TIZEN_METADATA_EDITOR_PRIVATE_H__ -#define __TIZEN_METADATA_EDITOR_PRIVATE_H__ +#ifndef __TIZEN_MULTIMEDIA_METADATA_EDITOR_PRIVATE_H__ +#define __TIZEN_MULTIMEDIA_METADATA_EDITOR_PRIVATE_H__ #include #include @@ -96,4 +96,4 @@ typedef struct { #ifdef __cplusplus } #endif /* __cplusplus */ -#endif /*__TIZEN_METADATA_EDITOR_PRIVATE_H__*/ +#endif /*__TIZEN_MULTIMEDIA_METADATA_EDITOR_PRIVATE_H__*/ diff --git a/include/metadata_editor_type.h b/include/metadata_editor_type.h index d7ab918..f1e55ba 100755 --- a/include/metadata_editor_type.h +++ b/include/metadata_editor_type.h @@ -16,8 +16,8 @@ -#ifndef __TIZEN_METADATA_EDITOR_TYPE_H__ -#define __TIZEN_METADATA_EDITOR_TYPE_H__ +#ifndef __TIZEN_MULTIMEDIA_METADATA_EDITOR_TYPE_H__ +#define __TIZEN_MULTIMEDIA_METADATA_EDITOR_TYPE_H__ #include @@ -31,12 +31,17 @@ extern "C" { * @{ */ -/** @brief Definition for Metadata editor Error Class */ + +/** +* @brief Definition for Metadata editor Error Class. +* @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif +* +*/ #define METADATA_EDITOR_ERROR_CLASS TIZEN_ERROR_METADATA_EDITOR /** * @ingroup CAPI_MEDIA_METADATA_EDITOR_MODULE - * @brief The enumerations of media metadata error + * @brief The enumerations of media metadata error. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif */ typedef enum { @@ -52,7 +57,7 @@ typedef enum { /** * @ingroup CAPI_MEDIA_METADATA_EDITOR_MODULE - * @brief The enumerations of attribute + * @brief The enumerations of attribute. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif */ typedef enum { @@ -73,7 +78,7 @@ typedef enum { /** * @ingroup CAPI_MEDIA_METADATA_EDITOR_MODULE - * @brief The handle of media metadata + * @brief The handle of media metadata. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif */ typedef void * metadata_editor_h; @@ -86,4 +91,4 @@ typedef void * metadata_editor_h; } #endif /* __cplusplus */ -#endif /*__TIZEN_METADATA_EDITOR_TYPE_H__*/ +#endif /*__TIZEN_MULTIMEDIA_METADATA_EDITOR_TYPE_H__*/ diff --git a/packaging/capi-media-metadata-editor.spec b/packaging/capi-media-metadata-editor.spec index e69ec87..d55882b 100755 --- a/packaging/capi-media-metadata-editor.spec +++ b/packaging/capi-media-metadata-editor.spec @@ -1,6 +1,6 @@ Name: capi-media-metadata-editor Summary: A metadata editor library in Tizen Native API -Version: 0.1.7 +Version: 0.1.8 Release: 0 Group: Multimedia/API License: Apache-2.0 -- 2.7.4 From 5eeceab6a06be700671c76ea11da4a45e61378d2 Mon Sep 17 00:00:00 2001 From: hj kim Date: Thu, 25 Jan 2018 09:19:30 +0900 Subject: [PATCH 03/16] Fix Doxygen mistakes Change-Id: I2e89f110ab047dd34e1c1ecbd6e6b6b7cb853fad --- include/metadata_editor.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/metadata_editor.h b/include/metadata_editor.h index d012f1a..80d4e4b 100755 --- a/include/metadata_editor.h +++ b/include/metadata_editor.h @@ -191,6 +191,8 @@ int metadata_editor_append_picture(metadata_editor_h metadata, const char *pictu * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * * @remarks You must call metadata_editor_update_metadata() for applying to the metadata of the media file. if not, you will see the existing metadata when you call metadata_editor_get_metadata(). \n + * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n + * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * * @param[in] metadata The handle to metadata * @param[in] index artwork image order -- 2.7.4 From 36424e29da432f8cde3f147bd8692ba8f4263b14 Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Mon, 12 Feb 2018 11:31:48 +0900 Subject: [PATCH 04/16] Fix typo Change-Id: I309224042e23271c4ce2142b7f5ec5135219fde5 Signed-off-by: Minje Ahn --- include/metadata_editor.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/metadata_editor.h b/include/metadata_editor.h index 80d4e4b..8e115b5 100755 --- a/include/metadata_editor.h +++ b/include/metadata_editor.h @@ -56,7 +56,7 @@ int metadata_editor_create(metadata_editor_h *metadata); * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * * @remarks In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n - * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. + * For example, if you get the specific path by using storage_get_directory(). you should add privilege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * * @param[in] metadata The handle to metadata * @param[in] path path to read or write metadata @@ -80,7 +80,7 @@ int metadata_editor_set_path(metadata_editor_h metadata, const char *path); * @remarks The @a value should be released using free(). \n * If the attribute value of the metadata is empty, return value is NULL. \n * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n - * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. + * For example, if you get the specific path by using storage_get_directory(). you should add privilege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * * @param[in] metadata The handle to metadata * @param[in] attribute key attribute name to get @@ -125,7 +125,7 @@ int metadata_editor_set_metadata(metadata_editor_h metadata, metadata_editor_att * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * * @remarks In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n - * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. + * For example, if you get the specific path by using storage_get_directory(). you should add privilege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * * @param[in] metadata The handle to metadata * @return 0 on success, otherwise a negative error value @@ -145,7 +145,7 @@ int metadata_editor_update_metadata(metadata_editor_h metadata); * * @remarks The @a picture abd @a mime_type should be released using free(). \n * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n - * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. + * For example, if you get the specific path by using storage_get_directory(). you should add privilege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * * @param[in] metadata The handle to metadata * @param[in] index picture order @@ -170,7 +170,7 @@ int metadata_editor_get_picture(metadata_editor_h metadata, int index, void **pi * @remarks You must call metadata_editor_update_metadata() for applying to the metadata of the media file. if not, you will see the existing metadata when you call metadata_editor_get_metadata(). \n * Image type of the metadata supports jpeg and png. \n * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n - * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. + * For example, if you get the specific path by using storage_get_directory(). you should add privilege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * * @param[in] metadata The handle to metadata * @param[in] picture_path The path of picture for adding to the metadata @@ -192,7 +192,7 @@ int metadata_editor_append_picture(metadata_editor_h metadata, const char *pictu * * @remarks You must call metadata_editor_update_metadata() for applying to the metadata of the media file. if not, you will see the existing metadata when you call metadata_editor_get_metadata(). \n * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n - * For example, if you get the specific path by using storage_get_directory(). you should add previlege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. + * For example, if you get the specific path by using storage_get_directory(). you should add privilege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * * @param[in] metadata The handle to metadata * @param[in] index artwork image order -- 2.7.4 From 2e4c90aaaf3864e77a0e53e49451b2143abf744a Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Mon, 5 Mar 2018 14:10:07 +0900 Subject: [PATCH 05/16] Fix typo Change-Id: If06f721dc2c9e13f04cd8e4944b43b72d193d6df Signed-off-by: Minje Ahn --- doc/metadata_editor_doc.h | 2 +- include/metadata_editor.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/metadata_editor_doc.h b/doc/metadata_editor_doc.h index 56f1310..ecb4431 100755 --- a/doc/metadata_editor_doc.h +++ b/doc/metadata_editor_doc.h @@ -37,7 +37,7 @@ * \#include * * @section CAPI_MEDIA_METADATA_EDITOR_OVERVIEW Overview - * The @ref CAPI_MEDIA_METADATA_EDITOR_MODULE API allows you to read the metadata from a media file(#metadata_editor_get_metadata()). To edit a metadata(#metadata_editor_set_metadata()), create/destory the handle(#metadata_editor_create()/#metadata_editor_destroy), and append/ remove a picture in the metadata(#metadata_editor_append_picture()/ #metadata_editor_remove_picture()). + * The @ref CAPI_MEDIA_METADATA_EDITOR_MODULE API allows you to read the metadata from a media file(#metadata_editor_get_metadata()). To edit a metadata(#metadata_editor_set_metadata()), create/destroy the handle(#metadata_editor_create()/#metadata_editor_destroy), and append/ remove a picture in the metadata(#metadata_editor_append_picture()/ #metadata_editor_remove_picture()). */ #endif /* __TIZEN_METADATA_EDITOR_DOC_H__ */ diff --git a/include/metadata_editor.h b/include/metadata_editor.h index 8e115b5..01b8cbc 100755 --- a/include/metadata_editor.h +++ b/include/metadata_editor.h @@ -143,7 +143,7 @@ int metadata_editor_update_metadata(metadata_editor_h metadata); * @brief Gets the picture in the media file. * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif * - * @remarks The @a picture abd @a mime_type should be released using free(). \n + * @remarks The @a picture and @a mime_type should be released using free(). \n * In case of accessing specific path in internal storage or external storage, you may add the privilege for accessing the path. \n * For example, if you get the specific path by using storage_get_directory(). you should add privilege http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage. * -- 2.7.4 From 41d25a71f1c114ef32178235ec4e616233b72cd4 Mon Sep 17 00:00:00 2001 From: hj kim Date: Fri, 23 Mar 2018 09:29:37 +0900 Subject: [PATCH 06/16] Fix Coverity issues Change-Id: I71fb5886972dae84270b701d35eca0176175fb86 --- test/metadata_editor_test.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/metadata_editor_test.c b/test/metadata_editor_test.c index 1f84eb3..6e2bbc6 100755 --- a/test/metadata_editor_test.c +++ b/test/metadata_editor_test.c @@ -366,10 +366,14 @@ static bool __add_picture(metadata_editor_h metadata) static bool __delete_pictures(metadata_editor_h metadata) { + int ret = METADATA_EDITOR_ERROR_NONE; uint num, i; char *picture_index = NULL; - metadata_editor_get_metadata(metadata, METADATA_EDITOR_ATTR_PICTURE_NUM, &picture_index); + ret = metadata_editor_get_metadata(metadata, METADATA_EDITOR_ATTR_PICTURE_NUM, &picture_index); + if (ret != METADATA_EDITOR_ERROR_NONE) + printf("fail to metadata_editor_get_metadata[%d]\n", ret); + printf("The number of pictures is [%s]\n", picture_index); if (picture_index) { -- 2.7.4 From 5216d274a51a3c3abb69d2690267d2bbc11647ab Mon Sep 17 00:00:00 2001 From: hj kim Date: Thu, 21 Jun 2018 14:04:07 +0900 Subject: [PATCH 07/16] Just update api description Change-Id: If122aba54eec100152d2625d008398102a324a5e --- include/metadata_editor.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/include/metadata_editor.h b/include/metadata_editor.h index 01b8cbc..a4eaddf 100755 --- a/include/metadata_editor.h +++ b/include/metadata_editor.h @@ -45,7 +45,7 @@ extern "C" { * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Not enough memory is available + * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Out of memory * @see metadata_editor_destroy() */ int metadata_editor_create(metadata_editor_h *metadata); @@ -88,7 +88,7 @@ int metadata_editor_set_path(metadata_editor_h metadata, const char *path); * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Not enough memory is available + * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Out of memory * @retval #METADATA_EDITOR_ERROR_PERMISSION_DENIED Permission denied * @retval #METADATA_EDITOR_ERROR_OPERATION_FAILED Internal Operation Fail * @pre Set path to read or write metadata by calling metadata_editor_set_path() @@ -111,7 +111,7 @@ int metadata_editor_get_metadata(metadata_editor_h metadata, metadata_editor_att * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Not enough memory is available + * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Out of memory * @retval #METADATA_EDITOR_ERROR_OPERATION_FAILED Internal Operation Fail * @pre Set path to read or write metadata by calling metadata_editor_set_path() * @see metadata_editor_create(), metadata_editor_update_metadata(), metadata_editor_destroy() @@ -131,7 +131,7 @@ int metadata_editor_set_metadata(metadata_editor_h metadata, metadata_editor_att * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Not enough memory is available + * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Out of memory * @retval #METADATA_EDITOR_ERROR_PERMISSION_DENIED Permission denied * @retval #METADATA_EDITOR_ERROR_OPERATION_FAILED Internal Operation Fail * @pre Set path to read or write metadata by calling metadata_editor_set_path() @@ -155,7 +155,7 @@ int metadata_editor_update_metadata(metadata_editor_h metadata); * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Not enough memory is available + * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Out of memory * @retval #METADATA_EDITOR_ERROR_OPERATION_FAILED Internal Operation Fail * @retval #METADATA_EDITOR_ERROR_PERMISSION_DENIED Permission denied * @pre Set path to read or write metadata by calling metadata_editor_set_path() @@ -177,7 +177,7 @@ int metadata_editor_get_picture(metadata_editor_h metadata, int index, void **pi * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Not enough memory is available + * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Out of memory * @retval #METADATA_EDITOR_ERROR_NOT_SUPPORTED unsupported file type * @retval #METADATA_EDITOR_ERROR_OPERATION_FAILED Internal Operation Fail * @retval #METADATA_EDITOR_ERROR_PERMISSION_DENIED Permission denied @@ -199,7 +199,7 @@ int metadata_editor_append_picture(metadata_editor_h metadata, const char *pictu * @return 0 on success, otherwise a negative error value * @retval #METADATA_EDITOR_ERROR_NONE Successful * @retval #METADATA_EDITOR_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Not enough memory is available + * @retval #METADATA_EDITOR_ERROR_OUT_OF_MEMORY Out of memory * @retval #METADATA_EDITOR_ERROR_OPERATION_FAILED Internal Operation Fail * @retval #METADATA_EDITOR_ERROR_PERMISSION_DENIED Permission denied * @pre Set path to read or write metadata by calling metadata_editor_set_path() -- 2.7.4 From b29ca1c5a3d07abf09deadddf84b0405da9dd502 Mon Sep 17 00:00:00 2001 From: SeokHoon Lee Date: Fri, 14 Sep 2018 16:13:56 +0900 Subject: [PATCH 08/16] Add gcov environment Signed-off-by: SeokHoon Lee Change-Id: Ie6879f3d2a8baef1b61e7f53e6acf2030b4ffaf5 --- packaging/capi-media-metadata-editor.spec | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packaging/capi-media-metadata-editor.spec b/packaging/capi-media-metadata-editor.spec index d55882b..a7eed50 100755 --- a/packaging/capi-media-metadata-editor.spec +++ b/packaging/capi-media-metadata-editor.spec @@ -32,6 +32,13 @@ export CFLAGS+=" -Wextra -Wno-array-bounds" export CFLAGS+=" -Wno-ignored-qualifiers -Wno-unused-parameter -Wshadow" export CFLAGS+=" -Wwrite-strings -Wswitch-default" CXXFLAGS=${CXXFLAGS/-fgnu89-inline/} +%if 0%{?gcov:1} +export CFLAGS+=" -fprofile-arcs -ftest-coverage" +export CXXFLAGS+=" -fprofile-arcs -ftest-coverage" +export FFLAGS+=" -fprofile-arcs -ftest-coverage" +export LDFLAGS+=" -lgcov" +%endif + MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` %cmake . -DFULLVER=%{version} -DMAJORVER=${MAJORVER} -- 2.7.4 From d5b382415e719972e98fad3e05ee8397036774a0 Mon Sep 17 00:00:00 2001 From: hj kim Date: Wed, 31 Oct 2018 15:09:54 +0900 Subject: [PATCH 09/16] Fix wrong PC_REQUIRED Change-Id: I7314748e4903320bdaa95a15f730223647fd4e15 --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8280500..ec9094c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,7 @@ SET(service "metadata-editor") # for package file SET(dependents "dlog capi-base-common taglib aul") +SET(pc_dependents "capi-base-common") PROJECT(${fw_name} C CXX) @@ -53,7 +54,7 @@ INSTALL( ) SET(PC_NAME ${fw_name}) -SET(PC_REQUIRED ${dependents}) +SET(PC_REQUIRED ${pc_dependents}) SET(PC_LDFLAGS -l${fw_name}) CONFIGURE_FILE( -- 2.7.4 From 9eb566aa2b101235ac32ea871def35e9409c12ba Mon Sep 17 00:00:00 2001 From: "jiyong.min" Date: Thu, 10 Jan 2019 13:24:30 +0900 Subject: [PATCH 10/16] Fix the log position to avoid errno change. Change-Id: Ia7d81de1f5fa4aa766e3d700497d2cadc314456e --- src/metadata_editor.cpp | 3 ++- test/metadata_editor_test.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 7d4004e..7d8379a 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -826,10 +826,11 @@ extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char * /* check the file exits actually */ exist = open(path, O_RDONLY); if(exist < 0) { - metadata_editor_error("Not exist file"); if (errno == EACCES || errno == EPERM) { + metadata_editor_error("Permission denied"); return METADATA_EDITOR_ERROR_PERMISSION_DENIED; } else { + metadata_editor_error("Not exist file"); return METADATA_EDITOR_ERROR_FILE_EXISTS; } } diff --git a/test/metadata_editor_test.c b/test/metadata_editor_test.c index 6e2bbc6..efc780d 100755 --- a/test/metadata_editor_test.c +++ b/test/metadata_editor_test.c @@ -417,7 +417,7 @@ int main(int argc, char *argv[]) /*__printRetValue("metadata_editor_create(...)",ret); */ if (ret != METADATA_EDITOR_ERROR_NONE) { - printf("Fail metadata_editor_create() at line [%d]\n", __LINE__); + printf("Fail metadata_editor_create() [%d]\n", ret); return 0; } @@ -425,7 +425,7 @@ int main(int argc, char *argv[]) /*__printRetValue("metadata_editor_set_path(...)",ret); */ if (ret != METADATA_EDITOR_ERROR_NONE) { - printf("Fail metadata_editor_set_path() at line [%d]\n", __LINE__); + printf("Fail metadata_editor_set_path() [%d]\n", ret); goto exception; } -- 2.7.4 From f97a101efe6fa864af3ccd29874165e28f08c792 Mon Sep 17 00:00:00 2001 From: "jiyong.min" Date: Tue, 29 Jan 2019 09:28:04 +0900 Subject: [PATCH 11/16] Add to check the return of fread() - If an error occurs, the return value is a short item count. Change-Id: I3acb7494ff53f56243ae239b6c1371eb5537478f --- src/metadata_editor.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 7d8379a..61034fd 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -770,7 +770,7 @@ int __metadata_editor_get_picture_info(const char *path, void **picture, int *si //IF ok.. read file FILE* fin = fopen(path, "rb"); - int file_size = 0; + size_t file_size = 0; if (fin) { while (fgetc(fin) != EOF) @@ -781,7 +781,11 @@ int __metadata_editor_get_picture_info(const char *path, void **picture, int *si memset(picture_buffer, 0, file_size * sizeof(char)); fin = fopen(path, "rb"); if (fin) { - ret = fread(picture_buffer, file_size, 1, fin); + if(file_size != fread(picture_buffer, file_size, 1, fin)) { + metadata_editor_error("fread error"); + fclose(fin); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } fclose(fin); } if (*picture == NULL) { -- 2.7.4 From 6f5913629493ce5a2e7b5ea9fe59ce4662f43ea1 Mon Sep 17 00:00:00 2001 From: "jiyong.min" Date: Fri, 1 Feb 2019 08:08:42 +0900 Subject: [PATCH 12/16] Change the value for checking fread() to the number of items Change-Id: I95149c62b7be1b73990830bb0ffa7f10404e16de --- src/metadata_editor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 61034fd..92b73b4 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -781,7 +781,7 @@ int __metadata_editor_get_picture_info(const char *path, void **picture, int *si memset(picture_buffer, 0, file_size * sizeof(char)); fin = fopen(path, "rb"); if (fin) { - if(file_size != fread(picture_buffer, file_size, 1, fin)) { + if(file_size != fread(picture_buffer, 1, file_size, fin)) { metadata_editor_error("fread error"); fclose(fin); return METADATA_EDITOR_ERROR_OPERATION_FAILED; -- 2.7.4 From 752ca4759fe47ab522b3cb77d8bebfdf7c76509b Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Tue, 2 Jul 2019 08:29:04 +0900 Subject: [PATCH 13/16] Add for line coverage Change-Id: Ief38a15eb8a0d5ce606b11fc9e5c22353ff2aaa1 Signed-off-by: Minje Ahn --- packaging/capi-media-metadata-editor.spec | 39 ++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/packaging/capi-media-metadata-editor.spec b/packaging/capi-media-metadata-editor.spec index a7eed50..d3625a7 100755 --- a/packaging/capi-media-metadata-editor.spec +++ b/packaging/capi-media-metadata-editor.spec @@ -12,6 +12,10 @@ BuildRequires: pkgconfig(taglib) BuildRequires: pkgconfig(aul) Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig +%if 0%{?gcov:1} +BuildRequires: lcov +BuildRequires: zip +%endif %description A media metadata editor library in Tizen Native API. @@ -24,6 +28,15 @@ Requires: %{name} = %{version}-%{release} %description devel A media metadata editor library in Tizen Native API. (Development files included) +%if 0%{?gcov:1} +%package gcov +Summary: Line Coverage of Metadata Editor library in Tizen C API +Group: Development/Multimedia + +%description gcov +Collection of files related to Line Coverage. It is teseted as gcov for a metadata editor library in Tizen native API +%endif + %prep %setup -q @@ -44,10 +57,29 @@ MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` make %{?jobs:-j%jobs} +%if 0%{?gcov:1} +mkdir -p gcov-obj +find . -name '*.gcno' -exec cp '{}' gcov-obj ';' +%endif + %install rm -rf %{buildroot} %make_install +if 0%{?gcov:1} +mkdir -p %{buildroot}%{_datadir}/gcov/obj +install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj +%endif + +%check +ctest --output-on-failure %{?_smp_mflags} +%if 0%{?gcov:1} +lcov -c --ignore-errors graph --no-external -q -d . -o metadata-editor.info +genhtml metadata-editor.info -o metadata-editor.out +zip -r metadata-editor.zip metadata-editor.out metadata-editor.info +install -m 0644 metadata-editor.zip %{buildroot}%{_datadir}/gcov/ +%endif + %post -p /sbin/ldconfig %postun -p /sbin/ldconfig @@ -58,4 +90,9 @@ rm -rf %{buildroot} %files devel %{_includedir}/metadata-editor/*.h -%{_libdir}/pkgconfig/capi-media-metadata-editor.pc +%{_libdir}/pkgconfig/capi-media-metadata-editor.pci + +%if 0%{?gcov:1} +%files gcov +%{_datadir}/gcov/obj/* +%endif -- 2.7.4 From 5178d32f388f7872a3b6d5c20f23681c18952903 Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Tue, 2 Jul 2019 09:27:44 +0900 Subject: [PATCH 14/16] Fix build error Change-Id: I7e5f0b6e080785c32c2dda1bf440ced048aaab3e Signed-off-by: Minje Ahn --- packaging/capi-media-metadata-editor.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/capi-media-metadata-editor.spec b/packaging/capi-media-metadata-editor.spec index d3625a7..81bc1ee 100755 --- a/packaging/capi-media-metadata-editor.spec +++ b/packaging/capi-media-metadata-editor.spec @@ -90,7 +90,7 @@ install -m 0644 metadata-editor.zip %{buildroot}%{_datadir}/gcov/ %files devel %{_includedir}/metadata-editor/*.h -%{_libdir}/pkgconfig/capi-media-metadata-editor.pci +%{_libdir}/pkgconfig/capi-media-metadata-editor.pc %if 0%{?gcov:1} %files gcov -- 2.7.4 From af03f9f54b78bc7630169f85127f03e9a24834f2 Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Tue, 2 Jul 2019 10:45:02 +0900 Subject: [PATCH 15/16] Remove check for gcov Change-Id: I99fcdd951a0afc327f39606167262e563c20c28c Signed-off-by: Minje Ahn --- packaging/capi-media-metadata-editor.spec | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/packaging/capi-media-metadata-editor.spec b/packaging/capi-media-metadata-editor.spec index 81bc1ee..a1b40b2 100755 --- a/packaging/capi-media-metadata-editor.spec +++ b/packaging/capi-media-metadata-editor.spec @@ -12,10 +12,6 @@ BuildRequires: pkgconfig(taglib) BuildRequires: pkgconfig(aul) Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig -%if 0%{?gcov:1} -BuildRequires: lcov -BuildRequires: zip -%endif %description A media metadata editor library in Tizen Native API. @@ -66,20 +62,11 @@ find . -name '*.gcno' -exec cp '{}' gcov-obj ';' rm -rf %{buildroot} %make_install -if 0%{?gcov:1} +%if 0%{?gcov:1} mkdir -p %{buildroot}%{_datadir}/gcov/obj install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj %endif -%check -ctest --output-on-failure %{?_smp_mflags} -%if 0%{?gcov:1} -lcov -c --ignore-errors graph --no-external -q -d . -o metadata-editor.info -genhtml metadata-editor.info -o metadata-editor.out -zip -r metadata-editor.zip metadata-editor.out metadata-editor.info -install -m 0644 metadata-editor.zip %{buildroot}%{_datadir}/gcov/ -%endif - %post -p /sbin/ldconfig %postun -p /sbin/ldconfig -- 2.7.4 From a393b2b577810bc6e93996c50ac3a608367382c7 Mon Sep 17 00:00:00 2001 From: hj kim Date: Tue, 27 Aug 2019 11:01:07 +0900 Subject: [PATCH 16/16] Update code to reduce Cyclomatic Complexity and DC Change-Id: I2d9ea5df5687c41329981c77df0aa6be0c0592c5 --- src/metadata_editor.cpp | 981 ++++++++++++++++++++++++++---------------------- 1 file changed, 527 insertions(+), 454 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 92b73b4..be3c632 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -51,18 +51,49 @@ typedef enum { METADATA_EDITOR_FORMAT_NOTYPE = 0xFF /**< Error type. File type is not correct or not specified */ } metadata_editor_format_e; +static int __check_metadata_parameter(metadata_editor_s *metadata) +{ + metadata_editor_retvm_if(!metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); + metadata_editor_retvm_if(!metadata->file, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); + metadata_editor_retvm_if(!metadata->isOpen, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + + return METADATA_EDITOR_ERROR_NONE; +} + +static int __check_metadata_set_parameter(metadata_editor_s *metadata) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_parameter"); + + metadata_editor_retvm_if(metadata->isReadOnly, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File is readonly. Unable to modify"); + + return METADATA_EDITOR_ERROR_NONE; +} + +static int __check_metadata_get_parameter(metadata_editor_s *metadata, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_parameter"); + + metadata_editor_retvm_if(!value, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid value"); + + return METADATA_EDITOR_ERROR_NONE; +} // *** This is an auxiliary function that is used to get the frame value *** // // *** It operates with frames that exists both in ID3v1 and ID3v2 tags *** // static int __ID3_getTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* frameID, char** value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(frameID == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!frameID, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid frameID"); - // Check if the file, given through metadata, exists and is opened correctly *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); // Check if the frame is empty (nothing to read) or ID3v2 tag does not exist if (!tag2 || tag2->frameListMap()[frameID].isEmpty()) { @@ -147,16 +178,12 @@ static int __ID3_getTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1: // *** This is an auxiliary function that is used to write the new value to the frame *** // // *** It operates with frames that exists both in ID3v1 and ID3v2 tags *** // static int __ID3_setTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* frameID, const char* value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(frameID == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exists - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!frameID, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid frameID"); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); // If the pointer is NULL or c-string is empty - handle as request for deletion if (!value || (*value == '\0')) { @@ -216,14 +243,13 @@ static int __ID3_setTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1: // *** This function reads frames that exist only in ID3v2 tag *** // static int __ID3_getFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, const char* frameID, char** value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(frameID == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!frameID, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid frameID"); - // Check if the file, given through metadata, exists and is opened correctly *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); // Check if the frame is empty (nothing to read) or ID3v2 tag does not exist metadata_editor_retvm_if(!tag2 || tag2->frameListMap()[frameID].isEmpty(), METADATA_EDITOR_ERROR_NONE, "The frame %s does not exist", frameID); @@ -245,16 +271,12 @@ static int __ID3_getFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag // *** This function writes frames that exist only in ID3v2 tag *** // static int __ID3_setFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, const char* frameID, const char* value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(frameID == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!frameID, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid frameID"); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); // If the pointer is NULL or c-string is empty - handle as request for deletion if (!value || (*value == '\0')) { @@ -283,16 +305,11 @@ static int __ID3_setFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag // *** This function is used to receive the number of pictures stored in ID3v2 tag of file *** // static int __ID3_getNumberOfPictures(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag does not exist. Can not process further"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag does not exist. Can not process further"); TagLib::ID3v2::FrameList lst = tag2->frameListMap()["APIC"]; // link to picture frames in tag // Check if the frames exist @@ -309,16 +326,11 @@ static int __ID3_getNumberOfPictures(metadata_editor_s* _metadata, TagLib::ID3v2 // *** This function is used to receive unsynchronized lyrics from ID3v2 tag in file *** // // *** This frame differs from other string-type frames and uses UnsynchronizedLyricsFrame instead of TextIdentificationFrame *** // static int __ID3_getLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag does not exist. Can not process further"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag does not exist. Can not process further"); TagLib::ID3v2::FrameList lst = tag2->frameListMap()["USLT"]; // link to unsynchronized lyric frames in tag // Check if frames exist in file @@ -340,15 +352,11 @@ static int __ID3_getLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag // *** This function is used to set text in comment frame. It processes both ID3v1 and ID3v2 tags *** // // *** Comment frame is different from other string-type frames. It uses CommentsFrame instead of TextIdentificationFrame *** // static int __ID3_setTwixCommentFrame(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* value) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); // If the pointer is NULL or c-string is empty - handle as request for deletion if (!value || (*value == '\0')) { @@ -382,15 +390,11 @@ static int __ID3_setTwixCommentFrame(metadata_editor_s* _metadata, TagLib::ID3v1 // *** This function is used to set text in Lyrics frame *** // // *** Lyrics frame is different from other string-type frames and uses UnsynchronizedLyricsFrame instead of TextIdentificationFrame *** // static int __ID3_setLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, const char* value) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); - - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); TagLib::ID3v2::FrameList lst = tag2->frameListMap()["USLT"]; // link to unsynchronized lyric frames in tag // If the pointer is NULL or c-string is empty - handle as request for deletion @@ -421,16 +425,12 @@ static int __ID3_setLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag } // *** This function extracts string values from tag in MP4 file *** // -static int __MP4_getStringItem(metadata_editor_s* _metadata, const char* itemname, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(itemname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); - - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); +static int __MP4_getStringItem(metadata_editor_s* _metadata, const char* itemname, char **value) { + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!itemname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid itemname"); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -458,15 +458,11 @@ static int __MP4_getStringItem(metadata_editor_s* _metadata, const char* itemnam // *** This function extracts integer value from item in MP4 tag *** // static int __MP4_getIntegerItem(metadata_editor_s* _metadata, const char* itemname, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(itemname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!itemname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid itemname"); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -492,14 +488,11 @@ static int __MP4_getIntegerItem(metadata_editor_s* _metadata, const char* itemna // *** This function adds (or changes) string item of itemname type *** // static int __MP4_updateStringItem(metadata_editor_s* _metadata, const char* itemname, const char* value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(itemname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!itemname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid itemname"); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -523,14 +516,11 @@ static int __MP4_updateStringItem(metadata_editor_s* _metadata, const char* item // *** This function adds (or changes) integer item of itemname type *** // static int __MP4_updateIntegerItem(metadata_editor_s* _metadata, const char* itemname, const char* value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(itemname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!itemname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid itemname"); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -560,14 +550,10 @@ static int __MP4_updateIntegerItem(metadata_editor_s* _metadata, const char* ite // *** This function is used to find the number of pictures stored in MP4 file *** // static int __MP4_getNumberOfPictures(metadata_editor_s* _metadata, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -590,14 +576,11 @@ static int __MP4_getNumberOfPictures(metadata_editor_s* _metadata, char** value) #if 0 // *** This function is used to extract string from Xiph Comment field *** // static int __xiph_getFieldValue(metadata_editor_s* _metadata, TagLib::Ogg::XiphComment* xtag, const char* fieldname, char** value) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(fieldname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Value Pointer"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!fieldname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid fieldname"); metadata_editor_retvm_if(!xtag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag does not exist"); const TagLib::Ogg::FieldListMap& fieldMap = xtag->fieldListMap(); @@ -623,14 +606,11 @@ static int __xiph_getFieldValue(metadata_editor_s* _metadata, TagLib::Ogg::XiphC // *** This function is used to write string into Xiph Comment fields *** // static int __xiph_updateFieldValue(metadata_editor_s* _metadata, TagLib::Ogg::XiphComment* xtag, const char* fieldname, const char* value) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(fieldname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!fieldname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid fieldname"); metadata_editor_retvm_if(!xtag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag does not exist"); // Check if it is a request for deletion @@ -647,14 +627,10 @@ static int __xiph_updateFieldValue(metadata_editor_s* _metadata, TagLib::Ogg::Xi // *** This function is used to receive the number of pictures in FLAC file *** // static int __FLAC_getNumberOfPictures(metadata_editor_s* _metadata, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Value Pointer"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); TagLib::FLAC::File* _file = (TagLib::FLAC::File*) _metadata->file; if (_file->pictureList().isEmpty()) { @@ -1039,339 +1015,449 @@ extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char * } } +static int __metadata_editor_get_mp3_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tag pointers + TagLib::MPEG::File* _file = (TagLib::MPEG::File*)metadata->file; + TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); + TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(); + + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TPE1", value); + case METADATA_EDITOR_ATTR_TITLE: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TIT2", value); + case METADATA_EDITOR_ATTR_ALBUM: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TALB", value); + case METADATA_EDITOR_ATTR_GENRE: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TCON", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_getFrameByName(metadata, tag2, "TCOM", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_getFrameByName(metadata, tag2, "TCOP", value); + case METADATA_EDITOR_ATTR_DATE: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TDRC", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_getFrameByName(metadata, tag2, "TIT3", value); + case METADATA_EDITOR_ATTR_COMMENT: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "COMM", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TRCK", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_getFrameByName(metadata, tag2, "TPE3", value); + case METADATA_EDITOR_ATTR_PICTURE_NUM: return __ID3_getNumberOfPictures(metadata, tag2, value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_getLyricsFrame(metadata, tag2, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_get_mp4_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __MP4_getStringItem(metadata, "\xA9""ART", value); + case METADATA_EDITOR_ATTR_TITLE: return __MP4_getStringItem(metadata, "\xA9""nam", value); + case METADATA_EDITOR_ATTR_ALBUM: return __MP4_getStringItem(metadata, "\xA9""alb", value); + case METADATA_EDITOR_ATTR_GENRE: return __MP4_getStringItem(metadata, "\xA9""gen", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __MP4_getStringItem(metadata, "\xA9""wrt", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __MP4_getStringItem(metadata, "cprt", value); + case METADATA_EDITOR_ATTR_DATE: return __MP4_getStringItem(metadata, "\xA9""day", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __MP4_getStringItem(metadata, "desc", value); + case METADATA_EDITOR_ATTR_COMMENT: return __MP4_getStringItem(metadata, "\xA9""cmt", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __MP4_getIntegerItem(metadata, "trkn", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __MP4_getStringItem(metadata, "cond", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __MP4_getStringItem(metadata, "\xA9""lyr", value); + case METADATA_EDITOR_ATTR_PICTURE_NUM: return __MP4_getNumberOfPictures(metadata, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; +} +} + +#if 0 +static int __metadata_editor_get_flac_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::FLAC::File* _file = (TagLib::FLAC::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->xiphComment(false); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Tag does not exist"); + *value = NULL; + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(metadata, xtag, "LYRICS", value); + case METADATA_EDITOR_ATTR_PICTURE_NUM: return __FLAC_getNumberOfPictures(metadata, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_get_ogg_vorbis_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->tag(); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Tag does not exist"); + *value = NULL; + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_get_ogg_flac_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->tag(); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Tag does not exist"); + *value = NULL; + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_get_wav_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tag pointers + TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)metadata->file; + TagLib::ID3v2::Tag* tag2 = _file->tag(); + + if (tag2 == NULL) { // Check if we have a valid tag for processing + metadata_editor_error("Error. ID3v2 tag does not exist. Can not proceed metadata extraction"); + *value = NULL; + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __ID3_getFrameByName(metadata, tag2, "TPE1", value); + case METADATA_EDITOR_ATTR_TITLE: return __ID3_getFrameByName(metadata, tag2, "TIT2", value); + case METADATA_EDITOR_ATTR_ALBUM: return __ID3_getFrameByName(metadata, tag2, "TALB", value); + case METADATA_EDITOR_ATTR_GENRE: return __ID3_getFrameByName(metadata, tag2, "TCON", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_getFrameByName(metadata, tag2, "TCOM", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_getFrameByName(metadata, tag2, "TCOP", value); + case METADATA_EDITOR_ATTR_DATE: return __ID3_getFrameByName(metadata, tag2, "TDRC", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_getFrameByName(metadata, tag2, "TIT3", value); + case METADATA_EDITOR_ATTR_COMMENT: return __ID3_getFrameByName(metadata, tag2, "COMM", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_getFrameByName(metadata, tag2, "TRCK", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_getFrameByName(metadata, tag2, "TPE3", value); + case METADATA_EDITOR_ATTR_PICTURE_NUM: return __ID3_getNumberOfPictures(metadata, tag2, value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_getLyricsFrame(metadata, tag2, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} +#endif + // *** This function is used to get the tag frame (field, item - each tag has its own name for data unit) from file *** // extern "C" int metadata_editor_get_metadata(metadata_editor_h metadata, metadata_editor_attr_e attribute, char **value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Value Pointer"); metadata_editor_s *_metadata = (metadata_editor_s*)metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + metadata_editor_retvm_if(!_metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: { - // Bring the pointer to actual file type and make tag pointers - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; - TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); - TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(); + case METADATA_EDITOR_FORMAT_MP3: + return __metadata_editor_get_mp3_metadata(_metadata, attribute, value); + + case METADATA_EDITOR_FORMAT_MP4: + return __metadata_editor_get_mp4_metadata(_metadata, attribute, value); - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TPE1", value); - case METADATA_EDITOR_ATTR_TITLE: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TIT2", value); - case METADATA_EDITOR_ATTR_ALBUM: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TALB", value); - case METADATA_EDITOR_ATTR_GENRE: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TCON", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_getFrameByName(_metadata, tag2, "TCOM", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_getFrameByName(_metadata, tag2, "TCOP", value); - case METADATA_EDITOR_ATTR_DATE: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TDRC", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_getFrameByName(_metadata, tag2, "TIT3", value); - case METADATA_EDITOR_ATTR_COMMENT: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "COMM", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TRCK", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_getFrameByName(_metadata, tag2, "TPE3", value); - case METADATA_EDITOR_ATTR_PICTURE_NUM: return __ID3_getNumberOfPictures(_metadata, tag2, value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_getLyricsFrame(_metadata, tag2, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_MP4: { - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __MP4_getStringItem(_metadata, "\xA9""ART", value); - case METADATA_EDITOR_ATTR_TITLE: return __MP4_getStringItem(_metadata, "\xA9""nam", value); - case METADATA_EDITOR_ATTR_ALBUM: return __MP4_getStringItem(_metadata, "\xA9""alb", value); - case METADATA_EDITOR_ATTR_GENRE: return __MP4_getStringItem(_metadata, "\xA9""gen", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __MP4_getStringItem(_metadata, "\xA9""wrt", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __MP4_getStringItem(_metadata, "cprt", value); - case METADATA_EDITOR_ATTR_DATE: return __MP4_getStringItem(_metadata, "\xA9""day", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __MP4_getStringItem(_metadata, "desc", value); - case METADATA_EDITOR_ATTR_COMMENT: return __MP4_getStringItem(_metadata, "\xA9""cmt", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __MP4_getIntegerItem(_metadata, "trkn", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __MP4_getStringItem(_metadata, "cond", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __MP4_getStringItem(_metadata, "\xA9""lyr", value); - case METADATA_EDITOR_ATTR_PICTURE_NUM: return __MP4_getNumberOfPictures(_metadata, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } #if 0 case METADATA_EDITOR_FORMAT_FLAC: { - // Bring the pointer to actual file type and make tags pointers - TagLib::FLAC::File* _file = (TagLib::FLAC::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->xiphComment(false); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Tag does not exist"); - *value = NULL; - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(_metadata, xtag, "LYRICS", value); - case METADATA_EDITOR_ATTR_PICTURE_NUM: return __FLAC_getNumberOfPictures(_metadata, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return __metadata_editor_get_flac_metadata(_metadata, attribute, value); } case METADATA_EDITOR_FORMAT_OGG_VORBIS: { - // Bring the pointer to actual file type and make tags pointers - TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->tag(); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Tag does not exist"); - *value = NULL; - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return __metadata_editor_get_ogg_vorbis_metadata(_metadata, attribute, value); } case METADATA_EDITOR_FORMAT_OGG_FLAC: { - // Bring the pointer to actual file type and make tags pointers - TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->tag(); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Tag does not exist"); - *value = NULL; - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return __metadata_editor_get_ogg_flac_metadata(_metadata, attribute, value); } case METADATA_EDITOR_FORMAT_WAV: { - // Bring the pointer to actual file type and make tag pointers - TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; - TagLib::ID3v2::Tag* tag2 = _file->tag(); - - if (tag2 == NULL) { // Check if we have a valid tag for processing - metadata_editor_error("Error. ID3v2 tag does not exist. Can not proceed metadata extraction"); - *value = NULL; - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __ID3_getFrameByName(_metadata, tag2, "TPE1", value); - case METADATA_EDITOR_ATTR_TITLE: return __ID3_getFrameByName(_metadata, tag2, "TIT2", value); - case METADATA_EDITOR_ATTR_ALBUM: return __ID3_getFrameByName(_metadata, tag2, "TALB", value); - case METADATA_EDITOR_ATTR_GENRE: return __ID3_getFrameByName(_metadata, tag2, "TCON", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_getFrameByName(_metadata, tag2, "TCOM", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_getFrameByName(_metadata, tag2, "TCOP", value); - case METADATA_EDITOR_ATTR_DATE: return __ID3_getFrameByName(_metadata, tag2, "TDRC", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_getFrameByName(_metadata, tag2, "TIT3", value); - case METADATA_EDITOR_ATTR_COMMENT: return __ID3_getFrameByName(_metadata, tag2, "COMM", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_getFrameByName(_metadata, tag2, "TRCK", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_getFrameByName(_metadata, tag2, "TPE3", value); - case METADATA_EDITOR_ATTR_PICTURE_NUM: return __ID3_getNumberOfPictures(_metadata, tag2, value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_getLyricsFrame(_metadata, tag2, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return __metadata_editor_get_wav_metadata(_metadata, attribute, value); } #endif default: - metadata_editor_error("Wrong file type"); + metadata_editor_error("Wrong file type [%d]", _metadata->filetype); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_mp3_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::MPEG::File* _file = (TagLib::MPEG::File*)metadata->file; + TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); + TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(true); + + metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TPE1", value); + case METADATA_EDITOR_ATTR_TITLE: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TIT2", value); + case METADATA_EDITOR_ATTR_ALBUM: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TALB", value); + case METADATA_EDITOR_ATTR_GENRE: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TCON", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_setFrameByName(metadata, tag2, "TCOM", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_setFrameByName(metadata, tag2, "TCOP", value); + case METADATA_EDITOR_ATTR_DATE: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TDRC", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_setFrameByName(metadata, tag2, "TIT3", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TRCK", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_setFrameByName(metadata, tag2, "TPE3", value); + case METADATA_EDITOR_ATTR_COMMENT: return __ID3_setTwixCommentFrame(metadata, tag1, tag2, value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_setLyricsFrame(metadata, tag2, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_mp4_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __MP4_updateStringItem(metadata, "\xA9""ART", value); + case METADATA_EDITOR_ATTR_TITLE: return __MP4_updateStringItem(metadata, "\xA9""nam", value); + case METADATA_EDITOR_ATTR_ALBUM: return __MP4_updateStringItem(metadata, "\xA9""alb", value); + case METADATA_EDITOR_ATTR_GENRE: return __MP4_updateStringItem(metadata, "\xA9""gen", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __MP4_updateStringItem(metadata, "\xA9""wrt", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __MP4_updateStringItem(metadata, "cprt", value); + case METADATA_EDITOR_ATTR_DATE: return __MP4_updateStringItem(metadata, "\xA9""day", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __MP4_updateStringItem(metadata, "desc", value); + case METADATA_EDITOR_ATTR_COMMENT: return __MP4_updateStringItem(metadata, "\xA9""cmt", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __MP4_updateIntegerItem(metadata, "trkn", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __MP4_updateStringItem(metadata, "cond", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __MP4_updateStringItem(metadata, "\xA9""lyr", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +#if 0 +static int __metadata_editor_set_flac_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::FLAC::File* _file = (TagLib::FLAC::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->xiphComment(true); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_ogg_vorbis_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->tag(); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_ogg_flac_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->tag(); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_wav_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)metadata->file; + TagLib::ID3v2::Tag* tag2 = _file->tag(); + // Check if the valid tag pointer exist + if (tag2 == NULL) { + metadata_editor_error("Error. ID3v2 tag was not created. Can not proceed metadata updating"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __ID3_setFrameByName(metadata, tag2, "TPE1", value); + case METADATA_EDITOR_ATTR_TITLE: return __ID3_setFrameByName(metadata, tag2, "TIT2", value); + case METADATA_EDITOR_ATTR_ALBUM: return __ID3_setFrameByName(metadata, tag2, "TALB", value); + case METADATA_EDITOR_ATTR_GENRE: return __ID3_setFrameByName(metadata, tag2, "TCON", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_setFrameByName(metadata, tag2, "TCOM", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_setFrameByName(metadata, tag2, "TCOP", value); + case METADATA_EDITOR_ATTR_DATE: return __ID3_setFrameByName(metadata, tag2, "TDRC", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_setFrameByName(metadata, tag2, "TIT3", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_setFrameByName(metadata, tag2, "TRCK", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_setFrameByName(metadata, tag2, "TPE3", value); + case METADATA_EDITOR_ATTR_COMMENT: return __ID3_setTwixCommentFrame(metadata, NULL, tag2, value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_setLyricsFrame(metadata, tag2, value); + default: return METADATA_EDITOR_ERROR_INVALID_PARAMETER; } } +#endif // *** This function is used to modify the metadata (frame in tag). But it does not apply changes to file *** // extern "C" int metadata_editor_set_metadata(metadata_editor_h metadata, metadata_editor_attr_e attribute, const char* value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + metadata_editor_retvm_if(!_metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: { - // Bring the pointer to actual file type and make tags pointers - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; - TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); - TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(true); + case METADATA_EDITOR_FORMAT_MP3: + return __metadata_editor_set_mp3_metadata(_metadata, attribute, value); - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + case METADATA_EDITOR_FORMAT_MP4: + return __metadata_editor_set_mp4_metadata(_metadata, attribute, value); - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TPE1", value); - case METADATA_EDITOR_ATTR_TITLE: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TIT2", value); - case METADATA_EDITOR_ATTR_ALBUM: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TALB", value); - case METADATA_EDITOR_ATTR_GENRE: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TCON", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_setFrameByName(_metadata, tag2, "TCOM", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_setFrameByName(_metadata, tag2, "TCOP", value); - case METADATA_EDITOR_ATTR_DATE: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TDRC", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_setFrameByName(_metadata, tag2, "TIT3", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TRCK", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_setFrameByName(_metadata, tag2, "TPE3", value); - case METADATA_EDITOR_ATTR_COMMENT: return __ID3_setTwixCommentFrame(_metadata, tag1, tag2, value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_setLyricsFrame(_metadata, tag2, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_MP4: { - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __MP4_updateStringItem(_metadata, "\xA9""ART", value); - case METADATA_EDITOR_ATTR_TITLE: return __MP4_updateStringItem(_metadata, "\xA9""nam", value); - case METADATA_EDITOR_ATTR_ALBUM: return __MP4_updateStringItem(_metadata, "\xA9""alb", value); - case METADATA_EDITOR_ATTR_GENRE: return __MP4_updateStringItem(_metadata, "\xA9""gen", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __MP4_updateStringItem(_metadata, "\xA9""wrt", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __MP4_updateStringItem(_metadata, "cprt", value); - case METADATA_EDITOR_ATTR_DATE: return __MP4_updateStringItem(_metadata, "\xA9""day", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __MP4_updateStringItem(_metadata, "desc", value); - case METADATA_EDITOR_ATTR_COMMENT: return __MP4_updateStringItem(_metadata, "\xA9""cmt", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __MP4_updateIntegerItem(_metadata, "trkn", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __MP4_updateStringItem(_metadata, "cond", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __MP4_updateStringItem(_metadata, "\xA9""lyr", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } #if 0 - case METADATA_EDITOR_FORMAT_FLAC: { - // Bring the pointer to actual file type and make tags pointers - TagLib::FLAC::File* _file = (TagLib::FLAC::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->xiphComment(true); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_OGG_VORBIS: { - // Bring the pointer to actual file type and make tags pointers - TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->tag(); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_OGG_FLAC: { - // Bring the pointer to actual file type and make tags pointers - TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->tag(); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_WAV: { - // Bring the pointer to actual file type and make tags pointers - TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; - TagLib::ID3v2::Tag* tag2 = _file->tag(); - // Check if the valid tag pointer exist - if (tag2 == NULL) { - metadata_editor_error("Error. ID3v2 tag was not created. Can not proceed metadata updating"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } + case METADATA_EDITOR_FORMAT_FLAC: + return __metadata_editor_set_flac_metadata(_metadata, attribute, value); + + case METADATA_EDITOR_FORMAT_OGG_VORBIS: + return __metadata_editor_set_ogg_vorbis_metadata(_metadata, attribute, value); + + case METADATA_EDITOR_FORMAT_OGG_FLAC: + return __metadata_editor_set_ogg_flac_metadata(_metadata, attribute, value); + + case METADATA_EDITOR_FORMAT_WAV: + return __metadata_editor_set_wav_metadata(_metadata, attribute, value); - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __ID3_setFrameByName(_metadata, tag2, "TPE1", value); - case METADATA_EDITOR_ATTR_TITLE: return __ID3_setFrameByName(_metadata, tag2, "TIT2", value); - case METADATA_EDITOR_ATTR_ALBUM: return __ID3_setFrameByName(_metadata, tag2, "TALB", value); - case METADATA_EDITOR_ATTR_GENRE: return __ID3_setFrameByName(_metadata, tag2, "TCON", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_setFrameByName(_metadata, tag2, "TCOM", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_setFrameByName(_metadata, tag2, "TCOP", value); - case METADATA_EDITOR_ATTR_DATE: return __ID3_setFrameByName(_metadata, tag2, "TDRC", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_setFrameByName(_metadata, tag2, "TIT3", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_setFrameByName(_metadata, tag2, "TRCK", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_setFrameByName(_metadata, tag2, "TPE3", value); - case METADATA_EDITOR_ATTR_COMMENT: return __ID3_setTwixCommentFrame(_metadata, NULL, tag2, value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_setLyricsFrame(_metadata, tag2, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } #endif default: metadata_editor_error("Wrong file type"); @@ -1381,15 +1467,11 @@ extern "C" int metadata_editor_set_metadata(metadata_editor_h metadata, metadata // *** This function apply all changes done in the tag(s) and update them to file *** // extern "C" int metadata_editor_update_metadata(metadata_editor_h metadata) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); - - metadata_editor_s *_metadata = (metadata_editor_s*)metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); + int ret = METADATA_EDITOR_ERROR_NONE; + metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); switch (_metadata->filetype) { // Process the file according to the specified file type case METADATA_EDITOR_FORMAT_MP3: { @@ -1454,21 +1536,20 @@ extern "C" int metadata_editor_update_metadata(metadata_editor_h metadata) { extern "C" int metadata_editor_get_picture(metadata_editor_h metadata, int index, void **picture, int *size, char **mime_type) { const char *TYPE_JPEG = "image/jpeg"; const char *TYPE_PNG = "image/png"; - // Check if we have valid arguments to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); - metadata_editor_retvm_if(picture == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(size == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + + int ret = METADATA_EDITOR_ERROR_NONE; metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - // Check if the file, given through metadata, exists and is opened correctly + ret = __check_metadata_get_parameter(_metadata, mime_type); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!picture, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid picture"); + metadata_editor_retvm_if(!size, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid size"); + *picture = NULL; *size = 0; *mime_type = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - switch (_metadata->filetype) { // Process the file according to the specified file type case METADATA_EDITOR_FORMAT_MP3: { TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; // Bring the pointer to actual file type @@ -1647,16 +1728,12 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const int size = 0; char *type = NULL; - // Check if we have valid arguments to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); metadata_editor_retvm_if(path == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); ret = __metadata_editor_get_picture_info(path, &picture, &size, &type); metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); @@ -1792,15 +1869,11 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const // *** This function is used to delete picture with specified index *** // extern "C" int metadata_editor_remove_picture(metadata_editor_h metadata, int index) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID handler."); - + int ret = METADATA_EDITOR_ERROR_NONE; metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); switch (_metadata->filetype) { // Process the file according to the specified file type case METADATA_EDITOR_FORMAT_MP3: { -- 2.7.4