Subject: add 3 testcases for "dde poke", only active with --enable-symbols (we need a "dde poke" server for that, which is now built into tcldde14g.dll, but not in tcldde14.dll)

From: "jan.nijtmans" <[email-masked]>
Date: Tue, 7 Aug 2012 14:58:34 +0000

---
 tests/winDde.test | 21 +++++++++++++++++++++
 win/tclWinDde.c   | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/tests/winDde.test b/tests/winDde.test
index 8befa3c..8d9bd12 100644
--- a/tests/winDde.test
+++ b/tests/winDde.test
@@ -15,6 +15,7 @@ if {"::tcltest" ni [namespace children]} {
     namespace import -force ::tcltest::*
 }
 
+testConstraint debug [::tcl::pkgconfig get debug]
 testConstraint dde 0
 if {[testConstraint win]} {
     if {![catch {
@@ -166,6 +167,16 @@ test winDde-3.7 {DDE request binary} -constraints dde -body {
     dde execute -binary TclEval self [list set \xc3\xa1 \xc3\x84\x00]
     scan [set \xe1] %c
 } -result 196
+test winDde-3.8 {DDE poke locally} -constraints {dde debug} -body {
+    set \xe1 ""
+    dde poke TclEval self \xe1 \xc4
+    dde request TclEval self \xe1
+} -result \xc4
+test winDde-3.9 {DDE poke -binary locally} -constraints {dde debug} -body {
+    set \xe1 ""
+    dde poke -binary TclEval self \xe1 \xc3\x84\x00
+    dde request TclEval self \xe1
+} -result \xc4
 
 # -------------------------------------------------------------------------
 
@@ -207,6 +218,16 @@ test winDde-4.4 {DDE eval remotely} -constraints {dde stdio} -body {
     update
     set \xe1
 }  -result foo
+test winDde-4.5 {DDE poke remotely} -constraints {dde debug stdio} -body {
+    set \xe1 ""
+    set name ch\xEDld-4.5
+    set child [createChildProcess $name]
+    dde poke TclEval $name \xe1 foo
+    set \xe1 [dde request TclEval $name \xe1]
+    dde execute TclEval $name {set done 1}
+    update
+    set \xe1
+} -result foo
 
 # -------------------------------------------------------------------------
 
diff --git a/win/tclWinDde.c b/win/tclWinDde.c
index 7b9fbf4..23b3a8e 100644
--- a/win/tclWinDde.c
+++ b/win/tclWinDde.c
@@ -17,7 +17,13 @@
 #include <dde.h>
 #include <ddeml.h>
 
-#ifndef UNICODE
+#ifdef UNICODE
+#   if !defined(NDEBUG)
+	/* test POKE server Implemented for UNICODE in debug mode only */
+#	undef CBF_FAIL_POKES
+#	define CBF_FAIL_POKES 0
+#   endif
+#else
 #   undef CP_WINUNICODE
 #   define CP_WINUNICODE CP_WINANSI
 #   undef Tcl_WinTCharToUtf
@@ -786,6 +792,53 @@ DdeServerProc(
 	}
 	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;
+	    Tcl_Obj *variableObjPtr;
+
+	    len = DdeQueryString(ddeInstance, ddeItem, NULL, 0, CP_WINUNICODE);
+	    Tcl_DStringInit(&dString);
+	    Tcl_DStringSetLength(&dString, (len + 1) * sizeof(TCHAR) - 1);
+	    utilString = (TCHAR *) Tcl_DStringValue(&dString);
+	    DdeQueryString(ddeInstance, ddeItem, utilString, (DWORD) len + 1,
+		    CP_WINUNICODE);
+	    Tcl_WinTCharToUtf(utilString, -1, &ds);
+	    utilString = (TCHAR *) DdeAccessData(hData, &dlen);
+	    if (uFmt == CF_TEXT) {
+		variableObjPtr = Tcl_NewStringObj((char *)utilString, -1);
+	    } else {
+		variableObjPtr = Tcl_NewUnicodeObj(utilString, -1);
+	    }
+
+	    Tcl_SetVar2Ex(convPtr->riPtr->interp, Tcl_DStringValue(&ds), NULL,
+		    variableObjPtr, TCL_GLOBAL_ONLY);
+
+	    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
-- 
cgit v0.12