aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/Metadata.cpp
diff options
context:
space:
mode:
authorJean-Francois Mauguit <jfmauguit@mac.com>2024-09-24 09:03:25 -0400
committerGitHub <noreply@github.com>2024-09-24 09:03:25 -0400
commitbab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/Metadata.cpp
parent4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff)
parent20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff)
downloadwinamp-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.cpp117
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