int Web_Response()

in src/generic/webout.c [191:413]


int Web_Response(ClientData clientData, Tcl_Interp * interp,
		 int objc, Tcl_Obj * CONST objv[])
{


    ResponseObj *responseObj = NULL;
    OutData *outData = NULL;

    /*
       char            *channelName = NULL;
       Tcl_Obj         *result = NULL;
       Tcl_Channel     channel = NULL;
       int             mode = 0;
       int lastIndex = objc -1;
       int idx = -1;
       int iCurArg = -1;
     */
    int res;

    static char *params[] = { "-sendheader",
	"-select",
	"-bytessent",
	"-httpresponse",
	"-reset",
	"-resetall",
	NULL
    };
    enum params
    { SENDHEADER, SELECT, BYTESSENT, HTTPRESPONSE, RESET, RESETALL };

    /* --------------------------------------------------------------------------
     * sanity
     * ----------------------------------------------------------------------- */
    WebAssertData(interp, clientData, "web::response", TCL_ERROR)
	outData = (OutData *) clientData;
    WebAssertData(interp, outData->responseObjHash, "web::response",
		  TCL_ERROR);

    /* get the current response object */
    responseObj = outData->defaultResponseObj;
    if (responseObj == NULL) {
	Tcl_SetResult(interp, "no current response object", TCL_STATIC);
	return TCL_ERROR;
    }

    /* handle first paramList things */
    /* note: the keys might not be strictly case sensitive */
    res = paramGet((ParamList *) responseObj->headers, interp, objc, objv, 1);

    if (res == TCL_CONTINUE) {

	if (objc == 1) {
	    /* ----------------------------------------------------------------------
	     * return name of default channel
	     * ------------------------------------------------------------------- */
	    Tcl_ResetResult(interp);	/* empty string */
	    if (responseObj->name != NULL) {
		Tcl_SetObjResult(interp, responseObj->name);
		return TCL_OK;
	    }
	    Tcl_SetResult(interp, "current response has no name", TCL_STATIC);
	    return TCL_ERROR;
	}
	else {
	    int opt;
	    if (paramGetIndexFromObj
		(interp, objv[1], params, "subcommand", 0, &opt) == TCL_ERROR)
		return TCL_ERROR;

	    switch ((enum params) opt) {
	    case RESETALL:
		WebAssertObjc(objc != 2, 2, NULL);
		return resetOutData(interp, outData);

	    case RESET:{
		    Tcl_Obj *tmp;
		    char *tname;

		    WebAssertObjc(objc != 2, 2, NULL);

		    /* --------------------------------------------------------------------
		     * just reset this one
		     * ----------------------------------------------------------------- */

		    removeFromHashTable(outData->responseObjHash,
					Tcl_GetString(responseObj->name));

		    tmp = Tcl_DuplicateObj(responseObj->name);
		    Tcl_IncrRefCount(tmp);
		    tname = Tcl_GetString(tmp);

		    if (responseObj == outData->defaultResponseObj)
			outData->defaultResponseObj = NULL;
		    destroyResponseObj((ClientData) responseObj, interp);

		    /* if we reset the default response object, we have to recreate it 
		     * with our special createDefaultResponseObj function ...
		     */

		    if (isDefaultResponseObj(interp, tname)) {
			responseObj = createDefaultResponseObj(interp);
			/* add it to Hash Table */
			if (appendToHashTable(outData->responseObjHash,
					  Tcl_GetString(responseObj->name),
					      (ClientData) responseObj) != TCL_OK) {
			  Tcl_SetResult(interp,
					"could not reset default response object",
					TCL_STATIC);
			  return TCL_ERROR;
			}
		    } else
			responseObj = getResponseObj(interp, outData, tname);

		    Tcl_DecrRefCount(tmp);
		    if (responseObj == NULL) {
			Tcl_SetResult(interp,
				      "could not reset response object",
				      TCL_STATIC);
			return TCL_ERROR;
		    }

		    if (outData->defaultResponseObj == NULL)
			outData->defaultResponseObj = responseObj;

		    return TCL_OK;
		    break;
		}
	    case SENDHEADER:{
		    int res;
		    WebAssertObjc(objc > 3, 2, NULL);
		    res = responseObj->sendHeader;
		    if (objc == 3)
			/* set new value */
			if (Tcl_GetBooleanFromObj(interp, objv[2],
						  &(responseObj->
						    sendHeader)) ==
			    TCL_ERROR) {

			    return TCL_ERROR;
			}
		    Tcl_SetObjResult(interp, Tcl_NewBooleanObj(res));
		    return TCL_OK;
		    break;
		}
	    case SELECT:{
		    ResponseObj *old = NULL;
		    char *name = NULL;
/*         fprintf(stderr,"DBG -select called\n"); fflush(stderr); */

		    WebAssertObjc(objc != 3, 2, "channelName");
		    old = responseObj;
		    name = Tcl_GetString(objv[2]);
		    /* we have to find the new channel */
		    if (!strcmp(name, "default")) {
			name = (char *) requestGetDefaultOutChannelName(interp);
		    }
		    responseObj =
			getResponseObj(interp, outData, name);

		    if (responseObj == NULL) {
			Tcl_ResetResult(interp);
			Tcl_AppendResult(interp, "invalid response object \"",
					 name, "\"",
					 (char *) NULL);
			return TCL_ERROR;
		    }
		    outData->defaultResponseObj = responseObj;
		    Tcl_ResetResult(interp);	/* empty string */
		    if (old->name != NULL) {
			Tcl_SetObjResult(interp, old->name);
		    }
		    return TCL_OK;
		    break;
		}

	    case BYTESSENT:
		WebAssertObjc(objc != 2, 2, NULL);
		Tcl_SetObjResult(interp,
				 Tcl_NewLongObj(responseObj->bytesSent));
		return TCL_OK;

	    case HTTPRESPONSE:{
		    Tcl_Obj *current;
		    WebAssertObjc(objc > 3, 2, NULL);
		    current = responseObj->httpresponse;
		    if (current)
			Tcl_SetObjResult(interp, current);
		    if (objc == 3) {
			/* if length = 0 we reset
			 * if equal to "default", take from HTTP_RESPONSE
			 * otherwise take value */
			int len;
			char *response = Tcl_GetStringFromObj(objv[2], &len);
			if (len == 0)
			    responseObj->httpresponse = NULL;
			else {
			    if (!strcmp("default", response)) {
				responseObj->httpresponse =
				    Tcl_NewStringObj(HTTP_RESPONSE, -1);
			    }
			    else {
				responseObj->httpresponse =
				    Tcl_DuplicateObj(objv[2]);
			    }
			    Tcl_IncrRefCount(responseObj->httpresponse);
			}
			/* forget old value */
			if (current)
			    Tcl_DecrRefCount(current);
		    }
		    return TCL_OK;
		    break;
		}
	    default:
		break;

	    }
	}
	WebAssertObjc(1, 1, "(unknown syntax)");
    }
    return res;

}