import { PlatformPackager } from "app-builder-lib"
import { getLicenseAssets } from "app-builder-lib/out/util/license"
import { log } from "builder-util"
import { readFile } from "fs-extra"
import * as iconv from "iconv-lite"
import { load } from "js-yaml"
import { serializeString } from "./dmgUtil"
import { getDefaultButtons } from "./licenseDefaultButtons"
export async function getLicenseButtonsFile(packager: PlatformPackager<any>): Promise<Array<LicenseButtonsFile>> {
return getLicenseAssets(
(await packager.resourceList).filter(it => {
const name = it.toLowerCase()
return name.startsWith("licensebuttons_") && (name.endsWith(".json") || name.endsWith(".yml"))
}),
packager
)
}
export interface LicenseButtonsFile {
file: string
lang: string
langWithRegion: string
langName: string
}
export async function getLicenseButtons(licenseButtonFiles: Array<LicenseButtonsFile>, langWithRegion: string, id: number, name: string) {
let data = getDefaultButtons(langWithRegion, id, name)
for (const item of licenseButtonFiles) {
if (item.langWithRegion !== langWithRegion) {
continue
}
try {
const fileData = load(await readFile(item.file, "utf-8")) as any
const buttonsStr =
labelToHex(fileData.lang, item.lang, item.langWithRegion) +
labelToHex(fileData.agree, item.lang, item.langWithRegion) +
labelToHex(fileData.disagree, item.lang, item.langWithRegion) +
labelToHex(fileData.print, item.lang, item.langWithRegion) +
labelToHex(fileData.save, item.lang, item.langWithRegion) +
labelToHex(fileData.description, item.lang, item.langWithRegion)
data = `data 'STR#' (${id}, "${name}") {\n`
data += serializeString("0006" + buttonsStr)
data += `\n};`
if (log.isDebugEnabled) {
log.debug({ lang: item.langName, data }, `overwriting license buttons`)
}
return data
} catch (e: any) {
log.debug({ error: e }, "cannot overwrite license buttons")
return data
}
}
return data
}
function labelToHex(label: string, lang: string, langWithRegion: string) {
const lbl = hexEncode(label, lang, langWithRegion).toString().toUpperCase()
const len = numberToHex(lbl.length / 2)
return len + lbl
}
function numberToHex(nb: number) {
return ("0" + nb.toString(16)).slice(-2)
}
function hexEncode(str: string, lang: string, langWithRegion: string) {
const macCodePages = getMacCodePage(lang, langWithRegion)
let result = ""
for (let i = 0; i < str.length; i++) {
try {
let hex = getMacHexCode(str, i, macCodePages)
if (hex === undefined) {
hex = "3F"
}
result += hex
} catch (e: any) {
log.debug({ error: e, char: str[i] }, "cannot convert")
result += "3F"
}
}
return result
}
function getMacCodePage(lang: string, langWithRegion: string) {
switch (lang) {
case "ja":
return ["euc-jp"]
case "zh":
if (langWithRegion === "zh_CN") {
return ["gb2312"]
}
return ["big5"]
case "ko":
return ["euc-kr"]
case "ar":
case "ur":
return ["macarabic"]
case "he":
return ["machebrew"]
case "el":
case "elc":
return ["macgreek"]
case "ru":
case "be":
case "sr":
case "bg":
case "uz":
return ["maccyrillic"]
case "ro":
return ["macromania"]
case "uk":
return ["macukraine"]
case "th":
return ["macthai"]
case "et":
case "lt":
case "lv":
case "pl":
case "hu":
case "cs":
case "sk":
return ["maccenteuro"]
case "is":
case "fo":
return ["maciceland"]
case "tr":
return ["macturkish"]
case "hr":
case "sl":
return ["maccroatian"]
default:
return ["macroman"]
}
}
function getMacHexCode(str: string, i: number, macCodePages: any) {
const code = str.charCodeAt(i)
if (code < 128) {
return code.toString(16)
} else if (code < 256) {
return iconv.encode(str[i], "macroman").toString("hex")
} else {
for (let i = 0; i < macCodePages.length; i++) {
const result = iconv.encode(str[i], macCodePages[i]).toString("hex")
if (result !== undefined) {
return result
}
}
}
return code
}