00001 #ifndef _FOOBAR2000_SDK_ADVCONFIG_H_
00002 #define _FOOBAR2000_SDK_ADVCONFIG_H_
00003
00004 class advconfig_entry : public service_base {
00005 public:
00006 virtual void get_name(pfc::string_base & p_out) = 0;
00007 virtual GUID get_guid() = 0;
00008 virtual GUID get_parent() = 0;
00009 virtual void reset() = 0;
00010 virtual double get_sort_priority() = 0;
00011
00012 static const GUID guid_root;
00013 static const GUID guid_branch_tagging,guid_branch_decoding,guid_branch_tools,guid_branch_playback,guid_branch_display;
00014
00015 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(advconfig_entry);
00016 };
00017
00018 class advconfig_branch : public advconfig_entry {
00019 public:
00020 FB2K_MAKE_SERVICE_INTERFACE(advconfig_branch,advconfig_entry);
00021 };
00022
00023 class advconfig_entry_checkbox : public advconfig_entry {
00024 public:
00025 virtual bool get_state() = 0;
00026 virtual void set_state(bool p_state) = 0;
00027 virtual bool is_radio() = 0;
00028
00029 FB2K_MAKE_SERVICE_INTERFACE(advconfig_entry_checkbox,advconfig_entry);
00030 };
00031
00032 class advconfig_entry_string : public advconfig_entry {
00033 public:
00034 virtual void get_state(pfc::string_base & p_out) = 0;
00035 virtual void set_state(const char * p_string,t_size p_length = infinite) = 0;
00036 virtual t_uint32 get_flags() = 0;
00037
00038 enum {
00039 flag_is_integer = 1 << 0,
00040 flag_is_signed = 1 << 1,
00041 };
00042
00043 FB2K_MAKE_SERVICE_INTERFACE(advconfig_entry_string,advconfig_entry);
00044 };
00045
00046
00047 class advconfig_branch_impl : public advconfig_branch {
00048 public:
00049 advconfig_branch_impl(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority) : m_name(p_name), m_guid(p_guid), m_parent(p_parent), m_priority(p_priority) {}
00050 void get_name(pfc::string_base & p_out) {p_out = m_name;}
00051 GUID get_guid() {return m_guid;}
00052 GUID get_parent() {return m_parent;}
00053 void reset() {}
00054 double get_sort_priority() {return m_priority;}
00055 private:
00056 pfc::string8 m_name;
00057 GUID m_guid,m_parent;
00058 const double m_priority;
00059 };
00060
00061 template<bool p_is_radio = false>
00062 class advconfig_entry_checkbox_impl : public advconfig_entry_checkbox {
00063 public:
00064 advconfig_entry_checkbox_impl(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,bool p_initialstate)
00065 : m_name(p_name), m_initialstate(p_initialstate), m_state(p_guid,p_initialstate), m_parent(p_parent), m_priority(p_priority) {}
00066
00067 void get_name(pfc::string_base & p_out) {p_out = m_name;}
00068 GUID get_guid() {return m_state.get_guid();}
00069 GUID get_parent() {return m_parent;}
00070 void reset() {m_state = m_initialstate;}
00071 bool get_state() {return m_state;}
00072 void set_state(bool p_state) {m_state = p_state;}
00073 bool is_radio() {return p_is_radio;}
00074 double get_sort_priority() {return m_priority;}
00075 private:
00076 pfc::string8 m_name;
00077 const bool m_initialstate;
00078 cfg_bool m_state;
00079 GUID m_parent;
00080 const double m_priority;
00081 };
00082
00083 class advconfig_branch_factory : public service_factory_single_t<advconfig_branch_impl> {
00084 public:
00085 advconfig_branch_factory(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority)
00086 : service_factory_single_t<advconfig_branch_impl>(p_name,p_guid,p_parent,p_priority) {}
00087 };
00088
00089 template<bool p_is_radio>
00090 class advconfig_checkbox_factory_t : public service_factory_single_t<advconfig_entry_checkbox_impl<p_is_radio> > {
00091 public:
00092 advconfig_checkbox_factory_t(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,bool p_initialstate)
00093 : service_factory_single_t<advconfig_entry_checkbox_impl<p_is_radio> >(p_name,p_guid,p_parent,p_priority,p_initialstate) {}
00094 };
00095
00096 typedef advconfig_checkbox_factory_t<false> advconfig_checkbox_factory;
00097 typedef advconfig_checkbox_factory_t<true> advconfig_radio_factory;
00098
00099 class advconfig_entry_string_impl : public advconfig_entry_string {
00100 public:
00101 advconfig_entry_string_impl(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,const char * p_initialstate)
00102 : m_name(p_name), m_parent(p_parent), m_priority(p_priority), m_initialstate(p_initialstate), m_state(p_guid,p_initialstate) {}
00103 void get_name(pfc::string_base & p_out) {p_out = m_name;}
00104 GUID get_guid() {return m_state.get_guid();}
00105 GUID get_parent() {return m_parent;}
00106 void reset() {core_api::ensure_main_thread();m_state = m_initialstate;}
00107 double get_sort_priority() {return m_priority;}
00108 void get_state(pfc::string_base & p_out) {core_api::ensure_main_thread();p_out = m_state;}
00109 void set_state(const char * p_string,t_size p_length = infinite) {core_api::ensure_main_thread();m_state.set_string(p_string,p_length);}
00110 t_uint32 get_flags() {return 0;}
00111 private:
00112 const pfc::string8 m_initialstate, m_name;
00113 cfg_string m_state;
00114 const double m_priority;
00115 const GUID m_parent;
00116 };
00117
00118 class advconfig_string_factory : public service_factory_single_t<advconfig_entry_string_impl> {
00119 public:
00120 advconfig_string_factory(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,const char * p_initialstate)
00121 : service_factory_single_t<advconfig_entry_string_impl>(p_name,p_guid,p_parent,p_priority,p_initialstate) {}
00122 };
00123
00124
00125 class advconfig_entry_integer_impl : public advconfig_entry_string {
00126 public:
00127 advconfig_entry_integer_impl(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,t_uint64 p_initialstate,t_uint64 p_min,t_uint64 p_max)
00128 : m_name(p_name), m_parent(p_parent), m_priority(p_priority), m_initval(p_initialstate), m_min(p_min), m_max(p_max), m_state(p_guid,p_initialstate) {}
00129 void get_name(pfc::string_base & p_out) {p_out = m_name;}
00130 GUID get_guid() {return m_state.get_guid();}
00131 GUID get_parent() {return m_parent;}
00132 void reset() {m_state = m_initval;}
00133 double get_sort_priority() {return m_priority;}
00134 void get_state(pfc::string_base & p_out) {p_out = pfc::format_uint(m_state.get_value());}
00135 void set_state(const char * p_string,t_size p_length) {m_state = pfc::clip_t<t_uint64>(pfc::atoui64_ex(p_string,p_length),m_min,m_max);}
00136 t_uint32 get_flags() {return advconfig_entry_string::flag_is_integer;}
00137
00138 t_uint64 get_state_int() const {return m_state;}
00139 private:
00140 cfg_int_t<t_uint64> m_state;
00141 const double m_priority;
00142 const t_uint64 m_initval, m_min, m_max;
00143 const GUID m_parent;
00144 const pfc::string8 m_name;
00145 };
00146
00147 class advconfig_integer_factory : public service_factory_single_t<advconfig_entry_integer_impl> {
00148 public:
00149 advconfig_integer_factory(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,t_uint64 p_initialstate,t_uint64 p_min,t_uint64 p_max)
00150 : service_factory_single_t<advconfig_entry_integer_impl>(p_name,p_guid,p_parent,p_priority,p_initialstate,p_min,p_max) {}
00151 };
00152
00153
00154 class advconfig_entry_enum : public advconfig_entry {
00155 public:
00156 virtual t_size get_value_count() = 0;
00157 virtual void enum_value(pfc::string_base & p_out,t_size p_index) = 0;
00158 virtual t_size get_state() = 0;
00159 virtual void set_state(t_size p_value) = 0;
00160
00161 FB2K_MAKE_SERVICE_INTERFACE(advconfig_entry_enum,advconfig_entry);
00162 };
00163
00164 #endif //_FOOBAR2000_SDK_ADVCONFIG_H_