|
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]);
|