142365ec6Sopenharmony_ci/*
242365ec6Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
342365ec6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
442365ec6Sopenharmony_ci * you may not use this file except in compliance with the License.
542365ec6Sopenharmony_ci * You may obtain a copy of the License at
642365ec6Sopenharmony_ci *
742365ec6Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
842365ec6Sopenharmony_ci *
942365ec6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1042365ec6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1142365ec6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1242365ec6Sopenharmony_ci * See the License for the specific language governing permissions and
1342365ec6Sopenharmony_ci * limitations under the License.
1442365ec6Sopenharmony_ci */
1542365ec6Sopenharmony_ci
1642365ec6Sopenharmony_ciimport { Log } from '../utils/Log'
1742365ec6Sopenharmony_ciimport type { IModeMap } from './IModeMap'
1842365ec6Sopenharmony_ciimport type { FunctionId } from './FunctionId'
1942365ec6Sopenharmony_ci
2042365ec6Sopenharmony_ciexport class ModeAssembler {
2142365ec6Sopenharmony_ci  private TAG: string = '[ModeAssembler]:'
2242365ec6Sopenharmony_ci  private mNeedAdd: FunctionId[]
2342365ec6Sopenharmony_ci  private mNeedDelete: FunctionId[]
2442365ec6Sopenharmony_ci  private mMode: IModeMap
2542365ec6Sopenharmony_ci  private mFunctionsMap: Map<FunctionId, any>
2642365ec6Sopenharmony_ci
2742365ec6Sopenharmony_ci  constructor(functionsMap: Map<FunctionId, any>, modeMap: IModeMap) {
2842365ec6Sopenharmony_ci    this.mFunctionsMap = functionsMap
2942365ec6Sopenharmony_ci    this.mMode = modeMap
3042365ec6Sopenharmony_ci  }
3142365ec6Sopenharmony_ci
3242365ec6Sopenharmony_ci  public assembler(preMode: string, currentMode: string): void {
3342365ec6Sopenharmony_ci    Log.info(`${this.TAG} assembler preMode = ${preMode}  currentMode = ${currentMode} E `)
3442365ec6Sopenharmony_ci    this.mNeedAdd = []
3542365ec6Sopenharmony_ci    this.mNeedDelete = []
3642365ec6Sopenharmony_ci    Log.info(`${this.TAG} assembler preMode = ${this.mMode.getFunctions(preMode)}  currentMode = ${this.mMode.getFunctions(currentMode)} E `)
3742365ec6Sopenharmony_ci
3842365ec6Sopenharmony_ci    let preModeFun: FunctionId[] = this.mMode.getFunctions(preMode)
3942365ec6Sopenharmony_ci    let currentModeFun: FunctionId[] = this.mMode.getFunctions(currentMode)
4042365ec6Sopenharmony_ci
4142365ec6Sopenharmony_ci    Log.info(`${this.TAG} assembler preModeFun = ${preModeFun}  currentModeFun = ${currentModeFun}  `)
4242365ec6Sopenharmony_ci    if (!preMode) {
4342365ec6Sopenharmony_ci      this.mNeedAdd = JSON.parse(JSON.stringify(currentModeFun))
4442365ec6Sopenharmony_ci    } else if (preMode != currentMode) {
4542365ec6Sopenharmony_ci      this.mNeedAdd = JSON.parse(JSON.stringify(currentModeFun))
4642365ec6Sopenharmony_ci      for (let fun of preModeFun) {
4742365ec6Sopenharmony_ci        let index = currentModeFun.indexOf(fun)
4842365ec6Sopenharmony_ci          if (index == -1) {
4942365ec6Sopenharmony_ci            this.mNeedDelete.push(fun)
5042365ec6Sopenharmony_ci          } else {
5142365ec6Sopenharmony_ci            this.mNeedAdd.splice(index, 1)
5242365ec6Sopenharmony_ci          }
5342365ec6Sopenharmony_ci      }
5442365ec6Sopenharmony_ci    }
5542365ec6Sopenharmony_ci    Log.info(`${this.TAG} assembler mNeedAdd = ${this.mNeedAdd}  mNeedDelete = ${this.mNeedDelete}`)
5642365ec6Sopenharmony_ci    this.attachFunction(this.mNeedAdd)
5742365ec6Sopenharmony_ci    this.detachFunction(this.mNeedDelete)
5842365ec6Sopenharmony_ci    Log.info(`${this.TAG} assembler X`)
5942365ec6Sopenharmony_ci  }
6042365ec6Sopenharmony_ci
6142365ec6Sopenharmony_ci  private attachFunction(item: FunctionId[]): void {
6242365ec6Sopenharmony_ci    for (let fun of item) {
6342365ec6Sopenharmony_ci      Log.info(`${this.TAG} attachFunction fun: ${fun}`)
6442365ec6Sopenharmony_ci      this.mFunctionsMap.get(fun).load()
6542365ec6Sopenharmony_ci    }
6642365ec6Sopenharmony_ci  }
6742365ec6Sopenharmony_ci
6842365ec6Sopenharmony_ci  private detachFunction(item: FunctionId[]): void {
6942365ec6Sopenharmony_ci    for (let fun of item) {
7042365ec6Sopenharmony_ci      Log.info(`${this.TAG} disattachFunction fun: ${fun}`)
7142365ec6Sopenharmony_ci      this.mFunctionsMap.get(fun).unload()
7242365ec6Sopenharmony_ci    }
7342365ec6Sopenharmony_ci  }
7442365ec6Sopenharmony_ci}