21#include <winpr/config.h>
23#include <winpr/buildflags.h>
28#include <winpr/string.h>
29#include <winpr/winpr.h>
30#include <winpr/version.h>
31#include <winpr/wlog.h>
32#include <winpr/file.h>
33#include <winpr/build-config.h>
41static INIT_ONCE s_winpr_app_details_once = INIT_ONCE_STATIC_INIT;
42static char s_winpr_vendor_string[MAX_PATH] = { 0 };
43static char s_winpr_product_string[MAX_PATH] = { 0 };
44static SSIZE_T s_winpr_version = -1;
45static BOOL s_winpr_app_details_are_custom = FALSE;
47static BOOL CALLBACK init_app_details(WINPR_ATTR_UNUSED
PINIT_ONCE once,
48 WINPR_ATTR_UNUSED PVOID param,
49 WINPR_ATTR_UNUSED PVOID* context)
51 const size_t vlen =
sizeof(WINPR_VENDOR_STRING);
52 const size_t plen =
sizeof(WINPR_PRODUCT_STRING);
53 if (!strncpy(s_winpr_vendor_string, WINPR_VENDOR_STRING, vlen))
56 if (!strncpy(s_winpr_product_string, WINPR_PRODUCT_STRING, plen))
59#if defined(WITH_RESOURCE_VERSIONING)
60 s_winpr_version = WINPR_VERSION_MAJOR;
67static WINPR_ATTR_NODISCARD BOOL initializeApplicationDetails(
void)
69 InitOnceExecuteOnce(&s_winpr_app_details_once, init_app_details, NULL, NULL);
73BOOL winpr_setApplicationDetails(
const char* vendor,
const char* product, SSIZE_T version)
75 if (!initializeApplicationDetails())
78 if (!vendor || !product)
80 const size_t vlen = strnlen(vendor, MAX_PATH);
81 const size_t plen = strnlen(product, MAX_PATH);
82 if ((vlen == MAX_PATH) || (plen == MAX_PATH))
85 if (!strncpy(s_winpr_vendor_string, vendor, vlen + 1))
88 if (!strncpy(s_winpr_product_string, product, plen + 1))
91 s_winpr_version = version;
92 s_winpr_app_details_are_custom = TRUE;
96const char* winpr_getApplicationDetailsVendor(
void)
98 if (!initializeApplicationDetails())
100 return s_winpr_vendor_string;
103const char* winpr_getApplicationDetailsProduct(
void)
105 if (!initializeApplicationDetails())
107 return s_winpr_product_string;
110char* winpr_getApplicatonDetailsRegKey(
const char* fmt)
112 char* val = winpr_getApplicatonDetailsCombined(
'\\');
118 (void)winpr_asprintf(&str, &slen, fmt, val);
123char* winpr_getApplicatonDetailsCombined(
char separator)
125 const SSIZE_T version = winpr_getApplicationDetailsVersion();
126 const char* vendor = winpr_getApplicationDetailsVendor();
127 const char* product = winpr_getApplicationDetailsProduct();
133 (void)winpr_asprintf(&str, &slen,
"%s%c%s", vendor, separator, product);
137 (void)winpr_asprintf(&str, &slen,
"%s%c%s%" PRIdz, vendor, separator, product, version);
143SSIZE_T winpr_getApplicationDetailsVersion(
void)
145 if (!initializeApplicationDetails())
147 return s_winpr_version;
150BOOL winpr_areApplicationDetailsCustomized(
void)
152 return s_winpr_app_details_are_custom;
155void winpr_get_version(
int* major,
int* minor,
int* revision)
158 *major = WINPR_VERSION_MAJOR;
160 *minor = WINPR_VERSION_MINOR;
162 *revision = WINPR_VERSION_REVISION;
165const char* winpr_get_version_string(
void)
167 return WINPR_VERSION_FULL;
170const char* winpr_get_build_revision(
void)
172 return WINPR_GIT_REVISION;
175const char* winpr_get_build_config(
void)
177 static const char build_config[] =
178 "Build configuration: " WINPR_BUILD_CONFIG
"\n"
179 "Build type: " WINPR_BUILD_TYPE
"\n"
180 "CFLAGS: " WINPR_CFLAGS
"\n"
181 "Compiler: " WINPR_COMPILER_ID
", " WINPR_COMPILER_VERSION
"\n"
182 "Target architecture: " WINPR_TARGET_ARCH
"\n";