diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/Metadata.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/Winamp/Metadata.cpp')
-rw-r--r-- | Src/Winamp/Metadata.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/Src/Winamp/Metadata.cpp b/Src/Winamp/Metadata.cpp new file mode 100644 index 00000000..7c316dc5 --- /dev/null +++ b/Src/Winamp/Metadata.cpp @@ -0,0 +1,117 @@ +#include "main.h" +#include "Metadata.h" +#include "api.h" +#include <api/service/waservicefactory.h> + +/** + ** Author: Ben Allison + ** original date: April 10, 2006 + */ +Metadata::~Metadata() +{ + for ( wchar_t *l_key : keys ) + free( l_key ); + + keys.clear(); +} + +int Metadata::GetExtendedFileInfo(const wchar_t *filename, const wchar_t *tag, wchar_t *data, size_t dataLength) +{ + // benski> old way CUT: return in_get_extended_fileinfoW(filename, tag, data, dataLength); +/* + int result = 0; // failure + svc_metaTag *metaTag = GetMetaTagObject(filename, METATAG_ALL, 0, 0); + if (metaTag) + { + if (metaTag->metaTag_open(filename) == METATAG_SUCCESS) + metaTag->getMetaData(tag, reinterpret_cast<__int8 *>(data), dataLength*sizeof(wchar_t), METATYPE_STRING); + + metaTag->metaTag_close(); + } + else // TODO: we could get rid of this as soon as we make extendedMetaTag (see TODO at end of file) + */ + return in_get_extended_fileinfoW(filename, tag, data, dataLength); + + //return !!(result == METATAG_SUCCESS); +} + +int Metadata::SetExtendedFileInfo(const wchar_t *filename, const wchar_t *tag, const wchar_t *data) +{ + return in_set_extended_fileinfoW(filename, tag, const_cast<wchar_t *>(data)); +} + +int Metadata::WriteExtendedFileInfo(const wchar_t *filename) +{ + return in_write_extended_fileinfo(); +} + +inline static bool InList(const GUID guid, GUID *exclude, int numExcludes) +{ + if (!exclude) + return false; + while (numExcludes--) + { + if (guid == exclude[numExcludes]) + return true; + } + return false; +} + +svc_metaTag *Metadata::GetMetaTagObject(const wchar_t *filename, int flags, GUID *exclude, int numExcludes) +{ + int i = 0; + waServiceFactory *sf = 0; + do + { + sf = WASABI_API_SVC->service_enumService(WaSvc::METATAG, i++); + if (sf) + { + svc_metaTag *metaTag = static_cast<svc_metaTag *>(sf->getInterface()); + if (metaTag + && !InList(metaTag->getGUID(), exclude, numExcludes) + && flags & metaTag->getFlags() + && metaTag->isOurFile(filename)) + return metaTag; + + sf->releaseInterface(metaTag); + } + + } + while (sf); + return 0; +} + +svc_metaTag *Metadata::GetMetaTagObjectByGUID(const GUID metaTagGuid) +{ + waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(metaTagGuid); + if (sf && sf->getServiceType() == WaSvc::METATAG) // just to be safe + return static_cast<svc_metaTag *>(sf->getInterface()); + + return NULL; +} + +uint32_t Metadata::GenerateKey(const wchar_t *field) +{ + Nullsoft::Utility::AutoLock keyLock(keyGuard); + // TODO this is hella slow but it'll get the ball rolling on implementing this + for (size_t i=0;i!=keys.size();i++) + { + if (!_wcsicmp(field, keys[i])) + return (uint32_t)i; + } + + keys.push_back(_wcsdup(field)); + return (uint32_t)keys.size()-1; +} +// TODO: extendedMetaTag, derived from svc_metaTag, that uses getExtendedFileInfo + +#define CBCLASS Metadata +START_DISPATCH; +CB(API_METADATA_GETEXTENDEDFILEINFO, GetExtendedFileInfo) +CB(API_METADATA_SETEXTENDEDFILEINFO, SetExtendedFileInfo) +CB(API_METADATA_WRITEEXTENDEDFILEINFO, WriteExtendedFileInfo) +CB(API_METADATA_GETMETATAGOBJECT, GetMetaTagObject) +CB(API_METADATA_GETMETATAGOBJECTBYGUID, GetMetaTagObjectByGUID) +CB(API_METADATA_GENERATEKEY, GenerateKey) +END_DISPATCH; +#undef CBCLASS
\ No newline at end of file |