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