oleview: Added idl save to file functionality
Piotr Caban
piotr.caban at gmail.com
Sun Aug 20 11:51:04 CDT 2006
Hi,
Changelog:
- Added idl save to file functionality
programs/oleview/typelib.c | 105
++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 104 insertions(+), 1 deletions(-)
--
Piotr
-------------- next part --------------
diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c
index dee9655..c5088d3 100644
--- a/programs/oleview/typelib.c
+++ b/programs/oleview/typelib.c
@@ -21,6 +21,7 @@
#include "main.h"
#include "wine/debug.h"
+#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(oleview);
@@ -89,6 +90,103 @@ static const WCHAR wszPARAMFLAG_FHASDEFA
static const WCHAR wszPARAMFLAG_FHASCUSTDATA[]
= { 'h','a','s','c','u','s','t','d','a','t','a','\0' };
+void ShowLastError(void)
+{
+ DWORD error = GetLastError();
+ LPWSTR lpMsgBuf;
+ WCHAR wszTitle[MAX_LOAD_STRING];
+
+ LoadString(globals.hMainInst, IDS_TYPELIBTITLE, wszTitle,
+ sizeof(WCHAR[MAX_LOAD_STRING]));
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, error, 0, (LPTSTR) &lpMsgBuf, 0, NULL);
+ MessageBox(NULL, lpMsgBuf, wszTitle, MB_OK | MB_ICONERROR);
+ LocalFree(lpMsgBuf);
+ return;
+}
+
+void SaveIdl(WCHAR *wszFileName)
+{
+ HTREEITEM hIDL;
+ TVITEM tvi;
+ HANDLE hFile;
+ DWORD dwNumWrite;
+ char *wszIdl;
+
+ hIDL = TreeView_GetChild(typelib.hTree, TVI_ROOT);
+
+ memset(&tvi, 0, sizeof(TVITEM));
+ tvi.hItem = hIDL;
+
+ SendMessage(typelib.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
+
+ hFile = CreateFile(wszFileName, GENERIC_WRITE, FILE_SHARE_WRITE,
+ NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+ if(hFile == INVALID_HANDLE_VALUE)
+ {
+ ShowLastError();
+ return;
+ }
+
+ wszIdl = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(WCHAR)*((TYPELIB_DATA *)(tvi.lParam))->idlLen);
+ wine_utf8_wcstombs(((TYPELIB_DATA *)(tvi.lParam))->idl,
+ ((TYPELIB_DATA *)(tvi.lParam))->idlLen, wszIdl,
+ ((TYPELIB_DATA *)(tvi.lParam))->idlLen);
+
+ if(!WriteFile(hFile, wszIdl, ((TYPELIB_DATA *)(tvi.lParam))->idlLen,
+ &dwNumWrite, NULL))
+ {
+ ShowLastError();
+ HeapFree(GetProcessHeap(), 0, wszIdl);
+ return;
+ }
+
+ HeapFree(GetProcessHeap(), 0, wszIdl);
+ SetEndOfFile(hFile);
+ CloseHandle(hFile);
+}
+
+void GetSaveIdlAsPath(void)
+{
+ OPENFILENAME saveidl;
+ WCHAR *pFileName;
+ WCHAR wszPath[MAX_LOAD_STRING];
+ WCHAR wszDir[MAX_LOAD_STRING];
+ static const WCHAR wszDefaultExt[] = { 'i','d','l',0 };
+ static const WCHAR wszIdlFiles[] = { '*','.','i','d','l','\0','\0' };
+
+ memset(&saveidl, 0, sizeof(saveidl));
+
+ lstrcpyW(wszDir, typelib.wszFileName);
+ pFileName = wszDir + lstrlenW(wszDir);
+ while(*pFileName != '.' && *pFileName != '\\' && *pFileName != '/'
+ && pFileName > wszDir) pFileName -= 1;
+ if(*pFileName == '.')
+ {
+ *pFileName = '\0';
+ while(*pFileName != '\\' && *pFileName != '/' && pFileName > wszDir)
+ pFileName -= 1;
+ }
+ if(*pFileName == '\\' || *pFileName == '/') pFileName += 1;
+ lstrcpyW(wszPath, pFileName);
+
+ GetCurrentDirectory(MAX_LOAD_STRING, wszDir);
+
+ saveidl.lStructSize = sizeof(OPENFILENAME);
+ saveidl.hwndOwner = globals.hTypeLibWnd;
+ saveidl.hInstance = globals.hMainInst;
+ saveidl.lpstrFilter = wszIdlFiles;
+ saveidl.lpstrFile = wszPath;
+ saveidl.nMaxFile = MAX_LOAD_STRING;
+ saveidl.lpstrInitialDir = wszDir;
+ saveidl.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
+ saveidl.lpstrDefExt = wszDefaultExt;
+
+ if (GetSaveFileName(&saveidl))
+ SaveIdl(wszPath);
+}
+
void AddToStrW(WCHAR *wszDest, const WCHAR *wszSource)
{
lstrcpyW(&wszDest[lstrlenW(wszDest)], wszSource);
@@ -534,7 +632,7 @@ void CreateInterfaceInfo(ITypeInfo *pTyp
BOOL bFirst;
const WCHAR wszFormat[] = { '0','x','%','.','8','l','x','\0' };
- const WCHAR wszInterface[] = { 'I','n','t','e','r','f','a','c','e',' ','\0' };
+ const WCHAR wszInterface[] = { 'i','n','t','e','r','f','a','c','e',' ','\0' };
const WCHAR wszHelpstring[] = { 'h','e','l','p','s','t','r','i','n','g','\0' };
const WCHAR wszHelpcontext[] = { 'h','e','l','p','c','o','n','t','e','x','t','\0' };
const WCHAR wszTYPEFLAG_FAPPOBJECT[] = { 'a','p','p','o','b','j','e','c','t','\0' };
@@ -747,7 +845,9 @@ int PopulateTree(void)
AddSpaces((TYPELIB_DATA*)(U(tvis).item.lParam), 4);
AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszHelpString);
AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszOpenBrackets2);
+ AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszInvertedComa);
AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), bstrData);
+ AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszInvertedComa);
AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets2);
AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine);
AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets1);
@@ -938,6 +1038,9 @@ void TypeLibMenuCommand(WPARAM wParam, H
switch(wParam)
{
+ case IDM_SAVEAS:
+ GetSaveIdlAsPath();
+ break;
case IDM_STATUSBAR:
vis = IsWindowVisible(typelib.hStatusBar);
ShowWindow(typelib.hStatusBar, vis ? SW_HIDE : SW_SHOW);
More information about the wine-patches
mailing list