Blame components/MozVoikko2.js

Packit Service 893690
/* ***** BEGIN LICENSE BLOCK *****
Packit Service 893690
 *
Packit Service 893690
 *   This file is part of mozvoikko2.
Packit Service 893690
 *
Packit Service 893690
 *   mozvoikko2 is free software: you can redistribute it and/or modify
Packit Service 893690
 *   it under the terms of the GNU General Public License as published by
Packit Service 893690
 *   the Free Software Foundation, either version 2 of the License, or
Packit Service 893690
 *   (at your option) any later version.
Packit Service 893690
 *
Packit Service 893690
 *   mozvoikko is distributed in the hope that it will be useful,
Packit Service 893690
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 893690
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 893690
 *   GNU General Public License for more details.
Packit Service 893690
 *
Packit Service 893690
 *   You should have received a copy of the GNU General Public License
Packit Service 893690
 *   along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
Packit Service 893690
 *
Packit Service 893690
 * ***** END OF LICENSE BLOCK ***** */
Packit Service 893690
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
Packit Service 893690
Components.utils.import("resource://gre/modules/ctypes.jsm");
Packit Service 893690
Packit Service 893690
const mozISpellCheckingEngine = Components.interfaces.mozISpellCheckingEngine;
Packit Service 893690
const CLASS_ID = Components.ID("89630d4c-c64d-11e0-83d8-00508d9f364f");
Packit Service 893690
const CLASS_NAME = "Finnish language spell-check";
Packit Service 893690
const CONTRACT_ID = "@mozilla.org/mozvoikko2;1";
Packit Service 893690
Packit Service 893690
const VOIKKO_OPT_IGNORE_DOT = 0;
Packit Service 893690
const VOIKKO_OPT_IGNORE_NUMBERS = 1;
Packit Service 893690
const VOIKKO_OPT_IGNORE_UPPERCASE = 3;
Packit Service 893690
const VOIKKO_OPT_ACCEPT_MISSING_HYPHENS = 12;
Packit Service 893690
Packit Service 893690
function LibVoikko()
Packit Service 893690
{
Packit Service 893690
}
Packit Service 893690
Packit Service 893690
LibVoikko.prototype = {
Packit Service 893690
    libvoikko: null,
Packit Service 893690
Packit Service 893690
    data_loc: "",
Packit Service 893690
Packit Service 893690
    call_abi: ctypes.default_abi,
Packit Service 893690
Packit Service 893690
    fn_voikko_init: null,
Packit Service 893690
    fn_voikko_terminate: null,
Packit Service 893690
    fn_voikko_spell_cstr: null,
Packit Service 893690
    fn_voikko_suggest_cstr: null,
Packit Service 893690
    fn_voikko_free_cstr_array: null,
Packit Service 893690
    fn_voikko_set_boolean_option: null,
Packit Service 893690
Packit Service 893690
    init : function()
Packit Service 893690
    {
Packit Service 893690
        var runtime = Components.classes["@mozilla.org/xre/app-info;1"]
Packit Service 893690
            .getService(Components.interfaces.nsIXULRuntime);
Packit Service 893690
Packit Service 893690
        var abi = runtime.OS + "_" + runtime.XPCOMABI;
Packit Service 893690
Packit Service 893690
        var lib_name;
Packit Service 893690
        this.data_loc = "";
Packit Service 893690
        //==================================================================
Packit Service 893690
        // Detect shared library name to load
Packit Service 893690
        //==================================================================
Packit Service 893690
        if (abi == "Linux_x86-gcc3" || abi == "Linux_x86_64-gcc3")
Packit Service 893690
        {
Packit Service 893690
            lib_name = "libvoikko.so.1";
Packit Service 893690
        }
Packit Service 893690
        else if (abi == "WINNT_x86-msvc" || abi == "WINNT_x86_64-msvc")
Packit Service 893690
        {
Packit Service 893690
            lib_name = "libvoikko-1.dll";
Packit Service 893690
            this.call_abi = ctypes.winapi_abi;
Packit Service 893690
        }
Packit Service 893690
        else if (abi == "Darwin_x86_64-gcc3" || abi == "Darwin_x86-gcc3" || abi == "Darwin_ppc-gcc3")
Packit Service 893690
        {
Packit Service 893690
            lib_name = "libvoikko.1.dylib";
Packit Service 893690
        }
Packit Service 893690
        else
Packit Service 893690
        {
Packit Service 893690
            throw "Unsupported ABI " + abi;
Packit Service 893690
        }
Packit Service 893690
Packit Service 893690
        // Try to locate libvoikko inside extension directory and
Packit Service 893690
        // replace value
Packit Service 893690
        var extension_dir = __LOCATION__.parent.parent;
Packit Service 893690
        var libvoikko_loc = extension_dir.clone();
Packit Service 893690
        libvoikko_loc.append("voikko");
Packit Service 893690
        libvoikko_loc.append(abi);
Packit Service 893690
        libvoikko_loc.append(lib_name);
Packit Service 893690
        if (libvoikko_loc.exists() && libvoikko_loc.isFile())
Packit Service 893690
        {
Packit Service 893690
            this.libvoikko = ctypes.open(libvoikko_loc.path);
Packit Service 893690
            aConsoleService.logStringMessage("MozVoikko2: loaded " + libvoikko_loc.path);
Packit Service 893690
        }
Packit Service 893690
        else
Packit Service 893690
        {
Packit Service 893690
            this.libvoikko = ctypes.open(lib_name);
Packit Service 893690
            aConsoleService.logStringMessage("MozVoikko2: loaded system libvoikko");
Packit Service 893690
            aConsoleService.logStringMessage("MozVoikko2: libvoikko_loc = " + libvoikko_loc.path);
Packit Service 893690
        }
Packit Service 893690
Packit Service 893690
        var data_loc = extension_dir.clone();
Packit Service 893690
        data_loc.append("voikko");
Packit Service 893690
        var data_loc_test = data_loc.clone();
Packit Service 893690
        data_loc_test.append("2");
Packit Service 893690
        data_loc_test.append("mor-standard");
Packit Service 893690
        data_loc_test.append("voikko-fi_FI.pro");
Packit Service 893690
        if (data_loc_test.exists() && data_loc_test.isFile())
Packit Service 893690
        {
Packit Service 893690
            this.data_loc = data_loc.path;
Packit Service 893690
            aConsoleService.logStringMessage("MozVoikko2: Found suomi-malaga data at " + this.data_loc);
Packit Service 893690
        }
Packit Service 893690
Packit Service 893690
        /* Detect used libvoikko version and output a message to Javascript console. */
Packit Service 893690
        var fn_voikkoGetVersion = this.libvoikko.declare(
Packit Service 893690
            "voikkoGetVersion",
Packit Service 893690
            this.call_abi,
Packit Service 893690
            ctypes.char.ptr);
Packit Service 893690
Packit Service 893690
        var version_str = fn_voikkoGetVersion().readString();
Packit Service 893690
        aConsoleService.logStringMessage("MozVoikko2: Using libvoikko version " + version_str);
Packit Service 893690
Packit Service 893690
Packit Service 893690
        //
Packit Service 893690
        // struct VoikkoHandle * voikkoInit(const char ** error, const char * langcode,
Packit Service 893690
        //                                  const char * path);
Packit Service 893690
        //
Packit Service 893690
        this.fn_voikko_init = this.libvoikko.declare(
Packit Service 893690
            "voikkoInit",
Packit Service 893690
            this.call_abi,
Packit Service 893690
            ctypes.voidptr_t, // Return value: we are not interested what is inside
Packit Service 893690
            ctypes.char.ptr.ptr,
Packit Service 893690
            ctypes.char.ptr,
Packit Service 893690
            ctypes.char.ptr);
Packit Service 893690
Packit Service 893690
        //
Packit Service 893690
        // void voikkoTerminate(struct VoikkoHandle * handle);
Packit Service 893690
        //
Packit Service 893690
        this.fn_voikko_terminate = this.libvoikko.declare(
Packit Service 893690
            "voikkoTerminate",
Packit Service 893690
            this.call_abi,
Packit Service 893690
            ctypes.void_t,
Packit Service 893690
            ctypes.voidptr_t);
Packit Service 893690
        
Packit Service 893690
        //
Packit Service 893690
        // int voikkoSpellCstr(struct VoikkoHandle * handle, const char * word);
Packit Service 893690
        //
Packit Service 893690
        this.fn_voikko_spell_cstr = this.libvoikko.declare(
Packit Service 893690
            "voikkoSpellCstr",
Packit Service 893690
            this.call_abi,
Packit Service 893690
            ctypes.int,
Packit Service 893690
            ctypes.voidptr_t,
Packit Service 893690
            ctypes.char.ptr);
Packit Service 893690
Packit Service 893690
        //
Packit Service 893690
        // char ** voikkoSuggestCstr(struct VoikkoHandle * handle, const char * word);
Packit Service 893690
        //
Packit Service 893690
        this.fn_voikko_suggest_cstr = this.libvoikko.declare(
Packit Service 893690
            "voikkoSuggestCstr",
Packit Service 893690
            this.call_abi,
Packit Service 893690
            ctypes.char.ptr.array(50).ptr,
Packit Service 893690
            ctypes.voidptr_t,
Packit Service 893690
            ctypes.char.ptr);
Packit Service 893690
Packit Service 893690
        //
Packit Service 893690
        // void voikkoFreeCstrArray(char ** cstrArray);
Packit Service 893690
        //
Packit Service 893690
        this.fn_voikko_free_cstr_array = this.libvoikko.declare(
Packit Service 893690
            "voikkoFreeCstrArray",
Packit Service 893690
            this.call_abi,
Packit Service 893690
            ctypes.void_t,
Packit Service 893690
            ctypes.char.ptr.array(50).ptr);
Packit Service 893690
Packit Service 893690
        //
Packit Service 893690
        // int voikkoSetBooleanOption(struct VoikkoHandle * handle, int option, int value);
Packit Service 893690
        //
Packit Service 893690
        this.fn_voikko_set_boolean_option = this.libvoikko.declare(
Packit Service 893690
            "voikkoSetBooleanOption",
Packit Service 893690
            this.call_abi,
Packit Service 893690
            ctypes.int,
Packit Service 893690
            ctypes.voidptr_t,
Packit Service 893690
            ctypes.int,
Packit Service 893690
            ctypes.int);
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    finalize : function()
Packit Service 893690
    {
Packit Service 893690
        this.fn_voikko_init = null;
Packit Service 893690
        this.fn_voikko_terminate = null;
Packit Service 893690
        this.libvoikko.close();
Packit Service 893690
    }
Packit Service 893690
};
Packit Service 893690
Packit Service 893690
var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"].
Packit Service 893690
    getService(Components.interfaces.nsIConsoleService);
Packit Service 893690
Packit Service 893690
Packit Service 893690
try
Packit Service 893690
{
Packit Service 893690
    var libvoikko = new LibVoikko;
Packit Service 893690
    libvoikko.init();
Packit Service 893690
}
Packit Service 893690
catch (err)
Packit Service 893690
{
Packit Service 893690
    Components.utils.reportError(err);
Packit Service 893690
    throw err;
Packit Service 893690
}
Packit Service 893690
Packit Service 893690
function VoikkoHandle(libvoikko)
Packit Service 893690
{
Packit Service 893690
}
Packit Service 893690
Packit Service 893690
Packit Service 893690
VoikkoHandle.prototype = {
Packit Service 893690
    handle: null,
Packit Service 893690
    libvoikko: null,
Packit Service 893690
    lang_code: null,
Packit Service 893690
Packit Service 893690
    open : function(libvoikko, lang_code)
Packit Service 893690
    {
Packit Service 893690
        var message = ctypes.char.ptr(null);
Packit Service 893690
        var message_ptr = message.address();
Packit Service 893690
        var data_loc = null;
Packit Service 893690
Packit Service 893690
        if (libvoikko.data_loc != "")
Packit Service 893690
        {
Packit Service 893690
            data_loc = libvoikko.data_loc;
Packit Service 893690
        }
Packit Service 893690
Packit Service 893690
        this.libvoikko = libvoikko;
Packit Service 893690
Packit Service 893690
        this.handle = this.libvoikko.fn_voikko_init(
Packit Service 893690
            message_ptr,
Packit Service 893690
            "fi_FI",
Packit Service 893690
            data_loc);
Packit Service 893690
Packit Service 893690
        this.libvoikko.fn_voikko_set_boolean_option(this.handle, VOIKKO_OPT_IGNORE_DOT, 1);
Packit Service 893690
        this.libvoikko.fn_voikko_set_boolean_option(this.handle, VOIKKO_OPT_IGNORE_NUMBERS, 1);
Packit Service 893690
        this.libvoikko.fn_voikko_set_boolean_option(this.handle, VOIKKO_OPT_IGNORE_UPPERCASE, 1);
Packit Service 893690
        this.libvoikko.fn_voikko_set_boolean_option(this.handle, VOIKKO_OPT_ACCEPT_MISSING_HYPHENS, 1);
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    finalize : function()
Packit Service 893690
    {
Packit Service 893690
        if (handle)
Packit Service 893690
        {
Packit Service 893690
            this.libvoikko.fn_voikko_terminate(this.handle);
Packit Service 893690
            this.handle = null;
Packit Service 893690
        }
Packit Service 893690
    }
Packit Service 893690
};
Packit Service 893690
Packit Service 893690
Packit Service 893690
function MozVoikko2()
Packit Service 893690
{
Packit Service 893690
    try
Packit Service 893690
    {
Packit Service 893690
        this.voikko_handle = new VoikkoHandle;
Packit Service 893690
        this.voikko_handle.open(libvoikko);
Packit Service 893690
    }
Packit Service 893690
    catch (err)
Packit Service 893690
    {
Packit Service 893690
        Components.utils.reportError(err);
Packit Service 893690
        throw err;
Packit Service 893690
    }
Packit Service 893690
}
Packit Service 893690
Packit Service 893690
MozVoikko2.prototype = {
Packit Service 893690
    classDescription: CLASS_NAME,
Packit Service 893690
    classID: CLASS_ID,
Packit Service 893690
    contractID: CONTRACT_ID,
Packit Service 893690
Packit Service 893690
    data_loc : null,
Packit Service 893690
    voikko_handle : null,
Packit Service 893690
    mPersonalDictionary : null,
Packit Service 893690
Packit Service 893690
    QueryInterface: XPCOMUtils.generateQI([mozISpellCheckingEngine, Components.interfaces.nsISupport]),
Packit Service 893690
Packit Service 893690
    get dictionary()
Packit Service 893690
    {
Packit Service 893690
        return "fi_FI";
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    set dictionary(dict)
Packit Service 893690
    {
Packit Service 893690
        if (dict != "fi_FI")
Packit Service 893690
        {
Packit Service 893690
            throw "mozvoikko2: dictionary '" + dict + "' is not supported by this component (but may be supported by others)";
Packit Service 893690
        }
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    get providesPersonalDictionary()
Packit Service 893690
    {
Packit Service 893690
        return false;
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    get providesWordUtils()
Packit Service 893690
    {
Packit Service 893690
        return false;
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    get name()
Packit Service 893690
    {
Packit Service 893690
        return "MozVoikko 2";
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    get copyright()
Packit Service 893690
    {
Packit Service 893690
        return "GPL v2";
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    get personalDictionary()
Packit Service 893690
    {
Packit Service 893690
        return this.mPersonalDictionary;
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    set personalDictionary(mPersonalDictionary)
Packit Service 893690
    {
Packit Service 893690
        this.mPersonalDictionary = mPersonalDictionary;
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    getDictionaryList : function(dicts, count)
Packit Service 893690
    {
Packit Service 893690
        dicts.value = ["fi_FI"];
Packit Service 893690
        count.value = 1;
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    check : function(word)
Packit Service 893690
    {
Packit Service 893690
        if (word.length < 2)
Packit Service 893690
        {
Packit Service 893690
            return true;
Packit Service 893690
        }
Packit Service 893690
        var result = libvoikko.fn_voikko_spell_cstr(this.voikko_handle.handle, word);
Packit Service 893690
Packit Service 893690
        if (result == 0 && this.mPersonalDictionary)
Packit Service 893690
        {
Packit Service 893690
            return this.mPersonalDictionary.check(word, "fi_FI");
Packit Service 893690
        }
Packit Service 893690
        else
Packit Service 893690
        {
Packit Service 893690
            return result != 0;
Packit Service 893690
        }
Packit Service 893690
    },
Packit Service 893690
Packit Service 893690
    suggest : function(word, sugg, count)
Packit Service 893690
    {
Packit Service 893690
        var i;
Packit Service 893690
        var tmp = libvoikko.fn_voikko_suggest_cstr(this.voikko_handle.handle, word);
Packit Service 893690
Packit Service 893690
        count.value = 0;
Packit Service 893690
Packit Service 893690
        if (!tmp.isNull())
Packit Service 893690
        {
Packit Service 893690
            sugg.value = [];
Packit Service 893690
            count.value = 0;
Packit Service 893690
Packit Service 893690
            for (i = 0; i < 50 && !tmp.contents[i].isNull(); i++)
Packit Service 893690
            {
Packit Service 893690
                sugg.value[i] = tmp.contents[i].readString();
Packit Service 893690
                count.value ++;
Packit Service 893690
            }
Packit Service 893690
        }
Packit Service 893690
Packit Service 893690
        libvoikko.fn_voikko_free_cstr_array(tmp);
Packit Service 893690
    }   
Packit Service 893690
}
Packit Service 893690
Packit Service 893690
Packit Service 893690
if (XPCOMUtils.generateNSGetFactory)
Packit Service 893690
    var NSGetFactory = XPCOMUtils.generateNSGetFactory([MozVoikko2]);
Packit Service 893690
else
Packit Service 893690
    var NSGetModule = XPCOMUtils.generateNSGetModule([MozVoikko2]);