annotate foosdk/sdk/foobar2000/SDK/service.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 "component.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 foobar2000_api * g_foobar2000_api = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 service_class_ref service_factory_base::enum_find_class(const GUID & p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 PFC_ASSERT(core_api::are_services_available() && g_foobar2000_api);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 return g_foobar2000_api->service_enum_find_class(p_guid);
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 bool service_factory_base::enum_create(service_ptr_t<service_base> & p_out,service_class_ref p_class,t_size p_index)
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 PFC_ASSERT(core_api::are_services_available() && g_foobar2000_api);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 return g_foobar2000_api->service_enum_create(p_out,p_class,p_index);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 t_size service_factory_base::enum_get_count(service_class_ref p_class)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 PFC_ASSERT(core_api::are_services_available() && g_foobar2000_api);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 return g_foobar2000_api->service_enum_get_count(p_class);
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 service_factory_base * service_factory_base::__internal__list = NULL;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 namespace service_impl_helper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 void release_object_delayed(service_base * ptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 ptr->service_add_ref();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 fb2k::inMainThread( [ptr] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 try { ptr->service_release(); } catch(...) {}
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 }
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
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 void _standard_api_create_internal(service_ptr & out, const GUID & classID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 service_class_ref c = service_factory_base::enum_find_class(classID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 switch(service_factory_base::enum_get_count(c)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 case 0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 if ( core_api::are_services_available() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 FB2K_DebugLog() << "Service not found of type: " << pfc::print_guid(classID);
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 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 throw exception_service_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 case 1:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 PFC_ASSERT_SUCCESS( service_factory_base::enum_create(out, c, 0) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 throw exception_service_duplicated();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
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 _standard_api_try_get_internal(service_ptr & out, const GUID & classID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 service_class_ref c = service_factory_base::enum_find_class(classID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 switch (service_factory_base::enum_get_count(c)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 case 1:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 PFC_ASSERT_SUCCESS(service_factory_base::enum_create(out, c, 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 return 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 }
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 void _standard_api_get_internal(service_ptr & out, const GUID & classID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if (!_standard_api_try_get_internal(out, classID) ) uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }