annotate foosdk/sdk/foobar2000/SDK/config_object.cpp @ 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 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "config_object_impl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "configStore.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 void config_object_notify_manager::g_on_changed(const service_ptr_t<config_object> & p_object)
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 if (core_api::assert_main_thread())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 for (auto ptr : enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 ptr->on_changed(p_object);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 bool config_object::g_find(service_ptr_t<config_object> & p_out,const GUID & p_guid)
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 for (auto ptr : enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (ptr->get_guid() == p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 p_out = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
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 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 void config_object::g_get_data_string(const GUID & p_guid,pfc::string_base & p_out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 service_ptr_t<config_object> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 if (!g_find(ptr,p_guid)) throw exception_service_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 ptr->get_data_string(p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 void config_object::g_set_data_string(const GUID & p_guid,const char * p_data,t_size p_length)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 service_ptr_t<config_object> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 if (!g_find(ptr,p_guid)) throw exception_service_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 ptr->set_data_string(p_data,p_length);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 void config_object::get_data_int32(t_int32 & p_out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 t_int32 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 get_data_struct_t<t_int32>(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 byte_order::order_le_to_native_t(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 p_out = temp;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 void config_object::set_data_int32(t_int32 p_val)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 t_int32 temp = p_val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 byte_order::order_native_to_le_t(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 set_data_struct_t<t_int32>(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 bool config_object::get_data_bool_simple(bool p_default) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 bool ret = p_default;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 get_data_bool(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 } catch(...) {return p_default;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 t_int32 config_object::get_data_int32_simple(t_int32 p_default) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 t_int32 ret = p_default;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 get_data_int32(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 } catch(...) {return p_default;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
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 void config_object::g_get_data_int32(const GUID & p_guid,t_int32 & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 service_ptr_t<config_object> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 if (!g_find(ptr,p_guid)) throw exception_service_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 ptr->get_data_int32(p_out);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 void config_object::g_set_data_int32(const GUID & p_guid,t_int32 p_val) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 service_ptr_t<config_object> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 if (!g_find(ptr,p_guid)) throw exception_service_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 ptr->set_data_int32(p_val);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 bool config_object::g_get_data_bool_simple(const GUID & p_guid,bool p_default)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 service_ptr_t<config_object> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 if (!g_find(ptr,p_guid)) throw exception_service_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 return ptr->get_data_bool_simple(p_default);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 t_int32 config_object::g_get_data_int32_simple(const GUID & p_guid,t_int32 p_default)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 service_ptr_t<config_object> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 if (!g_find(ptr,p_guid)) throw exception_service_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 return ptr->get_data_int32_simple(p_default);
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 void config_object::get_data_bool(bool & p_out) {get_data_struct_t<bool>(p_out);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 void config_object::set_data_bool(bool p_val) {set_data_struct_t<bool>(p_val);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 void config_object::g_get_data_bool(const GUID & p_guid,bool & p_out) {g_get_data_struct_t<bool>(p_guid,p_out);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 void config_object::g_set_data_bool(const GUID & p_guid,bool p_val) {g_set_data_struct_t<bool>(p_guid,p_val);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 class stream_writer_string : public stream_writer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 p_abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 m_out.add_string((const char*)p_buffer,p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 stream_writer_string(pfc::string_base & p_out) : m_out(p_out) {m_out.reset();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 pfc::string_base & m_out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 class stream_writer_fixedbuffer : public stream_writer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 p_abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 if (p_bytes > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 if (p_bytes > m_bytes - m_bytes_read) throw pfc::exception_overflow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 memcpy((t_uint8*)m_out,p_buffer,p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 m_bytes_read += p_bytes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 stream_writer_fixedbuffer(void * p_out,t_size p_bytes,t_size & p_bytes_read) : m_out(p_out), m_bytes(p_bytes), m_bytes_read(p_bytes_read) {m_bytes_read = 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 void * m_out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 t_size m_bytes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 t_size & m_bytes_read;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 class stream_writer_get_length : public stream_writer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 void write(const void * ,t_size p_bytes,abort_callback & p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 p_abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 m_length += p_bytes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 stream_writer_get_length(t_size & p_length) : m_length(p_length) {m_length = 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 t_size & m_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 t_size config_object::get_data_raw(void * p_out,t_size p_bytes) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 t_size ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 stream_writer_fixedbuffer stream(p_out,p_bytes,ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 get_data(&stream,fb2k::noAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 t_size config_object::get_data_raw_length() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 t_size ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 stream_writer_get_length stream(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 get_data(&stream,fb2k::noAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 void config_object::set_data_raw(const void * p_data,t_size p_bytes, bool p_notify) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 stream_reader_memblock_ref stream(p_data,p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 set_data(&stream,fb2k::noAbort,p_notify);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 void config_object::set_data_string(const char * p_data,t_size p_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 set_data_raw(p_data,pfc::strlen_max(p_data,p_length));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 void config_object::get_data_string(pfc::string_base & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 stream_writer_string stream(p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 get_data(&stream,fb2k::noAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 //config_object_impl stuff
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 #if FOOBAR2020
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 pfc::string8 config_object_impl::formatName() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 return pfc::format("config_object.", pfc::print_guid(get_guid()));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 void config_object_impl::get_data(stream_writer * p_stream,abort_callback & p_abort) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 auto blob = fb2k::configStore::get()->getConfigBlob(formatName(), m_initial);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 if (blob.is_valid()) p_stream->write(blob->data(), blob->size(), p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 void config_object_impl::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
188 core_api::ensure_main_thread();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 pfc::mem_block data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 enum {delta = 1024};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 t_uint8 buffer[delta];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 for(;;)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 t_size delta_done = p_stream->read(buffer,delta,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 if (delta_done > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 data.append_fromptr(buffer,delta_done);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 if (delta_done != delta) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 auto blob = fb2k::memBlock::blockWithData(std::move(data));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 fb2k::configStore::get()->setConfigBlob(formatName(), blob);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 if (p_notify) config_object_notify_manager::g_on_changed(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 config_object_impl::config_object_impl(const GUID & p_guid,const void * p_data,t_size p_bytes) : cfg_var_reader(p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 if (p_bytes > 0) m_initial = fb2k::makeMemBlock(p_data, p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 #else // FOOBAR2020
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 void config_object_impl::get_data(stream_writer* p_stream, abort_callback& p_abort) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 inReadSync(m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 p_stream->write_object(m_data.get_ptr(), m_data.get_size(), p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 void config_object_impl::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
224 core_api::ensure_main_thread();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 inWriteSync(m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 m_data.set_size(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 enum { delta = 1024 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 t_uint8 buffer[delta];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 for (;;)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 t_size delta_done = p_stream->read(buffer, delta, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 if (delta_done > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 m_data.append_fromptr(buffer, delta_done);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 if (delta_done != delta) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 if (p_notify) config_object_notify_manager::g_on_changed(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 config_object_impl::config_object_impl(const GUID& p_guid, const void* p_data, t_size p_bytes) : cfg_var(p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 m_data.set_data_fromptr((const t_uint8*)p_data, p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 #endif