int doencrypt()

in src/generic/crypt.c [146:239]


int doencrypt(Tcl_Interp * interp, Tcl_Obj * in, int internal)
{

    CryptData *cryptData = NULL;
    int lobjc = -1;
    Tcl_Obj **lobjv = NULL;
    int i = -1;

    if ((interp == NULL) || (in == NULL))
	return TCL_ERROR;

    cryptData =
	(CryptData *) Tcl_GetAssocData(interp, WEB_CRYPT_ASSOC_DATA, NULL);
    WebAssertData(interp, cryptData, "doencrypt", TCL_ERROR);

    WebAssertData(interp, cryptData->encryptChain, "doencrypt", TCL_ERROR);

    /* ------------------------------------------------------------------------
     * get elements from encryptchain
     * --------------------------------------------------------------------- */
    if (Tcl_ListObjGetElements(interp, cryptData->encryptChain,
			       &lobjc, &lobjv) == TCL_ERROR) {

	LOG_MSG(interp, WRITE_LOG | SET_RESULT,
		__FILE__, __LINE__,
		"web::encrypt", WEBLOG_ERROR,
		"error accessing encryptchain", NULL);
	return TCL_ERROR;
    }

    /* --------------------------------------------------------------------------
     * ... and loop
     * ----------------------------------------------------------------------- */
    for (i = 0; i <= lobjc; i++) {

	int res = 0;
	Tcl_Obj *cmd = NULL;

	if (i < lobjc) {
	  if (lobjv[i] != NULL) {
	    cmd = Tcl_DuplicateObj(lobjv[i]);
	    Tcl_IncrRefCount(cmd);
	  } else {
	    cmd = NULL;
	  }
	}
	else {
	    if (!internal) {
		Tcl_SetObjResult(interp, in);
		return TCL_OK;
	    }
	    cmd = Tcl_NewListObj(0, NULL);
	    Tcl_IncrRefCount(cmd);
	    Tcl_ListObjAppendElement(interp, cmd,
				     Tcl_NewStringObj("web::list2uri", -1));
	}

	if (cmd != NULL) {

	    if (Tcl_ListObjAppendElement(interp, cmd, in) != TCL_OK) {
		Tcl_DecrRefCount(cmd);
		return TCL_ERROR;
	    }

	    res = Tcl_EvalObjEx(interp, cmd, TCL_EVAL_DIRECT);
	    Tcl_DecrRefCount(cmd);

	    switch (res) {
	    case TCL_OK:
		return TCL_OK;
		break;
	    case TCL_CONTINUE:
		break;
	    default:
		if (i < lobjc) {
		    LOG_MSG(interp, WRITE_LOG | SET_RESULT,
			    __FILE__, __LINE__,
			    "web::encrypt", WEBLOG_ERROR,
			    "encrypt method \"", Tcl_GetString(lobjv[i]),
			    "\": ", Tcl_GetStringResult(interp), NULL);
		}
		return TCL_ERROR;
		break;
	    }
	}
    }

    LOG_MSG(interp, WRITE_LOG | SET_RESULT,
	    __FILE__, __LINE__,
	    "web::encrypt", WEBLOG_ERROR,
	    "no matching encryption method found", NULL);

    return TCL_ERROR;
}