diff options
Diffstat (limited to 'tinyDAV/src/tdav_win32.c')
-rw-r--r-- | tinyDAV/src/tdav_win32.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/tinyDAV/src/tdav_win32.c b/tinyDAV/src/tdav_win32.c new file mode 100644 index 0000000..789fc77 --- /dev/null +++ b/tinyDAV/src/tdav_win32.c @@ -0,0 +1,234 @@ +/* +* Copyright (C) 2010-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +/**@file tdav_win32.c + * @brief tinyDAV WIN32 helper functions. + * + */ +#include "tinydav/tdav_win32.h" + +#if TDAV_UNDER_WINDOWS + +#include "tsk_string.h" +#include "tsk_memory.h" +#include "tsk_debug.h" + +#include <windows.h> +#if !TDAV_UNDER_WINDOWS_RT +#include <Shlwapi.h> /* PathRemoveFileSpec */ +#endif + +/* https://msdn.microsoft.com/en-us/library/windows/desktop/ms724834%28v=vs.85%29.aspx +Version Number Description +6.2 Windows 8 / Windows Server 2012 +6.1 Windows 7 / Windows 2008 R2 +6.0 Windows Vista / Windows 2008 +5.2 Windows 2003 +5.1 Windows XP +5.0 Windows 2000 +*/ +static DWORD dwMajorVersion = -1; +static DWORD dwMinorVersion = -1; + +#if (TDAV_UNDER_WINDOWS_RT || TDAV_UNDER_WINDOWS_CE) +const HMODULE GetCurrentModule() +{ + return NULL; +} +#else +const HMODULE GetCurrentModule() +{ + HMODULE hm = {0}; + GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)GetCurrentModule, &hm); + return hm; +} +#endif /* !(TDAV_UNDER_WINDOWS_RT || TDAV_UNDER_WINDOWS_CE) */ + +int tdav_win32_init() +{ +#if !TDAV_UNDER_WINDOWS_RT + MMRESULT result; + +#if !TDAV_UNDER_WINDOWS_CE + CoInitializeEx(NULL, COINIT_MULTITHREADED); +#endif + + // Timers accuracy + result = timeBeginPeriod(1); + if (result) { + TSK_DEBUG_ERROR("timeBeginPeriod(1) returned result=%u", result); + } + + // Get OS version + if(dwMajorVersion == -1 || dwMinorVersion == -1){ + OSVERSIONINFO osvi; + ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osvi); + dwMajorVersion = osvi.dwMajorVersion; + dwMinorVersion = osvi.dwMinorVersion; +#if TDAV_UNDER_WINDOWS_CE && (BUILD_TYPE_GE && SIN_CITY) + TSK_DEBUG_INFO("Windows dwMajorVersion=%ld, dwMinorVersion=%ld\n", dwMajorVersion, dwMinorVersion); +#else + fprintf(stdout, "Windows dwMajorVersion=%ld, dwMinorVersion=%ld\n", dwMajorVersion, dwMinorVersion); +#endif + } +#endif + + return 0; +} + +int tdav_win32_get_osversion(unsigned long* version_major, unsigned long* version_minor) +{ + if (version_major) { + *version_major = dwMajorVersion; + } + if (version_minor) { + *version_minor = dwMinorVersion; + } + return 0; +} + +tsk_bool_t tdav_win32_is_win8_or_later() +{ + if (dwMajorVersion == -1 || dwMinorVersion == -1) { + TSK_DEBUG_ERROR("Version numbers are invalid"); + return tsk_false; + } + return ((dwMajorVersion > 6) || ((dwMajorVersion == 6) && (dwMinorVersion >= 2))); +} + +tsk_bool_t tdav_win32_is_win7_or_later() +{ + if (dwMajorVersion == -1 || dwMinorVersion == -1) { + TSK_DEBUG_ERROR("Version numbers are invalid"); + return tsk_false; + } + return ( (dwMajorVersion > 6) || ( (dwMajorVersion == 6) && (dwMinorVersion >= 1) ) ); +} + +tsk_bool_t tdav_win32_is_winvista_or_later() +{ + if (dwMajorVersion == -1 || dwMinorVersion == -1) { + TSK_DEBUG_ERROR("Version numbers are invalid"); + return tsk_false; + } + return (dwMajorVersion >= 6); +} + +tsk_bool_t tdav_win32_is_winxp_or_later() +{ + if (dwMajorVersion == -1 || dwMinorVersion == -1) { + TSK_DEBUG_ERROR("Version numbers are invalid"); + return tsk_false; + } + return ( (dwMajorVersion > 5) || ( (dwMajorVersion == 5) && (dwMinorVersion >= 1) ) ); +} + +const char* tdav_get_current_directory_const() +{ +#if TDAV_UNDER_WINDOWS_RT + TSK_DEBUG_ERROR("Not supported"); + return tsk_null; +#else + static char CURRENT_DIR_PATH[MAX_PATH] = { 0 }; + static DWORD CURRENT_DIR_PATH_LEN = 0; + if (CURRENT_DIR_PATH_LEN == 0) { + // NULL HMODULE will get the path to the executable not the DLL. When runing the code in Internet Explorer this is a BIG issue as the path is where IE.exe is installed. +#if TDAV_UNDER_WINDOWS_CE + static wchar_t TMP_CURRENT_DIR_PATH[MAX_PATH] = { 0 }; + if ((CURRENT_DIR_PATH_LEN = GetModuleFileName(GetCurrentModule(), TMP_CURRENT_DIR_PATH, sizeof(TMP_CURRENT_DIR_PATH)))) { + if ((CURRENT_DIR_PATH_LEN = wcstombs(CURRENT_DIR_PATH, TMP_CURRENT_DIR_PATH, sizeof(CURRENT_DIR_PATH) - 1))) { + int idx = tsk_strLastIndexOf(CURRENT_DIR_PATH, CURRENT_DIR_PATH_LEN, "\\"); + if (idx > -1) { + CURRENT_DIR_PATH[idx] = '\0'; + CURRENT_DIR_PATH_LEN = idx; + } + } + } +#else + if ((CURRENT_DIR_PATH_LEN = GetModuleFileNameA(GetCurrentModule(), CURRENT_DIR_PATH, sizeof(CURRENT_DIR_PATH)))) { + if (!PathRemoveFileSpecA(CURRENT_DIR_PATH)) { + TSK_DEBUG_ERROR("PathRemoveFileSpec(%s) failed: %x", CURRENT_DIR_PATH, GetLastError()); + memset(CURRENT_DIR_PATH, 0, sizeof(CURRENT_DIR_PATH)); + CURRENT_DIR_PATH_LEN = 0; + } + } +#endif /* TDAV_UNDER_WINDOWS_CE */ + if (!CURRENT_DIR_PATH_LEN) { + TSK_DEBUG_ERROR("GetModuleFileNameA() failed: %x", GetLastError()); + } + } + return CURRENT_DIR_PATH; +#endif /* TDAV_UNDER_WINDOWS_RT */ +} + +TINYDAV_API void tdav_win32_print_error(const char* func, HRESULT hr) +{ + CHAR message[1024] = {0}; + +#if (TDAV_UNDER_WINDOWS_RT || TDAV_UNDER_WINDOWS_CE) +#if !defined(WC_ERR_INVALID_CHARS) +#define WC_ERR_INVALID_CHARS 0 +#endif + // FormatMessageA not allowed on the Store + static WCHAR wBuff[1024] = {0}; + FormatMessageW( + FORMAT_MESSAGE_FROM_SYSTEM, + tsk_null, + hr, + 0, + wBuff, + sizeof(wBuff)-1, + tsk_null); + WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, wBuff, wcslen(wBuff), message, sizeof(message) - 1, NULL, NULL); +#else + FormatMessageA + ( +#if !TDAV_UNDER_WINDOWS_RT + FORMAT_MESSAGE_ALLOCATE_BUFFER | +#endif + FORMAT_MESSAGE_FROM_SYSTEM, + tsk_null, + hr, + 0, + message, + sizeof(message) - 1, + tsk_null); +#endif + + TSK_DEBUG_ERROR("%s(): %s", func, message); +} + +int tdav_win32_deinit() +{ +#if !(TDAV_UNDER_WINDOWS_RT || TDAV_UNDER_WINDOWS_CE) + MMRESULT result; + + // Timers accuracy + result = timeEndPeriod(1); + if(result){ + TSK_DEBUG_ERROR("timeEndPeriod(1) returned result=%u", result); + } +#endif + + return 0; +} + +#endif /* TDAV_UNDER_WINDOWS */
\ No newline at end of file |