summaryrefslogtreecommitdiffstats
path: root/win/tclWinDde.c
diff options
context:
space:
mode:
Diffstat (limited to 'win/tclWinDde.c')
-rw-r--r--win/tclWinDde.c744
1 files changed, 248 insertions, 496 deletions
diff --git a/win/tclWinDde.c b/win/tclWinDde.c
index d883bac..eef5caa 100644
--- a/win/tclWinDde.c
+++ b/win/tclWinDde.c
@@ -10,20 +10,20 @@
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*/
-#undef STATIC_BUILD
-#ifndef USE_TCL_STUBS
-# define USE_TCL_STUBS
-#endif
#include "tclInt.h"
+#include "tclPort.h"
#include <dde.h>
#include <ddeml.h>
-#include <tchar.h>
-#if !defined(NDEBUG)
- /* test POKE server Implemented for debug mode only */
-# undef CBF_FAIL_POKES
-# define CBF_FAIL_POKES 0
-#endif
+/*
+ * TCL_STORAGE_CLASS is set unconditionally to DLLEXPORT because the Dde_Init
+ * declaration is in the source file itself, which is only accessed when we
+ * are building a library. DO NOT MOVE BEFORE ANY #include LINES. ONLY USE
+ * EXTERN TO INDICATE EXPORTED FUNCTIONS FROM NOW ON.
+ */
+
+#undef TCL_STORAGE_CLASS
+#define TCL_STORAGE_CLASS DLLEXPORT
/*
* The following structure is used to keep track of the interpreters
@@ -34,7 +34,7 @@ typedef struct RegisteredInterp {
struct RegisteredInterp *nextPtr;
/* The next interp this application knows
* about. */
- WCHAR *name; /* Interpreter's name (malloc-ed). */
+ char *name; /* Interpreter's name (malloc-ed). */
Tcl_Obj *handlerPtr; /* The server handler command */
Tcl_Interp *interp; /* The interpreter attached to this name. */
} RegisteredInterp;
@@ -51,7 +51,7 @@ typedef struct Conversation {
Tcl_Obj *returnPackagePtr; /* The result package for this conversation. */
} Conversation;
-typedef struct {
+typedef struct DdeEnumServices {
Tcl_Interp *interp;
int result;
ATOM service;
@@ -59,7 +59,7 @@ typedef struct {
HWND hwnd;
} DdeEnumServices;
-typedef struct {
+typedef struct ThreadSpecificData {
Conversation *currentConversations;
/* A list of conversations currently being
* processed. */
@@ -79,10 +79,9 @@ static DWORD ddeInstance; /* The application instance handle given to us
* by DdeInitialize. */
static int ddeIsServer = 0;
-#define TCL_DDE_VERSION "1.4.5"
#define TCL_DDE_PACKAGE_NAME "dde"
-#define TCL_DDE_SERVICE_NAME L"TclEval"
-#define TCL_DDE_EXECUTE_RESULT L"$TCLEVAL$EXECUTE$RESULT"
+#define TCL_DDE_SERVICE_NAME "TclEval"
+#define TCL_DDE_EXECUTE_RESULT "$TCLEVAL$EXECUTE$RESULT"
#define DDE_FLAG_ASYNC 1
#define DDE_FLAG_BINARY 2
@@ -90,62 +89,35 @@ static int ddeIsServer = 0;
TCL_DECLARE_MUTEX(ddeMutex)
-#if (TCL_MAJOR_VERSION < 9) && defined(TCL_MINOR_VERSION) && (TCL_MINOR_VERSION < 7)
-# if TCL_UTF_MAX > 3
-# define Tcl_WCharToUtfDString(a,b,c) Tcl_WinTCharToUtf((TCHAR *)(a),(b)*sizeof(WCHAR),c)
-# define Tcl_UtfToWCharDString(a,b,c) (WCHAR *)Tcl_WinUtfToTChar(a,b,c)
-# else
-# define Tcl_WCharToUtfDString Tcl_UniCharToUtfDString
-# define Tcl_UtfToWCharDString Tcl_UtfToUniCharDString
-# endif
-#ifndef Tcl_Size
-# define Tcl_Size int
-#endif
-#ifndef Tcl_CreateObjCommand2
-# define Tcl_CreateObjCommand2 Tcl_CreateObjCommand
-#endif
-#endif
-
/*
- * Declarations for functions defined in this file.
+ * Forward declarations for functions defined later in this file.
*/
static LRESULT CALLBACK DdeClientWindowProc(HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam);
-static int DdeCreateClient(DdeEnumServices *es);
+static int DdeCreateClient(struct DdeEnumServices *es);
static BOOL CALLBACK DdeEnumWindowsCallback(HWND hwndTarget,
LPARAM lParam);
-static void DdeExitProc(void *clientData);
+static void DdeExitProc(ClientData clientData);
static int DdeGetServicesList(Tcl_Interp *interp,
- const WCHAR *serviceName, const WCHAR *topicName);
+ const char *serviceName, const char *topicName);
static HDDEDATA CALLBACK DdeServerProc(UINT uType, UINT uFmt, HCONV hConv,
HSZ ddeTopic, HSZ ddeItem, HDDEDATA hData,
DWORD dwData1, DWORD dwData2);
static LRESULT DdeServicesOnAck(HWND hwnd, WPARAM wParam,
LPARAM lParam);
-static void DeleteProc(void *clientData);
+static void DeleteProc(ClientData clientData);
static Tcl_Obj * ExecuteRemoteObject(RegisteredInterp *riPtr,
Tcl_Obj *ddeObjectPtr);
static int MakeDdeConnection(Tcl_Interp *interp,
- const WCHAR *name, HCONV *ddeConvPtr);
+ const char *name, HCONV *ddeConvPtr);
static void SetDdeError(Tcl_Interp *interp);
-static int DdeObjCmd(void *clientData,
- Tcl_Interp *interp, Tcl_Size objc,
+static int DdeObjCmd(ClientData clientData,
+ Tcl_Interp *interp, int objc,
Tcl_Obj *const objv[]);
-#ifdef __cplusplus
-extern "C" {
-#endif
-DLLEXPORT int Dde_Init(Tcl_Interp *interp);
-DLLEXPORT int Dde_SafeInit(Tcl_Interp *interp);
-#if TCL_MAJOR_VERSION < 9
-/* With those additional entries, "load tcldde14.dll" works without 3th argument */
-DLLEXPORT int Tcldde_Init(Tcl_Interp *interp);
-DLLEXPORT int Tcldde_SafeInit(Tcl_Interp *interp);
-#endif
-#ifdef __cplusplus
-}
-#endif
+EXTERN int Dde_Init(Tcl_Interp *interp);
+EXTERN int Dde_SafeInit(Tcl_Interp *interp);
/*
*----------------------------------------------------------------------
@@ -167,22 +139,14 @@ int
Dde_Init(
Tcl_Interp *interp)
{
- if (!Tcl_InitStubs(interp, "8.5-", 0)) {
+ if (!Tcl_InitStubs(interp, "8.1", 0)) {
return TCL_ERROR;
}
- Tcl_CreateObjCommand2(interp, "dde", DdeObjCmd, NULL, NULL);
+ Tcl_CreateObjCommand(interp, "dde", DdeObjCmd, NULL, NULL);
Tcl_CreateExitHandler(DdeExitProc, NULL);
- return Tcl_PkgProvideEx(interp, TCL_DDE_PACKAGE_NAME, TCL_DDE_VERSION, NULL);
+ return Tcl_PkgProvide(interp, TCL_DDE_PACKAGE_NAME, "1.3.3");
}
-#if TCL_MAJOR_VERSION < 9
-int
-Tcldde_Init(
- Tcl_Interp *interp)
-{
- return Dde_Init(interp);
-}
-#endif
/*
*----------------------------------------------------------------------
@@ -210,14 +174,6 @@ Dde_SafeInit(
}
return result;
}
-#if TCL_MAJOR_VERSION < 9
-int
-Tcldde_SafeInit(
- Tcl_Interp *interp)
-{
- return Dde_SafeInit(interp);
-}
-#endif
/*
*----------------------------------------------------------------------
@@ -259,7 +215,7 @@ Initialize(void)
if (ddeInstance == 0) {
Tcl_MutexLock(&ddeMutex);
if (ddeInstance == 0) {
- if (DdeInitializeW(&ddeInstance, (PFNCALLBACK)(void *)DdeServerProc,
+ if (DdeInitialize(&ddeInstance, (PFNCALLBACK) DdeServerProc,
CBF_SKIP_REGISTRATIONS | CBF_SKIP_UNREGISTRATIONS
| CBF_FAIL_POKES, 0) != DMLERR_NO_ERROR) {
ddeInstance = 0;
@@ -272,8 +228,8 @@ Initialize(void)
if ((ddeServiceGlobal == 0) && (nameFound != 0)) {
ddeIsServer = 1;
Tcl_CreateExitHandler(DdeExitProc, NULL);
- ddeServiceGlobal = DdeCreateStringHandleW(ddeInstance,
- TCL_DDE_SERVICE_NAME, CP_WINUNICODE);
+ ddeServiceGlobal = DdeCreateStringHandle(ddeInstance,
+ TCL_DDE_SERVICE_NAME, 0);
DdeNameService(ddeInstance, ddeServiceGlobal, 0L, DNS_REGISTER);
} else {
ddeIsServer = 0;
@@ -307,23 +263,22 @@ Initialize(void)
*----------------------------------------------------------------------
*/
-static const WCHAR *
+static const char *
DdeSetServerName(
Tcl_Interp *interp,
- const WCHAR *name, /* The name that will be used to refer to the
+ const char *name, /* The name that will be used to refer to the
* interpreter in later "send" commands. Must
* be globally unique. */
int flags, /* DDE_FLAG_FORCE or 0 */
Tcl_Obj *handlerPtr) /* Name of the optional proc/command to handle
* incoming Dde eval's */
{
- int suffix;
+ int suffix, offset;
RegisteredInterp *riPtr, *prevPtr;
Tcl_DString dString;
- const WCHAR *actualName;
+ const char *actualName;
Tcl_Obj *srvListPtr = NULL, **srvPtrPtr = NULL;
- Tcl_Size n, srvCount = 0, offset;
- int lastSuffix, r = TCL_OK;
+ int n, srvCount = 0, lastSuffix, r = TCL_OK;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
/*
@@ -359,7 +314,7 @@ DdeSetServerName(
* current interp, but it doesn't have a name.
*/
- return L"";
+ return "";
}
/*
@@ -380,9 +335,7 @@ DdeSetServerName(
&srvPtrPtr);
}
if (r != TCL_OK) {
- Tcl_DStringInit(&dString);
- OutputDebugStringW(Tcl_UtfToWCharDString(Tcl_GetString(Tcl_GetObjResult(interp)), -1, &dString));
- Tcl_DStringFree(&dString);
+ OutputDebugString(Tcl_GetStringResult(interp));
return NULL;
}
@@ -399,14 +352,13 @@ DdeSetServerName(
lastSuffix = suffix;
if (suffix > 1) {
if (suffix == 2) {
- Tcl_DStringAppend(&dString, (char *)name, wcslen(name) * sizeof(WCHAR));
- Tcl_DStringAppend(&dString, (char *)L" #", 2 * sizeof(WCHAR));
+ Tcl_DStringAppend(&dString, name, -1);
+ Tcl_DStringAppend(&dString, " #", 2);
offset = Tcl_DStringLength(&dString);
- Tcl_DStringSetLength(&dString, offset + sizeof(WCHAR) * TCL_INTEGER_SPACE);
- actualName = (WCHAR *) Tcl_DStringValue(&dString);
+ Tcl_DStringSetLength(&dString, offset + TCL_INTEGER_SPACE);
+ actualName = Tcl_DStringValue(&dString);
}
- _snwprintf((WCHAR *) (Tcl_DStringValue(&dString) + offset),
- TCL_INTEGER_SPACE, L"%d", suffix);
+ sprintf(Tcl_DStringValue(&dString) + offset, "%d", suffix);
}
/*
@@ -415,42 +367,39 @@ DdeSetServerName(
for (n = 0; n < srvCount; ++n) {
Tcl_Obj* namePtr;
- Tcl_DString ds;
Tcl_ListObjIndex(interp, srvPtrPtr[n], 1, &namePtr);
- Tcl_DStringInit(&ds);
- Tcl_UtfToWCharDString(Tcl_GetString(namePtr), -1, &ds);
- if (wcscmp(actualName, (WCHAR *)Tcl_DStringValue(&ds)) == 0) {
+ if (strcmp(actualName, Tcl_GetString(namePtr)) == 0) {
suffix++;
- Tcl_DStringFree(&ds);
break;
}
- Tcl_DStringFree(&ds);
}
}
+ Tcl_DStringSetLength(&dString,
+ offset + (int)strlen(Tcl_DStringValue(&dString)+offset));
}
/*
* We have found a unique name. Now add it to the registry.
*/
- riPtr = (RegisteredInterp *) Tcl_Alloc(sizeof(RegisteredInterp));
+ riPtr = (RegisteredInterp *) ckalloc(sizeof(RegisteredInterp));
riPtr->interp = interp;
- riPtr->name = (WCHAR *) Tcl_Alloc((wcslen(actualName) + 1) * sizeof(WCHAR));
+ riPtr->name = ckalloc((unsigned int) strlen(actualName) + 1);
riPtr->nextPtr = tsdPtr->interpListPtr;
riPtr->handlerPtr = handlerPtr;
if (riPtr->handlerPtr != NULL) {
Tcl_IncrRefCount(riPtr->handlerPtr);
}
tsdPtr->interpListPtr = riPtr;
- wcscpy(riPtr->name, actualName);
+ strcpy(riPtr->name, actualName);
if (Tcl_IsSafe(interp)) {
Tcl_ExposeCommand(interp, "dde", "dde");
}
- Tcl_CreateObjCommand2(interp, "dde", DdeObjCmd,
- riPtr, DeleteProc);
+ Tcl_CreateObjCommand(interp, "dde", DdeObjCmd,
+ (ClientData) riPtr, DeleteProc);
if (Tcl_IsSafe(interp)) {
Tcl_HideCommand(interp, "dde", "dde");
}
@@ -515,7 +464,8 @@ DdeGetRegistrationPtr(
static void
DeleteProc(
- void *clientData) /* The interp we are deleting. */
+ ClientData clientData) /* The interp we are deleting passed as
+ * ClientData. */
{
RegisteredInterp *riPtr = (RegisteredInterp *) clientData;
RegisteredInterp *searchPtr, *prevPtr;
@@ -536,7 +486,7 @@ DeleteProc(
prevPtr->nextPtr = searchPtr->nextPtr;
}
}
- Tcl_Free((char *) riPtr->name);
+ ckfree(riPtr->name);
if (riPtr->handlerPtr) {
Tcl_DecrRefCount(riPtr->handlerPtr);
}
@@ -574,11 +524,10 @@ ExecuteRemoteObject(
Tcl_Obj *returnPackagePtr;
int result = TCL_OK;
- if ((riPtr->handlerPtr == NULL) && Tcl_IsSafe(riPtr->interp)) {
+ if (riPtr->handlerPtr == NULL && Tcl_IsSafe(riPtr->interp)) {
Tcl_SetObjResult(riPtr->interp, Tcl_NewStringObj("permission denied: "
"a handler procedure must be defined for use in a safe "
"interp", -1));
- Tcl_SetErrorCode(riPtr->interp, "TCL", "DDE", "SECURITY_CHECK", (void *)NULL);
result = TCL_ERROR;
}
@@ -652,20 +601,18 @@ DdeServerProc(
HSZ ddeTopic, HSZ ddeItem, /* String handles. Transaction-type
* dependent. */
HDDEDATA hData, /* DDE data. Transaction-type dependent. */
- DWORD unused1, DWORD unused2)
+ DWORD dwData1, DWORD dwData2)
/* Transaction-dependent data. */
{
Tcl_DString dString;
- Tcl_Size len;
+ int len;
DWORD dlen;
- WCHAR *utilString;
+ char *utilString;
Tcl_Obj *ddeObjectPtr;
HDDEDATA ddeReturn = NULL;
RegisteredInterp *riPtr;
Conversation *convPtr, *prevConvPtr;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
- (void)unused1;
- (void)unused2;
switch(uType) {
case XTYP_CONNECT:
@@ -674,16 +621,16 @@ DdeServerProc(
* sure we have a valid topic.
*/
- len = DdeQueryStringW(ddeInstance, ddeTopic, NULL, 0, CP_WINUNICODE);
+ len = DdeQueryString(ddeInstance, ddeTopic, NULL, 0, 0);
Tcl_DStringInit(&dString);
- Tcl_DStringSetLength(&dString, (len + 1) * sizeof(WCHAR) - 1);
- utilString = (WCHAR *) Tcl_DStringValue(&dString);
- DdeQueryStringW(ddeInstance, ddeTopic, utilString, (DWORD) len + 1,
- CP_WINUNICODE);
+ Tcl_DStringSetLength(&dString, len);
+ utilString = Tcl_DStringValue(&dString);
+ DdeQueryString(ddeInstance, ddeTopic, utilString, (DWORD) len + 1,
+ CP_WINANSI);
for (riPtr = tsdPtr->interpListPtr; riPtr != NULL;
riPtr = riPtr->nextPtr) {
- if (_wcsicmp(utilString, riPtr->name) == 0) {
+ if (stricmp(utilString, riPtr->name) == 0) {
Tcl_DStringFree(&dString);
return (HDDEDATA) TRUE;
}
@@ -699,16 +646,16 @@ DdeServerProc(
* result to return in an XTYP_REQUEST.
*/
- len = DdeQueryStringW(ddeInstance, ddeTopic, NULL, 0, CP_WINUNICODE);
+ len = DdeQueryString(ddeInstance, ddeTopic, NULL, 0, 0);
Tcl_DStringInit(&dString);
- Tcl_DStringSetLength(&dString, (len + 1) * sizeof(WCHAR) - 1);
- utilString = (WCHAR *) Tcl_DStringValue(&dString);
- DdeQueryStringW(ddeInstance, ddeTopic, utilString, (DWORD) len + 1,
- CP_WINUNICODE);
+ Tcl_DStringSetLength(&dString, len);
+ utilString = Tcl_DStringValue(&dString);
+ DdeQueryString(ddeInstance, ddeTopic, utilString, (DWORD) len + 1,
+ CP_WINANSI);
for (riPtr = tsdPtr->interpListPtr; riPtr != NULL;
riPtr = riPtr->nextPtr) {
- if (_wcsicmp(riPtr->name, utilString) == 0) {
- convPtr = (Conversation *) Tcl_Alloc(sizeof(Conversation));
+ if (stricmp(riPtr->name, utilString) == 0) {
+ convPtr = (Conversation *) ckalloc(sizeof(Conversation));
convPtr->nextPtr = tsdPtr->currentConversations;
convPtr->returnPackagePtr = NULL;
convPtr->hConv = hConv;
@@ -738,7 +685,7 @@ DdeServerProc(
if (convPtr->returnPackagePtr != NULL) {
Tcl_DecrRefCount(convPtr->returnPackagePtr);
}
- Tcl_Free((char *) convPtr);
+ ckfree((char *) convPtr);
break;
}
}
@@ -764,24 +711,22 @@ DdeServerProc(
}
if (convPtr != NULL) {
- Tcl_DString dsBuf;
char *returnString;
- len = DdeQueryStringW(ddeInstance, ddeItem, NULL, 0, CP_WINUNICODE);
+ len = DdeQueryString(ddeInstance, ddeItem, NULL, 0, CP_WINANSI);
Tcl_DStringInit(&dString);
- Tcl_DStringInit(&dsBuf);
- Tcl_DStringSetLength(&dString, (len + 1) * sizeof(WCHAR) - 1);
- utilString = (WCHAR *) Tcl_DStringValue(&dString);
- DdeQueryStringW(ddeInstance, ddeItem, utilString, (DWORD) len + 1,
- CP_WINUNICODE);
- if (_wcsicmp(utilString, TCL_DDE_EXECUTE_RESULT) == 0) {
- returnString =
- Tcl_GetStringFromObj(convPtr->returnPackagePtr, &len);
- if (uFmt != CF_TEXT) {
- Tcl_DStringInit(&dsBuf);
- Tcl_UtfToWCharDString(returnString, len, &dsBuf);
- returnString = Tcl_DStringValue(&dsBuf);
- len = Tcl_DStringLength(&dsBuf) + sizeof(WCHAR) - 1;
+ Tcl_DStringSetLength(&dString, len);
+ utilString = Tcl_DStringValue(&dString);
+ DdeQueryString(ddeInstance, ddeItem, utilString, (DWORD) len + 1,
+ CP_WINANSI);
+ if (stricmp(utilString, TCL_DDE_EXECUTE_RESULT) == 0) {
+ if (uFmt == CF_TEXT) {
+ returnString =
+ Tcl_GetStringFromObj(convPtr->returnPackagePtr, &len);
+ } else {
+ returnString = (char *)
+ Tcl_GetUnicodeFromObj(convPtr->returnPackagePtr, &len);
+ len = 2 * len + 1;
}
ddeReturn = DdeCreateDataHandle(ddeInstance, (BYTE *)returnString,
(DWORD) len+1, 0, ddeItem, uFmt, 0);
@@ -789,21 +734,17 @@ DdeServerProc(
if (Tcl_IsSafe(convPtr->riPtr->interp)) {
ddeReturn = NULL;
} else {
- Tcl_DString ds;
- Tcl_Obj *variableObjPtr;
-
- Tcl_DStringInit(&ds);
- Tcl_WCharToUtfDString(utilString, wcslen(utilString), &ds);
- variableObjPtr = Tcl_GetVar2Ex(
- convPtr->riPtr->interp, Tcl_DStringValue(&ds), NULL,
+ Tcl_Obj *variableObjPtr = Tcl_GetVar2Ex(
+ convPtr->riPtr->interp, utilString, NULL,
TCL_GLOBAL_ONLY);
if (variableObjPtr != NULL) {
- returnString = Tcl_GetStringFromObj(variableObjPtr, &len);
- if (uFmt != CF_TEXT) {
- Tcl_DStringInit(&dsBuf);
- Tcl_UtfToWCharDString(returnString, len, &dsBuf);
- returnString = Tcl_DStringValue(&dsBuf);
- len = Tcl_DStringLength(&dsBuf) + sizeof(WCHAR) - 1;
+ if (uFmt == CF_TEXT) {
+ returnString = Tcl_GetStringFromObj(
+ variableObjPtr, &len);
+ } else {
+ returnString = (char *) Tcl_GetUnicodeFromObj(
+ variableObjPtr, &len);
+ len = 2 * len + 1;
}
ddeReturn = DdeCreateDataHandle(ddeInstance,
(BYTE *)returnString, (DWORD) len+1, 0, ddeItem,
@@ -811,75 +752,20 @@ DdeServerProc(
} else {
ddeReturn = NULL;
}
- Tcl_DStringFree(&ds);
}
}
- Tcl_DStringFree(&dsBuf);
Tcl_DStringFree(&dString);
}
return ddeReturn;
-#if !CBF_FAIL_POKES
- case XTYP_POKE:
- /*
- * This is a poke for a Tcl variable, only implemented in
- * debug/UNICODE mode.
- */
- ddeReturn = DDE_FNOTPROCESSED;
-
- if ((uFmt != CF_TEXT) && (uFmt != CF_UNICODETEXT)) {
- return ddeReturn;
- }
-
- for (convPtr = tsdPtr->currentConversations; (convPtr != NULL)
- && (convPtr->hConv != hConv); convPtr = convPtr->nextPtr) {
- /*
- * Empty loop body.
- */
- }
-
- if (convPtr && !Tcl_IsSafe(convPtr->riPtr->interp)) {
- Tcl_DString ds, ds2;
- Tcl_Obj *variableObjPtr;
- DWORD len2;
-
- Tcl_DStringInit(&dString);
- Tcl_DStringInit(&ds2);
- len = DdeQueryStringW(ddeInstance, ddeItem, NULL, 0, CP_WINUNICODE);
- Tcl_DStringSetLength(&dString, (len + 1) * sizeof(WCHAR) - 1);
- utilString = (WCHAR *) Tcl_DStringValue(&dString);
- DdeQueryStringW(ddeInstance, ddeItem, utilString, (DWORD) len + 1,
- CP_WINUNICODE);
- Tcl_DStringInit(&ds);
- Tcl_WCharToUtfDString(utilString, wcslen(utilString), &ds);
- utilString = (WCHAR *) DdeAccessData(hData, &len2);
- len = len2;
- if (uFmt != CF_TEXT) {
- Tcl_DStringInit(&ds2);
- Tcl_WCharToUtfDString(utilString, wcslen(utilString), &ds2);
- utilString = (WCHAR *) Tcl_DStringValue(&ds2);
- }
- variableObjPtr = Tcl_NewStringObj((char *)utilString, -1);
-
- Tcl_SetVar2Ex(convPtr->riPtr->interp, Tcl_DStringValue(&ds), NULL,
- variableObjPtr, TCL_GLOBAL_ONLY);
-
- Tcl_DStringFree(&ds2);
- Tcl_DStringFree(&ds);
- Tcl_DStringFree(&dString);
- ddeReturn = (HDDEDATA) DDE_FACK;
- }
- return ddeReturn;
-
-#endif
case XTYP_EXECUTE: {
/*
* Execute this script. The results will be saved into a list object
- * which will be retrieved later. See ExecuteRemoteObject.
+ * which will be retreived later. See ExecuteRemoteObject.
*/
Tcl_Obj *returnPackagePtr;
- char *string;
+ Tcl_UniChar *uniStr;
for (convPtr = tsdPtr->currentConversations; (convPtr != NULL)
&& (convPtr->hConv != hConv); convPtr = convPtr->nextPtr) {
@@ -892,26 +778,21 @@ DdeServerProc(
return (HDDEDATA) DDE_FNOTPROCESSED;
}
- utilString = (WCHAR *) DdeAccessData(hData, &dlen);
- string = (char *) utilString;
+ utilString = (char *) DdeAccessData(hData, &dlen);
+ uniStr = (Tcl_UniChar *) utilString;
if (!dlen) {
/* Empty binary array. */
ddeObjectPtr = Tcl_NewObj();
- } else if ((dlen & 1) || utilString[(dlen>>1)-1]) {
- /* Cannot be Unicode, so assume utf-8 */
- if (!string[dlen-1]) {
+ } else if ((dlen & 1) || uniStr[(dlen>>1)-1]) {
+ /* Cannot be unicode, so assume utf-8 */
+ if (!utilString[dlen-1]) {
dlen--;
}
- ddeObjectPtr = Tcl_NewStringObj(string, dlen);
+ ddeObjectPtr = Tcl_NewStringObj(utilString, dlen);
} else {
- /* Unicode */
- Tcl_DString dsBuf;
-
- Tcl_DStringInit(&dsBuf);
- Tcl_WCharToUtfDString(utilString, (dlen>>1) - 1, &dsBuf);
- ddeObjectPtr = Tcl_NewStringObj(Tcl_DStringValue(&dsBuf),
- Tcl_DStringLength(&dsBuf));
- Tcl_DStringFree(&dsBuf);
+ /* unicode */
+ dlen >>= 1;
+ ddeObjectPtr = Tcl_NewUnicodeObj(uniStr, dlen - 1);
}
Tcl_IncrRefCount(ddeObjectPtr);
DdeUnaccessData(hData);
@@ -946,8 +827,8 @@ DdeServerProc(
*/
HSZPAIR *returnPtr;
- Tcl_Size i;
- DWORD numItems;
+ int i;
+ int numItems;
for (i = 0, riPtr = tsdPtr->interpListPtr; riPtr != NULL;
i++, riPtr = riPtr->nextPtr) {
@@ -956,20 +837,17 @@ DdeServerProc(
*/
}
- if ((size_t)i >= UINT_MAX/sizeof(HSZPAIR)) {
- return NULL;
- }
- numItems = (DWORD)i;
+ numItems = i;
ddeReturn = DdeCreateDataHandle(ddeInstance, NULL,
- (numItems + 1) * (DWORD)sizeof(HSZPAIR), 0, 0, 0, 0);
+ (numItems + 1) * sizeof(HSZPAIR), 0, 0, 0, 0);
returnPtr = (HSZPAIR *) DdeAccessData(ddeReturn, &dlen);
len = dlen;
- for (i = 0, riPtr = tsdPtr->interpListPtr; i < (Tcl_Size)numItems;
+ for (i = 0, riPtr = tsdPtr->interpListPtr; i < numItems;
i++, riPtr = riPtr->nextPtr) {
- returnPtr[i].hszSvc = DdeCreateStringHandleW(ddeInstance,
- TCL_DDE_SERVICE_NAME, CP_WINUNICODE);
- returnPtr[i].hszTopic = DdeCreateStringHandleW(ddeInstance,
- riPtr->name, CP_WINUNICODE);
+ returnPtr[i].hszSvc = DdeCreateStringHandle(ddeInstance,
+ TCL_DDE_SERVICE_NAME, CP_WINANSI);
+ returnPtr[i].hszTopic = DdeCreateStringHandle(ddeInstance,
+ riPtr->name, CP_WINANSI);
}
returnPtr[i].hszSvc = NULL;
returnPtr[i].hszTopic = NULL;
@@ -1000,9 +878,8 @@ DdeServerProc(
static void
DdeExitProc(
- void *dummy) /* Not used. */
+ ClientData clientData) /* Not used in this handler. */
{
- (void)dummy;
DdeNameService(ddeInstance, NULL, 0, DNS_UNREGISTER);
DdeUninitialize(ddeInstance);
ddeInstance = 0;
@@ -1028,14 +905,14 @@ DdeExitProc(
static int
MakeDdeConnection(
Tcl_Interp *interp, /* Used to report errors. */
- const WCHAR *name, /* The connection to use. */
+ const char *name, /* The connection to use. */
HCONV *ddeConvPtr)
{
HSZ ddeTopic, ddeService;
HCONV ddeConv;
- ddeService = DdeCreateStringHandleW(ddeInstance, TCL_DDE_SERVICE_NAME, CP_WINUNICODE);
- ddeTopic = DdeCreateStringHandleW(ddeInstance, name, CP_WINUNICODE);
+ ddeService = DdeCreateStringHandle(ddeInstance, TCL_DDE_SERVICE_NAME, 0);
+ ddeTopic = DdeCreateStringHandle(ddeInstance, name, 0);
ddeConv = DdeConnect(ddeInstance, ddeService, ddeTopic, NULL);
DdeFreeStringHandle(ddeInstance, ddeService);
@@ -1043,14 +920,8 @@ MakeDdeConnection(
if (ddeConv == (HCONV) NULL) {
if (interp != NULL) {
- Tcl_DString dString;
-
- Tcl_DStringInit(&dString);
- Tcl_WCharToUtfDString(name, wcslen(name), &dString);
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "no registered server named \"%s\"", Tcl_DStringValue(&dString)));
- Tcl_DStringFree(&dString);
- Tcl_SetErrorCode(interp, "TCL", "DDE", "NO_SERVER", (void *)NULL);
+ Tcl_AppendResult(interp, "no registered server named \"",
+ name, "\"", NULL);
}
return TCL_ERROR;
}
@@ -1081,24 +952,24 @@ MakeDdeConnection(
static int
DdeCreateClient(
- DdeEnumServices *es)
+ struct DdeEnumServices *es)
{
- WNDCLASSEXW wc;
- static const WCHAR *szDdeClientClassName = L"TclEval client class";
- static const WCHAR *szDdeClientWindowName = L"TclEval client window";
+ WNDCLASSEX wc;
+ static const char *szDdeClientClassName = "TclEval client class";
+ static const char *szDdeClientWindowName = "TclEval client window";
memset(&wc, 0, sizeof(wc));
wc.cbSize = sizeof(wc);
wc.lpfnWndProc = DdeClientWindowProc;
wc.lpszClassName = szDdeClientClassName;
- wc.cbWndExtra = sizeof(DdeEnumServices *);
+ wc.cbWndExtra = sizeof(struct DdeEnumServices *);
/*
* Register and create the callback window.
*/
- RegisterClassExW(&wc);
- es->hwnd = CreateWindowExW(0, szDdeClientClassName, szDdeClientWindowName,
+ RegisterClassEx(&wc);
+ es->hwnd = CreateWindowEx(0, szDdeClientClassName, szDdeClientWindowName,
WS_POPUP, 0, 0, 0, 0, NULL, NULL, NULL, (LPVOID)es);
return TCL_OK;
}
@@ -1113,20 +984,20 @@ DdeClientWindowProc(
switch (uMsg) {
case WM_CREATE: {
LPCREATESTRUCT lpcs = (LPCREATESTRUCT) lParam;
- DdeEnumServices *es =
- (DdeEnumServices *) lpcs->lpCreateParams;
+ struct DdeEnumServices *es =
+ (struct DdeEnumServices *) lpcs->lpCreateParams;
#ifdef _WIN64
- SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR) es);
+ SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) es);
#else
- SetWindowLongW(hwnd, GWL_USERDATA, (LONG) es);
+ SetWindowLong(hwnd, GWL_USERDATA, (LONG) es);
#endif
return (LRESULT) 0L;
}
case WM_DDE_ACK:
return DdeServicesOnAck(hwnd, wParam, lParam);
default:
- return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+ return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
@@ -1139,31 +1010,24 @@ DdeServicesOnAck(
HWND hwndRemote = (HWND)wParam;
ATOM service = (ATOM)LOWORD(lParam);
ATOM topic = (ATOM)HIWORD(lParam);
- DdeEnumServices *es;
- WCHAR sz[255];
- Tcl_DString dString;
+ struct DdeEnumServices *es;
+ char sz[255];
#ifdef _WIN64
- es = (DdeEnumServices *) GetWindowLongPtrW(hwnd, GWLP_USERDATA);
+ es = (struct DdeEnumServices *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
#else
- es = (DdeEnumServices *) GetWindowLongW(hwnd, GWL_USERDATA);
+ es = (struct DdeEnumServices *) GetWindowLong(hwnd, GWL_USERDATA);
#endif
- if (((es->service == (ATOM)0) || (es->service == service))
- && ((es->topic == (ATOM)0) || (es->topic == topic))) {
+ if ((es->service == (ATOM)0 || es->service == service)
+ && (es->topic == (ATOM)0 || es->topic == topic)) {
Tcl_Obj *matchPtr = Tcl_NewListObj(0, NULL);
Tcl_Obj *resultPtr = Tcl_GetObjResult(es->interp);
- GlobalGetAtomNameW(service, sz, 255);
- Tcl_DStringInit(&dString);
- Tcl_WCharToUtfDString(sz, wcslen(sz), &dString);
- Tcl_ListObjAppendElement(NULL, matchPtr, Tcl_NewStringObj(Tcl_DStringValue(&dString), -1));
- Tcl_DStringFree(&dString);
- GlobalGetAtomNameW(topic, sz, 255);
- Tcl_DStringInit(&dString);
- Tcl_WCharToUtfDString(sz, wcslen(sz), &dString);
- Tcl_ListObjAppendElement(NULL, matchPtr, Tcl_NewStringObj(Tcl_DStringValue(&dString), -1));
- Tcl_DStringFree(&dString);
+ GlobalGetAtomName(service, sz, 255);
+ Tcl_ListObjAppendElement(NULL, matchPtr, Tcl_NewStringObj(sz, -1));
+ GlobalGetAtomName(topic, sz, 255);
+ Tcl_ListObjAppendElement(NULL, matchPtr, Tcl_NewStringObj(sz, -1));
/*
* Adding the hwnd as a third list element provides a unique
@@ -1189,7 +1053,7 @@ DdeServicesOnAck(
* Tell the server we are no longer interested.
*/
- PostMessageW(hwndRemote, WM_DDE_TERMINATE, (WPARAM)hwnd, 0L);
+ PostMessage(hwndRemote, WM_DDE_TERMINATE, (WPARAM)hwnd, 0L);
return 0L;
}
@@ -1199,9 +1063,9 @@ DdeEnumWindowsCallback(
LPARAM lParam)
{
DWORD_PTR dwResult = 0;
- DdeEnumServices *es = (DdeEnumServices *) lParam;
+ struct DdeEnumServices *es = (struct DdeEnumServices *) lParam;
- SendMessageTimeoutW(hwndTarget, WM_DDE_INITIATE, (WPARAM)es->hwnd,
+ SendMessageTimeout(hwndTarget, WM_DDE_INITIATE, (WPARAM)es->hwnd,
MAKELONG(es->service, es->topic), SMTO_ABORTIFHUNG, 1000,
&dwResult);
return TRUE;
@@ -1210,16 +1074,16 @@ DdeEnumWindowsCallback(
static int
DdeGetServicesList(
Tcl_Interp *interp,
- const WCHAR *serviceName,
- const WCHAR *topicName)
+ const char *serviceName,
+ const char *topicName)
{
- DdeEnumServices es;
+ struct DdeEnumServices es;
es.interp = interp;
es.result = TCL_OK;
es.service = (serviceName == NULL)
- ? (ATOM)0 : GlobalAddAtomW(serviceName);
- es.topic = (topicName == NULL) ? (ATOM)0 : GlobalAddAtomW(topicName);
+ ? (ATOM)0 : GlobalAddAtom(serviceName);
+ es.topic = (topicName == NULL) ? (ATOM)0 : GlobalAddAtom(topicName);
Tcl_ResetResult(interp); /* our list is to be appended to result. */
DdeCreateClient(&es);
@@ -1258,30 +1122,25 @@ static void
SetDdeError(
Tcl_Interp *interp) /* The interp to put the message in. */
{
- const char *errorMessage, *errorCode;
+ const char *errorMessage;
switch (DdeGetLastError(ddeInstance)) {
case DMLERR_DATAACKTIMEOUT:
case DMLERR_EXECACKTIMEOUT:
case DMLERR_POKEACKTIMEOUT:
errorMessage = "remote interpreter did not respond";
- errorCode = "TIMEOUT";
break;
case DMLERR_BUSY:
errorMessage = "remote server is busy";
- errorCode = "BUSY";
break;
case DMLERR_NOTPROCESSED:
errorMessage = "remote server cannot handle this command";
- errorCode = "NOCANDO";
break;
default:
errorMessage = "dde command failed";
- errorCode = "FAILED";
}
Tcl_SetObjResult(interp, Tcl_NewStringObj(errorMessage, -1));
- Tcl_SetErrorCode(interp, "TCL", "DDE", errorCode, (void *)NULL);
}
/*
@@ -1303,48 +1162,39 @@ SetDdeError(
static int
DdeObjCmd(
- void *dummy, /* Not used. */
+ ClientData clientData, /* Used only for deletion */
Tcl_Interp *interp, /* The interp we are sending from */
- Tcl_Size objc, /* Number of arguments */
+ int objc, /* Number of arguments */
Tcl_Obj *const *objv) /* The arguments */
{
- static const char *const ddeCommands[] = {
- "servername", "execute", "poke", "request", "services", "eval", NULL};
+ static const char *ddeCommands[] = {
+ "servername", "execute", "poke", "request", "services", "eval",
+ (char *) NULL};
enum DdeSubcommands {
DDE_SERVERNAME, DDE_EXECUTE, DDE_POKE, DDE_REQUEST, DDE_SERVICES,
DDE_EVAL
};
- static const char *const ddeSrvOptions[] = {
+ static const char *ddeSrvOptions[] = {
"-force", "-handler", "--", NULL
};
enum DdeSrvOptions {
DDE_SERVERNAME_EXACT, DDE_SERVERNAME_HANDLER, DDE_SERVERNAME_LAST,
};
- static const char *const ddeExecOptions[] = {
- "-async", "-binary", NULL
- };
- enum DdeExecOptions {
- DDE_EXEC_ASYNC, DDE_EXEC_BINARY
- };
- static const char *const ddeEvalOptions[] = {
+ static const char *ddeExecOptions[] = {
"-async", NULL
};
- static const char *const ddeReqOptions[] = {
+ static const char *ddeReqOptions[] = {
"-binary", NULL
};
- int index, argIndex;
- Tcl_Size length, i;
+ int index, i, length, argIndex;
int flags = 0, result = TCL_OK, firstArg = 0;
HSZ ddeService = NULL, ddeTopic = NULL, ddeItem = NULL, ddeCookie = NULL;
HDDEDATA ddeData = NULL, ddeItemData = NULL, ddeReturn;
HCONV hConv = NULL;
- const WCHAR *serviceName = NULL, *topicName = NULL;
- const char *string;
+ const char *serviceName = NULL, *topicName = NULL, *string;
DWORD ddeResult;
Tcl_Obj *objPtr, *handlerPtr = NULL;
- Tcl_DString serviceBuf, topicBuf, itemBuf;
- (void)dummy;
/*
* Initialize DDE server/client
@@ -1360,9 +1210,6 @@ DdeObjCmd(
return TCL_ERROR;
}
- Tcl_DStringInit(&serviceBuf);
- Tcl_DStringInit(&topicBuf);
- Tcl_DStringInit(&itemBuf);
switch ((enum DdeSubcommands) index) {
case DDE_SERVERNAME:
for (i = 2; i < objc; i++) {
@@ -1412,53 +1259,38 @@ DdeObjCmd(
if (objc == 5) {
firstArg = 2;
break;
- } else if ((objc >= 6) && (objc <= 7)) {
- firstArg = objc - 3;
- for (i = 2; i < firstArg; i++) {
- if (Tcl_GetIndexFromObj(interp, objv[i], ddeExecOptions,
- "option", 0, &argIndex) != TCL_OK) {
- goto wrongDdeExecuteArgs;
- }
- if (argIndex == DDE_EXEC_ASYNC) {
- flags |= DDE_FLAG_ASYNC;
- } else {
- flags |= DDE_FLAG_BINARY;
- }
+ } else if (objc == 6) {
+ if (Tcl_GetIndexFromObj(NULL, objv[2], ddeExecOptions, "option", 0,
+ &argIndex) == TCL_OK) {
+ flags |= DDE_FLAG_ASYNC;
+ firstArg = 3;
+ break;
}
- break;
}
/* otherwise... */
- wrongDdeExecuteArgs:
Tcl_WrongNumArgs(interp, 2, objv,
- "?-async? ?-binary? serviceName topicName value");
+ "?-async? serviceName topicName value");
return TCL_ERROR;
case DDE_POKE:
- if (objc == 6) {
- firstArg = 2;
- break;
- } else if ((objc == 7) && (Tcl_GetIndexFromObj(NULL, objv[2],
- ddeReqOptions, "option", 0, &argIndex) == TCL_OK)) {
- flags |= DDE_FLAG_BINARY;
- firstArg = 3;
- break;
+ if (objc != 6) {
+ Tcl_WrongNumArgs(interp, 2, objv,
+ "serviceName topicName item value");
+ return TCL_ERROR;
}
-
- /*
- * Otherwise...
- */
-
- Tcl_WrongNumArgs(interp, 2, objv,
- "?-binary? serviceName topicName item value");
- return TCL_ERROR;
+ firstArg = 2;
+ break;
case DDE_REQUEST:
if (objc == 5) {
firstArg = 2;
break;
- } else if ((objc == 6) && (Tcl_GetIndexFromObj(NULL, objv[2],
- ddeReqOptions, "option", 0, &argIndex) == TCL_OK)) {
- flags |= DDE_FLAG_BINARY;
- firstArg = 3;
- break;
+ } else if (objc == 6) {
+ int dummy;
+ if (Tcl_GetIndexFromObj(NULL, objv[2], ddeReqOptions, "option", 0,
+ &dummy) == TCL_OK) {
+ flags |= DDE_FLAG_BINARY;
+ firstArg = 3;
+ break;
+ }
}
/*
@@ -1482,7 +1314,7 @@ DdeObjCmd(
return TCL_ERROR;
} else {
firstArg = 2;
- if (Tcl_GetIndexFromObj(NULL, objv[2], ddeEvalOptions, "option",
+ if (Tcl_GetIndexFromObj(NULL, objv[2], ddeExecOptions, "option",
0, &argIndex) == TCL_OK) {
if (objc < 5) {
goto wrongDdeEvalArgs;
@@ -1497,12 +1329,7 @@ DdeObjCmd(
Initialize();
if (firstArg != 1) {
- const char *src = Tcl_GetStringFromObj(objv[firstArg], &length);
-
- Tcl_DStringInit(&serviceBuf);
- Tcl_UtfToWCharDString(src, length, &serviceBuf);
- serviceName = (WCHAR *) Tcl_DStringValue(&serviceBuf);
- length = Tcl_DStringLength(&serviceBuf) / sizeof(WCHAR);
+ serviceName = Tcl_GetStringFromObj(objv[firstArg], &length);
} else {
length = 0;
}
@@ -1510,21 +1337,17 @@ DdeObjCmd(
if (length == 0) {
serviceName = NULL;
} else if ((index != DDE_SERVERNAME) && (index != DDE_EVAL)) {
- ddeService = DdeCreateStringHandleW(ddeInstance, serviceName,
- CP_WINUNICODE);
+ ddeService = DdeCreateStringHandle(ddeInstance, (void *) serviceName,
+ CP_WINANSI);
}
if ((index != DDE_SERVERNAME) && (index != DDE_EVAL)) {
- const char *src = Tcl_GetStringFromObj(objv[firstArg + 1], &length);
-
- Tcl_DStringInit(&topicBuf);
- topicName = Tcl_UtfToWCharDString(src, length, &topicBuf);
- length = Tcl_DStringLength(&topicBuf) / sizeof(WCHAR);
+ topicName = Tcl_GetStringFromObj(objv[firstArg + 1], &length);
if (length == 0) {
topicName = NULL;
} else {
- ddeTopic = DdeCreateStringHandleW(ddeInstance, topicName,
- CP_WINUNICODE);
+ ddeTopic = DdeCreateStringHandle(ddeInstance, (void *) topicName,
+ CP_WINANSI);
}
}
@@ -1533,42 +1356,20 @@ DdeObjCmd(
serviceName = DdeSetServerName(interp, serviceName, flags,
handlerPtr);
if (serviceName != NULL) {
- Tcl_DString dsBuf;
-
- Tcl_DStringInit(&dsBuf);
- Tcl_WCharToUtfDString(serviceName, wcslen(serviceName), &dsBuf);
- Tcl_SetObjResult(interp, Tcl_NewStringObj(Tcl_DStringValue(&dsBuf),
- Tcl_DStringLength(&dsBuf)));
- Tcl_DStringFree(&dsBuf);
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(serviceName, -1));
} else {
Tcl_ResetResult(interp);
}
break;
case DDE_EXECUTE: {
- Tcl_Size dataLength;
- const void *dataString;
- Tcl_DString dsBuf;
-
- Tcl_DStringInit(&dsBuf);
- if (flags & DDE_FLAG_BINARY) {
- dataString =
- Tcl_GetByteArrayFromObj(objv[firstArg + 2], &dataLength);
- } else {
- const char *src;
+ int dataLength;
+ BYTE *dataString = (BYTE *) Tcl_GetStringFromObj(
+ objv[firstArg + 2], &dataLength);
- src = Tcl_GetStringFromObj(objv[firstArg + 2], &dataLength);
- Tcl_DStringInit(&dsBuf);
- dataString =
- Tcl_UtfToWCharDString(src, dataLength, &dsBuf);
- dataLength = Tcl_DStringLength(&dsBuf) + sizeof(WCHAR);
- }
-
- if (dataLength + 1 < 2) {
+ if (dataLength == 0) {
Tcl_SetObjResult(interp,
Tcl_NewStringObj("cannot execute null data", -1));
- Tcl_DStringFree(&dsBuf);
- Tcl_SetErrorCode(interp, "TCL", "DDE", "NULL", (void *)NULL);
result = TCL_ERROR;
break;
}
@@ -1577,22 +1378,21 @@ DdeObjCmd(
DdeFreeStringHandle(ddeInstance, ddeTopic);
if (hConv == NULL) {
- Tcl_DStringFree(&dsBuf);
SetDdeError(interp);
result = TCL_ERROR;
break;
}
- ddeData = DdeCreateDataHandle(ddeInstance, (BYTE *) dataString,
- (DWORD) dataLength, 0, 0, (flags & DDE_FLAG_BINARY) ? CF_TEXT : CF_UNICODETEXT, 0);
+ ddeData = DdeCreateDataHandle(ddeInstance, dataString,
+ (DWORD) dataLength+1, 0, 0, CF_TEXT, 0);
if (ddeData != NULL) {
if (flags & DDE_FLAG_ASYNC) {
DdeClientTransaction((LPBYTE) ddeData, 0xFFFFFFFF, hConv, 0,
- (flags & DDE_FLAG_BINARY) ? CF_TEXT : CF_UNICODETEXT, XTYP_EXECUTE, TIMEOUT_ASYNC, &ddeResult);
+ CF_TEXT, XTYP_EXECUTE, TIMEOUT_ASYNC, &ddeResult);
DdeAbandonTransaction(ddeInstance, hConv, ddeResult);
} else {
ddeReturn = DdeClientTransaction((LPBYTE) ddeData, 0xFFFFFFFF,
- hConv, 0, (flags & DDE_FLAG_BINARY) ? CF_TEXT : CF_UNICODETEXT, XTYP_EXECUTE, 30000, NULL);
+ hConv, 0, CF_TEXT, XTYP_EXECUTE, 30000, NULL);
if (ddeReturn == 0) {
SetDdeError(interp);
result = TCL_ERROR;
@@ -1603,22 +1403,15 @@ DdeObjCmd(
SetDdeError(interp);
result = TCL_ERROR;
}
- Tcl_DStringFree(&dsBuf);
break;
}
case DDE_REQUEST: {
- const WCHAR *itemString;
- const char *src;
-
- src = Tcl_GetStringFromObj(objv[firstArg + 2], &length);
- Tcl_DStringInit(&itemBuf);
- itemString = Tcl_UtfToWCharDString(src, length, &itemBuf);
- length = Tcl_DStringLength(&itemBuf) / sizeof(WCHAR);
+ const char *itemString = Tcl_GetStringFromObj(objv[firstArg + 2],
+ &length);
if (length == 0) {
Tcl_SetObjResult(interp,
Tcl_NewStringObj("cannot request value of null data", -1));
- Tcl_SetErrorCode(interp, "TCL", "DDE", "NULL", (void *)NULL);
result = TCL_ERROR;
goto cleanup;
}
@@ -1631,34 +1424,27 @@ DdeObjCmd(
result = TCL_ERROR;
} else {
Tcl_Obj *returnObjPtr;
- ddeItem = DdeCreateStringHandleW(ddeInstance, itemString,
- CP_WINUNICODE);
+ ddeItem = DdeCreateStringHandle(ddeInstance, (void *)itemString,
+ CP_WINANSI);
if (ddeItem != NULL) {
ddeData = DdeClientTransaction(NULL, 0, hConv, ddeItem,
- (flags & DDE_FLAG_BINARY) ? CF_TEXT : CF_UNICODETEXT, XTYP_REQUEST, 5000, NULL);
+ CF_TEXT, XTYP_REQUEST, 5000, NULL);
if (ddeData == NULL) {
SetDdeError(interp);
result = TCL_ERROR;
} else {
DWORD tmp;
- WCHAR *dataString = (WCHAR *) DdeAccessData(ddeData, &tmp);
+ const char *dataString = (const char *) DdeAccessData(ddeData, &tmp);
if (flags & DDE_FLAG_BINARY) {
returnObjPtr =
- Tcl_NewByteArrayObj((BYTE *) dataString, tmp);
+ Tcl_NewByteArrayObj((BYTE *) dataString, (int) tmp);
} else {
- Tcl_DString dsBuf;
-
- if ((tmp >= sizeof(WCHAR))
- && !dataString[tmp / sizeof(WCHAR) - 1]) {
- tmp -= (DWORD)sizeof(WCHAR);
+ if (tmp && !dataString[tmp-1]) {
+ --tmp;
}
- Tcl_DStringInit(&dsBuf);
- Tcl_WCharToUtfDString(dataString, tmp>>1, &dsBuf);
- returnObjPtr =
- Tcl_NewStringObj(Tcl_DStringValue(&dsBuf),
- Tcl_DStringLength(&dsBuf));
- Tcl_DStringFree(&dsBuf);
+ returnObjPtr = Tcl_NewStringObj(dataString,
+ (int) tmp);
}
DdeUnaccessData(ddeData);
DdeFreeDataHandle(ddeData);
@@ -1669,37 +1455,22 @@ DdeObjCmd(
result = TCL_ERROR;
}
}
+
break;
}
case DDE_POKE: {
- Tcl_DString dsBuf;
- const WCHAR *itemString;
+ const char *itemString = Tcl_GetStringFromObj(objv[firstArg + 2],
+ &length);
BYTE *dataString;
- const char *src;
- src = Tcl_GetStringFromObj(objv[firstArg + 2], &length);
- Tcl_DStringInit(&itemBuf);
- itemString = Tcl_UtfToWCharDString(src, length, &itemBuf);
- length = Tcl_DStringLength(&itemBuf) / sizeof(WCHAR);
if (length == 0) {
Tcl_SetObjResult(interp,
Tcl_NewStringObj("cannot have a null item", -1));
- Tcl_SetErrorCode(interp, "TCL", "DDE", "NULL", (void *)NULL);
result = TCL_ERROR;
goto cleanup;
}
- Tcl_DStringInit(&dsBuf);
- if (flags & DDE_FLAG_BINARY) {
- dataString = (BYTE *)
- Tcl_GetByteArrayFromObj(objv[firstArg + 3], &length);
- } else {
- const char *data =
- Tcl_GetStringFromObj(objv[firstArg + 3], &length);
- Tcl_DStringInit(&dsBuf);
- dataString = (BYTE *)
- Tcl_UtfToWCharDString(data, length, &dsBuf);
- length = Tcl_DStringLength(&dsBuf) + sizeof(WCHAR);
- }
+ dataString = (BYTE *) Tcl_GetStringFromObj(objv[firstArg + 3],
+ &length);
hConv = DdeConnect(ddeInstance, ddeService, ddeTopic, NULL);
DdeFreeStringHandle(ddeInstance, ddeService);
@@ -1709,11 +1480,11 @@ DdeObjCmd(
SetDdeError(interp);
result = TCL_ERROR;
} else {
- ddeItem = DdeCreateStringHandleW(ddeInstance, itemString,
- CP_WINUNICODE);
+ ddeItem = DdeCreateStringHandle(ddeInstance, (void *) itemString,
+ CP_WINANSI);
if (ddeItem != NULL) {
- ddeData = DdeClientTransaction(dataString, (DWORD) length,
- hConv, ddeItem, (flags & DDE_FLAG_BINARY) ? CF_TEXT : CF_UNICODETEXT, XTYP_POKE, 5000, NULL);
+ ddeData = DdeClientTransaction(dataString, (DWORD) length+1,
+ hConv, ddeItem, CF_TEXT, XTYP_POKE, 5000, NULL);
if (ddeData == NULL) {
SetDdeError(interp);
result = TCL_ERROR;
@@ -1723,7 +1494,6 @@ DdeObjCmd(
result = TCL_ERROR;
}
}
- Tcl_DStringFree(&dsBuf);
break;
}
@@ -1738,7 +1508,6 @@ DdeObjCmd(
if (serviceName == NULL) {
Tcl_SetObjResult(interp,
Tcl_NewStringObj("invalid service name \"\"", -1));
- Tcl_SetErrorCode(interp, "TCL", "DDE", "NO_SERVER", (void *)NULL);
result = TCL_ERROR;
goto cleanup;
}
@@ -1757,7 +1526,7 @@ DdeObjCmd(
for (riPtr = tsdPtr->interpListPtr; riPtr != NULL;
riPtr = riPtr->nextPtr) {
- if (_wcsicmp(serviceName, riPtr->name) == 0) {
+ if (stricmp(serviceName, riPtr->name) == 0) {
break;
}
}
@@ -1770,9 +1539,9 @@ DdeObjCmd(
* server.
*/
- Tcl_Preserve(riPtr);
+ Tcl_Preserve((ClientData) riPtr);
sendInterp = riPtr->interp;
- Tcl_Preserve(sendInterp);
+ Tcl_Preserve((ClientData) sendInterp);
/*
* Don't exchange objects between interps. The target interp would
@@ -1782,19 +1551,17 @@ DdeObjCmd(
* referring to deallocated objects.
*/
- if (Tcl_IsSafe(riPtr->interp) && (riPtr->handlerPtr == NULL)) {
- Tcl_SetObjResult(riPtr->interp, Tcl_NewStringObj(
- "permission denied: a handler procedure must be"
- " defined for use in a safe interp", -1));
- Tcl_SetErrorCode(interp, "TCL", "DDE", "SECURITY_CHECK",
- (void *)NULL);
+ if (Tcl_IsSafe(riPtr->interp) && riPtr->handlerPtr == NULL) {
+ Tcl_SetResult(riPtr->interp, "permission denied: "
+ "a handler procedure must be defined for use in "
+ "a safe interp", TCL_STATIC);
result = TCL_ERROR;
}
if (result == TCL_OK) {
- if (objc == 1) {
+ if (objc == 1)
objPtr = objv[0];
- } else {
+ else {
objPtr = Tcl_ConcatObj(objc, objv);
}
if (riPtr->handlerPtr != NULL) {
@@ -1827,7 +1594,8 @@ DdeObjCmd(
objPtr = Tcl_GetVar2Ex(sendInterp, "errorInfo", NULL,
TCL_GLOBAL_ONLY);
if (objPtr) {
- Tcl_AppendObjToErrorInfo(interp, objPtr);
+ string = Tcl_GetStringFromObj(objPtr, &length);
+ Tcl_AddObjErrorInfo(interp, string, length);
}
objPtr = Tcl_GetVar2Ex(sendInterp, "errorCode", NULL,
@@ -1838,11 +1606,9 @@ DdeObjCmd(
}
Tcl_SetObjResult(interp, Tcl_GetObjResult(sendInterp));
}
- Tcl_Release(riPtr);
- Tcl_Release(sendInterp);
+ Tcl_Release((ClientData) riPtr);
+ Tcl_Release((ClientData) sendInterp);
} else {
- Tcl_DString dsBuf;
-
/*
* This is a non-local request. Send the script to the server and
* poll it for a result.
@@ -1851,36 +1617,31 @@ DdeObjCmd(
if (MakeDdeConnection(interp, serviceName, &hConv) != TCL_OK) {
invalidServerResponse:
Tcl_SetObjResult(interp,
- Tcl_NewStringObj("invalid data returned from server", -1));
- Tcl_SetErrorCode(interp, "TCL", "DDE", "BAD_RESPONSE", (void *)NULL);
+ Tcl_NewStringObj("invalid data returned from server",
+ -1));
result = TCL_ERROR;
goto cleanup;
}
objPtr = Tcl_ConcatObj(objc, objv);
string = Tcl_GetStringFromObj(objPtr, &length);
- Tcl_DStringInit(&dsBuf);
- Tcl_UtfToWCharDString(string, length, &dsBuf);
- string = Tcl_DStringValue(&dsBuf);
- length = Tcl_DStringLength(&dsBuf) + sizeof(WCHAR);
- ddeItemData = DdeCreateDataHandle(ddeInstance, (BYTE *) string,
- (DWORD) length, 0, 0, CF_UNICODETEXT, 0);
- Tcl_DStringFree(&dsBuf);
+ ddeItemData = DdeCreateDataHandle(ddeInstance,
+ (BYTE *) string, (DWORD) length+1, 0, 0, CF_TEXT, 0);
if (flags & DDE_FLAG_ASYNC) {
ddeData = DdeClientTransaction((LPBYTE) ddeItemData,
0xFFFFFFFF, hConv, 0,
- CF_UNICODETEXT, XTYP_EXECUTE, TIMEOUT_ASYNC, &ddeResult);
+ CF_TEXT, XTYP_EXECUTE, TIMEOUT_ASYNC, &ddeResult);
DdeAbandonTransaction(ddeInstance, hConv, ddeResult);
} else {
ddeData = DdeClientTransaction((LPBYTE) ddeItemData,
0xFFFFFFFF, hConv, 0,
- CF_UNICODETEXT, XTYP_EXECUTE, 30000, NULL);
+ CF_TEXT, XTYP_EXECUTE, 30000, NULL);
if (ddeData != 0) {
- ddeCookie = DdeCreateStringHandleW(ddeInstance,
- TCL_DDE_EXECUTE_RESULT, CP_WINUNICODE);
+ ddeCookie = DdeCreateStringHandle(ddeInstance,
+ TCL_DDE_EXECUTE_RESULT, CP_WINANSI);
ddeData = DdeClientTransaction(NULL, 0, hConv, ddeCookie,
- CF_UNICODETEXT, XTYP_REQUEST, 30000, NULL);
+ CF_TEXT, XTYP_REQUEST, 30000, NULL);
}
}
@@ -1889,12 +1650,10 @@ DdeObjCmd(
if (ddeData == 0) {
SetDdeError(interp);
result = TCL_ERROR;
- goto cleanup;
}
if (!(flags & DDE_FLAG_ASYNC)) {
Tcl_Obj *resultPtr;
- WCHAR *ddeDataString;
/*
* The return handle has a two or four element list in it. The
@@ -1905,18 +1664,12 @@ DdeObjCmd(
* variable "errorInfo".
*/
+ resultPtr = Tcl_NewObj();
length = DdeGetData(ddeData, NULL, 0, 0);
- ddeDataString = (WCHAR *) Tcl_Alloc(length);
- DdeGetData(ddeData, (BYTE *) ddeDataString, (DWORD) length, 0);
- if (length > (Tcl_Size)sizeof(WCHAR)) {
- length -= sizeof(WCHAR);
- }
- Tcl_DStringInit(&dsBuf);
- Tcl_WCharToUtfDString(ddeDataString, length>>1, &dsBuf);
- resultPtr = Tcl_NewStringObj(Tcl_DStringValue(&dsBuf),
- Tcl_DStringLength(&dsBuf));
- Tcl_DStringFree(&dsBuf);
- Tcl_Free((char *) ddeDataString);
+ Tcl_SetObjLength(resultPtr, length);
+ string = Tcl_GetString(resultPtr);
+ DdeGetData(ddeData, (BYTE *) string, (DWORD) length, 0);
+ Tcl_SetObjLength(resultPtr, (int) strlen(string));
if (Tcl_ListObjIndex(NULL, resultPtr, 0, &objPtr) != TCL_OK) {
Tcl_DecrRefCount(resultPtr);
@@ -1934,7 +1687,9 @@ DdeObjCmd(
Tcl_DecrRefCount(resultPtr);
goto invalidServerResponse;
}
- Tcl_AppendObjToErrorInfo(interp, objPtr);
+ length = -1;
+ string = Tcl_GetStringFromObj(objPtr, &length);
+ Tcl_AddObjErrorInfo(interp, string, length);
Tcl_ListObjIndex(NULL, resultPtr, 2, &objPtr);
Tcl_SetObjErrorCode(interp, objPtr);
@@ -1966,9 +1721,6 @@ DdeObjCmd(
if (hConv != NULL) {
DdeDisconnect(hConv);
}
- Tcl_DStringFree(&itemBuf);
- Tcl_DStringFree(&topicBuf);
- Tcl_DStringFree(&serviceBuf);
return result;
}