15b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard/** 25b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * Copyright (C) 2014 The Android Open Source Project 35b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * 45b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * Licensed under the Apache License, Version 2.0 (the "License"); you may not 55b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * use this file except in compliance with the License. You may obtain a copy of 65b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * the License at 75b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * 85b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * http://www.apache.org/licenses/LICENSE-2.0 95b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * 105b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * Unless required by applicable law or agreed to in writing, software 115b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 125b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 135b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * License for the specific language governing permissions and limitations under 145b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard * the License. 155b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard */ 165b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard 175b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalardpackage com.android.inputmethod.latin.dicttool; 185b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard 195b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalardimport com.android.inputmethod.latin.dicttool.BinaryDictOffdeviceUtils.DecoderChainSpec; 205b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalardimport com.android.inputmethod.latin.makedict.DictionaryHeader; 215b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalardimport com.android.inputmethod.latin.makedict.UnsupportedFormatException; 225b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard 235b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalardimport java.io.File; 245b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalardimport java.util.Arrays; 255b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard 265b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalardpublic class Header extends Dicttool.Command { 275b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard public static final String COMMAND = "header"; 285b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard 295b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard public Header() { 305b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard } 315b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard 325b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard @Override 335b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard public String getHelp() { 345b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard return COMMAND + " <filename>: prints the header contents of a dictionary file"; 355b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard } 365b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard 375b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard @Override 385b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard public void run() throws UnsupportedFormatException { 395b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard final boolean plumbing; 405b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard if (mArgs.length > 0 && "-p".equals(mArgs[0])) { 415b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard plumbing = true; 425b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard mArgs = Arrays.copyOfRange(mArgs, 1, mArgs.length); 435b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard } else { 445b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard plumbing = false; 455b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard } 465b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard if (mArgs.length < 1) { 475b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard throw new RuntimeException("Not enough arguments for command " + COMMAND); 485b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard } 495b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard final String filename = mArgs[0]; 505b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard final File dictFile = new File(filename); 515b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard final DecoderChainSpec<DictionaryHeader> spec = 525b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard BinaryDictOffdeviceUtils.decodeDictionaryForProcess(dictFile, 535b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard new BinaryDictOffdeviceUtils.HeaderReaderProcessor()); 545b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard if (null == spec) { 555b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard throw new UnsupportedFormatException(filename 565b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard + " doesn't seem to be a valid version 2 dictionary file"); 575b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard } 585b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard 595b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard final DictionaryHeader header = spec.mResult; 605b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard System.out.println("Dictionary : " + dictFile.getAbsolutePath()); 615b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard System.out.println("Size : " + dictFile.length() + " bytes"); 625b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard System.out.println("Format : Binary dictionary format"); 638e394ffcf40307482f19b32b48eb9fc3a7630dfdAdrian Velicu System.out.println("Format version : " + header.mFormatOptions.mVersion); 645b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard System.out.println("Packaging : " + spec.describeChain()); 655b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard System.out.println("Header attributes :"); 665b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard System.out.print(header.mDictionaryOptions.toString(2 /* indentCount */, plumbing)); 675b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard } 685b33d197ba7c9e44847561b99f948d5a11e1ecc6Jean Chalard} 69