Mercurial > foo_out_sdl
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/SDK/service.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,68 @@ +#include "foobar2000-sdk-pch.h" +#include "component.h" + +foobar2000_api * g_foobar2000_api = NULL; + +service_class_ref service_factory_base::enum_find_class(const GUID & p_guid) +{ + PFC_ASSERT(core_api::are_services_available() && g_foobar2000_api); + return g_foobar2000_api->service_enum_find_class(p_guid); +} + +bool service_factory_base::enum_create(service_ptr_t<service_base> & p_out,service_class_ref p_class,t_size p_index) +{ + PFC_ASSERT(core_api::are_services_available() && g_foobar2000_api); + return g_foobar2000_api->service_enum_create(p_out,p_class,p_index); +} + +t_size service_factory_base::enum_get_count(service_class_ref p_class) +{ + PFC_ASSERT(core_api::are_services_available() && g_foobar2000_api); + return g_foobar2000_api->service_enum_get_count(p_class); +} + +service_factory_base * service_factory_base::__internal__list = NULL; + + +namespace service_impl_helper { + void release_object_delayed(service_base * ptr) { + ptr->service_add_ref(); + fb2k::inMainThread( [ptr] { + try { ptr->service_release(); } catch(...) {} + } ); + } +}; + + +void _standard_api_create_internal(service_ptr & out, const GUID & classID) { + service_class_ref c = service_factory_base::enum_find_class(classID); + switch(service_factory_base::enum_get_count(c)) { + case 0: +#if PFC_DEBUG + if ( core_api::are_services_available() ) { + FB2K_DebugLog() << "Service not found of type: " << pfc::print_guid(classID); + } +#endif + throw exception_service_not_found(); + case 1: + PFC_ASSERT_SUCCESS( service_factory_base::enum_create(out, c, 0) ); + break; + default: + throw exception_service_duplicated(); + } +} + +bool _standard_api_try_get_internal(service_ptr & out, const GUID & classID) { + service_class_ref c = service_factory_base::enum_find_class(classID); + switch (service_factory_base::enum_get_count(c)) { + case 1: + PFC_ASSERT_SUCCESS(service_factory_base::enum_create(out, c, 0)); + return true; + default: + return false; + } +} + +void _standard_api_get_internal(service_ptr & out, const GUID & classID) { + if (!_standard_api_try_get_internal(out, classID) ) uBugCheck(); +} \ No newline at end of file
