コード例 #1
0
ファイル: quasar_socket.cpp プロジェクト: cwarden/quasar
QStringList
QuasarSocket::recv(int timeout)
{
    int timeoutCnt = 0;

    while (true) {
	char buffer[8192];
	int count = readBlock(buffer, 8191);
	if (count == -1) {
	    QStringList results;
	    results.push_back("error:");
	    results.push_back("Error reading from server");
	    return results;
	}
	if (count == 0) {
	    waitForMore(1000);
	    if (++timeoutCnt < timeout || timeout == 0) continue;

	    QStringList results;
	    results.push_back("error:");
	    results.push_back("Timeout reading from server");
	    return results;
	}

	buffer[count] = 0;
	_readLine += QString::fromUtf8(buffer);
	timeoutCnt = 0;

	QString data;
	if (_readLine.left(1) == "\002") {
	    int index = _readLine.find('\003');
	    if (index == -1) continue;

	    data = _readLine.mid(1, index - 1);
	    _readLine = _readLine.mid(index + 1);
	} else {
	    int index = _readLine.find('\n');
	    if (index == -1) continue;

	    data = _readLine.left(index);
	    _readLine = _readLine.mid(index + 1);

	    while (data.right(1) == "\r")
		data = data.left(data.length() - 1);
	}

	return TclObject(data).toStringList();
    }

    return QStringList();
}
コード例 #2
0
ファイル: ComObject.cpp プロジェクト: pukkaone/tcom
TclObject
ComObject::getArgument (VARIANT *pArg, const Parameter &param)
{
    if (vtMissing == pArg) {
        return Extension::newNaObj();

    } else if (param.flags() & PARAMFLAG_FOUT) {
        // Get name of Tcl variable to hold out value.
        TclObject varName = getOutVariableName(param);

        if (param.flags() & PARAMFLAG_FIN) {
            // For in/out parameters, set the Tcl variable to the input value.
            TclObject value(pArg, param.type(), m_interp);
            setVariable(varName, value);
        }
        return varName;

    } else {
        return TclObject(pArg, param.type(), m_interp);
    }
}
コード例 #3
0
ファイル: ComObject.cpp プロジェクト: pukkaone/tcom
static TclObject
getOutVariableName (const Parameter &param)
{
    return TclObject(PACKAGE_NAMESPACE "arg_" + param.name());
}
コード例 #4
0
ファイル: foreachCmd.cpp プロジェクト: jbroll/tcom
int
Extension::foreachCmd (
    ClientData,
    Tcl_Interp *interp,
    int objc,
    Tcl_Obj *const objv[])
{
    if (objc != 4) {
	Tcl_WrongNumArgs(
            interp, 1, objv, "varList collectionHandle script");
	return TCL_ERROR;
    }

    Tcl_Obj *pVarList = objv[1];
    Tcl_Obj *pBody = objv[3];

    Reference *pCollection = referenceHandles.find(interp, objv[2]);
    if (pCollection == 0) {
        const char *arg = Tcl_GetStringFromObj(objv[2], 0);
        Tcl_AppendResult(
            interp, "invalid interface pointer handle ", arg, 0);
        return TCL_ERROR;
    }

    // Collections should implement a _NewEnum method which returns an object
    // that enumerates the elements.
    HRESULT hr;
    PositionalArguments arguments;
    _variant_t varResult;

    hr = pCollection->invoke(
        DISPID_NEWENUM,
        DISPATCH_METHOD | DISPATCH_PROPERTYGET,
        arguments,
        &varResult);
    if (FAILED(hr) || V_VT(&varResult) != VT_UNKNOWN) {
	Tcl_AppendResult(interp, "object is not a collection", NULL);
	return TCL_ERROR;
    }
    IUnknownPtr pUnk(V_UNKNOWN(&varResult));
    
    // Get a specific kind of enumeration.
    IEnumVARIANTPtr pEnumVARIANT;
    IEnumUnknownPtr pEnumUnknown;
    enum EnumKind { ENUM_VARIANT, ENUM_UNKNOWN };
    EnumKind enumKind;

    hr = pUnk->QueryInterface(
        IID_IEnumVARIANT, reinterpret_cast<void **>(&pEnumVARIANT));
    if (SUCCEEDED(hr)) {
        enumKind = ENUM_VARIANT;
    } else {
        hr = pUnk->QueryInterface(
            IID_IEnumUnknown, reinterpret_cast<void **>(&pEnumUnknown));
        if (SUCCEEDED(hr)) {
	    enumKind = ENUM_UNKNOWN;
        }
    }
    
    if (FAILED(hr)) {
        Tcl_AppendResult(interp,
            "Unknown enumerator type: not IEnumVARIANT or IEnumUnknown", NULL);
        return TCL_ERROR;
    }

    int completionCode;

    int varc;				// number of loop variables
    completionCode = Tcl_ListObjLength(interp, pVarList, &varc);
    if (completionCode != TCL_OK) {
        return TCL_ERROR;
    }
    if (varc < 1) {
	Tcl_AppendResult(interp, "foreach varlist is empty", NULL);
	return TCL_ERROR;
    }

    while (true) {
        // If the variable list has been converted to another kind of Tcl
        // object, convert it back to a list and refetch the pointer to its
        // element array.
        Tcl_Obj **varv;
        completionCode =
            Tcl_ListObjGetElements(interp, pVarList, &varc, &varv);
        if (completionCode != TCL_OK) {
            return TCL_ERROR;
        }

        // Assign values to all loop variables.
        int v = 0;
	for (;  v < varc;  ++v) {
            TclObject value;
	    ULONG count;

	    switch (enumKind) {
	    case ENUM_VARIANT:
		{
		    _variant_t elementVar;
		    hr = pEnumVARIANT->Next(1, &elementVar, &count);
		    if (hr == S_OK && count > 0) {
			value = TclObject(&elementVar, Type::variant(), interp, 0);
		    }
		}
		break;

	    case ENUM_UNKNOWN:
		{
		    IUnknown *pElement;
		    hr = pEnumUnknown->Next(1, &pElement, &count);
		    if (hr == S_OK && count > 0) {
			value = referenceHandles.newObj(
			    interp, Reference::newReference(pElement));
		    }
		}
		break;
	    }

	    if (FAILED(hr)) {
		_com_issue_error(hr);
	    }
	    if (hr != S_OK || count == 0) {
		break;
	    }

	    Tcl_Obj *varValuePtr = Tcl_ObjSetVar2(
                interp, varv[v], NULL, value, TCL_LEAVE_ERR_MSG);
	    if (varValuePtr == NULL) {
		return TCL_ERROR;
	    }
	}

        if (v == 0) {
            completionCode = TCL_OK;
            break;
        }

        if (v < varc) {
            TclObject empty;

            for (; v < varc;  ++v) {
	        Tcl_Obj *varValuePtr = Tcl_ObjSetVar2(
                    interp, varv[v], NULL, empty, TCL_LEAVE_ERR_MSG);
	        if (varValuePtr == NULL) {
		    return TCL_ERROR;
	        }
            }
        }

        // Execute the script body.
        completionCode =
#if TCL_MINOR_VERSION >= 1
            Tcl_EvalObjEx(interp, pBody, 0);
#else
            Tcl_EvalObj(interp, pBody);
#endif

        if (completionCode == TCL_CONTINUE) {
            // do nothing
        } else if (completionCode == TCL_BREAK) {
            completionCode = TCL_OK;
            break;
        } else if (completionCode == TCL_ERROR) {
	    std::ostringstream oss;
            oss << "\n    (\"foreach\" body line %d)" << interp->errorLine;
            Tcl_AddObjErrorInfo(
                interp, const_cast<char *>(oss.str().c_str()), -1);
            break;
        } else if (completionCode != TCL_OK) {
            break;
        }
    }

    if (completionCode == TCL_OK) {
	Tcl_ResetResult(interp);
    }
    return completionCode;
}