00001
00002
00003
00004 class NOVTABLE 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 bool g_find(service_ptr_t<advconfig_entry>& out, const GUID & id) {
00013 service_enum_t<advconfig_entry> e; service_ptr_t<advconfig_entry> ptr; while(e.next(ptr)) { if (ptr->get_guid() == id) {out = ptr; return true;} } return false;
00014 }
00015
00016 static const GUID guid_root;
00017 static const GUID guid_branch_tagging,guid_branch_decoding,guid_branch_tools,guid_branch_playback,guid_branch_display;
00018
00019 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(advconfig_entry);
00020 };
00021
00024 class NOVTABLE advconfig_branch : public advconfig_entry {
00025 public:
00026 FB2K_MAKE_SERVICE_INTERFACE(advconfig_branch,advconfig_entry);
00027 };
00028
00032 class NOVTABLE advconfig_entry_checkbox : public advconfig_entry {
00033 public:
00034 virtual bool get_state() = 0;
00035 virtual void set_state(bool p_state) = 0;
00036 virtual bool is_radio() = 0;
00037
00038 FB2K_MAKE_SERVICE_INTERFACE(advconfig_entry_checkbox,advconfig_entry);
00039 };
00040
00043 class NOVTABLE advconfig_entry_string : public advconfig_entry {
00044 public:
00045 virtual void get_state(pfc::string_base & p_out) = 0;
00046 virtual void set_state(const char * p_string,t_size p_length = infinite) = 0;
00047 virtual t_uint32 get_flags() = 0;
00048
00049 enum {
00050 flag_is_integer = 1 << 0,
00051 flag_is_signed = 1 << 1,
00052 };
00053
00054 FB2K_MAKE_SERVICE_INTERFACE(advconfig_entry_string,advconfig_entry);
00055 };
00056
00057
00060 class advconfig_branch_impl : public advconfig_branch {
00061 public:
00062 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) {}
00063 void get_name(pfc::string_base & p_out) {p_out = m_name;}
00064 GUID get_guid() {return m_guid;}
00065 GUID get_parent() {return m_parent;}
00066 void reset() {}
00067 double get_sort_priority() {return m_priority;}
00068 private:
00069 pfc::string8 m_name;
00070 GUID m_guid,m_parent;
00071 const double m_priority;
00072 };
00073
00076 template<bool p_is_radio = false>
00077 class advconfig_entry_checkbox_impl : public advconfig_entry_checkbox {
00078 public:
00079 advconfig_entry_checkbox_impl(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,bool p_initialstate)
00080 : m_name(p_name), m_initialstate(p_initialstate), m_state(p_guid,p_initialstate), m_parent(p_parent), m_priority(p_priority) {}
00081
00082 void get_name(pfc::string_base & p_out) {p_out = m_name;}
00083 GUID get_guid() {return m_state.get_guid();}
00084 GUID get_parent() {return m_parent;}
00085 void reset() {m_state = m_initialstate;}
00086 bool get_state() {return m_state;}
00087 void set_state(bool p_state) {m_state = p_state;}
00088 bool is_radio() {return p_is_radio;}
00089 double get_sort_priority() {return m_priority;}
00090 private:
00091 pfc::string8 m_name;
00092 const bool m_initialstate;
00093 cfg_bool m_state;
00094 GUID m_parent;
00095 const double m_priority;
00096 };
00097
00100 class advconfig_branch_factory : public service_factory_single_t<advconfig_branch_impl> {
00101 public:
00102 advconfig_branch_factory(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority)
00103 : service_factory_single_t<advconfig_branch_impl>(p_name,p_guid,p_parent,p_priority) {}
00104 };
00105
00108 template<bool p_is_radio>
00109 class advconfig_checkbox_factory_t : public service_factory_single_t<advconfig_entry_checkbox_impl<p_is_radio> > {
00110 public:
00111 advconfig_checkbox_factory_t(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,bool p_initialstate)
00112 : service_factory_single_t<advconfig_entry_checkbox_impl<p_is_radio> >(p_name,p_guid,p_parent,p_priority,p_initialstate) {}
00113 };
00114
00116 typedef advconfig_checkbox_factory_t<false> advconfig_checkbox_factory;
00118 typedef advconfig_checkbox_factory_t<true> advconfig_radio_factory;
00119
00120
00122 class advconfig_entry_string_impl : public advconfig_entry_string {
00123 public:
00124 advconfig_entry_string_impl(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,const char * p_initialstate)
00125 : m_name(p_name), m_parent(p_parent), m_priority(p_priority), m_initialstate(p_initialstate), m_state(p_guid,p_initialstate) {}
00126 void get_name(pfc::string_base & p_out) {p_out = m_name;}
00127 GUID get_guid() {return m_state.get_guid();}
00128 GUID get_parent() {return m_parent;}
00129 void reset() {core_api::ensure_main_thread();m_state = m_initialstate;}
00130 double get_sort_priority() {return m_priority;}
00131 void get_state(pfc::string_base & p_out) {core_api::ensure_main_thread();p_out = m_state;}
00132 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);}
00133 t_uint32 get_flags() {return 0;}
00134 private:
00135 const pfc::string8 m_initialstate, m_name;
00136 cfg_string m_state;
00137 const double m_priority;
00138 const GUID m_parent;
00139 };
00140
00143 class advconfig_string_factory : public service_factory_single_t<advconfig_entry_string_impl> {
00144 public:
00145 advconfig_string_factory(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,const char * p_initialstate)
00146 : service_factory_single_t<advconfig_entry_string_impl>(p_name,p_guid,p_parent,p_priority,p_initialstate) {}
00147 };
00148
00149
00151 class advconfig_entry_integer_impl : public advconfig_entry_string {
00152 public:
00153 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)
00154 : 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) {}
00155 void get_name(pfc::string_base & p_out) {p_out = m_name;}
00156 GUID get_guid() {return m_state.get_guid();}
00157 GUID get_parent() {return m_parent;}
00158 void reset() {m_state = m_initval;}
00159 double get_sort_priority() {return m_priority;}
00160 void get_state(pfc::string_base & p_out) {p_out = pfc::format_uint(m_state.get_value());}
00161 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);}
00162 t_uint32 get_flags() {return advconfig_entry_string::flag_is_integer;}
00163
00164 t_uint64 get_state_int() const {return m_state;}
00165 private:
00166 cfg_int_t<t_uint64> m_state;
00167 const double m_priority;
00168 const t_uint64 m_initval, m_min, m_max;
00169 const GUID m_parent;
00170 const pfc::string8 m_name;
00171 };
00172
00175 class advconfig_integer_factory : public service_factory_single_t<advconfig_entry_integer_impl> {
00176 public:
00177 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)
00178 : service_factory_single_t<advconfig_entry_integer_impl>(p_name,p_guid,p_parent,p_priority,p_initialstate,p_min,p_max) {}
00179 };
00180
00181
00183 class NOVTABLE advconfig_entry_enum : public advconfig_entry {
00184 public:
00185 virtual t_size get_value_count() = 0;
00186 virtual void enum_value(pfc::string_base & p_out,t_size p_index) = 0;
00187 virtual t_size get_state() = 0;
00188 virtual void set_state(t_size p_value) = 0;
00189
00190 FB2K_MAKE_SERVICE_INTERFACE(advconfig_entry_enum,advconfig_entry);
00191 };
00192
00193
00194
00195
00197 class advconfig_entry_string_impl_MT : public advconfig_entry_string {
00198 public:
00199 advconfig_entry_string_impl_MT(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,const char * p_initialstate)
00200 : m_name(p_name), m_parent(p_parent), m_priority(p_priority), m_initialstate(p_initialstate), m_state(p_guid,p_initialstate) {}
00201 void get_name(pfc::string_base & p_out) {p_out = m_name;}
00202 GUID get_guid() {return m_state.get_guid();}
00203 GUID get_parent() {return m_parent;}
00204 void reset() {
00205 insync(m_sync);
00206 m_state = m_initialstate;
00207 }
00208 double get_sort_priority() {return m_priority;}
00209 void get_state(pfc::string_base & p_out) {
00210 insync(m_sync);
00211 p_out = m_state;
00212 }
00213 void set_state(const char * p_string,t_size p_length = infinite) {
00214 insync(m_sync);
00215 m_state.set_string(p_string,p_length);
00216 }
00217 t_uint32 get_flags() {return 0;}
00218 private:
00219 const pfc::string8 m_initialstate, m_name;
00220 cfg_string m_state;
00221 critical_section m_sync;
00222 const double m_priority;
00223 const GUID m_parent;
00224 };
00225
00227 class advconfig_string_factory_MT : public service_factory_single_t<advconfig_entry_string_impl_MT> {
00228 public:
00229 advconfig_string_factory_MT(const char * p_name,const GUID & p_guid,const GUID & p_parent,double p_priority,const char * p_initialstate)
00230 : service_factory_single_t<advconfig_entry_string_impl_MT>(p_name,p_guid,p_parent,p_priority,p_initialstate) {}
00231 };