Skip to content
Snippets Groups Projects
Commit 815c3a97 authored by jkerdreu's avatar jkerdreu
Browse files

Fix Cbor tags support (UUID, URL) for encoding / decoding and CBOR to JSON....

Fix Cbor tags support (UUID, URL) for encoding / decoding and CBOR to JSON. Still need to fix UUID encoding.

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/branches/0.7@2445 b32b6428-25c9-4566-ad07-03861ab6144f
parent 1a1e58cb
Branches
No related tags found
No related merge requests found
......@@ -28,6 +28,5 @@ setup(
'bottle',
'gevent==1.5a2',
'gevent-websocket',
'python-rapidjson'
]
)
from gevent import monkey; monkey.patch_all()
from xaal.lib import tools,Engine,Device,helpers
from xaal.lib import Engine,Device,helpers,tools,cbor
from xaal.monitor import Monitor
from bottle import default_app,debug,get,request,response,redirect,static_file
import rapidjson
import json
import os
import platform
import logging
......@@ -65,7 +65,7 @@ def xaal_loop(engine):
engine.loop()
def json_encode(obj):
return rapidjson.dumps(obj,uuid_mode=rapidjson.UM_CANONICAL,indent=4)
return json.dumps(obj,indent=4)
def search_device(addr):
dev = None
......@@ -92,6 +92,7 @@ def list_devices():
for dev in monitor.devices:
h = {'address':dev.address,'dev_type':dev.dev_type,'info':dev.description.get('info',None)}
l.append(h)
cbor.cleanup(l)
response.headers['Content-Type'] = 'application/json'
return json_encode(l)
......@@ -105,6 +106,7 @@ def get_device(addr):
res.update({'attributes':dev.attributes})
res.update({'description':dev.description})
res.update({'metadata':dev.db})
cbor.cleanup(res)
else:
res = {'error':{'code':404,'message':'Unknow device'}}
response.status=404
......@@ -131,6 +133,7 @@ def send_request(addr,action):
if dev:
monitor.engine.send_request(monitor.dev,[uid,],action,body)
res = {'address':dev.address}
cbor.cleanup(res)
else:
res = {'error':{'code':404,'message':'Unknow device'}}
response.status=404
......
......@@ -85,7 +85,7 @@ class MetaDB(object):
def get_keys_values(self,_device):
dev = self.get_device(_device)
if dev:
return {'device':_device,'map' : dev}
return {'device':_device,'map' : dev.dict()}
return {'device':_device,'map' : {}}
logger.info('Unknown device %s' % _device)
......
......@@ -2,8 +2,9 @@ from xaal.lib import bindings, cbor
uuid = bindings.UUID.random()
url = bindings.URL("http://google.fr")
data = ["foobar",2,{"device":uuid}]
data = ["foobar",2,{"device":uuid, "url":url}]
tmp = cbor.dumps(data)
......
......@@ -38,5 +38,21 @@ class UUID(uuid.UUID):
return str(self)
class URL(str):pass
class URL:
def __init__(self,value):
self.__url = value
def get(self):
return self.__url
def set(self,value):
self.__url = value
def __str__(self):
return str(self.__url)
def __repr__(self):
return f"URL('{self.__url}')"
classes = [UUID,URL]
......@@ -19,10 +19,33 @@ def default_encoder(encoder, value):
encoder.encode(CBORTag(37, value.bytes))
if type(value) == bindings.URL:
encoder.encode(CBORTag(32, str(value)))
encoder.encode(CBORTag(32, value.get()))
def dumps(obj, **kwargs):
return cbor2.dumps(obj,default=default_encoder,**kwargs)
def loads(payload, **kwargs):
return cbor2.loads(payload,tag_hook=tag_hook,**kwargs)
def cleanup(obj):
"""
recursive walk a object to search for un-wanted CBOR bindings.
Transform this bindings in string format, this can be UUID, URL..
Should be Ok, with list, dicts..
Warning: This operate in-place changes.
Warning: This won't work for bindings in dict keys.
"""
if isinstance(obj,list):
for i in range(0,len(obj)):
obj[i] = cleanup(obj[i])
return obj
if isinstance(obj,dict):
for k in obj.keys():
obj.update({k:cleanup(obj[k])})
return obj
if type(obj) in bindings.classes:
return str(obj)
else:
return obj
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment