Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

267 lines
7.4 KiB

#include "precomp.h"
/************************************************************************/
/* */
/* Windows Cardfile - Written by Mark Cliggett */
/* (c) Copyright Microsoft Corp. 1985, 1994 - All Rights Reserved */
/* */
/* OLE - Insert New Object support */
/************************************************************************/
NOEXPORT int NEAR InitClassNamesList(
HWND hwndList);
NOEXPORT BOOL NEAR CreateObjectInDoc(
PCARD pCard,
TCHAR szClass[]);
NOEXPORT BOOL NEAR ServerNameFromClass(
TCHAR szClass[],
TCHAR szServer[]);
NOEXPORT BOOL NEAR GetSelectedClassName(
HWND hwndList,
TCHAR szSelectedClass[]);
/* set to FALSE at the beginning of Insertobject,
* set to TRUE in Ole CallBack function on OLE_SAVE/OLE_CHANGE,
* If FALSE when OLE_CLOSE received, then delete the Object(server closed without
* updating the embedded object).
*/
BOOL fInsertComplete=TRUE;
// Class name picked up from dialog
static TCHAR szClassName[KEYNAMESIZE];
void InsertObject(
void)
{
int Result;
if (EditMode == I_TEXT)
return;
Result = DialogBox( hIndexInstance,
(LPTSTR) MAKEINTRESOURCE(DLGINSERTOBJECT),
hIndexWnd,
(WNDPROC) InsertObjectDlgProc);
if (Result == -1)
return; /* probably error msg , out of mem */
else if (Result == 0 || szClassName[0] == 0)
return; /* dlg cancelled */
PicSaveUndo(&CurCard);
CreateObjectInDoc(&CurCard, szClassName);
}
/* Insert New... dialog */
int FAR PASCAL InsertObjectDlgProc(
HWND hDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
HWND hwndList;
switch (msg)
{
case WM_INITDIALOG:
*szClassName = (TCHAR) 0;
hwndList = GetDlgItem(hDlg, IDD_LISTBOX);
if (!InitClassNamesList(hwndList))
{
TCHAR szMsg[50];
LoadString(hIndexInstance, IDS_NOOLESERVERS, szMsg, CharSizeOf(szMsg));
MessageBox(hIndexWnd, szMsg, szCardfile, MB_OK );
EndDialog(hDlg, FALSE);
}
SendMessage(hwndList, LB_SETCURSEL, 0, 0L);
SetFocus(hwndList);
return FALSE;
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDD_LISTBOX:
#if !defined(WIN32)
if (HIWORD(lParam) != LBN_DBLCLK)
#else
if (HIWORD(wParam) != LBN_DBLCLK)
#endif
break;
/* fall through */
case IDOK:
hwndList = GetDlgItem(hDlg, IDD_LISTBOX);
if (!GetSelectedClassName(hwndList, szClassName))
EndDialog(hDlg, FALSE); /* error, similar to Cancel dlg */
else
EndDialog(hDlg, TRUE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
}
break;
}
return FALSE;
}
// do something to get rid of warnings
#ifndef OLE_20
#define OLECHAR CHAR
#else
#define OLECHAR TCHAR
#endif
NOEXPORT BOOL NEAR CreateObjectInDoc(
PCARD pCard,
TCHAR szClass[])
{
LPOLEOBJECT lpObject;
OBJECTTYPE otObject;
WORD fOleErrRet;
OLECHAR szOleClass[KEYNAMESIZE]; // class name in ascii for ole
//
// Convert class name to ascii if we need to
//
#ifndef OLE_20
WideCharToMultiByte(CP_ACP,
0,
szClass,
-1, // api calculates length
szOleClass,
sizeof(szOleClass),
NULL,
NULL );
#else
lstrcpy( szOleClass, szClass );
#endif
#ifndef OLE_20
wsprintfA (szObjectName, szObjFormat, idObjectMax + 1);
#else
wsprintfW (szObjectName, szObjFormat, idObjectMax + 1);
#endif
fInsertComplete = FALSE;
if (fOleErrRet = OleError(
OleCreate(szPStdFile,
lpclient,
szOleClass,
lhcdoc,
szObjectName,
&lpObject,
olerender_draw,
0)))
{
if (fOleErrRet == FOLEERROR_NOTGIVEN)
ErrorMessage(E_CREATEOBJECTFAILED);
return FALSE;
}
else
otObject = EMBEDDED;
DoSetHostNames(lpObject, otObject);
if (lpObject)
{
if (pCard->lpObject)
PicDelete(pCard);
pCard->lpObject = lpObject;
pCard->otObject = otObject;
pCard->idObject = idObjectMax++;
CurCardHead.flags |= FDIRTY;
}
return TRUE;
}
/* InitClassNamesList() - Fills the list box with possible server names. */
NOEXPORT int NEAR InitClassNamesList(
HWND hwndList)
{
TCHAR szClass[KEYNAMESIZE];
TCHAR szServer[KEYNAMESIZE];
HKEY hkeyRoot;
int i;
if (RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hkeyRoot))
return FALSE;
SendMessage(hwndList, LB_RESETCONTENT, 0, 0L);
for (i = 0; !RegEnumKey(HKEY_CLASSES_ROOT, i, szClass, KEYNAMESIZE); i++)
{
if (ServerNameFromClass(szClass, szServer))
SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)szServer);
}
RegCloseKey(hkeyRoot);
return SendMessage(hwndList, LB_GETCOUNT, 0, 0L);
}
/* for a given classname, it returns the server name if one exists.
* returns TRUE on success, FALSE if given classname is not a server */
NOEXPORT BOOL NEAR ServerNameFromClass(
TCHAR szClass[],
TCHAR szServer[])
{
DWORD dwSize = KEYNAMESIZE;
HKEY hkeyTemp = NULL;
TCHAR szExec[KEYNAMESIZE];
int Result;
if (*szClass != TEXT('.')) /* Not default extension... */
{
/* See if this class really refers to a server */
wsprintf(szExec, TEXT("%s\\protocol\\StdFileEditing\\server"), (LPTSTR)szClass);
if (!RegOpenKey(HKEY_CLASSES_ROOT, szExec, &hkeyTemp))
{
/* get the class name string */
Result = RegQueryValue(HKEY_CLASSES_ROOT, szClass, szServer, (LONG FAR *)&dwSize);
RegCloseKey(hkeyTemp);
if (Result == 0)
return TRUE;
}
}
return FALSE;
}
/* GetSelectedClassName() - Returns the class id from the listbox.
*/
NOEXPORT BOOL NEAR GetSelectedClassName(
HWND hwndList,
TCHAR szSelectedClass[])
{
TCHAR szKey[KEYNAMESIZE];
TCHAR szClass[KEYNAMESIZE];
TCHAR szServer[KEYNAMESIZE];
int i;
int Sel;
HKEY hkeyRoot;
if (RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hkeyRoot))
return FALSE;
Sel = (int)SendMessage(hwndList, LB_GETCURSEL, 0, 0L);
SendMessage(hwndList, LB_GETTEXT, Sel, (LPARAM)szKey);
for (i = 0;
!RegEnumKey(HKEY_CLASSES_ROOT, i, szClass, KEYNAMESIZE); i++)
{
if (ServerNameFromClass(szClass, szServer) && /* if it is a server */
lstrcmp(szServer, szKey) == 0) /* and it is the one we want */
{
lstrcpy(szSelectedClass, szClass);
RegCloseKey(hkeyRoot);
return TRUE;
}
}
RegCloseKey(hkeyRoot);
return FALSE;
}