[DEV] nearly ready to send Object throw the network

This commit is contained in:
Edouard DUPIN 2016-12-01 21:06:35 +01:00
parent 53fc5a2506
commit aabcf5b9ce
19 changed files with 339 additions and 177 deletions

View File

@ -63,6 +63,8 @@ def remove_start_stop_spacer(data):
dataout = dataout[:-1] dataout = dataout[:-1]
return dataout return dataout
def capital_first(data):
return data[0].upper() + data[1:]
class AttributeDefinition: class AttributeDefinition:
def __init__(self): def __init__(self):
@ -85,7 +87,7 @@ class AttributeDefinition:
debug.info(" BRIEF: " + self.brief) debug.info(" BRIEF: " + self.brief)
debug.info(" " + self.type + " " + self.name + ";") debug.info(" " + self.type + " " + self.name + ";")
def generate_doxy_get(self, space): def generate_doxy_get(self, space, object):
out = "" out = ""
out += space + "/**\n" out += space + "/**\n"
out += space + " * @brief Get parameter " + self.brief + "\n" out += space + " * @brief Get parameter " + self.brief + "\n"
@ -93,7 +95,7 @@ class AttributeDefinition:
out += space + " */\n" out += space + " */\n"
return out return out
def generate_doxy_set(self, space): def generate_doxy_set(self, space, object):
out = "" out = ""
out += space + "/**\n" out += space + "/**\n"
out += space + " * @brief Set parameter " + self.brief + "\n" out += space + " * @brief Set parameter " + self.brief + "\n"
@ -101,36 +103,36 @@ class AttributeDefinition:
out += space + " */\n" out += space + " */\n"
return out return out
def generate_cpp(self, space): def generate_cpp(self, space, object):
out = ""; out = "";
# TODO : Set it in protected # TODO : Set it in protected
out += space + convert_type_in_cpp(self.type) + " m_" + self.name + "; //!<" + self.brief + "\n" out += space + convert_type_in_cpp(self.type) + " m_" + self.name + "; //!<" + self.brief + "\n"
# TODO: set it in public ... # TODO: set it in public ...
out += self.generate_doxy_get(space) out += self.generate_doxy_get(space, object)
out += space + "virtual " + convert_type_in_cpp(self.type) + " get" + self.name.title() + "() {\n" out += space + "virtual " + convert_type_in_cpp(self.type) + " get" + capital_first(self.name) + "() {\n"
out += space + " return m_" + self.name.title() + ";\n" out += space + " return m_" + self.name + ";\n"
out += space + "}\n" out += space + "}\n"
out += self.generate_doxy_set(space) out += self.generate_doxy_set(space, object)
out += space + "virtual void set" + self.name.title() + "(" + convert_type_in_cpp(self.type) + " _value);\n" out += space + "virtual void set" + capital_first(self.name) + "(const " + convert_type_in_cpp(self.type) + "& _value) {\n"
out += space + " m_" + self.name.title() + " = _value;\n" out += space + " m_" + self.name + " = _value;\n"
out += space + "}\n" out += space + "}\n"
return out; return out;
def generate_hpp_proxy(self, space): def generate_hpp_proxy(self, space, object):
out = ""; out = "";
out += self.generate_doxy_get(space) out += self.generate_doxy_get(space, object)
out += space + "virtual zeus::Future<" + convert_type_in_cpp(self.type) + "> get" + self.name.title() + "();\n" out += space + "virtual zeus::Future<" + convert_type_in_cpp(self.type) + "> get" + capital_first(self.name) + "();\n"
out += self.generate_doxy_set(space) out += self.generate_doxy_set(space, object)
out += space + "virtual zeus::Future<void> set" + self.name.title() + "(" + convert_type_in_cpp(self.type) + " _value);\n" out += space + "virtual zeus::Future<void> set" + capital_first(self.name) + "(const " + convert_type_in_cpp(self.type) + "& _value);\n"
return out; return out;
def generate_cpp_proxy(self, space, class_name): def generate_cpp_proxy(self, space, class_name, object):
out = ""; out = "";
out += space + "zeus::Future<" + convert_type_in_cpp(self.type) + "> " + class_name + "::get" + self.name.title() + "() {\n" out += space + "zeus::Future<" + convert_type_in_cpp(self.type) + "> " + class_name + "::get" + capital_first(self.name) + "() {\n"
out += space + ' return m_srv.call("' + self.name + '.get");\n' out += space + ' return m_obj.call("' + self.name + '.get");\n'
out += space + "}\n" out += space + "}\n"
out += space + "zeus::Future<void> " + class_name + "::set" + self.name.title() + "(" + convert_type_in_cpp(self.type) + " _value) {\n" out += space + "zeus::Future<void> " + class_name + "::set" + capital_first(self.name) + "(const " + convert_type_in_cpp(self.type) + "& _value) {\n"
out += space + ' return m_srv.call("' + self.name + '.set", _value);\n' out += space + ' return m_obj.call("' + self.name + '.set", _value);\n'
out += space + "}\n" out += space + "}\n"
return out; return out;
@ -191,7 +193,7 @@ class FunctionDefinition:
debug.info(" " + elem["type"] + " " + elem["name"] + ", # " + elem["brief"]) debug.info(" " + elem["type"] + " " + elem["name"] + ", # " + elem["brief"])
debug.info(" )") debug.info(" )")
def generate_doxy(self, space): def generate_doxy(self, space, object):
# generate doxygen comment: # generate doxygen comment:
out = space + "/**\n" out = space + "/**\n"
if self.brief != "": if self.brief != "":
@ -211,9 +213,9 @@ class FunctionDefinition:
out += space + " */\n" out += space + " */\n"
return out return out
def generate_cpp(self, space): def generate_cpp(self, space, object):
out = ""; out = "";
out += self.generate_doxy(space) out += self.generate_doxy(space, object)
out += space + "virtual " out += space + "virtual "
out += convert_type_in_cpp(self.return_type) + " " + self.name + "(" out += convert_type_in_cpp(self.return_type) + " " + self.name + "("
param_data = "" param_data = ""
@ -231,9 +233,9 @@ class FunctionDefinition:
out += ") = 0;\n" out += ") = 0;\n"
return out; return out;
def generate_hpp_proxy(self, space): def generate_hpp_proxy(self, space, object):
out = ""; out = "";
out += self.generate_doxy(space) out += self.generate_doxy(space, object)
out += space + "virtual zeus::Future<" + convert_type_in_cpp(self.return_type) + "> " + self.name + "(" out += space + "virtual zeus::Future<" + convert_type_in_cpp(self.return_type) + "> " + self.name + "("
param_data = "" param_data = ""
id_parameter = 0 id_parameter = 0
@ -249,7 +251,7 @@ class FunctionDefinition:
out += param_data out += param_data
out += ");\n" out += ");\n"
return out; return out;
def generate_cpp_proxy(self, space, class_name): def generate_cpp_proxy(self, space, class_name, object):
out = ""; out = "";
out += space + "zeus::Future<" + convert_type_in_cpp(self.return_type) + "> " + class_name + "::" + self.name + "(" out += space + "zeus::Future<" + convert_type_in_cpp(self.return_type) + "> " + class_name + "::" + self.name + "("
param_data = "" param_data = ""
@ -266,7 +268,7 @@ class FunctionDefinition:
out += param_data out += param_data
out += ") {\n" out += ") {\n"
space += " " space += " "
out += space + 'return m_srv.call("' + self.name + '"' out += space + 'return m_obj.call("' + self.name + '"'
id_parameter = 0 id_parameter = 0
for elem in self.parameters: for elem in self.parameters:
id_parameter += 1 id_parameter += 1
@ -295,7 +297,7 @@ class ServiceDefinition:
def set_name(self, value): def set_name(self, value):
self.name = value self.name = value
# TODO : Check range ... # TODO : Check range ...
self.name[-1] = self.name[-1].title() self.name[-1] = capital_first(self.name[-1])
def set_brief(self, value): def set_brief(self, value):
self.brief = remove_start_stop_spacer(value) self.brief = remove_start_stop_spacer(value)
@ -328,7 +330,7 @@ class ServiceDefinition:
for elem in self.functions: for elem in self.functions:
elem.display(); elem.display();
def generate_header(self): def generate_header(self, object):
filename = "" filename = ""
for elem in self.name[:-1]: for elem in self.name[:-1]:
filename += elem + "/" filename += elem + "/"
@ -371,10 +373,10 @@ class ServiceDefinition:
out += space + "virtual ~" + self.name[-1] + "() = default;\n" out += space + "virtual ~" + self.name[-1] + "() = default;\n"
for elem in self.attributes: for elem in self.attributes:
out += elem.generate_cpp(space) out += elem.generate_cpp(space, object)
for elem in self.functions: for elem in self.functions:
out += elem.generate_cpp(space) out += elem.generate_cpp(space, object)
space = space[:-2] space = space[:-2]
out += space + "};\n" out += space + "};\n"
@ -384,7 +386,80 @@ class ServiceDefinition:
out += space + "}\n" out += space + "}\n"
return [filename, out] return [filename, out]
def generate_register_header(self): def generate_source(self, object):
filename = ""
for elem in self.name[:-1]:
filename += elem + "/"
filename += self.name[-1] + ".cpp";
out = ""
class_name = ""
for elem in self.name[:-1]:
class_name += "" + elem + "::"
class_name += self.name[-1];
namespace = ""
for elem in self.name[:-1]:
namespace += elem + "::"
out += "/** @file\n"
out += " * @note Generated file !!! Do not modify !!!\n"
out += " * @license APACHE-2\n"
out += " * @copyright none\n"
out += " */\n"
out += "\n"
out += "#include <" + filename.replace(".cpp",".hpp") + ">\n"
out += "#include <etk/types.hpp>\n"
out += "#include <zeus/Buffer.hpp>\n"
out += "#include <zeus/BufferData.hpp>\n"
out += "#include <zeus/debug.hpp>\n"
out += "#include <zeus/ParamType.hpp>\n"
out += "#include <etk/stdTools.hpp>\n"
out += "#include <zeus/AbstractFunction.hpp>\n"
out += "#include <climits>\n"
out += "#include <etk/os/FSNode.hpp>\n"
out += "#include <zeus/mineType.hpp>\n"
out += "#include <zeus/WebServer.hpp>\n"
out += "\n"
# now gebnerate the get and set parameter object ...
out += "namespace zeus {\n"
"""
out += " template<> const zeus::ParamType& createType<" + class_name + ">() {\n"
out += " static zeus::ParamType type(\"obj:" + class_name + "\", zeus::paramTypeObject, false, false);\n"
out += " return type;\n"
out += " }\n"
"""
out += " template<>\n"
out += " void BufferParameter::addParameter<" + class_name + ">(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const ememory::SharedPtr<" + class_name + ">& _value) {\n"
out += " std::vector<uint8_t> data;\n"
"""
out += " addType(data, createType<" + class_name + ">());\n"
"""
out += " addTypeObject(data, \"" + class_name + "\");\n"
out += " int32_t currentOffset = data.size();\n"
out += " int32_t startOffset = data.size();\n"
out += " data.resize(data.size()+4);\n"
out += " uint32_t fullId = 0;\n"
# convert the object in a real System Object ....
out += " if (_iface != nullptr) {\n"
out += " uint16_t id = _iface->getAdress();\n"
out += " uint16_t idObj = _iface->getNewObjectId();\n"
out += " ememory::SharedPtr<zeus::ObjectType<" + class_name + ">> obj(_iface, idObj, _value);\n"
out += " " + namespace + "register" + self.name[-1] + "(_value);\n"
out += " _iface->addObject(obj)\n"
out += " fullId = (uint32_t(id)<<16)+idObj\n"
out += " }\n"
# return Object ID and interface adress
out += " memcpy(&data[currentOffset], &fullId, 4);\n"
out += " m_parameter.push_back(std::make_pair(startOffset,data));\n"
out += " }\n"
out += "}\n"
return [filename, out]
def generate_register_header(self, object):
filename = "" filename = ""
for elem in self.name[:-1]: for elem in self.name[:-1]:
filename += elem + "/" filename += elem + "/"
@ -404,7 +479,10 @@ class ServiceDefinition:
out += "#pragma once\n" out += "#pragma once\n"
out += "\n" out += "\n"
out += "#include <etk/types.hpp>\n" out += "#include <etk/types.hpp>\n"
out += "#include <zeus/Service.hpp>\n" if object == True:
out += "#include <zeus/Object.hpp>\n"
else:
out += "#include <zeus/Service.hpp>\n"
out += "#include <zeus/Client.hpp>\n" out += "#include <zeus/Client.hpp>\n"
out += "#include <" + class_name.replace("::","/") + ".hpp>\n" out += "#include <" + class_name.replace("::","/") + ".hpp>\n"
out += "#include <string>\n" out += "#include <string>\n"
@ -422,40 +500,44 @@ class ServiceDefinition:
MACRO_BASE_NAME += elem.upper() + "_" MACRO_BASE_NAME += elem.upper() + "_"
out += space + "\n" out += space + "\n"
out += space + "void register" + self.name[-1] + "(zeus::ServiceType<" + class_name + ">& _serviceInterface);\n" if object == True:
out += space + "\n" out += space + "void register" + self.name[-1] + "(zeus::ObjectType<" + class_name + ">& _interface);\n"
out += space + "template<class " + MACRO_BASE_NAME + "TYPE>\n" else:
out += space + "zeus::Object* create" + self.name[-1] + "(zeus::Client* _client, uint16_t _objectId, uint16_t _clientId, zeus::ServiceType<" + class_name + ">::factory _factory) {\n" out += space + "void register" + self.name[-1] + "(zeus::ServiceType<" + class_name + ">& _interface);\n"
out += space + " zeus::ServiceType<" + class_name + ">* tmp = nullptr;\n"
out += space + " tmp = new zeus::ServiceType<" + class_name + ">(_client, _objectId, _clientId, _factory);\n"
out += space + " zeus::service::register" + self.name[-1] + "(*tmp);\n"
out += space + " return tmp;\n"
out += space + "}\n"
out += space + "\n" out += space + "\n"
if object == False:
out += space + "template<class " + MACRO_BASE_NAME + "TYPE>\n"
out += space + "zeus::Object* create" + self.name[-1] + "(zeus::Client* _client, uint16_t _objectId, uint16_t _clientId, zeus::ServiceType<" + class_name + ">::factory _factory) {\n"
out += space + " zeus::ServiceType<" + class_name + ">* tmp = nullptr;\n"
out += space + " tmp = new zeus::ServiceType<" + class_name + ">(_client, _objectId, _clientId, _factory);\n"
out += space + " zeus::service::register" + self.name[-1] + "(*tmp);\n"
out += space + " return tmp;\n"
out += space + "}\n"
out += space + "\n"
for elem in self.name[:-1]: for elem in self.name[:-1]:
space = space[:-1] space = space[:-1]
out += space + "}\n" out += space + "}\n"
out += space + "\n" out += space + "\n"
if object == False:
out += space + "#define " + MACRO_BASE_NAME + "DECLARE(type) \\\n" out += space + "#define " + MACRO_BASE_NAME + "DECLARE(type) \\\n"
out += space + " ETK_EXPORT_API zeus::Object* SERVICE_IO_instanciate(zeus::Client* _client, uint16_t _objectId, uint16_t _clientId) { \\\n" out += space + " ETK_EXPORT_API zeus::Object* SERVICE_IO_instanciate(zeus::Client* _client, uint16_t _objectId, uint16_t _clientId) { \\\n"
out += space + " return " + namespace + "create" + self.name[-1] + "<type>(_client, _objectId, _clientId, \\\n" out += space + " return " + namespace + "create" + self.name[-1] + "<type>(_client, _objectId, _clientId, \\\n"
out += space + " [](uint16_t _clientId){ \\\n" out += space + " [](uint16_t _clientId){ \\\n"
out += space + " return ememory::makeShared<type>(_clientId); \\\n" out += space + " return ememory::makeShared<type>(_clientId); \\\n"
out += space + " }); \\\n" out += space + " }); \\\n"
out += space + " }\n" out += space + " }\n"
out += space + "\n" out += space + "\n"
""" """
out += space + "#define " + MACRO_BASE_NAME + "DECLARE_FACTORY(type, factory) \\\n" out += space + "#define " + MACRO_BASE_NAME + "DECLARE_FACTORY(type, factory) \\\n"
out += space + " ETK_EXPORT_API zeus::Service* SERVICE_IO_instanciate() { \\\n" out += space + " ETK_EXPORT_API zeus::Service* SERVICE_IO_instanciate() { \\\n"
out += space + " return " + namespace + "create" + self.name[-1] + "<type>(factory); \\\n" out += space + " return " + namespace + "create" + self.name[-1] + "<type>(factory); \\\n"
out += space + " }\n" out += space + " }\n"
""" """
return [filename, out] return [filename, out]
def generate_register_code(self): def generate_register_code(self, object):
filename = "" filename = ""
for elem in self.name[:-1]: for elem in self.name[:-1]:
filename += elem + "/" filename += elem + "/"
@ -486,42 +568,41 @@ class ServiceDefinition:
for elem in self.name[:-1]: for elem in self.name[:-1]:
class_name += "" + elem + "::" class_name += "" + elem + "::"
class_name += self.name[-1]; class_name += self.name[-1];
if object == True:
out += space + "void " + function_name + "(zeus::ObjectType<" + class_name + ">& _interface) {\n"
else:
out += space + "void " + function_name + "(zeus::ServiceType<" + class_name + ">& _interface) {\n"
out += space + "void " + function_name + "(zeus::ServiceType<" + class_name + ">& _serviceInterface) {\n"
space += " " space += " "
out += space + 'ZEUS_INFO("===========================================================");\n'; out += space + 'ZEUS_INFO("===========================================================");\n';
out += space + 'ZEUS_INFO("== Instanciate service: ' + self.name[-1] + '");\n'; out += space + 'ZEUS_INFO("== Instanciate service: ' + self.name[-1] + '");\n';
out += space + 'ZEUS_INFO("===========================================================");\n'; out += space + 'ZEUS_INFO("===========================================================");\n';
#out += space + '_serviceInterface.propertyNameService.set("' + self.name[-1].lower() + '");\n' #out += space + '_serviceInterface.propertyNameService.set("' + self.name[-1].lower() + '");\n'
if self.brief != "": if self.brief != "":
out += space + '_serviceInterface.setDescription("' + self.brief + '");\n'; out += space + '_interface.setDescription("' + self.brief + '");\n';
if self.version != "": if self.version != "":
out += space + '_serviceInterface.setVersion("' + self.version + '");\n'; out += space + '_interface.setVersion("' + self.version + '");\n';
if self.api != "": if self.api != "":
out += space + '_serviceInterface.setType("' + self.api + '");\n'; out += space + '_interface.setType("' + self.api + '");\n';
for elem in self.authors: for elem in self.authors:
out += space + '_serviceInterface.addAuthor("' + elem.split("<")[0] + '", "' + elem.split("<")[1].replace(">","") + '");\n'; out += space + '_interface.addAuthor("' + elem.split("<")[0] + '", "' + elem.split("<")[1].replace(">","") + '");\n';
if len(self.functions) != 0: if len(self.functions) != 0 \
or len(self.attributes) != 0:
out += space + "zeus::AbstractFunction* func = nullptr;\n" out += space + "zeus::AbstractFunction* func = nullptr;\n"
for elem in self.attributes: for elem in self.attributes:
out += space + 'func = _serviceInterface.advertise("' + elem.name.title() + '.set", &' + class_name + '::set' + elem.name.title() + ');\n' out += space + 'func = _interface.advertise("' + elem.name + '.set", &' + class_name + '::set' + capital_first(elem.name) + ');\n'
out += space + 'if (func != nullptr) {\n' out += space + 'if (func != nullptr) {\n'
space += " "
if elem.brief != "": if elem.brief != "":
out += space + 'func->setDescription("Set parameter ' + elem.brief + '");\n' out += space + ' func->setDescription("Set parameter ' + elem.brief + '");\n'
out += space + '}\n' out += space + '}\n'
out += space + 'func = _serviceInterface.advertise("' + elem.name.title() + '.get", &' + class_name + '::get' + elem.name.title() + ');\n' out += space + 'func = _interface.advertise("' + elem.name + '.get", &' + class_name + '::get' + capital_first(elem.name) + ');\n'
out += space + 'if (func != nullptr) {\n' out += space + 'if (func != nullptr) {\n'
space += " "
if elem.brief != "": if elem.brief != "":
out += space + 'func->setDescription("Get parameter ' + elem.brief + '");\n' out += space + ' func->setDescription("Get parameter ' + elem.brief + '");\n'
out += space + '}\n' out += space + '}\n'
for elem in self.functions: for elem in self.functions:
out += space + 'func = _serviceInterface.advertise("' + elem.name + '", &' + class_name + '::' + elem.name + ');\n' out += space + 'func = _interface.advertise("' + elem.name + '", &' + class_name + '::' + elem.name + ');\n'
out += space + 'if (func != nullptr) {\n' out += space + 'if (func != nullptr) {\n'
space += " " space += " "
if elem.brief != "": if elem.brief != "":
@ -549,7 +630,7 @@ class ServiceDefinition:
out += "\n" out += "\n"
return [filename, out] return [filename, out]
def generate_proxy_header(self): def generate_proxy_header(self, object):
filename = "" filename = ""
for elem in self.name[:-1]: for elem in self.name[:-1]:
filename += elem + "/" filename += elem + "/"
@ -588,7 +669,7 @@ class ServiceDefinition:
space += " " space += " "
out += space + "public:\n" out += space + "public:\n"
out += space + " const Proxy" + self.name[-1] + "& operator= (const zeus::ServiceRemote& _srv) {\n" out += space + " const Proxy" + self.name[-1] + "& operator= (const zeus::ServiceRemote& _srv) {\n"
out += space + " m_srv = _srv;\n" out += space + " m_obj = _srv;\n"
out += space + " return *this;\n" out += space + " return *this;\n"
out += space + " }\n" out += space + " }\n"
out += space + " ~Proxy" + self.name[-1] + "() = default;\n" out += space + " ~Proxy" + self.name[-1] + "() = default;\n"
@ -599,7 +680,7 @@ class ServiceDefinition:
out += space + " }\n" out += space + " }\n"
""" """
out += space + " bool exist() const {\n" out += space + " bool exist() const {\n"
out += space + " return m_srv.exist();\n" out += space + " return m_obj.exist();\n"
out += space + " }\n" out += space + " }\n"
""" """
out += space + "public:\n" out += space + "public:\n"
@ -611,9 +692,9 @@ class ServiceDefinition:
out += space + "virtual ~" + self.name[-1] + "() = default;\n" out += space + "virtual ~" + self.name[-1] + "() = default;\n"
""" """
for elem in self.attributes: for elem in self.attributes:
out += elem.generate_hpp_proxy(space) out += elem.generate_hpp_proxy(space, object)
for elem in self.functions: for elem in self.functions:
out += elem.generate_hpp_proxy(space) out += elem.generate_hpp_proxy(space, object)
space = space[:-2] space = space[:-2]
out += space + "};\n" out += space + "};\n"
@ -623,17 +704,20 @@ class ServiceDefinition:
out += space + "}\n" out += space + "}\n"
return [filename, out] return [filename, out]
def generate_proxy_code(self): def generate_proxy_code(self, object):
filename = "" filename = ""
for elem in self.name[:-1]: for elem in self.name[:-1]:
filename += elem + "/" filename += elem + "/"
filename += "Proxy" + self.name[-1] + ".cpp"; filename += "Proxy" + self.name[-1] + ".cpp";
out = "" out = ""
proxy_class_name = ""
class_name = "" class_name = ""
for elem in self.name[:-1]: for elem in self.name[:-1]:
proxy_class_name += "" + elem + "::"
class_name += "" + elem + "::" class_name += "" + elem + "::"
class_name += "Proxy" + self.name[-1]; proxy_class_name += "Proxy" + self.name[-1];
class_name += self.name[-1];
out += "/** @file\n" out += "/** @file\n"
out += " * @note Generated file !!! Do not modify !!!\n" out += " * @note Generated file !!! Do not modify !!!\n"
@ -645,10 +729,11 @@ class ServiceDefinition:
out += "\n" out += "\n"
for elem in self.attributes: for elem in self.attributes:
out += elem.generate_cpp_proxy("", class_name) out += elem.generate_cpp_proxy("", proxy_class_name, object)
for elem in self.functions: for elem in self.functions:
out += elem.generate_cpp_proxy("", class_name) out += elem.generate_cpp_proxy("", proxy_class_name, object)
return [filename, out] return [filename, out]
@ -814,14 +899,17 @@ def tool_generate_idl(target, module, data_option):
#service_def.display() #service_def.display()
service_header = service_def.generate_header() service_header = service_def.generate_header(data_option["type"] == "object")
register_header = service_def.generate_register_header() service_source = service_def.generate_source(data_option["type"] == "object")
register_code = service_def.generate_register_code() register_header = service_def.generate_register_header(data_option["type"] == "object")
proxy_header = service_def.generate_proxy_header() register_code = service_def.generate_register_code(data_option["type"] == "object")
proxy_code = service_def.generate_proxy_code() proxy_header = service_def.generate_proxy_header(data_option["type"] == "object")
proxy_code = service_def.generate_proxy_code(data_option["type"] == "object")
debug.verbose("----------------- " + service_header[0] + " -----------------") debug.verbose("----------------- " + service_header[0] + " -----------------")
debug.verbose("\n" + service_header[1]) debug.verbose("\n" + service_header[1])
debug.verbose("----------------- " + service_source[0] + " -----------------")
debug.verbose("\n" + service_source[1])
debug.verbose("----------------- " + register_header[0] + " -----------------") debug.verbose("----------------- " + register_header[0] + " -----------------")
debug.verbose("\n" + register_header[1]) debug.verbose("\n" + register_header[1])
debug.verbose("----------------- " + register_code[0] + " -----------------") debug.verbose("----------------- " + register_code[0] + " -----------------")
@ -833,6 +921,7 @@ def tool_generate_idl(target, module, data_option):
tmp_path = os.path.join(target.get_build_path_temporary_generate(module.get_name()), "idl_src") tmp_path = os.path.join(target.get_build_path_temporary_generate(module.get_name()), "idl_src")
module.add_generated_header_file(service_header[1], service_header[0], install_element=True) module.add_generated_header_file(service_header[1], service_header[0], install_element=True)
module.add_generated_src_file(service_source[1], service_source[0])
module.add_generated_header_file(register_header[1], register_header[0], install_element=True) module.add_generated_header_file(register_header[1], register_header[0], install_element=True)
module.add_generated_src_file(register_code[1], register_code[0]) module.add_generated_src_file(register_code[1], register_code[0])
module.add_generated_header_file(proxy_header[1], proxy_header[0], install_element=True) module.add_generated_header_file(proxy_header[1], proxy_header[0], install_element=True)

View File

@ -88,6 +88,7 @@ def configure(target, my_module):
'zeus/RemoteProcessCall.hpp', 'zeus/RemoteProcessCall.hpp',
'zeus/Service.hpp', 'zeus/Service.hpp',
'zeus/ServiceRemote.hpp', 'zeus/ServiceRemote.hpp',
'zeus/WebObj.hpp',
'zeus/WebServer.hpp', 'zeus/WebServer.hpp',
'zeus/mineType.hpp', 'zeus/mineType.hpp',
'zeus/BaseProxy.hpp', 'zeus/BaseProxy.hpp',

View File

@ -0,0 +1,13 @@
#elem-brief: Client Property object
#elem-version: 1.0
#elem-type:USER-PROPERTY
#elem-author:Heero Yui<yui.heero@gmail.com>
#brief:Name of the user
string name
#brief:Groups of the user
vector:string groups
#brief:list of function athorised
vector:string functionList

View File

@ -35,7 +35,7 @@ def configure(target, my_module):
zeus_macro = macro.load_macro('zeus') zeus_macro = macro.load_macro('zeus')
zeus_macro.parse_service_idl(my_module, 'appl/zeus-service-user.srv.zeus.idl') zeus_macro.parse_service_idl(my_module, 'appl/zeus-service-user.srv.zeus.idl')
# use object for a first step ... # use object for a first step ...
zeus_macro.parse_object_idl(my_module, 'appl/zeus-service-clientProperty.struct.zeus.idl') zeus_macro.parse_object_idl(my_module, 'appl/zeus-clientProperty.obj.zeus.idl')
#module_zeus = target.get_module('zeus') #module_zeus = target.get_module('zeus')
#module_zeus.parse_service_idl(my_module, 'appl/zeus-service-user.zeus.idl') #module_zeus.parse_service_idl(my_module, 'appl/zeus-service-user.zeus.idl')

View File

@ -7,21 +7,21 @@
#include <zeus/BaseProxy.hpp> #include <zeus/BaseProxy.hpp>
#include <zeus/debug.hpp> #include <zeus/debug.hpp>
const zeus::BaseProxy& zeus::BaseProxy::operator= (const zeus::ServiceRemote& _srv) { const zeus::BaseProxy& zeus::BaseProxy::operator= (const zeus::ServiceRemote& _obj) {
m_srv = _srv; m_obj = _obj;
return *this; return *this;
} }
zeus::BaseProxy::BaseProxy(): zeus::BaseProxy::BaseProxy():
sys(m_srv), sys(m_obj),
srv(m_srv) { srv(m_obj) {
} }
zeus::BaseProxy::BaseProxy(const zeus::ServiceRemote& _srv): zeus::BaseProxy::BaseProxy(const zeus::ServiceRemote& _obj):
m_srv(_srv), m_obj(_obj),
sys(m_srv), sys(m_obj),
srv(m_srv) { srv(m_obj) {
} }
bool zeus::BaseProxy::exist() const { bool zeus::BaseProxy::exist() const {
return m_srv.exist(); return m_obj.exist();
} }

View File

@ -15,7 +15,7 @@ namespace zeus {
*/ */
class BaseProxy { class BaseProxy {
protected: protected:
zeus::ServiceRemote m_srv; //!< Service instance handle zeus::ServiceRemote m_obj; //!< Service instance handle
public: public:
zeus::SystemProxy sys; zeus::SystemProxy sys;
zeus::ServiceProxy srv; zeus::ServiceProxy srv;

View File

@ -10,7 +10,7 @@
#include <zeus/BufferParameter.hpp> #include <zeus/BufferParameter.hpp>
namespace zeus { namespace zeus {
class WebServer;
class BufferAnswer : class BufferAnswer :
public BufferParameter { public BufferParameter {
friend class zeus::Buffer; friend class zeus::Buffer;
@ -43,8 +43,8 @@ namespace zeus {
* @param[in] _value Value to add * @param[in] _value Value to add
*/ */
template<class ZEUS_TYPE_DATA> template<class ZEUS_TYPE_DATA>
void addAnswer(const ZEUS_TYPE_DATA& _value) { void addAnswer(const ememory::SharedPtr<zeus::WebServer>& _iface, const ZEUS_TYPE_DATA& _value) {
addParameter(_value); addParameter(_iface, _value);
} }
/** /**
* @brief get the answer value * @brief get the answer value

View File

@ -7,9 +7,10 @@
#include <etk/types.hpp> #include <etk/types.hpp>
#include <enet/WebSocket.hpp> #include <enet/WebSocket.hpp>
#include <zeus/ParamType.hpp> #include <zeus/ParamType.hpp>
#include <ememory/memory.hpp>
namespace zeus { namespace zeus {
class WebServer;
class BufferParameter: class BufferParameter:
public Buffer { public Buffer {
protected: protected:
@ -68,11 +69,11 @@ namespace zeus {
* @param[in] _value Value to add in parameter * @param[in] _value Value to add in parameter
*/ */
template<class ZEUS_TYPE_DATA> template<class ZEUS_TYPE_DATA>
void addParameter(uint16_t _paramId, const ZEUS_TYPE_DATA& _value); void addParameter(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const ZEUS_TYPE_DATA& _value);
public: public:
template<class ZEUS_TYPE_DATA> template<class ZEUS_TYPE_DATA>
void addParameter(const ZEUS_TYPE_DATA& _value) { void addParameter(const ememory::SharedPtr<zeus::WebServer>& _iface, const ZEUS_TYPE_DATA& _value) {
addParameter(m_parameter.size(), _value); addParameter(_iface, m_parameter.size(), _value);
} }
void parameterAppendBufferData(ememory::SharedPtr<zeus::BufferData> _obj); void parameterAppendBufferData(ememory::SharedPtr<zeus::BufferData> _obj);
}; };

View File

@ -49,7 +49,7 @@ void zeus::BufferParameter::addParameterEmptyVector() {
} }
namespace zeus { namespace zeus {
template<> template<>
void BufferParameter::addParameter<std::string>(uint16_t _paramId, const std::string& _value) { void BufferParameter::addParameter<std::string>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::string& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::string>()); addType(data, createType<std::string>());
int32_t currentOffset = data.size(); int32_t currentOffset = data.size();
@ -58,7 +58,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<std::vector<std::string>>(uint16_t _paramId, const std::vector<std::string>& _value) { void BufferParameter::addParameter<std::vector<std::string>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<std::string>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<std::string>>()); addType(data, createType<std::vector<std::string>>());
// count all datas: // count all datas:
@ -81,7 +81,7 @@ namespace zeus {
} }
template<> template<>
void BufferParameter::addParameter<std::vector<bool>>(uint16_t _paramId, const std::vector<bool>& _value) { void BufferParameter::addParameter<std::vector<bool>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<bool>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<bool>>()); addType(data, createType<std::vector<bool>>());
// add size: // add size:
@ -100,7 +100,7 @@ namespace zeus {
} }
template<> template<>
void BufferParameter::addParameter<std::vector<int8_t>>(uint16_t _paramId, const std::vector<int8_t>& _value) { void BufferParameter::addParameter<std::vector<int8_t>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<int8_t>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<int8_t>>()); addType(data, createType<std::vector<int8_t>>());
// add size: // add size:
@ -110,7 +110,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<std::vector<int16_t>>(uint16_t _paramId, const std::vector<int16_t>& _value) { void BufferParameter::addParameter<std::vector<int16_t>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<int16_t>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<int16_t>>()); addType(data, createType<std::vector<int16_t>>());
// add size: // add size:
@ -120,7 +120,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<std::vector<int32_t>>(uint16_t _paramId, const std::vector<int32_t>& _value) { void BufferParameter::addParameter<std::vector<int32_t>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<int32_t>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<int32_t>>()); addType(data, createType<std::vector<int32_t>>());
// add size: // add size:
@ -130,7 +130,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<std::vector<int64_t>>(uint16_t _paramId, const std::vector<int64_t>& _value) { void BufferParameter::addParameter<std::vector<int64_t>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<int64_t>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<int64_t>>()); addType(data, createType<std::vector<int64_t>>());
// add size: // add size:
@ -140,7 +140,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<std::vector<uint8_t>>(uint16_t _paramId, const std::vector<uint8_t>& _value) { void BufferParameter::addParameter<std::vector<uint8_t>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<uint8_t>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<uint8_t>>()); addType(data, createType<std::vector<uint8_t>>());
// add size: // add size:
@ -150,7 +150,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<std::vector<uint16_t>>(uint16_t _paramId, const std::vector<uint16_t>& _value) { void BufferParameter::addParameter<std::vector<uint16_t>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<uint16_t>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<uint16_t>>()); addType(data, createType<std::vector<uint16_t>>());
// add size: // add size:
@ -160,7 +160,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<std::vector<uint32_t>>(uint16_t _paramId, const std::vector<uint32_t>& _value) { void BufferParameter::addParameter<std::vector<uint32_t>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<uint32_t>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<uint32_t>>()); addType(data, createType<std::vector<uint32_t>>());
// add size: // add size:
@ -170,7 +170,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<std::vector<uint64_t>>(uint16_t _paramId, const std::vector<uint64_t>& _value) { void BufferParameter::addParameter<std::vector<uint64_t>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<uint64_t>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<uint64_t>>()); addType(data, createType<std::vector<uint64_t>>());
// add size: // add size:
@ -181,7 +181,7 @@ namespace zeus {
} }
template<> template<>
void BufferParameter::addParameter<std::vector<float>>(uint16_t _paramId, const std::vector<float>& _value) { void BufferParameter::addParameter<std::vector<float>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<float>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<float>>()); addType(data, createType<std::vector<float>>());
// add size: // add size:
@ -192,7 +192,7 @@ namespace zeus {
} }
template<> template<>
void BufferParameter::addParameter<std::vector<double>>(uint16_t _paramId, const std::vector<double>& _value) { void BufferParameter::addParameter<std::vector<double>>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const std::vector<double>& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<std::vector<double>>()); addType(data, createType<std::vector<double>>());
// add size: // add size:
@ -203,21 +203,21 @@ namespace zeus {
} }
template<> template<>
void BufferParameter::addParameter<int8_t>(uint16_t _paramId, const int8_t& _value) { void BufferParameter::addParameter<int8_t>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const int8_t& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<int8_t>()); addType(data, createType<int8_t>());
data.push_back(uint8_t(_value)); data.push_back(uint8_t(_value));
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<uint8_t>(uint16_t _paramId, const uint8_t& _value) { void BufferParameter::addParameter<uint8_t>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const uint8_t& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<uint8_t>()); addType(data, createType<uint8_t>());
data.push_back(_value); data.push_back(_value);
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<int16_t>(uint16_t _paramId, const int16_t& _value) { void BufferParameter::addParameter<int16_t>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const int16_t& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<int16_t>()); addType(data, createType<int16_t>());
int32_t currentOffset = data.size(); int32_t currentOffset = data.size();
@ -226,7 +226,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<uint16_t>(uint16_t _paramId, const uint16_t& _value) { void BufferParameter::addParameter<uint16_t>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const uint16_t& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<uint16_t>()); addType(data, createType<uint16_t>());
int32_t currentOffset = data.size(); int32_t currentOffset = data.size();
@ -235,7 +235,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<int32_t>(uint16_t _paramId, const int32_t& _value) { void BufferParameter::addParameter<int32_t>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const int32_t& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<int32_t>()); addType(data, createType<int32_t>());
int32_t currentOffset = data.size(); int32_t currentOffset = data.size();
@ -244,7 +244,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<uint32_t>(uint16_t _paramId, const uint32_t& _value) { void BufferParameter::addParameter<uint32_t>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const uint32_t& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<uint32_t>()); addType(data, createType<uint32_t>());
int32_t currentOffset = data.size(); int32_t currentOffset = data.size();
@ -253,7 +253,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<int64_t>(uint16_t _paramId, const int64_t& _value) { void BufferParameter::addParameter<int64_t>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const int64_t& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<int64_t>()); addType(data, createType<int64_t>());
int32_t currentOffset = data.size(); int32_t currentOffset = data.size();
@ -262,7 +262,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<uint64_t>(uint16_t _paramId, const uint64_t& _value) { void BufferParameter::addParameter<uint64_t>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const uint64_t& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<uint64_t>()); addType(data, createType<uint64_t>());
int32_t currentOffset = data.size(); int32_t currentOffset = data.size();
@ -273,12 +273,12 @@ namespace zeus {
#if defined(__TARGET_OS__MacOs) \ #if defined(__TARGET_OS__MacOs) \
|| defined(__TARGET_OS__IOs) || defined(__TARGET_OS__IOs)
template<> template<>
void BufferParameter::addParameter<size_t>(uint16_t _paramId, const size_t& _value) { void BufferParameter::addParameter<size_t>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const size_t& _value) {
addParameter(_paramId, uint64_t(_value)); addParameter(_paramId, uint64_t(_value));
} }
#endif #endif
template<> template<>
void BufferParameter::addParameter<float>(uint16_t _paramId, const float& _value) { void BufferParameter::addParameter<float>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const float& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<float>()); addType(data, createType<float>());
int32_t currentOffset = data.size(); int32_t currentOffset = data.size();
@ -287,7 +287,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<double>(uint16_t _paramId, const double& _value) { void BufferParameter::addParameter<double>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const double& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<double>()); addType(data, createType<double>());
int32_t currentOffset = data.size(); int32_t currentOffset = data.size();
@ -296,7 +296,7 @@ namespace zeus {
m_parameter.push_back(std::make_pair(2,data)); m_parameter.push_back(std::make_pair(2,data));
} }
template<> template<>
void BufferParameter::addParameter<bool>(uint16_t _paramId, const bool& _value) { void BufferParameter::addParameter<bool>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const bool& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<bool>()); addType(data, createType<bool>());
if (_value == true) { if (_value == true) {
@ -351,7 +351,7 @@ namespace zeus {
} }
}; };
template<> template<>
void BufferParameter::addParameter<zeus::File>(uint16_t _paramId, const zeus::File& _value) { void BufferParameter::addParameter<zeus::File>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const zeus::File& _value) {
std::vector<uint8_t> data; std::vector<uint8_t> data;
addType(data, createType<zeus::File>()); addType(data, createType<zeus::File>());
// set mine type in string: // set mine type in string:
@ -427,7 +427,7 @@ namespace zeus {
}; };
template<> template<>
void BufferParameter::addParameter<zeus::FileServer>(uint16_t _paramId, const zeus::FileServer& _value) { void BufferParameter::addParameter<zeus::FileServer>(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _paramId, const zeus::FileServer& _value) {
etk::FSNode node(_value.getFileName()); etk::FSNode node(_value.getFileName());
node.fileOpenRead(); node.fileOpenRead();
std::string extention = std::string(_value.getFileName().begin()+_value.getFileName().size() -3, _value.getFileName().end()); std::string extention = std::string(_value.getFileName().begin()+_value.getFileName().size() -3, _value.getFileName().end());
@ -440,7 +440,7 @@ namespace zeus {
node.fileRead(&fileData[0], 1, size); node.fileRead(&fileData[0], 1, size);
} }
zeus::File tmpFile(zeus::getMineType(extention), fileData, size); zeus::File tmpFile(zeus::getMineType(extention), fileData, size);
addParameter(_paramId, tmpFile); addParameter(_iface, _paramId, tmpFile);
node.fileClose(); node.fileClose();
if (size >= ZEUS_MINIMUM_SIZE_MULTIPLE) { if (size >= ZEUS_MINIMUM_SIZE_MULTIPLE) {
m_multipleSend.push_back(zeus::SendFile(_value.getFileName(), _paramId, size)); m_multipleSend.push_back(zeus::SendFile(_value.getFileName(), _paramId, size));

View File

@ -13,9 +13,9 @@
zeus::Object::Object(zeus::Client* _client, uint16_t _objectId) : zeus::Object::Object(zeus::Client* _client, uint16_t _objectId) :
zeus::RemoteProcessCall(_client->getWebInterface(), _client->m_localAddress, _objectId),
m_clientId(_client->m_localAddress), m_clientId(_client->m_localAddress),
m_objectId(_objectId) { m_objectId(_objectId) {
m_interfaceClient = _client->getWebInterface();
/* /*
zeus::AbstractFunction* func = advertise("getExtention", &zeus::Object::getExtention); zeus::AbstractFunction* func = advertise("getExtention", &zeus::Object::getExtention);
if (func != nullptr) { if (func != nullptr) {
@ -25,6 +25,14 @@ zeus::Object::Object(zeus::Client* _client, uint16_t _objectId) :
*/ */
} }
zeus::Object::Object(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _objectId) :
zeus::RemoteProcessCall(_iface, _iface->getAdress(), _objectId),
m_clientId(_iface->getAdress()),
m_objectId(_objectId) {
}
zeus::Object::~Object() { zeus::Object::~Object() {
} }
@ -100,7 +108,7 @@ void zeus::Object::callBinary(ememory::SharedPtr<zeus::Buffer> _obj) {
} else if (callFunction == "_delete") { } else if (callFunction == "_delete") {
clientDisconnect(sourceId); clientDisconnect(sourceId);
} }
m_interfaceClient->answerValue(callObj->getTransactionId(), uint32_t(m_id)<<16, source, true); m_interfaceWeb->answerValue(callObj->getTransactionId(), uint32_t(m_id)<<16, source, true);
return; return;
} else */if (isFunctionAuthorized(sourceId, callFunction) == true) { } else */if (isFunctionAuthorized(sourceId, callFunction) == true) {
ZEUS_INFO("plop 6 ..."); ZEUS_INFO("plop 6 ...");
@ -108,7 +116,7 @@ void zeus::Object::callBinary(ememory::SharedPtr<zeus::Buffer> _obj) {
return; return;
} else { } else {
ZEUS_INFO("plop 7 ..."); ZEUS_INFO("plop 7 ...");
m_interfaceClient->answerError(callObj->getTransactionId(), (uint32_t(m_clientId)<<16) + m_objectId, source, "NOT-AUTHORIZED-FUNCTION", ""); m_interfaceWeb->answerError(callObj->getTransactionId(), (uint32_t(m_clientId)<<16) + m_objectId, source, "NOT-AUTHORIZED-FUNCTION", "");
return; return;
} }
} }

View File

@ -27,9 +27,8 @@ namespace zeus {
protected: protected:
std::mutex m_mutex; std::mutex m_mutex;
protected: protected:
ememory::SharedPtr<zeus::WebServer> m_interfaceClient; uint16_t m_clientId; // TODO : Remove it
uint16_t m_clientId; uint16_t m_objectId; // TODO : Remove it
uint16_t m_objectId;
std::vector<zeus::FutureBase> m_callMultiData; std::vector<zeus::FutureBase> m_callMultiData;
public: public:
uint16_t getObjectId() { return m_objectId; } uint16_t getObjectId() { return m_objectId; }
@ -39,6 +38,7 @@ namespace zeus {
* @return * @return
*/ */
Object(zeus::Client* _client, uint16_t _objectId); Object(zeus::Client* _client, uint16_t _objectId);
Object(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _objectId);
/** /**
* @brief * @brief
* @param[in] * @param[in]
@ -104,10 +104,17 @@ namespace zeus {
private: private:
ememory::SharedPtr<ZEUS_TYPE_OBJECT> m_interface; // direct handle on the data; ememory::SharedPtr<ZEUS_TYPE_OBJECT> m_interface; // direct handle on the data;
public: public:
/*
ObjectType(zeus::Client* _client, uint16_t _objectId, uint16_t _clientId) : ObjectType(zeus::Client* _client, uint16_t _objectId, uint16_t _clientId) :
Object(_client, _objectId) { Object(_client, _objectId) {
m_interface = ememory::makeShared<ZEUS_TYPE_OBJECT>(_clientId); m_interface = ememory::makeShared<ZEUS_TYPE_OBJECT>(_clientId);
} }
*/
ObjectType(zeus::Client* _client, uint16_t _objectId, const ememory::SharedPtr<ZEUS_TYPE_OBJECT>& _element) :
Object(_client, _objectId),
m_interface(_element) {
// nothing else to do ...
}
public: public:
/** /**
* @brief * @brief
@ -173,7 +180,8 @@ namespace zeus {
} }
switch (it2->getType()) { switch (it2->getType()) {
case zeus::AbstractFunction::type::object: { case zeus::AbstractFunction::type::object: {
it2->execute(m_interfaceClient, _obj, (void*)m_interface); ZEUS_TYPE_OBJECT* elem = m_interface.get();
it2->execute(m_interfaceClient, _obj, (void*)elem);
return; return;
} }
case zeus::AbstractFunction::type::local: { case zeus::AbstractFunction::type::local: {

View File

@ -5,8 +5,9 @@
*/ */
#include <zeus/RemoteProcessCall.hpp> #include <zeus/RemoteProcessCall.hpp>
zeus::RemoteProcessCall::RemoteProcessCall() : zeus::RemoteProcessCall::RemoteProcessCall(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _id, uint16_t _objectId) :
m_type("UNKNOW"){ zeus::WebObj(_iface, _id, _objectId),
m_type("UNKNOW") {
zeus::AbstractFunction* func = advertise("getDescription", &zeus::RemoteProcessCall::getDescription); zeus::AbstractFunction* func = advertise("getDescription", &zeus::RemoteProcessCall::getDescription);
if (func != nullptr) { if (func != nullptr) {
func->setDescription("Get description"); func->setDescription("Get description");

View File

@ -9,17 +9,18 @@
#include <zeus/AbstractFunctionTypeDirect.hpp> #include <zeus/AbstractFunctionTypeDirect.hpp>
#include <zeus/AbstractFunctionTypeClass.hpp> #include <zeus/AbstractFunctionTypeClass.hpp>
#include <zeus/debug.hpp> #include <zeus/debug.hpp>
#include <zeus/WebObj.hpp>
namespace zeus { namespace zeus {
/** /**
* @brief Local declaration of call local data * @brief Local declaration of call local data
*/ */
class RemoteProcessCall { class RemoteProcessCall : public zeus::WebObj {
public: public:
/** /**
* @brief Basic constructor * @brief Basic constructor
*/ */
RemoteProcessCall(); RemoteProcessCall(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _id, uint16_t _objectId);
protected: protected:
std::vector<zeus::AbstractFunction*> m_listFunction; //!< List of all functions callable std::vector<zeus::AbstractFunction*> m_listFunction; //!< List of all functions callable
protected: protected:

View File

@ -23,14 +23,14 @@ namespace zeus {
* @param[in] * @param[in]
* @return * @return
*/ */
class ClientProperty { class ClientPropertyddd {
public: public:
/** /**
* @brief * @brief
* @param[in] * @param[in]
* @return * @return
*/ */
ClientProperty(const std::string& _clientName="", const std::vector<std::string>& _groups = std::vector<std::string>()) : ClientPropertyddd(const std::string& _clientName="", const std::vector<std::string>& _groups = std::vector<std::string>()) :
m_name(_clientName), m_name(_clientName),
m_groups(_groups) { m_groups(_groups) {
@ -103,7 +103,7 @@ namespace zeus {
using factory = std::function<ememory::SharedPtr<ZEUS_TYPE_SERVICE>(uint16_t)>; using factory = std::function<ememory::SharedPtr<ZEUS_TYPE_SERVICE>(uint16_t)>;
private: private:
// no need of shared_ptr or unique_ptr (if service die all is lost and is client die, the gateway notify us...) // no need of shared_ptr or unique_ptr (if service die all is lost and is client die, the gateway notify us...)
ememory::SharedPtr<ClientProperty> m_property; ememory::SharedPtr<ClientPropertyddd> m_property;
ememory::SharedPtr<ZEUS_TYPE_SERVICE> m_interface; ememory::SharedPtr<ZEUS_TYPE_SERVICE> m_interface;
public: public:
ServiceType(zeus::Client* _client, uint16_t _objectId, uint16_t _clientId, factory _factory) : ServiceType(zeus::Client* _client, uint16_t _objectId, uint16_t _clientId, factory _factory) :
@ -177,7 +177,7 @@ namespace zeus {
ZEUS_DEBUG("connect: " << _sourceId << " to '" << _userName << "'"); ZEUS_DEBUG("connect: " << _sourceId << " to '" << _userName << "'");
ZEUS_DEBUG(" client name='" << _clientName << "'"); ZEUS_DEBUG(" client name='" << _clientName << "'");
ZEUS_DEBUG(" groups=" << etk::to_string(_groups)); ZEUS_DEBUG(" groups=" << etk::to_string(_groups));
ememory::SharedPtr<ClientProperty> tmpProperty = ememory::makeShared<ClientProperty>(_clientName, _groups); ememory::SharedPtr<ClientPropertyddd> tmpProperty = ememory::makeShared<ClientPropertyddd>(_clientName, _groups);
ememory::SharedPtr<ZEUS_TYPE_SERVICE> tmpSrv; ememory::SharedPtr<ZEUS_TYPE_SERVICE> tmpSrv;
if (m_factory != nullptr) { if (m_factory != nullptr) {
tmpSrv = m_factory(tmpProperty, m_nameUser); tmpSrv = m_factory(tmpProperty, m_nameUser);

View File

@ -10,17 +10,15 @@
zeus::ServiceRemoteBase::ServiceRemoteBase(ememory::SharedPtr<zeus::WebServer> _clientLink, const std::string& _name, uint16_t _localId, uint16_t _localObjectId): zeus::ServiceRemoteBase::ServiceRemoteBase(ememory::SharedPtr<zeus::WebServer> _clientLink, const std::string& _name, uint16_t _localId, uint16_t _localObjectId):
m_interfaceClient(_clientLink), zeus::WebObj(_clientLink, _localId, _localObjectId),
m_name(_name), m_name(_name),
m_localId(_localId),
m_localObjectId(_localObjectId),
m_serviceId(0), m_serviceId(0),
m_isLinked(false) { m_isLinked(false) {
if (m_interfaceClient == nullptr) { if (m_interfaceWeb == nullptr) {
return; return;
} }
// little hack : Call the service manager with the service ID=0 ... // little hack : Call the service manager with the service ID=0 ...
zeus::Future<uint32_t> ret = m_interfaceClient->call((uint32_t(m_localId)<<16)+m_localObjectId, ZEUS_GATEWAY_ADDRESS, "link", _name); zeus::Future<uint32_t> ret = m_interfaceWeb->call(getFullId(), ZEUS_GATEWAY_ADDRESS, "link", _name);
ret.wait(); ret.wait();
if (ret.hasError() == true) { if (ret.hasError() == true) {
ZEUS_WARNING("Can not link with the service named: '" << _name << "' ==> link error"); ZEUS_WARNING("Can not link with the service named: '" << _name << "' ==> link error");
@ -35,7 +33,7 @@ zeus::ServiceRemoteBase::~ServiceRemoteBase() {
uint32_t tmpLocalService = m_serviceId; uint32_t tmpLocalService = m_serviceId;
// little hack : Call the service manager with the service ID=0 ... // little hack : Call the service manager with the service ID=0 ...
m_serviceId = 0; m_serviceId = 0;
zeus::Future<bool> ret = m_interfaceClient->call((uint32_t(m_localId)<<16)+m_localObjectId, m_serviceId, "unlink", tmpLocalService); zeus::Future<bool> ret = m_interfaceWeb->call(getFullId(), m_serviceId, "unlink", tmpLocalService);
ret.wait(); ret.wait();
if (ret.hasError() == true) { if (ret.hasError() == true) {
ZEUS_WARNING("Can not unlink with the service id: '" << tmpLocalService << "' ==> link error"); ZEUS_WARNING("Can not unlink with the service id: '" << tmpLocalService << "' ==> link error");

View File

@ -11,6 +11,7 @@
#include <zeus/ServiceRemote.hpp> #include <zeus/ServiceRemote.hpp>
#include <zeus/Future.hpp> #include <zeus/Future.hpp>
#include <zeus/WebServer.hpp> #include <zeus/WebServer.hpp>
#include <zeus/WebObj.hpp>
namespace zeus { namespace zeus {
class Client; class Client;
@ -20,13 +21,10 @@ namespace zeus {
* @param[in] * @param[in]
* @return * @return
*/ */
class ServiceRemoteBase { class ServiceRemoteBase : public zeus::WebObj {
friend class ServiceRemote; friend class ServiceRemote;
private: private:
ememory::SharedPtr<zeus::WebServer> m_interfaceClient;
std::string m_name; std::string m_name;
uint16_t m_localId;
uint16_t m_localObjectId;
uint32_t m_serviceId; uint32_t m_serviceId;
bool m_isLinked; bool m_isLinked;
public: public:
@ -35,7 +33,10 @@ namespace zeus {
* @param[in] * @param[in]
* @return * @return
*/ */
ServiceRemoteBase() = default; ServiceRemoteBase():
zeus::WebObj(nullptr, 0, 0) {
}
/** /**
* @brief * @brief
* @param[in] * @param[in]
@ -97,17 +98,17 @@ namespace zeus {
template<class... _ARGS> template<class... _ARGS>
zeus::FutureBase call(const std::string& _functionName, _ARGS&&... _args) { zeus::FutureBase call(const std::string& _functionName, _ARGS&&... _args) {
if ( m_interface == nullptr if ( m_interface == nullptr
|| m_interface->m_interfaceClient == nullptr) { || m_interface->m_interfaceWeb == nullptr) {
ememory::SharedPtr<zeus::BufferAnswer> ret = zeus::BufferAnswer::create(); ememory::SharedPtr<zeus::BufferAnswer> ret = zeus::BufferAnswer::create();
if (ret != nullptr) { if (ret != nullptr) {
ret->addError("NULLPTR", "call " + _functionName + " with no interface open"); ret->addError("NULLPTR", "call " + _functionName + " with no interface open");
} }
return zeus::FutureBase(0, ret); return zeus::FutureBase(0, ret);
} }
return m_interface->m_interfaceClient->call((uint32_t(m_interface->m_localId)<<16)+m_interface->m_localObjectId, return m_interface->m_interfaceWeb->call(m_interface->getFullId(),
m_interface->m_serviceId, m_interface->m_serviceId,
_functionName, _functionName,
_args...); _args...);
} }
}; };

32
zeus/WebObj.hpp Normal file
View File

@ -0,0 +1,32 @@
/** @file
* @author Edouard DUPIN
* @copyright 2016, Edouard DUPIN, all right reserved
* @license APACHE v2.0 (see license file)
*/
#pragma once
//#include <zeus/WebServer.hpp>
#include <etk/types.hpp>
#include <ememory/memory.hpp>
namespace zeus {
class WebServer;
class WebObj : public ememory::EnableSharedFromThis<zeus::WebObj> {
protected:
ememory::SharedPtr<zeus::WebServer> m_interfaceWeb;
uint16_t m_id;
uint16_t m_objectId;
public:
WebObj(const ememory::SharedPtr<zeus::WebServer>& _iface, uint16_t _id, uint16_t _objectId) :
m_interfaceWeb(_iface),
m_id(_id),
m_objectId(_objectId) {
}
uint32_t getFullId() {
return (uint32_t(m_id) << 16 ) + m_objectId;
}
};
}

View File

@ -23,7 +23,7 @@ ememory::SharedPtr<zeus::BufferCall> zeus::createBaseCall(uint64_t _transactionI
return obj; return obj;
} }
void zeus::createParam(int32_t _paramId, ememory::SharedPtr<zeus::BufferCall> _obj) { void zeus::createParam(const ememory::SharedPtr<zeus::WebServer>& _iface, int32_t _paramId, ememory::SharedPtr<zeus::BufferCall> _obj) {
// Finish recursive parse ... // Finish recursive parse ...
} }
@ -384,6 +384,7 @@ void zeus::WebServer::callForwardMultiple(uint16_t _srcObjectId,
} }
*/ */
/*
void zeus::WebServer::sendCtrl(uint32_t _source, uint32_t _destination, const std::string& _ctrlValue) { void zeus::WebServer::sendCtrl(uint32_t _source, uint32_t _destination, const std::string& _ctrlValue) {
auto ctrl = zeus::BufferCtrl::create(); auto ctrl = zeus::BufferCtrl::create();
if (ctrl == nullptr) { if (ctrl == nullptr) {
@ -395,6 +396,7 @@ void zeus::WebServer::sendCtrl(uint32_t _source, uint32_t _destination, const st
ctrl->setCtrl(_ctrlValue); ctrl->setCtrl(_ctrlValue);
writeBinary(ctrl); writeBinary(ctrl);
} }
*/
void zeus::WebServer::answerError(uint32_t _clientTransactionId, uint32_t _source, uint32_t _destination, const std::string& _errorValue, const std::string& _errorHelp) { void zeus::WebServer::answerError(uint32_t _clientTransactionId, uint32_t _source, uint32_t _destination, const std::string& _errorValue, const std::string& _errorHelp) {
auto answer = zeus::BufferAnswer::create(); auto answer = zeus::BufferAnswer::create();

View File

@ -11,6 +11,7 @@
#include <ememory/memory.hpp> #include <ememory/memory.hpp>
#include <zeus/AbstractFunction.hpp> #include <zeus/AbstractFunction.hpp>
#include <zeus/FutureBase.hpp> #include <zeus/FutureBase.hpp>
#include <zeus/WebObj.hpp>
//#define ZEUS_NO_ID_CLIENT (0xFFFFFFFF) //#define ZEUS_NO_ID_CLIENT (0xFFFFFFFF)
#define ZEUS_NO_ID_CLIENT (0x00000000) #define ZEUS_NO_ID_CLIENT (0x00000000)
@ -22,6 +23,7 @@
namespace zeus { namespace zeus {
class WebServer;
/** /**
* @brief * @brief
* @param[in] * @param[in]
@ -33,7 +35,8 @@ namespace zeus {
* @param[in] * @param[in]
* @return * @return
*/ */
void createParam(int32_t _paramId, void createParam(const ememory::SharedPtr<zeus::WebServer>& _iface,
int32_t _paramId,
ememory::SharedPtr<zeus::BufferCall> _obj); ememory::SharedPtr<zeus::BufferCall> _obj);
/** /**
@ -42,13 +45,14 @@ namespace zeus {
* @return * @return
*/ */
template<class ZEUS_TYPE, class... _ARGS> template<class ZEUS_TYPE, class... _ARGS>
void createParam(int32_t _paramId, void createParam(const ememory::SharedPtr<zeus::WebServer>& _iface,
int32_t _paramId,
ememory::SharedPtr<zeus::BufferCall> _obj, ememory::SharedPtr<zeus::BufferCall> _obj,
const ZEUS_TYPE& _param, const ZEUS_TYPE& _param,
_ARGS&&... _args) { _ARGS&&... _args) {
_obj->addParameter<ZEUS_TYPE>(_param); _obj->addParameter<ZEUS_TYPE>(_iface, _param);
_paramId++; _paramId++;
createParam(_paramId, _obj, std::forward<_ARGS>(_args)...); createParam(_iface, _paramId, _obj, std::forward<_ARGS>(_args)...);
} }
/** /**
* @brief * @brief
@ -57,11 +61,12 @@ namespace zeus {
*/ */
// convert const char in std::string ... // convert const char in std::string ...
template<class... _ARGS> template<class... _ARGS>
void createParam(int32_t _paramId, void createParam(const ememory::SharedPtr<zeus::WebServer>& _iface,
int32_t _paramId,
ememory::SharedPtr<zeus::BufferCall> _obj, ememory::SharedPtr<zeus::BufferCall> _obj,
const char* _param, const char* _param,
_ARGS&&... _args) { _ARGS&&... _args) {
createParam(_paramId, _obj, std::string(_param), std::forward<_ARGS>(_args)...); createParam(_iface, _paramId, _obj, std::string(_param), std::forward<_ARGS>(_args)...);
} }
/** /**
* @brief * @brief
@ -69,19 +74,21 @@ namespace zeus {
* @return * @return
*/ */
template<class... _ARGS> template<class... _ARGS>
ememory::SharedPtr<zeus::BufferCall> createCall(uint64_t _transactionId, const uint32_t& _source, const uint32_t& _destination, const std::string& _functionName, _ARGS&&... _args) { ememory::SharedPtr<zeus::BufferCall> createCall(const ememory::SharedPtr<zeus::WebServer>& _iface, uint64_t _transactionId, const uint32_t& _source, const uint32_t& _destination, const std::string& _functionName, _ARGS&&... _args) {
ememory::SharedPtr<zeus::BufferCall> callElem = createBaseCall(_transactionId, _source, _destination, _functionName); ememory::SharedPtr<zeus::BufferCall> callElem = createBaseCall(_transactionId, _source, _destination, _functionName);
if (callElem == nullptr) { if (callElem == nullptr) {
return nullptr; return nullptr;
} }
createParam(0, callElem, std::forward<_ARGS>(_args)...); createParam(_iface, 0, callElem, std::forward<_ARGS>(_args)...);
return callElem; return callElem;
} }
/** /**
* @brief * @brief
*/ */
class WebServer { class WebServer : public ememory::EnableSharedFromThis<zeus::WebServer> {
public:
std::vector<ememory::SharedPtr<zeus::WebObj>> m_actifObject; //!< List of all active object created and that remove is in progress ...
private: private:
enet::WebSocket m_connection; enet::WebSocket m_connection;
uint32_t m_interfaceId; uint32_t m_interfaceId;
@ -260,7 +267,7 @@ namespace zeus {
template<class... _ARGS> template<class... _ARGS>
zeus::FutureBase call(const uint32_t& _source, const uint32_t& _destination, const std::string& _functionName, _ARGS&&... _args) { zeus::FutureBase call(const uint32_t& _source, const uint32_t& _destination, const std::string& _functionName, _ARGS&&... _args) {
uint16_t id = getId(); uint16_t id = getId();
ememory::SharedPtr<zeus::BufferCall> callElem = zeus::createCall(id, _source, _destination, _functionName, std::forward<_ARGS>(_args)...); ememory::SharedPtr<zeus::BufferCall> callElem = zeus::createCall(sharedFromThis(), id, _source, _destination, _functionName, std::forward<_ARGS>(_args)...);
return callBinary(id, callElem); return callBinary(id, callElem);
} }
public: public:
@ -302,7 +309,7 @@ namespace zeus {
answer->setTransactionId(_clientTransactionId); answer->setTransactionId(_clientTransactionId);
answer->setSource(_source); answer->setSource(_source);
answer->setDestination(_destination); answer->setDestination(_destination);
answer->addAnswer(_value); answer->addAnswer(sharedFromThis(), _value);
writeBinary(answer); writeBinary(answer);
} }
/** /**
@ -326,7 +333,7 @@ namespace zeus {
* @param[in] _ctrlValue Control to send * @param[in] _ctrlValue Control to send
* @return * @return
*/ */
void sendCtrl(uint32_t _source, uint32_t _destination, const std::string& _ctrlValue); //void sendCtrl(uint32_t _source, uint32_t _destination, const std::string& _ctrlValue);
}; };
} }