def __jni_get_jobject_by_core_object_implementation(self, config): impl = 'jobject JniHelper::GetJ{0}ByCore{0}(const {0}& {1}) {{\n'.format( self.__class_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name)) impl += indent(2) + 'JNIEnv* env = GetJniEnv();\n' impl += indent(2) + 'if (!env) {\n' impl += indent(4) + 'sakura::log_error("Failed to get JNIEnv");\n' impl += indent(4) + 'return nullptr;\n' impl += indent(2) + '}\n\n' impl += indent(2) + 'jclass {0}Jclass = JniReferenceCache::SharedCache()->{1}_jclass();\n'.format( string_utils.first_char_to_lower(self.__class_name), string_utils.cpp_class_name_to_cpp_file_name(self.__class_name)) impl += indent(2) + 'jmethodID {0}ConstructorMethodID = env->GetMethodID({0}Jclass, "<init>", "('.format( string_utils.first_char_to_lower(self.__class_name)) for jni_var in self.__jni_var_list: impl += jni_var.var_type.to_jni_signature() impl += ')V");\n\n' for jni_var in self.__jni_var_list: impl += indent(2) + jni_var.jni_var_assignment_by_cpp_variable(config) + '\n' impl += '\n' constructor_fst_line = indent(2) + 'jobject j{0}Object = env->NewObject('.format(self.__class_name) num_constructor_indent = len(constructor_fst_line) impl += constructor_fst_line parameters = [] jclass_instance_name = '{0}Jclass'.format(string_utils.first_char_to_lower(self.__class_name)) constructor_method_id = '{0}ConstructorMethodID'.format(string_utils.first_char_to_lower(self.__class_name)) parameters.append(constructor_method_id) for jni_var in self.__jni_var_list: parameters.append('j{0}'.format(string_utils.to_title_style_name(jni_var.name))) impl += jclass_instance_name + ',\n' for parameter in parameters: impl += indent(num_constructor_indent) + parameter + ',\n' impl = impl[:-2] impl += ');' impl += '\n' for jni_var in self.__jni_var_list: delete_method = jni_var.jni_delete_local_ref() if delete_method != '': impl += indent(2) + delete_method + '\n' impl += '\n' impl += indent(2) + 'return j{0}Object;'.format(self.__class_name) impl += '\n' impl += '}\n' impl += '\n' return impl
def __jni_variable_from_cpp_class(self, config): instance_name = string_utils.cpp_class_name_to_cpp_file_name(self.__class_name) if self.__var_type == VarType.cpp_bool: return 'static_cast<jboolean>({0}.is_{1}())'.format(instance_name, self.__name) elif self.__var_type == VarType.cpp_enum: return 'static_cast<jint>({0}.{1}())'.format(instance_name, self.__name) elif self.__var_type == VarType.cpp_int: return 'static_cast<jint>({0}.{1}())'.format(instance_name, self.__name) elif self.__var_type == VarType.cpp_string: return 'env->NewStringUTF({0}.{1}().c_str())'.format(instance_name, self.__name) elif self.__var_type == VarType.cpp_string_array: return '{2}::JniHelper::JobjectArrayFromStringVector({0}.{1}())'.format(instance_name, self.__name, config.cpp_namespace) elif self.__var_type == VarType.cpp_time: return 'static_cast<jlong>({0}.{1}()) * 1000'.format(instance_name, self.__name) elif self.__var_type == VarType.cpp_object: skr_logger.skr_log_warning('JniVariable.__jni_variable_from_cpp_class() : C++ object is not supported') return '' elif self.__var_type == VarType.cpp_object_array: skr_logger.skr_log_warning( 'JniVariable.__jni_variable_from_cpp_class() : C++ object array is not supported') return '' else: skr_logger.skr_log_warning('JniVariable.__jni_variable_from_cpp_class() : Not supported type')
def generate_core_addition_header(self, config): """Generates Objective-C++ private header file. (eg: LCCTopic_CoreAddition.h) Args: config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used. """ file_name = '{1}{0}_CoreAddition.h'.format(self.class_name, config.objc_prefix) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#include "{0}.h"'.format(cpp_class_name_to_cpp_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write('@interface {1}{0} () {{'.format(self.class_name, config.objc_prefix)) output_header.write('\n') output_header.write(' @package') output_header.write('\n') output_header.write(_OBJC_SPACE) output_header.write('std::unique_ptr<{1}::{0}> _coreHandle;'.format(self.class_name, config.cpp_namespace)) output_header.write('\n') output_header.write('}') output_header.write(_OBJC_BR) output_header.write('+ (instancetype){0}WithCore{1}:(const {2}::{1}&)core{1};' .format(string_utils.first_char_to_lower(self.class_name), self.class_name, config.cpp_namespace)) output_header.write(_OBJC_BR) output_header.write('@end')
def generate_implementation(self): """Gets JNI implementation which is used before 4.0. Returns: A string which is JNI object implementation. """ file_name = 'com_lesschat_core_{0}_{1}.cc'.format(self.__group_name, self.__class_name) file_path = 'build/jni/' + file_name output_header = open(file_path, 'w') style_class_name = string_utils.cpp_class_name_to_cpp_file_name(self.__class_name) header_name = 'com_lesschat_core_{0}_{1}.h'.format(self.__group_name, self.__class_name) cpp_name = '{0}/{1}.h'.format(self.__group_name, style_class_name) output_header.write('#include "{0}"'.format(header_name) + '\n') output_header.write('#include "{0}"'.format(cpp_name) + '\n') output_header.write('#include "utils/android/jni_helper.h"') output_header.write(_JNI_BR) output_header.write(self.__def_cpp + _JNI_BR) # release method output_header.write(self.__release_impl()) output_header.write(_JNI_BR) for jni_var in self.__jni_var_list: output_header.write(jni_var.getter_impl()) output_header.write(_JNI_BR) output_header.write(self.__end_def_cpp)
def __jni_get_jobjects_array_by_core_objects_implementation(self): object_name = string_utils.cpp_class_name_to_cpp_file_name(self.__class_name) impl = 'jobjectArray JniHelper::GetJ{0}sArrayByCore{0}s(const std::vector<std::unique_ptr<{0}>>& {1}s) {{'.format( self.__class_name, object_name) impl += '\n' impl += indent(2) + 'jclass {0}Jclass = JniReferenceCache::SharedCache()->{1}_jclass();\n'.format( string_utils.first_char_to_lower(self.__class_name), object_name) impl += indent(2) + 'JNIEnv* env = GetJniEnv();\n' impl += indent(2) + 'if (!env) {\n' impl += indent(4) + 'return env->NewObjectArray(0, {0}Jclass, NULL);\n'.format( string_utils.first_char_to_lower(self.__class_name)) impl += indent(2) + '}\n\n' impl += indent(2) + 'jobjectArray jobjs = env->NewObjectArray({0}s.size(), {1}Jclass, NULL);\n\n'.format( object_name, string_utils.first_char_to_lower(self.__class_name)) impl += indent(2) + 'jsize i = 0;\n' impl += indent(2) + 'for (auto it = {0}s.begin(); it != {0}s.end(); ++it) {{\n'.format(object_name) impl += indent(4) + 'jobject j{0} = GetJ{0}ByCore{0}(**it);\n'.format(self.__class_name) impl += indent(4) + 'env->SetObjectArrayElement(jobjs, i, j{0});\n'.format(self.__class_name) impl += indent(4) + 'env->DeleteLocalRef(j{0});\n'.format(self.__class_name) impl += indent(4) + '++i;\n' impl += indent(2) + '}\n' impl += indent(2) + 'return jobjs;\n' impl += '}' return impl
def generate_implementation(self): file_name = 'com_lesschat_core_{0}_{1}.cc'.format(self.group_name, self.class_name) file_path = 'jni/' + file_name output_header = open(file_path, 'w') style_class_name = string_utils.cpp_class_name_to_cpp_file_name(self.class_name) header_name = 'com_lesschat_core_{0}_{1}.h'.format(self.group_name, self.class_name) cpp_name = '{0}/{1}.h'.format(self.group_name, style_class_name) output_header.write('#include "{0}"'.format(header_name) + '\n') output_header.write('#include "{0}"'.format(cpp_name) + '\n') output_header.write('#include "utils/android/jni_helper.h"') output_header.write(_JNI_BR) output_header.write(self.def_cpp + _JNI_BR) # create method # output_header.write(self.create_impl()) # output_header.write(_JNI_BR) # release method output_header.write(self.release_impl()) output_header.write(_JNI_BR) for jni_var in self.jni_var_list: output_header.write(jni_var.getter_impl()) output_header.write(_JNI_BR) output_header.write(self.end_def_cpp)
def generate_manager_implementation(self): """Generates C++ Object Manager implementation. """ if self.__cpp_manager_or_none is None: return cpp_manager = self.__cpp_manager_or_none header_file_name = cpp_class_name_to_cpp_file_name(self.__class_name) + '_manager.h' file_path = io_utils.cpp_object_implementation_path(self.__group_name, cpp_manager.class_name()) output_cc = open(file_path, 'w') cpp_include = '#include "{0}"\n'.format(header_file_name) cpp_include += '#include "director/director.h"' cpp_using = 'using std::string;\nusing std::unique_ptr;\nusing std::vector;\n\nusing sakura::FileUtils;\n' cpp_public_mark = '////////////////////////////////////////////////////////////////////////////////\n// ' \ '{0}, public:'.format(cpp_manager.class_name()) cpp_private_mark = '////////////////////////////////////////////////////////////////////////////////\n// ' \ '{0}, private:'.format(cpp_manager.class_name()) cpp_sqlite_schema_split = '// SQLite schema --------------------------------------------------------\n' output_cc.write(cpp_include + _CPP_BR) output_cc.write(cpp_using + _CPP_BR) output_cc.write(self.__config.cpp_ns_begin + _CPP_BR) output_cc.write(cpp_sqlite_schema_split + '\n') output_cc.write(cpp_manager.sqlite_key_declaration() + '\n') output_cc.write(cpp_manager.easy_sqlite_field_declaration() + _CPP_BR) output_cc.write(cpp_public_mark + _CPP_BR) output_cc.write(_CPP_LIFECYCLE_SPLIT + _CPP_BR) output_cc.write(cpp_manager.generate_constructor_implementation() + _CPP_BR) output_cc.write(cpp_manager.generate_deconstructor_implementation() + _CPP_BR) output_cc.write(cpp_manager.generate_init_or_die_implementation() + _CPP_BR) output_cc.write(cpp_manager.generate_default_manager_implementation() + _CPP_BR) output_cc.write(_CPP_HTTP_SPLIT + _CPP_BR) output_cc.write(cpp_manager.generate_manager_http_implementation()) output_cc.write(_CPP_PERSISTENT_STORE_SPLIT + _CPP_BR) output_cc.write(cpp_manager.generate_save_implementations()) output_cc.write(cpp_manager.generate_fetch_implementations()) output_cc.write(cpp_manager.generate_delete_implementations()) output_cc.write(cpp_private_mark + _CPP_BR) output_cc.write(_CPP_UTILS_SPLIT + _CPP_BR) output_cc.write(cpp_manager.unsafe_save_implementation() + _CPP_BR) for table_name in cpp_manager.table_name_list: output_cc.write(cpp_manager.unsafe_save_implementation(table_name) + _CPP_BR) output_cc.write(cpp_manager.sqlite_record_by_object_implementation() + _CPP_BR) for table_name in cpp_manager.table_name_list: output_cc.write(cpp_manager.sqlite_record_by_object_implementation(table_name) + _CPP_BR) output_cc.write(cpp_manager.sqlite_object_from_record_implementation() + _CPP_BR) output_cc.write(self.__config.cpp_ns_end + _CPP_BR)
def generate_web_api_header(self): if self.cpp_manager_or_none is None: return cpp_manager = self.cpp_manager_or_none header_file_name = 'web_api_{0}.h'.format(string_utils.cpp_class_name_to_cpp_file_name(self.class_name)) file_path = 'build/core/api/{0}'.format(header_file_name) output_header = open(file_path, 'w') output_header.write(cpp_manager.generate_wep_api_declarations())
def generate_web_api_implementation(self): if self.cpp_manager_or_none is None: return cpp_manager = self.cpp_manager_or_none output_cc = 'web_api_{0}.cc'.format(string_utils.cpp_class_name_to_cpp_file_name(self.class_name)) file_path = 'build/core/api/{0}'.format(output_cc) output_cc = open(file_path, 'w') output_cc.write(cpp_manager.generate_web_api_implementation())
def generate_web_api_header(self): """Generates C++ WebApi header, user should copy all code into WebApi.h manually. """ if self.__cpp_manager_or_none is None: return cpp_manager = self.__cpp_manager_or_none header_file_name = 'web_api_{0}.h'.format(cpp_class_name_to_cpp_file_name(self.__class_name)) file_path = 'build/core/api/{0}'.format(header_file_name) output_header = open(file_path, 'w') output_header.write(cpp_manager.generate_wep_api_declarations())
def generate_manager_core_addition_header(self): file_name = 'LCC{0}Manager_CoreAddition.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#include "{0}_manager.h"\n#include "director.h"'.format(string_utils.cpp_class_name_to_cpp_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write('@interface LCC{0}Manager () {{\n@private\n'.format(self.class_name)) output_header.write(_OBJC_SPACE) output_header.write('const lesschat::{0}Manager *_coreManagerHandler;\n'.format(self.class_name)) output_header.write('}') output_header.write(_OBJC_BR) output_header.write('@end\n')
def generate_manager_core_addition_header(self, config): """Generates Objective-C++ object manager private header file. Args: config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used. """ file_name = '{1}{0}Manager_CoreAddition.h'.format(self.class_name, config.objc_prefix) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#include "{0}_manager.h"\n#include "director.h"'.format( string_utils.cpp_class_name_to_cpp_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write('@interface {1}{0}Manager () {{\n @private\n'.format(self.class_name, config.objc_prefix)) output_header.write(_OBJC_SPACE) output_header.write('const {1}::{0}Manager *_coreManagerHandler;\n'.format(self.class_name, config.cpp_namespace)) output_header.write('}') output_header.write(_OBJC_BR) output_header.write('@end\n')
def generate_core_addition_header(self): file_name = 'LCC{0}_CoreAddition.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#include "{0}.h"'.format(cpp_class_name_to_cpp_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write('@interface LCC{0} () {{'.format(self.class_name)) output_header.write('\n') output_header.write('@package') output_header.write('\n') output_header.write(_OBJC_SPACE) output_header.write('std::unique_ptr<lesschat::{0}> _coreHandle;'.format(self.class_name)) output_header.write('\n') output_header.write('}') output_header.write(_OBJC_BR) output_header.write('+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1};' .format(string_utils.first_char_to_lower(self.class_name), self.class_name)) output_header.write(_OBJC_BR) output_header.write('@end')
def generate_manager_implementation(self, version, config): """Gets JNI object manager implementation. Args: version: A float version number of <JniModelXmlParser>. config: A <Config> object describes user-defined names. Returns: A string which is JNI object manager implementation. """ if self.__jni_manager_or_none is None: return jni_manager = self.__jni_manager_or_none file_name = '{2}_{0}_{1}Manager.cc'.format(self.__group_name, self.__class_name, config.jni_package_path) file_path = 'build/jni/' + file_name output_header = open(file_path, 'w') header_name = '#include "{2}_{0}_{1}Manager.h"\n'.format(self.__group_name, self.__class_name, config.jni_package_path) cpp_name = '#include "{0}/{1}_manager.h"\n'\ .format(self.__group_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name)) output_header.write(header_name) output_header.write(cpp_name) output_header.write('#include "utils/android/jni_helper.h"') output_header.write(_JNI_BR) output_header.write(self.__def_cpp) output_header.write(_JNI_BR) output_header.write(jni_manager.generate_fetch_implementations(version, config)) output_header.write(jni_manager.generate_http_function_implementations(config)) output_header.write(self.__end_def_cpp + '\n')
def generate_manager_header(self): """Generates C++ Object Manager header. """ if self.__cpp_manager_or_none is None: return cpp_manager = self.__cpp_manager_or_none file_path = io_utils.cpp_object_header_path(self.__group_name, cpp_manager.class_name()) output_header = open(file_path, 'w') def_guard = '#ifndef {2}_{0}_{1}_H_\n#define {2}_{0}_{1}_H_'.format( self.__group_name.upper().replace('/', '_'), cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(), self.__config.cpp_module_name) end_def_guard = '#endif /* defined({2}_{0}_{1}_H_) */'.format( self.__group_name.upper().replace('/', '_'), cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(), self.__config.cpp_module_name) cpp_include = '#include <string>\n' \ '#include <memory>\n' \ '#include <vector>\n' \ '#include <functional>\n\n' \ '#include "easySQLite/easySQLite.h"\n\n' \ '#include "base/base.h"\n#include "director/object_manager.h"\n#include "api/web_api.h"\n\n' cpp_include += '#include "{0}/{1}.h"'.format( self.__group_name.replace('core/', ''), cpp_class_name_to_cpp_file_name(self.__class_name)) cpp_class_begin = 'class LCC_DLL {0} : public ObjectManager {{'.format( cpp_manager.class_name()) cpp_class_end = '};' cpp_constructor = 'explicit {0}(Director* director);'.format( cpp_manager.class_name()) cpp_deconstructor = 'virtual ~{0}();'.format(cpp_manager.class_name()) cpp_init_method = 'bool InitOrDie();' cpp_default_manager = 'static const {0}* DefaultManager();'.format( cpp_manager.class_name()) cpp_manager_save_methods = cpp_manager.generate_save_declarations( _CPP_SPACE) cpp_manager_fetch_methods = cpp_manager.generate_fetch_declarations( _CPP_SPACE) cpp_manager_delete_methods = cpp_manager.generate_delete_declarations( _CPP_SPACE) cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format( cpp_manager.class_name()) cpp_manager_http_methods = cpp_manager.generate_manager_http_declarations( _CPP_SPACE) output_header.write(def_guard + _CPP_BR) output_header.write(cpp_include + _CPP_BR) output_header.write(self.__config.cpp_ns_begin + _CPP_BR) output_header.write(cpp_class_begin + '\n') output_header.write(_CPP_PUBLIC + _CPP_BR) output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR) output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR) output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR) output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR) output_header.write(_CPP_SPACE + cpp_default_manager + _CPP_BR) output_header.write(_CPP_SPACE + _CPP_HTTP_SPLIT + _CPP_BR) output_header.write(cpp_manager_http_methods) output_header.write(_CPP_SPACE + _CPP_PERSISTENT_STORE_SPLIT + _CPP_BR) output_header.write(cpp_manager_save_methods) output_header.write(cpp_manager_fetch_methods) output_header.write(cpp_manager_delete_methods) output_header.write(_CPP_PRIVATE + '\n') output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var() + _CPP_BR) for table_name in cpp_manager.table_name_list: output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var(table_name) + _CPP_BR) output_header.write(_CPP_SPACE + _CPP_UTILS_SPLIT + _CPP_BR) output_header.write(_CPP_SPACE + cpp_manager.sqlite_record_by_object_declaration() + _CPP_BR) for table_name in cpp_manager.table_name_list: output_header.write( _CPP_SPACE + cpp_manager.sqlite_record_by_object_declaration(table_name) + _CPP_BR) output_header.write(cpp_manager.unsafe_save_declaration(_CPP_SPACE)) for table_name in cpp_manager.table_name_list: output_header.write( cpp_manager.unsafe_save_declaration(_CPP_SPACE, table_name)) output_header.write( _CPP_SPACE + cpp_manager.sqlite_object_from_record_declaration() + _CPP_BR) output_header.write('\n' + _CPP_SPACE + cpp_disallow_copy_and_assign + '\n') output_header.write(cpp_class_end + _CPP_BR) output_header.write(self.__config.cpp_ns_end + _CPP_BR) output_header.write(end_def_guard + _CPP_BR)
def __jni_get_jobject_by_core_object_declaration(self): return 'static jobject GetJ{0}ByCore{0}(const {0}& {1});'.format( self.__class_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
def __jni_get_jobjects_array_by_core_objects_declaration(self): return 'static jobjectArray GetJ{0}sArrayByCore{0}s(const std::vector<std::unique_ptr<{0}>>& {1}s);'.format( self.__class_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
def __cpp_cache_by_cache_description_name(self, cache_desc, name=''): cache_attr = cache_desc if cache_attr is None or cache_attr == '': # if no 'cache' return '' impl = '' caches = re.split(',', cache_attr) for cache in caches: if cache[0] == '#': # if define impl += string_utils.indent(6) + self.__find_replace_string_by_name(cache[1:]) + '\n' else: # if by command cpp_class = 'this->' method = '' # command_components[0]: save(s)/delete(s)/update(s) # command_components[1]: (id, project_id) - replace string command_components = re.split('\(', cache) sql_verb = command_components[0] parameters = '' num_parameters = 0 if len(command_components) == 2: parameters = command_components[1] parameters = parameters[:-1] num_parameters = len(re.split(',', parameters)) else: parameters = name num_parameters = 0 if sql_verb == 'saves': method = 'Save{0}ToCache({1});\n'.format(self.plural_object_name, name) elif sql_verb == 'save': method = 'Save{0}ToCache(*{1});\n'.format(self.object_name, name) elif sql_verb == 'deletes': if num_parameters == 0: method = 'Delete{0}FromCache();\n'.format(self.plural_object_name) elif num_parameters == 1: by = 'by_{0}'.format(parameters) by = string_utils.to_title_style_name(by) method = 'Delete{0}FromCache{2}({1});\n'.format(self.plural_object_name, parameters, by) else: method = 'Delete{0}FromCache({1});\n'.format(self.plural_object_name, parameters) elif sql_verb == 'delete': if num_parameters == 0: method = 'Delete{0}FromCache();\n'.format(self.object_name) elif num_parameters == 1: by = 'by_{0}'.format(parameters) by = string_utils.to_title_style_name(by) method = 'Delete{0}FromCache{2}({1});\n'.format(self.object_name, parameters, by) else: method = 'Delete{0}FromCache({1});\n'.format(self.object_name, parameters) elif sql_verb[:7] == 'fupdate': # generate implementation automatically components = re.split(':', sql_verb) fetch_by_id = components[1] impl = string_utils.indent(6) + 'unique_ptr<{0}> {1} = this->Fetch{0}FromCacheBy{2}({3});\n'\ .format(self.object_name, string_utils.cpp_class_name_to_cpp_file_name(self.object_name), string_utils.to_title_style_name(fetch_by_id), fetch_by_id) for parameter in re.split(',', parameters): impl += string_utils.indent(6) + '{0}->set_{1}({1});\n'.format(string_utils.cpp_class_name_to_cpp_file_name(self.object_name), parameter) impl += string_utils.indent(6) + 'this->Save{0}ToCache(*{1});\n'.format(self.object_name, string_utils.cpp_class_name_to_cpp_file_name(self.object_name)) return impl else: print 'Unsupported method' assert False impl += string_utils.indent(6) + cpp_class + method return impl
def generate_manager_header(self): """Generates C++ Object Manager header. """ if self.__cpp_manager_or_none is None: return cpp_manager = self.__cpp_manager_or_none file_path = io_utils.cpp_object_header_path(self.__group_name, cpp_manager.class_name()) output_header = open(file_path, 'w') def_guard = '#ifndef {2}_{0}_{1}_H_\n#define {2}_{0}_{1}_H_'.format( self.__group_name.upper().replace('/', '_'), cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(), self.__config.cpp_module_name) end_def_guard = '#endif /* defined({2}_{0}_{1}_H_) */'.format( self.__group_name.upper().replace('/', '_'), cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(), self.__config.cpp_module_name) cpp_include = '#include <string>\n' \ '#include <memory>\n' \ '#include <vector>\n' \ '#include <functional>\n\n' \ '#include "easySQLite/easySQLite.h"\n\n' \ '#include "base/base.h"\n#include "director/object_manager.h"\n#include "api/web_api.h"\n\n' cpp_include += '#include "{0}/{1}.h"'.format(self.__group_name.replace('core/', ''), cpp_class_name_to_cpp_file_name(self.__class_name)) cpp_class_begin = 'class LCC_DLL {0} : public ObjectManager {{'.format(cpp_manager.class_name()) cpp_class_end = '};' cpp_constructor = 'explicit {0}(Director* director);'.format(cpp_manager.class_name()) cpp_deconstructor = 'virtual ~{0}();'.format(cpp_manager.class_name()) cpp_init_method = 'bool InitOrDie();' cpp_default_manager = 'static const {0}* DefaultManager();'.format(cpp_manager.class_name()) cpp_manager_save_methods = cpp_manager.generate_save_declarations(_CPP_SPACE) cpp_manager_fetch_methods = cpp_manager.generate_fetch_declarations(_CPP_SPACE) cpp_manager_delete_methods = cpp_manager.generate_delete_declarations(_CPP_SPACE) cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format(cpp_manager.class_name()) cpp_manager_http_methods = cpp_manager.generate_manager_http_declarations(_CPP_SPACE) output_header.write(def_guard + _CPP_BR) output_header.write(cpp_include + _CPP_BR) output_header.write(self.__config.cpp_ns_begin + _CPP_BR) output_header.write(cpp_class_begin + '\n') output_header.write(_CPP_PUBLIC + _CPP_BR) output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR) output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR) output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR) output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR) output_header.write(_CPP_SPACE + cpp_default_manager + _CPP_BR) output_header.write(_CPP_SPACE + _CPP_HTTP_SPLIT + _CPP_BR) output_header.write(cpp_manager_http_methods) output_header.write(_CPP_SPACE + _CPP_PERSISTENT_STORE_SPLIT + _CPP_BR) output_header.write(cpp_manager_save_methods) output_header.write(cpp_manager_fetch_methods) output_header.write(cpp_manager_delete_methods) output_header.write(_CPP_PRIVATE + '\n') output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var() + _CPP_BR) for table_name in cpp_manager.table_name_list: output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var(table_name) + _CPP_BR) output_header.write(_CPP_SPACE + _CPP_UTILS_SPLIT + _CPP_BR) output_header.write(_CPP_SPACE + cpp_manager.sqlite_record_by_object_declaration() + _CPP_BR) for table_name in cpp_manager.table_name_list: output_header.write(_CPP_SPACE + cpp_manager.sqlite_record_by_object_declaration(table_name) + _CPP_BR) output_header.write(cpp_manager.unsafe_save_declaration(_CPP_SPACE)) for table_name in cpp_manager.table_name_list: output_header.write(cpp_manager.unsafe_save_declaration(_CPP_SPACE, table_name)) output_header.write(_CPP_SPACE + cpp_manager.sqlite_object_from_record_declaration() + _CPP_BR) output_header.write('\n' + _CPP_SPACE + cpp_disallow_copy_and_assign + '\n') output_header.write(cpp_class_end + _CPP_BR) output_header.write(self.__config.cpp_ns_end + _CPP_BR) output_header.write(end_def_guard + _CPP_BR)
def generate_header(self): """Generates C++ Object header file. """ file_path = io_utils.cpp_object_header_path(self.__group_name, self.__class_name) output_header = open(file_path, 'w') def_guard = '#ifndef {2}_{0}_{1}_H_\n#define {2}_{0}_{1}_H_'.format( self.__group_name.upper().replace('/', '_'), cpp_class_name_to_cpp_file_name(self.__class_name).upper(), self.__config.cpp_module_name) end_def_guard = '#endif /* defined({2}_{0}_{1}_H_) */'.format( self.__group_name.upper().replace('/', '_'), cpp_class_name_to_cpp_file_name(self.__class_name).upper(), self.__config.cpp_module_name) cpp_include = '#include <string>\n#include <memory>\n#include <vector>\n\n#include "base/base.h"' cpp_class_begin = 'class LCC_DLL {0} : public CodingInterface {{'.format(self.__class_name) cpp_class_end = '};' cpp_constructor = '{0}();'.format(self.__class_name) cpp_deconstructor = 'virtual ~{0}();'.format(self.__class_name) cpp_init_method = self.__generate_init_method_declarasion() cpp_clone = 'std::unique_ptr<{0}> Clone() const;'.format(self.__class_name) cpp_getter_setter_split = '// Getter/Setter --------------------------------------------------------' cpp_variable_split = '// Variable --------------------------------------------------------' cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format(self.__class_name) output_header.write(def_guard + _CPP_BR) output_header.write(cpp_include + _CPP_BR) output_header.write(self.__config.cpp_ns_begin + _CPP_BR) if self.__class_comment is not None: comment = self.__find_replacement_by_define_name(self.__class_comment) output_header.write('{0}'.format(comment)) output_header.write(cpp_class_begin + '\n') output_header.write(_CPP_PUBLIC + _CPP_BR) for cpp_enum in self.__cpp_enum_list: output_header.write(cpp_enum.generate_cpp_enum(_CPP_SPACE) + '\n') output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR) output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR) output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR) output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR) output_header.write(_CPP_SPACE + cpp_clone + _CPP_BR) output_header.write(_CPP_SPACE + _CPP_CODING_INTERFACE_SPLIT + _CPP_BR) output_header.write(_CPP_SPACE + _CPP_INIT_WITH_JSON_DECLARATION + _CPP_BR) output_header.write(_CPP_SPACE + cpp_getter_setter_split + _CPP_BR) for cpp_var in self.__cpp_var_list: output_header.write(_CPP_SPACE + cpp_var.getter() + '\n') output_header.write(_CPP_SPACE + cpp_var.setter() + _CPP_BR) output_header.write(_CPP_PRIVATE + _CPP_BR) output_header.write(_CPP_SPACE + cpp_variable_split + _CPP_BR) for cpp_var in self.__cpp_var_list: output_header.write(_CPP_SPACE + cpp_var.private_var() + '\n') output_header.write(_CPP_BR) output_header.write(_CPP_SPACE + cpp_disallow_copy_and_assign + '\n') output_header.write(cpp_class_end + _CPP_BR) output_header.write(self.__config.cpp_ns_end + _CPP_BR) output_header.write(end_def_guard + _CPP_BR)
def __header_file_name(self): return cpp_class_name_to_cpp_file_name(self.__class_name)