Sweden-Number/programs/oleview/interface.c

197 lines
6.3 KiB
C

/*
* OleView (interface.c)
*
* Copyright 2006 Piotr Caban
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "main.h"
typedef struct
{
WCHAR *wszLabel;
WCHAR *wszIdentifier;
}DIALOG_INFO;
BOOL IsInterface(HTREEITEM item)
{
TVITEMW tvi;
memset(&tvi, 0, sizeof(TVITEMW));
tvi.hItem = item;
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
if(!tvi.lParam) return FALSE;
if(((ITEM_INFO*)tvi.lParam)->cFlag & INTERFACE) return TRUE;
return FALSE;
}
static IUnknown *GetInterface(void)
{
HTREEITEM hSelect;
TVITEMW tvi;
CLSID clsid;
IUnknown *unk;
hSelect = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
TVGN_CARET, 0);
memset(&tvi, 0, sizeof(TVITEMW));
tvi.hItem = hSelect;
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
CLSIDFromString(((ITEM_INFO *)tvi.lParam)->clsid, &clsid);
memset(&tvi, 0, sizeof(TVITEMW));
tvi.hItem = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
TVGN_PARENT, (LPARAM)hSelect);
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
IUnknown_QueryInterface(((ITEM_INFO *)tvi.lParam)->pU, &clsid, (void *)&unk);
return unk;
}
static INT_PTR CALLBACK InterfaceViewerProc(HWND hDlgWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
DIALOG_INFO *di;
HWND hObject;
IUnknown *unk;
HRESULT hRes;
ULARGE_INTEGER size;
WCHAR wszSize[MAX_LOAD_STRING];
WCHAR wszBuf[MAX_LOAD_STRING];
WCHAR wszFormat[] = { '%','d',' ','%','s','\0' };
switch(uMsg)
{
case WM_INITDIALOG:
di = (DIALOG_INFO *)lParam;
hObject = GetDlgItem(hDlgWnd, IDC_LABEL);
SetWindowTextW(hObject, di->wszLabel);
hObject = GetDlgItem(hDlgWnd, IDC_IDENTIFIER);
SetWindowTextW(hObject, di->wszIdentifier);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDCANCEL:
EndDialog(hDlgWnd, IDCANCEL);
return TRUE;
case IDC_ISDIRTY_BUTTON:
unk = GetInterface();
hRes = IPersistStream_IsDirty((IPersistStream *)unk);
IUnknown_Release(unk);
if(hRes == S_OK)
LoadStringW(globals.hMainInst, IDS_FALSE, wszBuf, ARRAY_SIZE(wszBuf));
else
LoadStringW(globals.hMainInst, IDS_TRUE, wszBuf, ARRAY_SIZE(wszBuf));
hObject = GetDlgItem(hDlgWnd, IDC_ISDIRTY);
SetWindowTextW(hObject, wszBuf);
return TRUE;
case IDC_GETSIZEMAX_BUTTON:
unk = GetInterface();
IPersistStream_GetSizeMax((IPersistStream *)unk, &size);
IUnknown_Release(unk);
LoadStringW(globals.hMainInst, IDS_BYTES, wszBuf, ARRAY_SIZE(wszBuf));
wsprintfW(wszSize, wszFormat, U(size).LowPart, wszBuf);
hObject = GetDlgItem(hDlgWnd, IDC_GETSIZEMAX);
SetWindowTextW(hObject, wszSize);
return TRUE;
}
}
return FALSE;
}
static void IPersistStreamInterfaceViewer(WCHAR *clsid, WCHAR *wszName)
{
DIALOG_INFO di;
WCHAR wszClassMoniker[] = { 'C','l','a','s','s','M','o','n','i','k','e','r','\0' };
if(wszName[0] == '{')
di.wszLabel = wszClassMoniker;
else di.wszLabel = wszName;
di.wszIdentifier = clsid;
DialogBoxParamW(0, MAKEINTRESOURCEW(DLG_IPERSISTSTREAM_IV),
globals.hMainWnd, InterfaceViewerProc, (LPARAM)&di);
}
static void IPersistInterfaceViewer(WCHAR *clsid, WCHAR *wszName)
{
DIALOG_INFO di;
WCHAR wszClassMoniker[] = { 'C','l','a','s','s','M','o','n','i','k','e','r','\0' };
if(wszName[0] == '{')
di.wszLabel = wszClassMoniker;
else di.wszLabel = wszName;
di.wszIdentifier = clsid;
DialogBoxParamW(0, MAKEINTRESOURCEW(DLG_IPERSIST_IV),
globals.hMainWnd, InterfaceViewerProc, (LPARAM)&di);
}
static void DefaultInterfaceViewer(WCHAR *clsid, WCHAR *wszName)
{
DIALOG_INFO di;
di.wszLabel = wszName;
di.wszIdentifier = clsid;
DialogBoxParamW(0, MAKEINTRESOURCEW(DLG_DEFAULT_IV),
globals.hMainWnd, InterfaceViewerProc, (LPARAM)&di);
}
void InterfaceViewer(HTREEITEM item)
{
TVITEMW tvi;
WCHAR *clsid;
WCHAR wszName[MAX_LOAD_STRING];
WCHAR wszParent[MAX_LOAD_STRING];
WCHAR wszIPersistStream[] = { '{','0','0','0','0','0','1','0','9','-',
'0','0','0','0','-','0','0','0','0','-','C','0','0','0','-',
'0','0','0','0','0','0','0','0','0','0','4','6','}','\0' };
WCHAR wszIPersist[] = { '{','0','0','0','0','0','1','0','C','-',
'0','0','0','0','-','0','0','0','0','-','C','0','0','0','-',
'0','0','0','0','0','0','0','0','0','0','4','6','}','\0' };
memset(&tvi, 0, sizeof(TVITEMW));
tvi.mask = TVIF_TEXT;
tvi.hItem = item;
tvi.cchTextMax = MAX_LOAD_STRING;
tvi.pszText = wszName;
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
clsid = ((ITEM_INFO*)tvi.lParam)->clsid;
memset(&tvi, 0, sizeof(TVITEMW));
tvi.mask = TVIF_TEXT;
tvi.hItem = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
TVGN_PARENT, (LPARAM)item);
tvi.cchTextMax = MAX_LOAD_STRING;
tvi.pszText = wszParent;
SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi);
if(!memcmp(clsid, wszIPersistStream, sizeof(wszIPersistStream)))
IPersistStreamInterfaceViewer(clsid, wszParent);
else if(!memcmp(clsid, wszIPersist, sizeof(wszIPersist)))
IPersistInterfaceViewer(clsid, wszParent);
else DefaultInterfaceViewer(clsid, wszName);
}