diff options
Diffstat (limited to 'win/tclWinDde.c')
| -rw-r--r-- | win/tclWinDde.c | 103 | 
1 files changed, 67 insertions, 36 deletions
diff --git a/win/tclWinDde.c b/win/tclWinDde.c index d508c02..617e4e5 100644 --- a/win/tclWinDde.c +++ b/win/tclWinDde.c @@ -88,7 +88,7 @@ static DWORD ddeInstance;	/* The application instance handle given to us  				 * by DdeInitialize. */  static int ddeIsServer = 0; -#define TCL_DDE_VERSION		"1.3.3" +#define TCL_DDE_VERSION		"1.4.0"  #define TCL_DDE_PACKAGE_NAME	"dde"  #define TCL_DDE_SERVICE_NAME	TEXT("TclEval")  #define TCL_DDE_EXECUTE_RESULT	TEXT("$TCLEVAL$EXECUTE$RESULT") @@ -1184,13 +1184,19 @@ DdeObjCmd(  	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[] = {  	"-async", NULL      };      static const char *const ddeReqOptions[] = {  	"-binary", NULL      }; -    int index, i, length; +    int index, i, length, argIndex;      int async = 0, binary = 0, exact = 0;      int result = TCL_OK, firstArg = 0;      HSZ ddeService = NULL, ddeTopic = NULL, ddeItem = NULL, ddeCookie = NULL; @@ -1218,7 +1224,6 @@ DdeObjCmd(      switch ((enum DdeSubcommands) index) {      case DDE_SERVERNAME:  	for (i = 2; i < objc; i++) { -	    int argIndex;  	    if (Tcl_GetIndexFromObj(interp, objv[i], ddeSrvOptions,  		    "option", 0, &argIndex) != TCL_OK) {  		/* @@ -1265,39 +1270,53 @@ DdeObjCmd(  	if (objc == 5) {  	    firstArg = 2;  	    break; -	} else if (objc == 6) { -	    int dummy; -	    if (Tcl_GetIndexFromObj(NULL, objv[2], ddeExecOptions, "option", 0, -		    &dummy) == TCL_OK) { -		async = 1; -		firstArg = 3; -		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) { +		    async = 1; +		} else { +		    binary = 1; +		}  	    } +	    break;  	}  	/* otherwise... */ +    wrongDdeExecuteArgs:  	Tcl_WrongNumArgs(interp, 2, objv, -		"?-async? serviceName topicName value"); +		"?-async? ?-binary? serviceName topicName value");  	return TCL_ERROR;      case DDE_POKE: -	if (objc != 6) { -	    Tcl_WrongNumArgs(interp, 2, objv, -		    "serviceName topicName item value"); -	    return TCL_ERROR; +	if (objc == 6) { +	    firstArg = 2; +	    break; +	} else if ((objc == 7) && (Tcl_GetIndexFromObj(NULL, objv[2], +		ddeReqOptions, "option", 0, &argIndex) == TCL_OK)) { +	    binary = 1; +	    firstArg = 3; +	    break;  	} -	firstArg = 2; -	break; + +	/* +	 * Otherwise... +	 */ + +	Tcl_WrongNumArgs(interp, 2, objv, +		"?-binary? serviceName topicName item value"); +	return TCL_ERROR;      case DDE_REQUEST:  	if (objc == 5) {  	    firstArg = 2;  	    break; -	} else if (objc == 6) { -	    int dummy; -	    if (Tcl_GetIndexFromObj(NULL, objv[2], ddeReqOptions, "option", 0, -		    &dummy) == TCL_OK) { -		binary = 1; -		firstArg = 3; -		break; -	    } +	} else if ((objc == 6) && (Tcl_GetIndexFromObj(NULL, objv[2], +		ddeReqOptions, "option", 0, &argIndex) == TCL_OK)) { +	    binary = 1; +	    firstArg = 3; +	    break;  	}  	/* @@ -1320,11 +1339,9 @@ DdeObjCmd(  	    Tcl_WrongNumArgs(interp, 2, objv, "?-async? serviceName args");  	    return TCL_ERROR;  	} else { -	    int dummy; -  	    firstArg = 2; -	    if (Tcl_GetIndexFromObj(NULL, objv[2], ddeExecOptions, "option", -		    0, &dummy) == TCL_OK) { +	    if (Tcl_GetIndexFromObj(NULL, objv[2], ddeEvalOptions, "option", +		    0, &argIndex) == TCL_OK) {  		if (objc < 5) {  		    goto wrongDdeEvalArgs;  		} @@ -1373,10 +1390,18 @@ DdeObjCmd(      case DDE_EXECUTE: {  	int dataLength; -	BYTE *dataString = (BYTE *) Tcl_GetStringFromObj( -		objv[firstArg + 2], &dataLength); +	BYTE *dataString; + +	if (binary) { +	    dataString = (BYTE *) +		    Tcl_GetByteArrayFromObj(objv[firstArg + 2], &dataLength); +	} else { +	    dataString = (BYTE *) +		    Tcl_GetStringFromObj(objv[firstArg + 2], &dataLength); +	    dataLength += 1; +	} -	if (dataLength == 0) { +	if (dataLength <= (binary ? 0 : sizeof(TCHAR))) {  	    Tcl_SetObjResult(interp,  		    Tcl_NewStringObj("cannot execute null data", -1));  	    Tcl_SetErrorCode(interp, "TCL", "DDE", "NULL", NULL); @@ -1394,7 +1419,7 @@ DdeObjCmd(  	}  	ddeData = DdeCreateDataHandle(ddeInstance, dataString, -		(DWORD) dataLength+1, 0, 0, CF_TEXT, 0); +		(DWORD) dataLength, 0, 0, CF_TEXT, 0);  	if (ddeData != NULL) {  	    if (async) {  		DdeClientTransaction((LPBYTE) ddeData, 0xFFFFFFFF, hConv, 0, @@ -1481,8 +1506,14 @@ DdeObjCmd(  	    result = TCL_ERROR;  	    goto cleanup;  	} -	dataString = (BYTE *) Tcl_GetStringFromObj(objv[firstArg + 3], -		&length); +	if (binary) { +	    dataString = (BYTE *) +		    Tcl_GetByteArrayFromObj(objv[firstArg + 3], &length); +	} else { +	    dataString = (BYTE *) +		    Tcl_GetStringFromObj(objv[firstArg + 3], &length); +	    length += 1; +	}  	hConv = DdeConnect(ddeInstance, ddeService, ddeTopic, NULL);  	DdeFreeStringHandle(ddeInstance, ddeService); @@ -1495,7 +1526,7 @@ DdeObjCmd(  	    ddeItem = DdeCreateStringHandle(ddeInstance, (void *) itemString,  		    CP_WINUNICODE);  	    if (ddeItem != NULL) { -		ddeData = DdeClientTransaction(dataString, (DWORD) length+1, +		ddeData = DdeClientTransaction(dataString, (DWORD) length,  			hConv, ddeItem, CF_TEXT, XTYP_POKE, 5000, NULL);  		if (ddeData == NULL) {  		    SetDdeError(interp);  | 
