]> git.sesse.net Git - vlc/blob - activex/utils.cpp
eecba670064722ccb089bbe26b47052cf54b12d8
[vlc] / activex / utils.cpp
1 /*****************************************************************************\r
2  * utils.cpp: ActiveX control for VLC\r
3  *****************************************************************************\r
4  * Copyright (C) 2005 VideoLAN\r
5  *\r
6  * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
7  *\r
8  * This program is free software; you can redistribute it and/or modify\r
9  * it under the terms of the GNU General Public License as published by\r
10  * the Free Software Foundation; either version 2 of the License, or\r
11  * (at your option) any later version.\r
12  *\r
13  * This program is distributed in the hope that it will be useful,\r
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
16  * GNU General Public License for more details.\r
17  *\r
18  * You should have received a copy of the GNU General Public License\r
19  * along with this program; if not, write to the Free Software\r
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
21  *****************************************************************************/\r
22 \r
23 #include "utils.h"\r
24 \r
25 /*\r
26 ** conversion facilities\r
27 */\r
28 \r
29 using namespace std;\r
30 \r
31 char *CStrFromBSTR(int codePage, BSTR bstr)\r
32 {\r
33     UINT len = SysStringLen(bstr);\r
34     if( len > 0 )\r
35     {\r
36         size_t mblen = WideCharToMultiByte(codePage,\r
37                 0, bstr, len, NULL, 0, NULL, NULL);\r
38         if( mblen > 0 )\r
39         {\r
40             char *buffer = (char *)malloc(mblen+1);\r
41             ZeroMemory(buffer, mblen+1);\r
42             if( WideCharToMultiByte(codePage, 0, bstr, len, buffer, mblen, NULL, NULL) )\r
43                 return buffer;\r
44         }\r
45     }\r
46     return NULL;\r
47 };\r
48 \r
49 BSTR BSTRFromCStr(int codePage, const char *s)\r
50 {\r
51     int wideLen = MultiByteToWideChar(codePage, 0, s, -1, NULL, 0);\r
52     if( wideLen )\r
53     {\r
54         WCHAR* wideStr = (WCHAR*)malloc(wideLen*sizeof(WCHAR));\r
55         if( NULL != wideStr )\r
56         {\r
57             BSTR bstr;\r
58 \r
59             ZeroMemory(wideStr, wideLen*sizeof(WCHAR));\r
60             MultiByteToWideChar(codePage, 0, s, -1, wideStr, wideLen);\r
61             bstr = SysAllocString(wideStr);\r
62             free(wideStr);\r
63 \r
64             return bstr;\r
65         }\r
66     }\r
67     return NULL;\r
68 };\r
69 \r
70 /*\r
71 **  properties\r
72 */\r
73 \r
74 HRESULT GetObjectProperty(LPUNKNOWN object, DISPID dispID, VARIANT& v)\r
75 {\r
76     IDispatch *pDisp;\r
77     HRESULT hr = object->QueryInterface(IID_IDispatch, (LPVOID *)&pDisp);\r
78     if( SUCCEEDED(hr) )\r
79     {\r
80         DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};\r
81         VARIANT vres;\r
82         hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT,\r
83                 DISPATCH_PROPERTYGET, &dispparamsNoArgs, &vres, NULL, NULL);\r
84         if( SUCCEEDED(hr) )\r
85         {\r
86             if( V_VT(&v) != V_VT(&vres) )\r
87             {\r
88                 hr = VariantChangeType(&v, &vres, 0, V_VT(&v));\r
89                 VariantClear(&vres);\r
90             }\r
91             else\r
92             {\r
93                 v = vres;\r
94             }\r
95         }\r
96         pDisp->Release();\r
97     }\r
98     return hr;\r
99 };\r
100 \r
101 \r