|
@@ -0,0 +1,91 @@
|
|
|
+import sys
|
|
|
+sys.path.append("wrappers")
|
|
|
+from modelverse import *
|
|
|
+import os
|
|
|
+import json
|
|
|
+
|
|
|
+import time
|
|
|
+time.sleep(1)
|
|
|
+init(sys.argv[1])
|
|
|
+login("JSON", "JSON")
|
|
|
+
|
|
|
+def json_service(port):
|
|
|
+ def print_out_json(data):
|
|
|
+ if isinstance(data, dict):
|
|
|
+ # Serialize dictionary
|
|
|
+ service_set(port, "D")
|
|
|
+ service_set(port, len(data))
|
|
|
+ for key, value in data.items():
|
|
|
+ service_set(port, key)
|
|
|
+ print_out_json(value)
|
|
|
+ elif isinstance(data, list):
|
|
|
+ # Serialize list
|
|
|
+ service_set(port, "L")
|
|
|
+ service_set(port, len(data))
|
|
|
+ for value in data:
|
|
|
+ print_out_json(value)
|
|
|
+ elif data is None:
|
|
|
+ service_set(port, "N")
|
|
|
+ else:
|
|
|
+ # Is a primitive value (normally), so send as-is
|
|
|
+ service_set(port, "P")
|
|
|
+ service_set(port, data)
|
|
|
+
|
|
|
+ def fetch_data():
|
|
|
+ data = service_get(port)
|
|
|
+ if data == "D":
|
|
|
+ rval = {}
|
|
|
+ length = service_get(port)
|
|
|
+ for _ in range(length):
|
|
|
+ key = service_get(port)
|
|
|
+ rval[key] = fetch_data()
|
|
|
+ elif data == "L":
|
|
|
+ rval = []
|
|
|
+ length = service_get(port)
|
|
|
+ for _ in range(length):
|
|
|
+ rval.append(fetch_data())
|
|
|
+ elif data == "P":
|
|
|
+ rval = service_get(port)
|
|
|
+ elif data == "N":
|
|
|
+ rval = None
|
|
|
+ else:
|
|
|
+ raise Exception("Unknown data type: " + data)
|
|
|
+ return rval
|
|
|
+
|
|
|
+ start = time.time()
|
|
|
+
|
|
|
+ mode = service_get(port)
|
|
|
+ try:
|
|
|
+ if mode == "decode":
|
|
|
+ service_set(port, "OK")
|
|
|
+ json_str = service_get(port)
|
|
|
+ json_data = json.loads(json_str)
|
|
|
+ print_out_json(json_data)
|
|
|
+ print("Decoded %s" % json_str)
|
|
|
+
|
|
|
+ elif mode == "encode":
|
|
|
+ service_set(port, "OK")
|
|
|
+ json_data = fetch_data()
|
|
|
+ json_str = json.dumps(json_data)
|
|
|
+ service_set(port, json_str)
|
|
|
+ print("Encoded %s" % json_str)
|
|
|
+
|
|
|
+ else:
|
|
|
+ raise Exception("No such mode: " + mode)
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ service_set(port, str(e))
|
|
|
+ raise
|
|
|
+ print("JSON took %ss" % (time.time() - start))
|
|
|
+
|
|
|
+service_register("JSON", json_service)
|
|
|
+
|
|
|
+try:
|
|
|
+ while raw_input() != "STOP":
|
|
|
+ pass
|
|
|
+except EOFError:
|
|
|
+ import time
|
|
|
+ while 1:
|
|
|
+ time.sleep(1.0)
|
|
|
+finally:
|
|
|
+ service_stop()
|