int Web_CmdUrlCfg()

in src/generic/url.c [841:985]


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

    UrlData *urlData = NULL;
    /* note: this could be dynamic, but 20 is enough ... */
    char *params[20];
    int i;
    int res;

    for (i = SCHEME; i <= QUERYSTRING; i++)
	params[i] = (char *) urlElementOpts[i];

    params[URLCFGRESET] = "-reset";
    params[URLCFGURLFORMAT] = "-urlformat";
    params[URLCFGEND] = NULL;


    /* --------------------------------------------------------------------------
     *
     * ----------------------------------------------------------------------- */
    WebAssertData(interp, clientData, "Web_CmdUrlCfg", TCL_ERROR)
	urlData = (UrlData *) clientData;

    /* --------------------------------------------------------------------------
     *
     * ----------------------------------------------------------------------- */

    res = paramGet((ParamList *) urlData->requestData->staticList,
		   interp, objc, objv, 1);

    if (res == TCL_CONTINUE) {
	int opt;
	Tcl_Obj *tmpObj = NULL;

	if (objc <= 1) {
	    Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");
	    return TCL_ERROR;
	}

	if (paramGetIndexFromObj
	    (interp, objv[1], params, "subcommand", 0, &opt) == TCL_ERROR)
	    return TCL_ERROR;

	/* ----------------------------------------------------------------------
	 * it is one of my options
	 * -------------------------------------------------------------------- */

	/* ----------------------------------------------------------------------
	 * web::cmdurlcfg -protocol value
	 * 0              1         2
	 * ------------------------------------------------------------------- */
	if (objc == 3)
	    tmpObj = objv[2];
	else
	    tmpObj = NULL;

	switch ((enum urlElement) opt) {
	case SCHEME:
	    WebAssertObjc(objc > 3, 2, "?value?");
	    if (urlData->defaultscheme != NULL) {
		Tcl_SetObjResult(interp,
				 Tcl_DuplicateObj(urlData->defaultscheme));
		if (tmpObj != NULL) {
		    Tcl_DecrRefCount(urlData->defaultscheme);
		    urlData->defaultscheme = Tcl_DuplicateObj(tmpObj);
		    Tcl_IncrRefCount(urlData->defaultscheme);
		}
		return TCL_OK;
	    } else {
		Tcl_SetObjResult(interp,
				 Tcl_NewStringObj(WEB_DEFAULT_SCHEME, -1));
		if (tmpObj != NULL) {
		    if (strcmp(Tcl_GetString(tmpObj), "")) {
		        urlData->defaultscheme = Tcl_DuplicateObj(tmpObj);
			Tcl_IncrRefCount(urlData->defaultscheme);
		    }
		}
		return TCL_OK;
	    }
	    break;
	case HOST:
	    WebAssertObjc(objc > 3, 2, "?value?");
	    return handleConfig(interp, &urlData->host, tmpObj, 1);
	    break;
	case PORT:
	    WebAssertObjc(objc > 3, 2, "?value?");
	    return handleConfig(interp, &urlData->port, tmpObj, 1);
	    break;
	case SCRIPTNAME:
	    WebAssertObjc(objc > 3, 2, "?value?");
	    return handleConfig(interp, &urlData->scriptname, tmpObj, 1);
	    break;
	case PATHINFO:
	    WebAssertObjc(objc > 3, 2, "?value?");
	    return handleConfig(interp, &urlData->pathinfo, tmpObj, 1);
	    break;
	case QUERYSTRING:
	    WebAssertObjc(objc > 3, 2, "?value?");
	    return handleConfig(interp, &urlData->querystring, tmpObj, 1);
	    break;
	case URLCFGRESET:
	    WebAssertObjc(objc != 2, 2, NULL);
	    return resetUrlData(interp, urlData);
	    break;
	case URLCFGURLFORMAT:{
		int urlformat = 0;
		Tcl_Obj *res = NULL;
		Tcl_Obj *tmpres = NULL;
		enum urlElement i;
		WebAssertObjc(objc > 3, 2, "?value?");
		/* format current */
		res = Tcl_NewObj();
		Tcl_IncrRefCount(res);
		for (i = SCHEME; i <= QUERYSTRING; i++) {
		    if (((urlData->urlformat) & urlElementFlags[i]) != 0) {
			tmpres =
			    Tcl_NewStringObj(&(urlElementOpts[i][1]), -1);
			Tcl_ListObjAppendElement(interp, res, tmpres);
		    }
		}

		if (tmpObj != NULL) {
		    /* we have to set it as well */
		    urlformat = parseUrlFormat(interp, tmpObj);
		    if (urlformat == 0) {
			/* cleanup */
			Tcl_DecrRefCount(res);
			return TCL_ERROR;
		    }
		    urlData->urlformat = urlformat;
		}
		Tcl_SetObjResult(interp, res);
		Tcl_DecrRefCount(res);
		return TCL_OK;
		break;
	    }
	default:
	    LOG_MSG(interp, WRITE_LOG | SET_RESULT, __FILE__, __LINE__,
		    "web::cmdurl", WEBLOG_INFO, "unknown option", NULL);
	    return TCL_ERROR;
	}
    }
    return res;
}