]> git.proxmox.com Git - mirror_smartmontools-debian.git/blame - os_win32/wmiquery.h
Imported Upstream version 5.42+svn3521
[mirror_smartmontools-debian.git] / os_win32 / wmiquery.h
CommitLineData
cfbba5b9
GI
1/*
2 * os_win32/wmiquery.h
3 *
4 * Home page of code is: http://smartmontools.sourceforge.net
5 *
6 * Copyright (C) 2011 Christian Franke <smartmontools-support@lists.sourceforge.net>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2, or (at your option)
11 * any later version.
12 *
13 * You should have received a copy of the GNU General Public License
14 * (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
15 *
16 */
17
18#ifndef WMIQUERY_H
19#define WMIQUERY_H
20
d008864d 21#define WMIQUERY_H_CVSID "$Id: wmiquery.h 3475 2011-11-10 21:43:40Z chrfranke $"
cfbba5b9
GI
22
23#ifdef HAVE_WBEMCLI_H
24#include <wbemcli.h>
25#else
26#include "wbemcli_small.h"
27#endif
28
29#include <string>
30
d008864d
GI
31#ifndef __GNUC__
32#define __attribute_format_printf(x, y) /**/
33#elif defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO
34// Check format of __mingw_*printf() instead of MSVCRT.DLL:*printf()
35#define __attribute_format_printf(x, y) __attribute__((format (gnu_printf, x, y)))
36#else
37#define __attribute_format_printf(x, y) __attribute__((format (printf, x, y)))
cfbba5b9
GI
38#endif
39
40/////////////////////////////////////////////////////////////////////////////
41// com_bstr
42
43/// Wrapper class for COM BSTR
44class com_bstr
45{
46public:
47 /// Construct from string.
48 com_bstr(const char * str);
49
50 /// Destructor frees BSTR.
51 ~com_bstr()
52 { SysFreeString(m_bstr); }
53
54 /// Implicit conversion to BSTR.
55 operator BSTR()
56 { return m_bstr; }
57
58 /// Convert BSTR back to std::string.
59 static bool to_str(const BSTR & bstr, std::string & str);
60
61private:
62 BSTR m_bstr;
63
64 com_bstr(const com_bstr &);
65 void operator=(const com_bstr &);
66};
67
68
69/////////////////////////////////////////////////////////////////////////////
70// com_intf_ptr
71
72/// Wrapper class for COM Interface pointer
73template <class T>
74class com_intf_ptr
75{
76public:
77 /// Construct empty object
78 com_intf_ptr()
79 : m_ptr(0) { }
80
81 /// Destructor releases the interface.
82 ~com_intf_ptr()
83 { reset(); }
84
85 /// Release interface and clear the pointer.
86 void reset()
87 {
88 if (m_ptr) {
89 m_ptr->Release(); m_ptr = 0;
90 }
91 }
92
93 /// Return the pointer.
94 T * get()
95 { return m_ptr; }
96
97 /// Pointer dereferencing.
98 T * operator->()
99 { return m_ptr; }
100
101 /// Return address of pointer for replacement.
102 T * * replace()
103 { reset(); return &m_ptr; }
104
105 /// For (ptr != 0) check.
106 operator bool() const
107 { return !!m_ptr; }
108
109 /// For (ptr == 0) check.
110 bool operator!() const
111 { return !m_ptr; }
112
113private:
114 T * m_ptr;
115
116 com_intf_ptr(const com_intf_ptr &);
117 void operator=(const com_intf_ptr &);
118};
119
120
121/////////////////////////////////////////////////////////////////////////////
122// wbem_object
123
124class wbem_enumerator;
125
126/// Wrapper class for IWbemClassObject
127class wbem_object
128{
129public:
130 /// Get string representation.
131 std::string get_str(const char * name) /*const*/;
132
133private:
134 /// Contents is set by wbem_enumerator.
135 friend class wbem_enumerator;
136 com_intf_ptr<IWbemClassObject> m_intf;
137};
138
139
140/////////////////////////////////////////////////////////////////////////////
141// wbem_enumerator
142
143class wbem_services;
144
145/// Wrapper class for IEnumWbemClassObject
146class wbem_enumerator
147{
148public:
149 /// Get next object, return false if none or error.
150 bool next(wbem_object & obj);
151
152private:
153 /// Contents is set by wbem_services.
154 friend class wbem_services;
155 com_intf_ptr<IEnumWbemClassObject> m_intf;
156};
157
158
159/////////////////////////////////////////////////////////////////////////////
160// wbem_services
161
162/// Wrapper class for IWbemServices
163class wbem_services
164{
165public:
166 /// Connect to service, return false on error.
167 bool connect();
168
169 /// Execute query, get result list.
170 /// Return false on error.
171 bool vquery(wbem_enumerator & result, const char * qstr, va_list args) /*const*/;
172
173 /// Execute query, get single result object.
174 /// Return false on error or result size != 1.
175 bool vquery1(wbem_object & obj, const char * qstr, va_list args) /*const*/;
176
177 /// Version of vquery() with printf() formatting.
178 bool query(wbem_enumerator & result, const char * qstr, ...) /*const*/
d008864d 179 __attribute_format_printf(3, 4);
cfbba5b9
GI
180
181 /// Version of vquery1() with printf() formatting.
182 bool query1(wbem_object & obj, const char * qstr, ...) /*const*/
d008864d 183 __attribute_format_printf(3, 4);
cfbba5b9
GI
184
185private:
186 com_intf_ptr<IWbemServices> m_intf;
187};
188
189#endif // WMIQUERY_H