~ubuntu-branches/ubuntu/saucy/libusbx/saucy-proposed

« back to all changes in this revision

Viewing changes to libusb/os/windows_common.h

  • Committer: Package Import Robot
  • Author(s): Aurelien Jarno
  • Date: 2013-05-06 17:31:43 UTC
  • mfrom: (1.1.2)
  • Revision ID: package-import@ubuntu.com-20130506173143-wfbiltvcnn7pvdpa
Tags: 2:1.0.15-1
* New upstream version.
* Fix cross-build (closes: #694912, #705658).
* Add a -dbg package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Windows backend common header for libusbx 1.0
 
3
 *
 
4
 * This file brings together header code common between
 
5
 * the desktop Windows and Windows CE backends.
 
6
 * Copyright © 2012-2013 RealVNC Ltd.
 
7
 * Copyright © 2009-2012 Pete Batard <pete@akeo.ie>
 
8
 * With contributions from Michael Plante, Orin Eman et al.
 
9
 * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer
 
10
 * Major code testing contribution by Xiaofan Chen
 
11
 *
 
12
 * This library is free software; you can redistribute it and/or
 
13
 * modify it under the terms of the GNU Lesser General Public
 
14
 * License as published by the Free Software Foundation; either
 
15
 * version 2.1 of the License, or (at your option) any later version.
 
16
 *
 
17
 * This library is distributed in the hope that it will be useful,
 
18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
20
 * Lesser General Public License for more details.
 
21
 *
 
22
 * You should have received a copy of the GNU Lesser General Public
 
23
 * License along with this library; if not, write to the Free Software
 
24
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
25
 */
 
26
 
 
27
#pragma once
 
28
 
 
29
// Windows API default is uppercase - ugh!
 
30
#if !defined(bool)
 
31
#define bool BOOL
 
32
#endif
 
33
#if !defined(true)
 
34
#define true TRUE
 
35
#endif
 
36
#if !defined(false)
 
37
#define false FALSE
 
38
#endif
 
39
 
 
40
#define safe_free(p) do {if (p != NULL) {free((void*)p); p = NULL;}} while(0)
 
41
#define safe_closehandle(h) do {if (h != INVALID_HANDLE_VALUE) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
 
42
#define safe_min(a, b) min((size_t)(a), (size_t)(b))
 
43
#define safe_strcp(dst, dst_max, src, count) do {memcpy(dst, src, safe_min(count, dst_max)); \
 
44
        ((char*)dst)[safe_min(count, dst_max)-1] = 0;} while(0)
 
45
#define safe_strcpy(dst, dst_max, src) safe_strcp(dst, dst_max, src, safe_strlen(src)+1)
 
46
#define safe_strncat(dst, dst_max, src, count) strncat(dst, src, safe_min(count, dst_max - safe_strlen(dst) - 1))
 
47
#define safe_strcat(dst, dst_max, src) safe_strncat(dst, dst_max, src, safe_strlen(src)+1)
 
48
#define safe_strcmp(str1, str2) strcmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2))
 
49
#define safe_stricmp(str1, str2) _stricmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2))
 
50
#define safe_strncmp(str1, str2, count) strncmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2), count)
 
51
#define safe_strlen(str) ((str==NULL)?0:strlen(str))
 
52
#define safe_sprintf(dst, count, ...) do {_snprintf(dst, count, __VA_ARGS__); (dst)[(count)-1] = 0; } while(0)
 
53
#define safe_stprintf _sntprintf
 
54
#define safe_tcslen(str) ((str==NULL)?0:_tcslen(str))
 
55
#define safe_unref_device(dev) do {if (dev != NULL) {libusb_unref_device(dev); dev = NULL;}} while(0)
 
56
#define wchar_to_utf8_ms(wstr, str, strlen) WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, strlen, NULL, NULL)
 
57
#ifndef ARRAYSIZE
 
58
#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))
 
59
#endif
 
60
 
 
61
#define ERR_BUFFER_SIZE             256
 
62
#define TIMER_REQUEST_RETRY_MS      100
 
63
#define MAX_TIMER_SEMAPHORES        128
 
64
 
 
65
 
 
66
/*
 
67
 * API macros - from libusb-win32 1.x
 
68
 */
 
69
#define DLL_DECLARE_PREFIXNAME(api, ret, prefixname, name, args)    \
 
70
        typedef ret (api * __dll_##name##_t)args;                       \
 
71
        static __dll_##name##_t prefixname = NULL
 
72
 
 
73
#ifndef _WIN32_WCE
 
74
#define DLL_STRINGIFY(dll) #dll
 
75
#define DLL_GET_MODULE_HANDLE(dll) GetModuleHandleA(DLL_STRINGIFY(dll))
 
76
#define DLL_LOAD_LIBRARY(dll) LoadLibraryA(DLL_STRINGIFY(dll))
 
77
#else
 
78
#define DLL_STRINGIFY(dll) L#dll
 
79
#define DLL_GET_MODULE_HANDLE(dll) GetModuleHandle(DLL_STRINGIFY(dll))
 
80
#define DLL_LOAD_LIBRARY(dll) LoadLibrary(DLL_STRINGIFY(dll))
 
81
#endif
 
82
 
 
83
#define DLL_LOAD_PREFIXNAME(dll, prefixname, name, ret_on_failure) \
 
84
        do {                                                           \
 
85
                HMODULE h = DLL_GET_MODULE_HANDLE(dll);                    \
 
86
        if (!h)                                                        \
 
87
                h = DLL_LOAD_LIBRARY(dll);                                 \
 
88
        if (!h) {                                                      \
 
89
                if (ret_on_failure) { return LIBUSB_ERROR_NOT_FOUND; }     \
 
90
                else { break; }                                            \
 
91
        }                                                              \
 
92
        prefixname = (__dll_##name##_t)GetProcAddress(h,               \
 
93
                                DLL_STRINGIFY(name));                  \
 
94
        if (prefixname) break;                                         \
 
95
        prefixname = (__dll_##name##_t)GetProcAddress(h,               \
 
96
                                DLL_STRINGIFY(name) DLL_STRINGIFY(A)); \
 
97
        if (prefixname) break;                                         \
 
98
        prefixname = (__dll_##name##_t)GetProcAddress(h,               \
 
99
                                DLL_STRINGIFY(name) DLL_STRINGIFY(W)); \
 
100
        if (prefixname) break;                                         \
 
101
        if(ret_on_failure)                                             \
 
102
                return LIBUSB_ERROR_NOT_FOUND;                             \
 
103
        } while(0)
 
104
 
 
105
#define DLL_DECLARE(api, ret, name, args)   DLL_DECLARE_PREFIXNAME(api, ret, name, name, args)
 
106
#define DLL_LOAD(dll, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, name, name, ret_on_failure)
 
107
#define DLL_DECLARE_PREFIXED(api, ret, prefix, name, args)   DLL_DECLARE_PREFIXNAME(api, ret, prefix##name, name, args)
 
108
#define DLL_LOAD_PREFIXED(dll, prefix, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, prefix##name, name, ret_on_failure)