aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nswasabi/MetadataChain.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/replicant/nswasabi/MetadataChain.h')
-rw-r--r--Src/replicant/nswasabi/MetadataChain.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/Src/replicant/nswasabi/MetadataChain.h b/Src/replicant/nswasabi/MetadataChain.h
new file mode 100644
index 00000000..cc6de698
--- /dev/null
+++ b/Src/replicant/nswasabi/MetadataChain.h
@@ -0,0 +1,97 @@
+#pragma once
+#include "metadata/ifc_metadata.h"
+
+
+template <class metadata_t>
+class MetadataChain : public metadata_t
+{
+public:
+ MetadataChain()
+ {
+ parent_metadata=0;
+ }
+
+ ~MetadataChain()
+ {
+ if (parent_metadata)
+ parent_metadata->Release();
+ }
+
+ static bool Unhandled(ns_error_t ret)
+ {
+ return (ret == NErr_NotImplemented || ret == NErr_Empty || ret == NErr_Unknown);
+ }
+
+ ns_error_t SetParentMetadata(ifc_metadata *new_parent_metadata)
+ {
+ if (parent_metadata)
+ parent_metadata->Release();
+ parent_metadata=new_parent_metadata;
+ if (parent_metadata)
+ parent_metadata->Retain();
+ return NErr_Success;
+ }
+protected:
+ ifc_metadata *parent_metadata;
+private:
+ ns_error_t WASABICALL Metadata_GetField(int field, unsigned int index, nx_string_t *value)
+ {
+ ns_error_t ret = metadata_t::Metadata_GetField(field, index, value);
+ if (Unhandled(ret) && parent_metadata)
+ return parent_metadata->GetField(field, index, value);
+ else
+ return ret;
+
+ }
+
+ ns_error_t WASABICALL Metadata_GetInteger(int field, unsigned int index, int64_t *value)
+ {
+ ns_error_t ret = metadata_t::Metadata_GetInteger(field, index, value);
+ if (Unhandled(ret) && parent_metadata)
+ return parent_metadata->GetInteger(field, index, value);
+ else
+ return ret;
+
+ }
+
+ ns_error_t WASABICALL Metadata_GetReal(int field, unsigned int index, double *value)
+ {
+ ns_error_t ret = metadata_t::Metadata_GetReal(field, index, value);
+ if (Unhandled(ret) && parent_metadata)
+ return parent_metadata->GetReal(field, index, value);
+ else
+ return ret;
+
+ }
+
+ ns_error_t WASABICALL Metadata_GetArtwork(int field, unsigned int index, artwork_t *artwork, data_flags_t flags)
+ {
+ ns_error_t ret = metadata_t::Metadata_GetArtwork(field, index, artwork, flags);
+ if (Unhandled(ret) && parent_metadata)
+ return parent_metadata->GetArtwork(field, index, artwork, flags);
+ else
+ return ret;
+
+ }
+
+ ns_error_t WASABICALL Metadata_GetBinary(int field, unsigned int index, nx_data_t *data)
+ {
+ ns_error_t ret = metadata_t::Metadata_GetBinary(field, index, data);
+ if (Unhandled(ret) && parent_metadata)
+ return parent_metadata->GetBinary(field, index, data);
+ else
+ return ret;
+
+ }
+
+ ns_error_t WASABICALL Metadata_GetMetadata(int field, unsigned int index, ifc_metadata **metadata)
+ {
+ ns_error_t ret = metadata_t::Metadata_GetMetadata(field, index, metadata);
+ if (Unhandled(ret) && parent_metadata)
+ return parent_metadata->GetMetadata(field, index, metadata);
+ else
+ return ret;
+
+ }
+ // TODO: ns_error_t WASABICALL Metadata_Serialize(nx_data_t *data) { return NErr_NotImplemented; }
+};