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