annotate foosdk/sdk/foobar2000/SDK/componentversion.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 //! Entrypoint interface for declaring component's version information. Instead of implementing this directly, use DECLARE_COMPONENT_VERSION().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 class NOVTABLE componentversion : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 virtual void get_file_name(pfc::string_base & out)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 virtual void get_component_name(pfc::string_base & out)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 virtual void get_component_version(pfc::string_base & out)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 virtual void get_about_message(pfc::string_base & out)=0;//about message uses "\n" for line separators
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 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(componentversion);
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 //! Implementation helper. You typically want to use DECLARE_COMPONENT_VERSION() instead.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 class componentversion_impl_simple : public componentversion {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 const char * name,*version,*about;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 //do not derive/override
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 virtual void get_file_name(pfc::string_base & out) {out.set_string(core_api::get_my_file_name());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 virtual void get_component_name(pfc::string_base & out) {out.set_string(name?name:"");}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 virtual void get_component_version(pfc::string_base & out) {out.set_string(version?version:"");}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 virtual void get_about_message(pfc::string_base & out) {out.set_string(about?about:"");}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 explicit componentversion_impl_simple(const char * p_name,const char * p_version,const char * p_about) : name(p_name), version(p_version), about(p_about ? p_about : "") {}
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 //! Implementation helper. You typically want to use DECLARE_COMPONENT_VERSION() instead.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 class componentversion_impl_copy : public componentversion {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 pfc::string8 name,version,about;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //do not derive/override
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 virtual void get_file_name(pfc::string_base & out) {out.set_string(core_api::get_my_file_name());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 virtual void get_component_name(pfc::string_base & out) {out.set_string(name);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 virtual void get_component_version(pfc::string_base & out) {out.set_string(version);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 virtual void get_about_message(pfc::string_base & out) {out.set_string(about);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 explicit componentversion_impl_copy(const char * p_name,const char * p_version,const char * p_about) : name(p_name), version(p_version), about(p_about ? p_about : "") {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 typedef service_factory_single_transparent_t<componentversion_impl_simple> __componentversion_impl_simple_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 typedef service_factory_single_transparent_t<componentversion_impl_copy> __componentversion_impl_copy_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 class componentversion_impl_simple_factory : public __componentversion_impl_simple_factory {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 componentversion_impl_simple_factory(const char * p_name,const char * p_version,const char * p_about) : __componentversion_impl_simple_factory(p_name,p_version,p_about) {}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 class componentversion_impl_copy_factory : public __componentversion_impl_copy_factory {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 componentversion_impl_copy_factory(const char * p_name,const char * p_version,const char * p_about) : __componentversion_impl_copy_factory(p_name,p_version,p_about) {}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! Use this to declare your component's version information. Parameters must ba plain const char * string constants. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 //! You should have only one DECLARE_COMPONENT_VERSION() per component DLL. Having more than one will confuse component updater's version matching. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! Please keep your version numbers formatted as: N[.N[.N....]][ alpha|beta|RC[ N[.N...]] \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 //! Sample version numbers, in ascending order: 0.9 < 0.10 < 1.0 alpha 1 < 1.0 alpha 2 < 1.0 beta 1 < 1.0 RC < 1.0 RC1 < 1.0 < 1.1 < 1.10 \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 //! For a working sample of how foobar2000 sorts version numbers, see http://www.foobar2000.org/versionator.php \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 //! Example: DECLARE_COMPONENT_VERSION("blah","1.3.3.7","")
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 #define DECLARE_COMPONENT_VERSION(NAME,VERSION,ABOUT) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 namespace {class componentversion_myimpl : public componentversion { public: componentversion_myimpl() {PFC_ASSERT( ABOUT );} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 void get_file_name(pfc::string_base & out) {out = core_api::get_my_file_name();} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 void get_component_name(pfc::string_base & out) {out = NAME;} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 void get_component_version(pfc::string_base & out) {out = VERSION;} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 void get_about_message(pfc::string_base & out) {out = ABOUT;} \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }; static service_factory_single_t<componentversion_myimpl> g_componentversion_myimpl_factory; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 // static componentversion_impl_simple_factory g_componentversion_service(NAME,VERSION,ABOUT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 //! Same as DECLARE_COMPONENT_VERSION(), but parameters can be dynamically generated strings rather than compile-time constants.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 #define DECLARE_COMPONENT_VERSION_COPY(NAME,VERSION,ABOUT) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 static componentversion_impl_copy_factory g_componentversion_service(NAME,VERSION,ABOUT);
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 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 //! Allows components to cleanly abort app startup in case the installation appears to have become corrupted.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 class component_installation_validator : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 virtual bool is_installed_correctly() = 0;
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 static bool test_my_name(const char * fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 static bool have_other_file(const char * fn);
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 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(component_installation_validator)
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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 //! Simple implementation of component_installation_validator that makes sure that our component DLL has not been renamed around by idiot users.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 class component_installation_validator_filename : public component_installation_validator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 component_installation_validator_filename(const char * dllName) : m_dllName(dllName) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 bool is_installed_correctly() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 return test_my_name(m_dllName);
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 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 const char * const m_dllName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 #define VALIDATE_COMPONENT_FILENAME(FN) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 static service_factory_single_t<component_installation_validator_filename> g_component_installation_validator_filename(FN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 #else // _WIN32
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 #define VALIDATE_COMPONENT_FILENAME(FN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 #endif // _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103