winamp/Src/replicant/nswasabi/MetadataChain.h

98 lines
2.5 KiB
C
Raw Normal View History

2024-09-24 13:54:57 +01:00
#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; }
};