# # # patch "cmd_scgi.cc" # from [799f752acb288807b8f0d73b3ae06b5aef7278fc] # to [4ed4e031317d7a05b0100ceaff1586d72d7e3314] # # patch "http_client.cc" # from [69ffc655e3c8de7de8eb4a5d3ca4c97ca583f0d5] # to [e76d0d4432ed71a506f7781aca7cbd61a6efc777] # # patch "json_msgs.cc" # from [e84dfe2a3071c3d520a0c7c6031f62b8b8dbead8] # to [80c4e3ba2bd3dc6afe4b4097faa4d757c92bcff3] # # patch "json_msgs.hh" # from [ca18a9c15f3c5056ca002ed6a2bae3a7327ab9c2] # to [23c8ea42a8e741ecc09731a7a2a326096df6c326] # # patch "vocab_terms.hh" # from [80283d95bc08f3a9f8c1c503ebeebb51b03c384e] # to [5a322fe5f4e1a98cfc75a9aa8ff2162753df7def] # ============================================================ --- cmd_scgi.cc 799f752acb288807b8f0d73b3ae06b5aef7278fc +++ cmd_scgi.cc 4ed4e031317d7a05b0100ceaff1586d72d7e3314 @@ -26,6 +26,7 @@ #include "lua.hh" #include "lua_hooks.hh" #include "net_common.hh" +#include "transforms.hh" #include "ui.hh" #include "netxx/address.h" @@ -171,6 +172,9 @@ do_cmd(database & db, json_io::json_obje revision_id rid; revision_t rev; + file_id fid, old_id, new_id; + file_data data; + file_delta delta; if (decode_msg_inquire_request(cmd_obj, request_revs)) { @@ -212,6 +216,20 @@ do_cmd(database & db, json_io::json_obje I(rid == check); return encode_msg_put_rev_response(); } + else if (decode_msg_put_file_data_request(cmd_obj, fid, data)) + { + // this will check that the id is correct + // db.put_file(fid, data); + return encode_msg_put_file_data_response(); + } + else if (decode_msg_put_file_delta_request(cmd_obj, old_id, new_id, delta)) + { + // this should also check that the delta applied to the data with old_id + // produces data that matches the new_id. currently it looks like the database + // does not enforce this though, so FIXME! + // db.put_file_version(old_id, new_id, delta); + return encode_msg_put_file_delta_response(); + } else { return encode_msg_error("unknown request"); ============================================================ --- http_client.cc 69ffc655e3c8de7de8eb4a5d3ca4c97ca583f0d5 +++ http_client.cc e76d0d4432ed71a506f7781aca7cbd61a6efc777 @@ -228,6 +228,10 @@ http_channel::push_file_data(file_id con http_channel::push_file_data(file_id const & id, file_data const & data) const { + json_value_t request = encode_msg_put_file_data_request(id, data); + json_value_t response = client.transact_json(request); + E(decode_msg_put_file_data_response(response), + F("received unexpected reply to 'put_file_data_request' message")); } void @@ -235,6 +239,10 @@ http_channel::push_file_delta(file_id co file_id const & new_id, file_delta const & delta) const { + json_value_t request = encode_msg_put_file_delta_request(old_id, new_id, delta); + json_value_t response = client.transact_json(request); + E(decode_msg_put_file_delta_response(response), + F("received unexpected reply to 'put_file_delta_request' message")); } void ============================================================ --- json_msgs.cc e84dfe2a3071c3d520a0c7c6031f62b8b8dbead8 +++ json_msgs.cc 80c4e3ba2bd3dc6afe4b4097faa4d757c92bcff3 @@ -12,6 +12,7 @@ #include "json_io.hh" #include "json_msgs.hh" #include "cset.hh" +#include "transforms.hh" #include #include @@ -53,12 +54,11 @@ namespace symbol const attr("attr"); symbol const value("value"); - symbol const changes("changes"); - // revision symbols symbol const old_revision("old_revision"); symbol const new_manifest("new_manifest"); symbol const edges("edges"); + symbol const changes("changes"); // file delta / data symbols symbol const id("id"); @@ -72,6 +72,8 @@ namespace symbol const vers("vers"); symbol const revs("revs"); symbol const error("error"); + symbol const status("status"); + symbol const rev("rev"); // request/response pairs symbol const inquire_request("inquire_request"); @@ -82,17 +84,15 @@ namespace symbol const put_rev_request("put_rev_request"); symbol const put_rev_response("put_rev_response"); + symbol const get_rev_request("get_rev_request"); symbol const get_rev_response("get_rev_request"); - symbol const status("status"); + symbol const put_file_data_request("put_file_data_request"); + symbol const put_file_data_response("put_file_data_response"); - symbol const get_file_data("get_file_data"); - symbol const get_file_delta("get_file_delta"); - - symbol const rev("rev"); - symbol const file_data("file_data"); - symbol const file_delta("file_delta"); + symbol const put_file_delta_request("put_file_delta_request"); + symbol const put_file_delta_response("put_file_delta_response"); } } @@ -494,6 +494,130 @@ decode_msg_put_rev_response(json_value_t return false; } +///////////////////////////////////////////////////////////////////// +// file data +///////////////////////////////////////////////////////////////////// + +json_value_t +encode_msg_put_file_data_request(file_id const & fid, + file_data const & data) +{ + builder b; + b[syms::type].str(syms::put_file_data_request()); + b[syms::vers].str("1"); + b[syms::id].str(fid.inner()()); + b[syms::data].str(encode_base64(data.inner())()); + return b.v; +} + +bool +decode_msg_put_file_data_request(json_value_t val, + file_id & fid, + file_data & data) +{ + string type, vers, id, dat; + query q(val); + if (q[syms::type].get(type) && type == syms::put_file_data_request() && + q[syms::vers].get(vers) && vers == "1" && + q[syms::id].get(id) && + q[syms::data].get(dat)) + { + fid = file_id(id); + data = file_data(decode_base64_as(dat)); + return true; + } + return false; +} + +json_value_t +encode_msg_put_file_data_response() +{ + builder b; + b[syms::type].str(syms::put_file_data_response()); + b[syms::vers].str("1"); + b[syms::status].str("received"); + return b.v; +} + +bool +decode_msg_put_file_data_response(json_value_t val) +{ + string type, vers, status; + query q(val); + if (q[syms::type].get(type) && type == syms::put_file_data_response() && + q[syms::vers].get(vers) && vers == "1" && + q[syms::status].get(status)) + { + return true; + } + return false; +} + +///////////////////////////////////////////////////////////////////// +// file delta +///////////////////////////////////////////////////////////////////// + +json_value_t +encode_msg_put_file_delta_request(file_id const & src_id, + file_id const & dst_id, + file_delta const & delta) +{ + builder b; + b[syms::type].str(syms::put_file_delta_request()); + b[syms::vers].str("1"); + b[syms::src_id].str(src_id.inner()()); + b[syms::dst_id].str(dst_id.inner()()); + b[syms::delta].str(encode_base64(delta.inner())()); + return b.v; +} + +bool +decode_msg_put_file_delta_request(json_value_t val, + file_id & src_id, + file_id & dst_id, + file_delta & delta) +{ + string type, vers, src, dst, del; + query q(val); + if (q[syms::type].get(type) && type == syms::put_file_delta_request() && + q[syms::vers].get(vers) && vers == "1" && + q[syms::src_id].get(src) && + q[syms::src_id].get(src) && + q[syms::delta].get(del)) + { + src_id = file_id(src); + dst_id = file_id(dst); + delta = file_delta(decode_base64_as(del)); + return true; + } + return false; +} + +json_value_t +encode_msg_put_file_delta_response() +{ + builder b; + b[syms::type].str(syms::put_file_delta_response()); + b[syms::vers].str("1"); + b[syms::status].str("received"); + return b.v; +} + +bool +decode_msg_put_file_delta_response(json_value_t val) +{ + string type, vers, status; + query q(val); + if (q[syms::type].get(type) && type == syms::put_file_delta_response() && + q[syms::vers].get(vers) && vers == "1" && + q[syms::status].get(status)) + { + return true; + } + return false; +} + + // Local Variables: // mode: C++ // fill-column: 76 ============================================================ --- json_msgs.hh ca18a9c15f3c5056ca002ed6a2bae3a7327ab9c2 +++ json_msgs.hh 23c8ea42a8e741ecc09731a7a2a326096df6c326 @@ -61,7 +61,7 @@ bool decode_msg_put_rev_response(json_io bool decode_msg_put_rev_response(json_io::json_value_t val); -// files +// file data json_io::json_value_t encode_msg_get_file_data(file_id const & fid); bool decode_msg_get_file_data(json_io::json_value_t val, file_id & fid); @@ -72,6 +72,28 @@ bool decode_msg_get_file_delta(json_io:: file_id & src_id, file_id & dst_id); +json_io::json_value_t encode_msg_put_file_data_request(file_id const & fid, + file_data const & data); +bool decode_msg_put_file_data_request(json_io::json_value_t val, + file_id & fid, + file_data & data); + +json_io::json_value_t encode_msg_put_file_data_response(); +bool decode_msg_put_file_data_response(json_io::json_value_t val); + +// file delta + +json_io::json_value_t encode_msg_put_file_delta_request(file_id const & src_id, + file_id const & dst_fid, + file_delta const & delta); +bool decode_msg_put_file_delta_request(json_io::json_value_t val, + file_id & src_id, + file_id & dst_id, + file_delta & delta); + +json_io::json_value_t encode_msg_put_file_delta_response(); +bool decode_msg_put_file_delta_response(json_io::json_value_t val); + // Local Variables: // mode: C++ // fill-column: 76 ============================================================ --- vocab_terms.hh 80283d95bc08f3a9f8c1c503ebeebb51b03c384e +++ vocab_terms.hh 5a322fe5f4e1a98cfc75a9aa8ff2162753df7def @@ -103,6 +103,7 @@ EXTERN template class base64; EXTERN template class hexenc; EXTERN template class base64; EXTERN template class base64; +EXTERN template class base64; // instantiate those bits of the stream operator vocab (again) actually in // use. "again" since stream operators are friends, not members. @@ -151,4 +152,3 @@ EXTERN template std::ostream & operator< // indent-tabs-mode: nil // End: // vim: et:sw=2:sts=2:ts=2:cino=>2s,{s,\:s,+s,t0,g0,^-2,e-2,n-2,p2s,(0,=s: -