annotate foosdk/sdk/foobar2000/SDK/config_object_impl.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "config_object.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "cfg_var_legacy.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //template function bodies from config_object class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 void config_object::get_data_struct_t(T& p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 if (get_data_raw(&p_out,sizeof(T)) != sizeof(T)) throw exception_io_data_truncation();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 void config_object::set_data_struct_t(const T& p_in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 return set_data_raw(&p_in,sizeof(T));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 void config_object::g_get_data_struct_t(const GUID & p_guid,T & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 service_ptr_t<config_object> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 if (!g_find(ptr,p_guid)) throw exception_service_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 return ptr->get_data_struct_t<T>(p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 void config_object::g_set_data_struct_t(const GUID & p_guid,const T & p_in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 service_ptr_t<config_object> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 if (!g_find(ptr,p_guid)) throw exception_service_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 return ptr->set_data_struct_t<T>(p_in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 #if FOOBAR2020
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 class config_object_impl : public config_object, private cfg_var_legacy::cfg_var_reader
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 GUID get_guid() const override {return cfg_var_reader::m_guid;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 void get_data(stream_writer * p_stream,abort_callback & p_abort) const override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 void set_data(stream_reader * p_stream,abort_callback & p_abort,bool p_notify) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 config_object_impl(const GUID & p_guid,const void * p_data,t_size p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 void set_data_raw(stream_reader * p_stream,t_size,abort_callback & p_abort) override {set_data(p_stream,p_abort,false);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 pfc::string8 formatName() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 fb2k::memBlockRef m_initial;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 class config_object_impl : public config_object, private cfg_var_legacy::cfg_var
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 GUID get_guid() const { return cfg_var::get_guid(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 void get_data(stream_writer* p_stream, abort_callback& p_abort) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 void set_data(stream_reader* p_stream, abort_callback& p_abort, bool p_notify);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 config_object_impl(const GUID& p_guid, const void* p_data, t_size p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 //cfg_var methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) { get_data(p_stream, p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) { set_data(p_stream, p_abort, false); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 mutable pfc::readWriteLock m_sync;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 pfc::array_t<t_uint8> m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 typedef service_factory_single_transparent_t<config_object_impl> config_object_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 class config_object_bool_factory : public config_object_factory {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 config_object_bool_factory(const GUID& id, bool def) : config_object_factory(id, &def, 1) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 class config_object_string_factory : public config_object_factory {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 config_object_string_factory(const GUID& id, const char * def) : config_object_factory(id, def, strlen(def)) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 class config_object_notify_impl_simple : public config_object_notify
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 t_size get_watched_object_count() override {return 1;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 GUID get_watched_object(t_size) override {return m_guid;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 void on_watched_object_changed(const service_ptr_t<config_object> & p_object) override {m_func(p_object);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 typedef void (*t_func)(const service_ptr_t<config_object> &);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 config_object_notify_impl_simple(const GUID & p_guid,t_func p_func) : m_guid(p_guid), m_func(p_func) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 GUID m_guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 t_func m_func;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 typedef service_factory_single_transparent_t<config_object_notify_impl_simple> config_object_notify_simple_factory;