Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -42,10 +42,12 @@ enable_threads="no" enable_sockets="no" ;; *-*-mingw*) LDFLAGS="$LDFLAGS -Wl,--allow-multiple-definition" + LIBS="$LIBS -lversion" + AC_SUBST(ALLOW_MULTIPLE_DEFINITION, [-Wl,--allow-multiple-definition]) ;; *-psp-*) AS_IF([test x"$DEVKITPSP" = x""], [ Index: src/OFSystemInfo.m ================================================================== --- src/OFSystemInfo.m +++ src/OFSystemInfo.m @@ -143,10 +143,11 @@ static void initOperatingSystemVersion(void) { #if defined(OF_IOS) || defined(OF_MACOS) +# ifdef OF_HAVE_FILES void *pool = objc_autoreleasePoolPush(); @try { OFString *propertyList = [OFString stringWithContentsOfFile: @"/System/Library/CoreServices/SystemVersion.plist"]; @@ -154,25 +155,76 @@ operatingSystemVersion = [[[propertyList propertyListValue] objectForKey: @"ProductVersion"] copy]; } @finally { objc_autoreleasePoolPop(pool); } +# endif #elif defined(OF_WINDOWS) - /* TODO */ + void *pool = objc_autoreleasePoolPush(); + + @try { + wchar_t systemDir[PATH_MAX]; + UINT systemDirLen; + OFString *systemDirString; + const of_char16_t *path; + void *buffer; + DWORD bufferLen; + + systemDirLen = GetSystemDirectoryW(systemDir, PATH_MAX); + if (systemDirLen == 0) + return; + + systemDirString = [OFString + stringWithUTF16String: systemDir + length: systemDirLen]; + path = [[systemDirString stringByAppendingPathComponent: + @"kernel32.dll"] UTF16String]; + + if ((bufferLen = GetFileVersionInfoSizeW(path, NULL)) == 0) + return; + if ((buffer = malloc(bufferLen)) == 0) + return; + + @try { + void *data; + UINT dataLen; + VS_FIXEDFILEINFO *info; + + if (!GetFileVersionInfoW(path, 0, bufferLen, buffer)) + return; + + if (!VerQueryValueW(buffer, L"\\", &data, &dataLen) || + dataLen < sizeof(info)) + return; + + info = (VS_FIXEDFILEINFO *)data; + + operatingSystemVersion = [[OFString alloc] + initWithFormat: @"%u.%u.%u", + HIWORD(info->dwProductVersionMS), + LOWORD(info->dwProductVersionMS), + HIWORD(info->dwProductVersionLS)]; + } @finally { + free(buffer); + } + } @finally { + objc_autoreleasePoolPop(pool); + } #elif defined(OF_ANDROID) /* TODO */ #elif defined(OF_MORPHOS) /* TODO */ #elif defined(OF_AMIGAOS4) /* TODO */ #elif defined(OF_WII) || defined(NINTENDO_3DS) || defined(OF_NINTENDO_DS) || \ defined(OF_PSP) || defined(OF_MSDOS) + /* Intentionally nothing */ #elif defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME) struct utsname utsname; if (uname(&utsname) != 0) - return nil; + return; operatingSystemVersion = [[OFString alloc] initWithCString: utsname.release encoding: [OFLocalization encoding]]; #endif