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; }
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; }
// 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(); }
void wwsig(WvDbusWriter w, Dbus.Field c, string sig, string val) { w.Write((byte)c); w.WriteSig(sig); w.WriteSig(val); }
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(); }
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)); }
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; }
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"); } }
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); }