Exemple #1
0
    private WvDbusMsg setup_msg(string call, string sig, object data)
    {
	WvDbusMsg msg = methodcall(call, sig);

	WvDbusWriter mw = new WvDbusWriter();
	if (sig == "s")
	    mw.Write((string)data);
	if (sig == "u")
	    mw.Write((uint)data);

	msg.Body = mw.ToArray();

	return msg;
    }
    private WvDbusMsg setup_msg(string query)
    {
	WvDbusMsg msg = methodcall("ExecChunkRecordset", "s");

	WvDbusWriter mw = new WvDbusWriter();
	mw.Write(query);

	msg.Body = mw.ToArray();

	return msg;
    }
    // 
    // The ISchema interface
    //

    // Note: this implementation ignores the sums.
    public VxSchemaErrors Put(VxSchema schema, VxSchemaChecksums sums, 
        VxPutOpts opts)
    {
        WvDbusMsg call = methodcall("PutSchema", 
            String.Format("{0}i", VxSchema.GetDbusSignature()));

        WvDbusWriter writer = new WvDbusWriter();

        schema.WriteSchema(writer);
        writer.Write((int)opts);
        call.Body = writer.ToArray();

        WvDbusMsg reply = bus.send_and_wait(call);
	if (reply.signature == VxSchemaErrors.GetDbusSignature())
	    return new VxSchemaErrors(reply.iter().pop());
	else
	    reply.check(VxSchemaErrors.GetDbusSignature());
	return null;
    }
Exemple #4
0
	public WvDbusMsg err_reply(string errcode, string errstr)
	{
	    WvDbusMsg r = reply();
	    r.type = Dbus.MType.Error;
	    r.err = errcode;
	    if (errstr.ne())
	    {
		r.signature = "s";
		var w = new WvDbusWriter();
		w.Write(errstr);
		r.Body = w.ToArray();
	    }
	    return r;
	}
Exemple #5
0
	// Header format is: yyyyuua{yv}
	public byte[] GetHeaderData()
	{
	    WvDbusWriter w = new WvDbusWriter();
	    
	    w.Write((byte)endian);
	    w.Write((byte)type);
	    w.Write((byte)flags);
	    w.Write((byte)Dbus.Protocol.Version);
	    w.Write(Body != null ? (uint)Body.Length : 0);
	    w.Write((uint)serial);
	    
	    // This two-step process is a little convoluted because of the
	    // way the WriteArray function needs to work.  That, in turn,
	    // is convoluted because the alignment of an array is complicated:
	    // there's different padding for zero-element arrays than for
	    // nonzero-element arrays, and WriteArray does that for us, 
	    // which means it needs to know in advance how many elements
	    // are in our array.
	    
	    var l = new List<Dbus.Field>();
	    if (sender.ne())
		l.Add(Dbus.Field.Sender);
	    if (dest.ne())
		l.Add(Dbus.Field.Destination);
	    if (rserial.HasValue)
		l.Add(Dbus.Field.ReplySerial);
	    if (signature.ne())
		l.Add(Dbus.Field.Signature);
	    if (path.ne())
		l.Add(Dbus.Field.Path);
	    if (ifc.ne())
		l.Add(Dbus.Field.Interface);
	    if (method.ne())
		l.Add(Dbus.Field.Member);
	    if (err.ne())
		l.Add(Dbus.Field.ErrorName);

	    w.WriteArray(8, l, (w2, i) => {
		switch (i)
		{
		case Dbus.Field.Sender:
		    wws(w2, i, "s", sender);
		    break;
		case Dbus.Field.Destination:
		    wws(w2, i, "s", dest);
		    break;
		case Dbus.Field.ReplySerial:
		    wv.assert(rserial.Value != 0);
		    wwu(w2, i, "u", rserial.Value);
		    break;
		case Dbus.Field.Signature:
		    wwsig(w2, i, "g", signature);
		    break;
		case Dbus.Field.Path:
		    wws(w2, i, "o", path);
		    break;
		case Dbus.Field.Interface:
		    wws(w2, i, "s", ifc);
		    break;
		case Dbus.Field.Member:
		    wws(w2, i, "s", method);
		    break;
		case Dbus.Field.ErrorName:
		    wws(w2, i, "s", err);
		    break;
		default:
		    break; // unknown field code, ignore
		}
	    });
	    
	    w.WritePad(8); // the header is *always* a multiple of 8
	    return w.ToArray();
	}
Exemple #6
0
	void wwsig(WvDbusWriter w, Dbus.Field c, string sig, string val)
	{
	    w.Write((byte)c);
	    w.WriteSig(sig);
	    w.WriteSig(val);
	}
Exemple #7
0
	void wwu(WvDbusWriter w, Dbus.Field c, string sig, uint val)
	{
	    w.Write((byte)c);
	    w.WriteSig(sig);
	    w.Write(val);
	}
    public void PutSchemaData(string tablename, string text, int seqnum)
    {
        WvDbusMsg call = methodcall("PutSchemaData", "ss");

        WvDbusWriter writer = new WvDbusWriter();

        writer.Write(tablename);
        writer.Write(text);
        call.Body = writer.ToArray();

        WvDbusMsg reply = bus.send_and_wait(call);
	reply.check("");
    }
    public string GetSchemaData(string tablename, int seqnum, string where,
                                Dictionary<string,string> replaces, List<string> skipfields)
    {
        WvDbusMsg call = methodcall("GetSchemaData", "ss");

        WvDbusWriter writer = new WvDbusWriter();

        if (where == null)
            where = "";

        writer.Write(tablename);
        writer.Write(where);
        call.Body = writer.ToArray();

        WvDbusMsg reply = bus.send_and_wait(call);
	reply.check("s");
	return reply.iter().pop();
    }
Exemple #10
0
    private static void HandleCancelQuery(WvDbus conn, WvDbusMsg msg)
    {
	log.print(WvLog.L.Debug4, "Received CancelQuery request\n");
	//FIXME:  Should I be in yet another thread?
	Action perform = null;
	if (msg.signature != "u" && msg.signature != "s")
	{
	    //accept 's' signatures for Perl DBus, which is stupid and can't
	    //send me 'u' parameters, even though the api accepts them.
	    log.print(WvLog.L.Debug4, "CancelQuery:  bad signature {0}\n",
			msg.signature);
	    perform = () => {
		conn.send(msg.err_reply(
			    "org.freedesktop.DBus.Error.UnknownMethod",
			    "No overload of {0} has signature '{1}'",
			    "CancelQuery", msg.signature));
	    };
	}
	else
	{
	    var it = msg.iter();
	    uint tokill;
	    if (msg.signature == "s")
	    {
		log.print(WvLog.L.Debug4,
			    "CancelQuery: converting arg from string\n");
		string temps = it.pop();
		tokill = Convert.ToUInt32(temps);
	    }
	    else
		tokill = it.pop();

	    log.print(WvLog.L.Debug4,
			"CancelQuery: try killing msg id {0}\n", tokill);

	    lock (action_mutex)
	    {
		if (curaction != null && curaction.conn == conn &&
		    curaction.src.serial == tokill)
		{
		    log.print(WvLog.L.Debug4,
				"CancelQuery: killing current action!\n");
			    
		    WvSqlRows_IDataReader.Cancel();
		    curaction = null;
		}
		else
		{
		    log.print(WvLog.L.Debug4,
				"CancelQuery: traversing action queue...\n");
			    
		    //Traverse the action queue, killing stuff
		    foreach (VxActionTriple t in action_queue)
			if (t.conn == conn && t.src.serial == tokill)
			{
			    log.print(WvLog.L.Debug4,
					"CancelQuery: found culprit, killing.\n");
			    //action_queue.Remove(t);
			    //FIXME:  What message should we really put here?
			    t.action = () => {
			    	conn.send(t.src.err_reply("vx.db.sqlerror",
					    "This message got canceled"));
			    };
			    break;
			}
		}
	    }

	    //Pointless return to make Perl happy.
	    perform = () => {
		WvDbusWriter writer = new WvDbusWriter();
		writer.Write("Cancel");
		conn.send(msg.reply("s").write(writer));
	    };
	    log.print(WvLog.L.Debug4, "CancelQuery:  complete\n");
	}

	//FIXME:  It's not clear whether for just add operations, in conjuction
	//with RemoveAt(0) going on in the otherthread, we need a mutex.
	action_queue.Add(new VxActionTriple(conn, msg, perform));
    }
Exemple #11
0
    static void CallQuit(WvDbus conn,
				 WvDbusMsg call, out WvDbusMsg reply)
    {
	// FIXME: Check permissions here
        WvDbusWriter writer = new WvDbusWriter();
	writer.Write("Quit");
        reply = call.reply("s").write(writer);
	Versaplexd.want_to_die = true;
    }
Exemple #12
0
    static void WriteV(WvDbusWriter w, VxColumnType t, object v)
    {
	switch (t)
	{
	case VxColumnType.Int64:
	    w.Write((Int64)v);
	    break;
	case VxColumnType.Int32:
	    w.Write((Int32)v);
	    break;
	case VxColumnType.Int16:
	    w.Write((Int16)v);
	    break;
	case VxColumnType.UInt8:
	    w.Write((byte)v);
	    break;
	case VxColumnType.Bool:
	    w.Write((bool)v);
	    break;
	case VxColumnType.Double:
	    w.Write((double)v);
	    break;
	case VxColumnType.Binary:
	    w.Write((byte[])v);
	    break;
	case VxColumnType.String:
	case VxColumnType.Decimal:
	case VxColumnType.Uuid:
	    w.Write((string)v);
	    break;
	case VxColumnType.DateTime:
	    {
		var dt = (VxDbusDateTime)v;
		w.Write(dt.seconds);
		w.Write(dt.microseconds);
		break;
	    }
	default:
	    throw new ArgumentException("Unknown VxColumnType");
	}
    }
Exemple #13
0
    static void CallGetSchemaData(WvDbus conn,
					  WvDbusMsg call, out WvDbusMsg reply)
    {
        if (call.signature != "ss") {
            reply = CreateUnknownMethodReply(call, "GetSchemaData");
            return;
        }

        string clientid = GetClientId(call);
        if (clientid == null)
        {
            reply = call.err_reply("org.freedesktop.DBus.Error.Failed",
				   "Could not identify the client");
            return;
        }

	var it = call.iter();
        string tablename = it.pop();
	string where = it.pop();

        WvDbusWriter writer = new WvDbusWriter();

	// FIXME: No exception catching?
	// FIXME: Should receive the replace/skip parameters via dbus
        using (var dbi = VxSqlPool.create(clientid))
        {
            VxDbSchema backend = new VxDbSchema(dbi);
            string schemadata = backend.GetSchemaData(tablename, 0, where,
						      null, null);
            writer.Write(schemadata);
        }

        reply = call.reply("s").write(writer);
    }