Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/programs/oleview/interface.c
4389 views
1
/*
2
* OleView (interface.c)
3
*
4
* Copyright 2006 Piotr Caban
5
*
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this library; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19
*/
20
21
#include "main.h"
22
23
typedef struct
24
{
25
WCHAR *wszLabel;
26
WCHAR *wszIdentifier;
27
}DIALOG_INFO;
28
29
BOOL IsInterface(HTREEITEM item)
30
{
31
TVITEMW tvi;
32
33
memset(&tvi, 0, sizeof(TVITEMW));
34
tvi.hItem = item;
35
36
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
37
if(!tvi.lParam) return FALSE;
38
39
if(((ITEM_INFO*)tvi.lParam)->cFlag & INTERFACE) return TRUE;
40
return FALSE;
41
}
42
43
static IUnknown *GetInterface(void)
44
{
45
HTREEITEM hSelect;
46
TVITEMW tvi;
47
CLSID clsid;
48
IUnknown *unk;
49
50
hSelect = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
51
TVGN_CARET, 0);
52
53
memset(&tvi, 0, sizeof(TVITEMW));
54
tvi.hItem = hSelect;
55
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
56
CLSIDFromString(((ITEM_INFO *)tvi.lParam)->clsid, &clsid);
57
58
memset(&tvi, 0, sizeof(TVITEMW));
59
tvi.hItem = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
60
TVGN_PARENT, (LPARAM)hSelect);
61
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
62
63
IUnknown_QueryInterface(((ITEM_INFO *)tvi.lParam)->pU, &clsid, (void *)&unk);
64
65
return unk;
66
}
67
68
static INT_PTR CALLBACK InterfaceViewerProc(HWND hDlgWnd, UINT uMsg,
69
WPARAM wParam, LPARAM lParam)
70
{
71
DIALOG_INFO *di;
72
HWND hObject;
73
IUnknown *unk;
74
HRESULT hRes;
75
ULARGE_INTEGER size;
76
WCHAR wszSize[MAX_LOAD_STRING];
77
WCHAR wszBuf[MAX_LOAD_STRING];
78
79
switch(uMsg)
80
{
81
case WM_INITDIALOG:
82
di = (DIALOG_INFO *)lParam;
83
hObject = GetDlgItem(hDlgWnd, IDC_LABEL);
84
SetWindowTextW(hObject, di->wszLabel);
85
hObject = GetDlgItem(hDlgWnd, IDC_IDENTIFIER);
86
SetWindowTextW(hObject, di->wszIdentifier);
87
return TRUE;
88
case WM_COMMAND:
89
switch(LOWORD(wParam)) {
90
case IDCANCEL:
91
EndDialog(hDlgWnd, IDCANCEL);
92
return TRUE;
93
case IDC_ISDIRTY_BUTTON:
94
unk = GetInterface();
95
hRes = IPersistStream_IsDirty((IPersistStream *)unk);
96
IUnknown_Release(unk);
97
if(hRes == S_OK)
98
LoadStringW(globals.hMainInst, IDS_FALSE, wszBuf, ARRAY_SIZE(wszBuf));
99
else
100
LoadStringW(globals.hMainInst, IDS_TRUE, wszBuf, ARRAY_SIZE(wszBuf));
101
hObject = GetDlgItem(hDlgWnd, IDC_ISDIRTY);
102
SetWindowTextW(hObject, wszBuf);
103
return TRUE;
104
case IDC_GETSIZEMAX_BUTTON:
105
unk = GetInterface();
106
IPersistStream_GetSizeMax((IPersistStream *)unk, &size);
107
IUnknown_Release(unk);
108
LoadStringW(globals.hMainInst, IDS_BYTES, wszBuf, ARRAY_SIZE(wszBuf));
109
wsprintfW(wszSize, L"%d %s", size.LowPart, wszBuf);
110
hObject = GetDlgItem(hDlgWnd, IDC_GETSIZEMAX);
111
SetWindowTextW(hObject, wszSize);
112
return TRUE;
113
}
114
}
115
return FALSE;
116
}
117
118
static void IPersistStreamInterfaceViewer(WCHAR *clsid, WCHAR *wszName)
119
{
120
DIALOG_INFO di;
121
122
if(wszName[0] == '{') di.wszLabel = (WCHAR *)L"ClassMoniker";
123
else di.wszLabel = wszName;
124
di.wszIdentifier = clsid;
125
126
DialogBoxParamW(0, MAKEINTRESOURCEW(DLG_IPERSISTSTREAM_IV),
127
globals.hMainWnd, InterfaceViewerProc, (LPARAM)&di);
128
}
129
130
static void IPersistInterfaceViewer(WCHAR *clsid, WCHAR *wszName)
131
{
132
DIALOG_INFO di;
133
134
if(wszName[0] == '{') di.wszLabel = (WCHAR *)L"ClassMoniker";
135
else di.wszLabel = wszName;
136
di.wszIdentifier = clsid;
137
138
DialogBoxParamW(0, MAKEINTRESOURCEW(DLG_IPERSIST_IV),
139
globals.hMainWnd, InterfaceViewerProc, (LPARAM)&di);
140
}
141
142
static void DefaultInterfaceViewer(WCHAR *clsid, WCHAR *wszName)
143
{
144
DIALOG_INFO di;
145
146
di.wszLabel = wszName;
147
di.wszIdentifier = clsid;
148
149
DialogBoxParamW(0, MAKEINTRESOURCEW(DLG_DEFAULT_IV),
150
globals.hMainWnd, InterfaceViewerProc, (LPARAM)&di);
151
}
152
153
void InterfaceViewer(HTREEITEM item)
154
{
155
TVITEMW tvi;
156
WCHAR *clsid;
157
WCHAR wszName[MAX_LOAD_STRING];
158
WCHAR wszParent[MAX_LOAD_STRING];
159
160
memset(&tvi, 0, sizeof(TVITEMW));
161
tvi.mask = TVIF_TEXT;
162
tvi.hItem = item;
163
tvi.cchTextMax = MAX_LOAD_STRING;
164
tvi.pszText = wszName;
165
166
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
167
clsid = ((ITEM_INFO*)tvi.lParam)->clsid;
168
169
memset(&tvi, 0, sizeof(TVITEMW));
170
tvi.mask = TVIF_TEXT;
171
tvi.hItem = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
172
TVGN_PARENT, (LPARAM)item);
173
tvi.cchTextMax = MAX_LOAD_STRING;
174
tvi.pszText = wszParent;
175
176
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
177
178
if(!wcscmp(clsid, L"{00000109-0000-0000-C000-000000000046}"))
179
IPersistStreamInterfaceViewer(clsid, wszParent);
180
else if(!wcscmp(clsid, L"{0000010C-0000-0000-C000-000000000046}"))
181
IPersistInterfaceViewer(clsid, wszParent);
182
183
else DefaultInterfaceViewer(clsid, wszName);
184
}
185
186