10826e83eSopenharmony_ci#!/usr/bin/env python3 20826e83eSopenharmony_ci# -*- coding: utf-8 -*- 30826e83eSopenharmony_ci 40826e83eSopenharmony_ci# Copyright (c) 2024 Huawei Device Co., Ltd. 50826e83eSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 60826e83eSopenharmony_ci# you may not use this file except in compliance with the License. 70826e83eSopenharmony_ci# You may obtain a copy of the License at 80826e83eSopenharmony_ci# 90826e83eSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 100826e83eSopenharmony_ci# 110826e83eSopenharmony_ci# Unless required by applicable law or agreed to in writing, software 120826e83eSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 130826e83eSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 140826e83eSopenharmony_ci# See the License for the specific language governing permissions and 150826e83eSopenharmony_ci# limitations under the License. 160826e83eSopenharmony_ci 170826e83eSopenharmony_cifrom __future__ import absolute_import 180826e83eSopenharmony_ci 190826e83eSopenharmony_ciimport os 200826e83eSopenharmony_ciimport sys 210826e83eSopenharmony_ciimport file_parser 220826e83eSopenharmony_ciimport system_util 230826e83eSopenharmony_ciimport make_capi_header 240826e83eSopenharmony_ciimport make_cpptoc_impl 250826e83eSopenharmony_ciimport make_ctocpp_impl 260826e83eSopenharmony_ciimport make_cpptoc_header 270826e83eSopenharmony_ciimport make_ctocpp_header 280826e83eSopenharmony_ci 290826e83eSopenharmony_ci# pylint:disable=huawei-redefined-outer-name 300826e83eSopenharmony_ci 310826e83eSopenharmony_ci# cannot be loaded as a module 320826e83eSopenharmony_ciif __name__ != "__main__": 330826e83eSopenharmony_ci sys.stderr.write('This file cannot be loaded as a module!') 340826e83eSopenharmony_ci sys.exit() 350826e83eSopenharmony_ci 360826e83eSopenharmony_ciroot_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 370826e83eSopenharmony_ci 380826e83eSopenharmony_cimodule_name = '' 390826e83eSopenharmony_ciif len(sys.argv) - 1 > 0: 400826e83eSopenharmony_ci module_name = sys.argv[1] 410826e83eSopenharmony_ci 420826e83eSopenharmony_ciif len(sys.argv) - 2 > 0: 430826e83eSopenharmony_ci dir_names = (sys.argv[2], '') 440826e83eSopenharmony_cielse: 450826e83eSopenharmony_ci dir_names = ('ohos_adapter', 'ohos_nweb', '') 460826e83eSopenharmony_ci 470826e83eSopenharmony_ci# Track the number of files that were written. 480826e83eSopenharmony_cifile_count = 0 490826e83eSopenharmony_ci 500826e83eSopenharmony_ci# ------------------------------------------------------------------------------------------------------# 510826e83eSopenharmony_ci 520826e83eSopenharmony_cidef update_file(contents, file_path): 530826e83eSopenharmony_ci if contents[-1:] != "\n": 540826e83eSopenharmony_ci # Add newline at end of file. 550826e83eSopenharmony_ci contents += "\n" 560826e83eSopenharmony_ci 570826e83eSopenharmony_ci file_dir = os.path.split(file_path)[0] 580826e83eSopenharmony_ci if not os.path.isdir(file_dir): 590826e83eSopenharmony_ci system_util.make_dirs(file_dir) 600826e83eSopenharmony_ci 610826e83eSopenharmony_ci system_util.write_file(file_path, contents) 620826e83eSopenharmony_ci sys.stdout.write('Finish to write file ' + os.path.basename(file_path) + '...\n') 630826e83eSopenharmony_ci 640826e83eSopenharmony_ci global file_count 650826e83eSopenharmony_ci file_count += 1 660826e83eSopenharmony_ci 670826e83eSopenharmony_ci# ------------------------------------------------------------------------------------------------------# 680826e83eSopenharmony_ci 690826e83eSopenharmony_cidef is_same_side(header, class_name): 700826e83eSopenharmony_ci cls = header.get_class(class_name) 710826e83eSopenharmony_ci if cls is None: 720826e83eSopenharmony_ci raise Exception('Class does not exist: ' + class_name) 730826e83eSopenharmony_ci 740826e83eSopenharmony_ci if cls.is_webview_side(): 750826e83eSopenharmony_ci return module_name == "webview" 760826e83eSopenharmony_ci 770826e83eSopenharmony_ci return module_name == "webcore" 780826e83eSopenharmony_ci 790826e83eSopenharmony_ci# ------------------------------------------------------------------------------------------------------# 800826e83eSopenharmony_ci 810826e83eSopenharmony_cidef update_capi_file(header, dir_name, work_dir): 820826e83eSopenharmony_ci dir_path = os.path.join(os.path.join(work_dir, dir_name), 'capi') 830826e83eSopenharmony_ci 840826e83eSopenharmony_ci # build the list of file name to make 850826e83eSopenharmony_ci file_names = sorted(header.get_file_names()) 860826e83eSopenharmony_ci if len(file_names) != 0: 870826e83eSopenharmony_ci sys.stdout.write('In C API header directory ' + dir_path + '...\n') 880826e83eSopenharmony_ci 890826e83eSopenharmony_ci for file_name in file_names: 900826e83eSopenharmony_ci sys.stdout.write('Generating ' + file_name + ' C API header...\n') 910826e83eSopenharmony_ci update_file(*make_capi_header.make_capi_header_file(header, work_dir, dir_name, file_name)) 920826e83eSopenharmony_ci 930826e83eSopenharmony_ci# ------------------------------------------------------------------------------------------------------# 940826e83eSopenharmony_ci 950826e83eSopenharmony_cidef update_cpptoc_file(header, dir_name, work_dir): 960826e83eSopenharmony_ci dir_path = os.path.join(os.path.join(work_dir, dir_name), 'cpptoc') 970826e83eSopenharmony_ci 980826e83eSopenharmony_ci # build the list of class name to make 990826e83eSopenharmony_ci class_names = sorted(header.get_class_names()) 1000826e83eSopenharmony_ci if len(class_names) != 0: 1010826e83eSopenharmony_ci sys.stdout.write('In CppToC directory ' + dir_path + '...\n') 1020826e83eSopenharmony_ci 1030826e83eSopenharmony_ci for class_name in class_names: 1040826e83eSopenharmony_ci if len(module_name) != 0 and not is_same_side(header, class_name): 1050826e83eSopenharmony_ci continue 1060826e83eSopenharmony_ci 1070826e83eSopenharmony_ci sys.stdout.write('Generating ' + class_name + 'CppToC class header...\n') 1080826e83eSopenharmony_ci update_file(*make_cpptoc_header.make_cpptoc_header_file(header, work_dir, dir_name, class_name)) 1090826e83eSopenharmony_ci 1100826e83eSopenharmony_ci sys.stdout.write('Generating ' + class_name + 'CppToC class implementation...\n') 1110826e83eSopenharmony_ci update_file(*make_cpptoc_impl.make_cpptoc_impl_file(header, work_dir, dir_name, class_name)) 1120826e83eSopenharmony_ci 1130826e83eSopenharmony_ci# ------------------------------------------------------------------------------------------------------# 1140826e83eSopenharmony_ci 1150826e83eSopenharmony_cidef update_ctocpp_file(header, dir_name, work_dir): 1160826e83eSopenharmony_ci dir_path = os.path.join(os.path.join(work_dir, dir_name), 'ctocpp') 1170826e83eSopenharmony_ci 1180826e83eSopenharmony_ci # build the list of class name to make 1190826e83eSopenharmony_ci class_names = sorted(header.get_class_names()) 1200826e83eSopenharmony_ci if len(class_names) != 0: 1210826e83eSopenharmony_ci sys.stdout.write('In CToCpp directory ' + dir_path + '...\n') 1220826e83eSopenharmony_ci 1230826e83eSopenharmony_ci for class_name in class_names: 1240826e83eSopenharmony_ci if len(module_name) != 0 and is_same_side(header, class_name): 1250826e83eSopenharmony_ci continue 1260826e83eSopenharmony_ci 1270826e83eSopenharmony_ci sys.stdout.write('Generating ' + class_name + 'CToCpp class header...\n') 1280826e83eSopenharmony_ci update_file(*make_ctocpp_header.make_ctocpp_header_file(header, work_dir, dir_name, class_name)) 1290826e83eSopenharmony_ci 1300826e83eSopenharmony_ci sys.stdout.write('Generating ' + class_name + 'CToCpp class implementation...\n') 1310826e83eSopenharmony_ci update_file(*make_ctocpp_impl.make_ctocpp_impl_file(header, work_dir, dir_name, class_name)) 1320826e83eSopenharmony_ci 1330826e83eSopenharmony_ci# ------------------------------------------------------------------------------------------------------# 1340826e83eSopenharmony_ci 1350826e83eSopenharmony_cidef translate_dir(dir_name): 1360826e83eSopenharmony_ci global file_count 1370826e83eSopenharmony_ci file_count = 0 1380826e83eSopenharmony_ci 1390826e83eSopenharmony_ci # make sure the header directory exists 1400826e83eSopenharmony_ci include_file_dir = os.path.join(os.path.join(root_dir, dir_name), 'include') 1410826e83eSopenharmony_ci if not system_util.path_exists(include_file_dir): 1420826e83eSopenharmony_ci sys.stderr.write('Directory ' + include_file_dir + ' does not exist.\n') 1430826e83eSopenharmony_ci return 1440826e83eSopenharmony_ci 1450826e83eSopenharmony_ci # create the header object 1460826e83eSopenharmony_ci sys.stdout.write('Parsing C++ headers from ' + include_file_dir + '...\n') 1470826e83eSopenharmony_ci header = file_parser.obj_header() 1480826e83eSopenharmony_ci 1490826e83eSopenharmony_ci # add include files to be processed 1500826e83eSopenharmony_ci header.set_root_directory(include_file_dir) 1510826e83eSopenharmony_ci header.add_directory(include_file_dir) 1520826e83eSopenharmony_ci 1530826e83eSopenharmony_ci # output the C API header file 1540826e83eSopenharmony_ci update_capi_file(header, dir_name, root_dir) 1550826e83eSopenharmony_ci 1560826e83eSopenharmony_ci # output the CppToC class file 1570826e83eSopenharmony_ci update_cpptoc_file(header, dir_name, root_dir) 1580826e83eSopenharmony_ci 1590826e83eSopenharmony_ci # output the CToCpp class file 1600826e83eSopenharmony_ci update_ctocpp_file(header, dir_name, root_dir) 1610826e83eSopenharmony_ci 1620826e83eSopenharmony_ci sys.stdout.write('Done - Wrote ' + str(file_count) + ' files.\n') 1630826e83eSopenharmony_ci 1640826e83eSopenharmony_ci# ------------------------------------------------------------------------------------------------------# 1650826e83eSopenharmony_ci 1660826e83eSopenharmony_cifor dir_name in dir_names: 1670826e83eSopenharmony_ci if len(dir_name) > 0: 1680826e83eSopenharmony_ci translate_dir(dir_name) 169