IV: Xây Dựng Extension Chuyển Mã Tiếng Việt
1.3 Xây dựng IDL(interface definition language)
Đôi nét về IDL:
Để sử dụng trong một môi trường trung lập đa hệ, Mozilla sử dụng ngôn ngữđịnh nghĩa giao diện “interface definition language” IDL được gọi là XPIDL, nó cho phép bạn chỉ
rõ những phương pháp, những thuộc tính, những hằng số của một giao diện đã cho, và cũng đểđịnh nghĩa sự thừa kế giao diện.
Có vài giới hạn trong việc định nghĩa giao diện của bạn khi sử dụng XPIDL. Không có sự
hỗ trợđa thừa kế, nếu bạn định nghĩa một giao diện mới thì không thể kế thừa hơn một giao diện. giới hạn của những giao diện trong XPIDL là những tên phương thức phải là duy nhất.
Tuy nhiên những khuyết điểm này không là gì so với những tính năng linh hoạt mà XPIDL đem lại. XPIDL cho phép bạn phát sinh những thư viện kiểu “type libraries”, hoặc “typelibs” với phần mở rộng là .xpt. đó là một file nhị phân khai báo một hoặc nhiều giao diện XPCOM, nó cung cấp những điều khiển và sự truy cập tới XPCOM. Khi thành phần COM được truy cập tới bởi một ngôn ngữ khác, chúng sẽ sử dụng xpt để truy cập tới giao diện, làm sao dể hỗ trợ những phương thức “mothod” và gọi chúng lên để sử
dụng như thế nào. Phần này của XPCOM được gọi là XPConnect. XPConect một lớp của XPCOM mà cung cấp tới những truy nhập tới thành phần của XPCOM từ ngôn ngữ khác, chẳng hạn là javascipt.
IDL chuyển mã tiếng việt:
Dưới đây là những hàm giao diện của XPCOM chuyển mã tiếng việt được sử dụng trong Extension chuyển mã tiếng việt.
Giao diện IDL của XPCOM chuyển mã tiếng việt: //giao diện sẽđược hỗ trợ XPCOM.
#include "nsISupports.idl" //mã id sẽđược đăng ký.
[scriptable, uuid(263ed1ba-5cc1-11db-9673-00e08161165f)] interface ITrans : nsISupports
{
//chuyển một chuỗi scrString từ bảng mã bất kỳ về bảng mã Unicode AString transString(in AString srcString);
//chuyển một font từ bảng mã srcId sang font Unicode tương ứng AString transFont(in AString srcFont,in long srcId);
//chuyển một chuỗi với bảng mã nguồn chỉđịnh,
AString transStringWithId(in AString srcString,in long idSrc); //tìm bảng mã của một chuỗi.
long findVnCode(in AString srcString); //tìm bảng mã của một font.
long findVnCodeFromFont(in AString srcFont); }
Biên dịch file IDL:
File IDL được biên dịch trên bộ thư viện của Gecko SDK, nó tạo ra hai file là type- library (*.XPT) và file C++ Header (*.H). nó được sử dụng để mô tả những đối tượng
được thi hành.
Ta có thể sử dụng một file BAT để thực thi biên dịch file này, trên thư viện cùa Gecko SDK.
build.bat
C:\gecko-sdk\bin\xpidl.exe -m header -I C:\gecko-sdk\idl TransCom.idl C:\gecko-sdk\bin\xpidl.exe -m typelib -I C:\gecko-sdk\idl TransCom.idl
File header (.h) được phát sinh thực chất là một khung mẫu cho XPCOM, mà bạn có thể
sử dụng mã tạo ra các lớp khai báo của XPCOM là .H và .CPP. có thể tương tự như său: File Trans.H
//ID được truy cập khi sừ dụng XPConnect
#define TRANS_CONTRACTID "@thienthanbattu.org/trans;1" //tên lớp sẽđược nhìn thấy trên interface
#define TRANS_CLASSNAME "Trans"
// mã ID của lớp {B90C30E5-180A-4c0d-96DB-1DC522854414}
#define TRANS_CID { 0xb90c30e5, 0x180a, 0x4c0d, { 0x96, 0xdb, 0x1d, 0xc5, 0x22, 0x85, 0x44, 0x14 } }
class CTrans : public ITrans {
public:
NS_DECL_ISUPPORTS //XPCOM Macro NS_DECL_ITRANS CTrans(); private: ~CTrans(); protected: /* additional members */ }; File Trans.CPP NS_IMPL_ISUPPORTS1(CTrans, ITrans) CTrans:: CTrans() {} CTrans:: ~CTrans() {}
/* AString transString (in AString srcString); */
NS_IMETHODIMP CTrans::TransString(const nsAString & srcString, nsAString & _retval){
return NS_OK; }
/* AString transStringWithId (in AString srcString, in long idSrc); */
NS_IMETHODIMP CTrans::TransStringWithId(const nsAString & srcString, PRInt32 idSrc, nsAString & _retval){
return NS_OK; }
/* AString transFont (in AString srcFont, in long srcId); */
NS_IMETHODIMP CTrans::TransFont(const nsAString & srcFont, PRInt32 srcId, nsAString & _retval){
return NS_OK; }
/* long findVnCode (in AString srcString); */
NS_IMETHODIMP CTrans::FindVnCode(const nsAString & srcString, PRInt32 *_retval){
return NS_OK; }
/* long findVnCodeFromFont (in AString srcFont); */
NS_IMETHODIMP CTrans::FindVnCodeFromFont(const nsAString & srcFont, PRInt32 *_retval){
return NS_OK; }
Trên đây là khung sườn mà XPCOM Macro đem lại cho những nhà phát triển ứng dụng C++ làm việc một cách hiệu quả và tiết kiệm hơn khi viết ứng dụng thay vì phải xây dựng một COM từ những chi tiết nhỏ nhất.
Với khung sườn này, ta có thể viết mã cho XPCOM chuyển mã tiếng việt với việc sử
dụng thêm hàm thư viện BKTrans.dll.
Tạo module thực thi “module implementation”:
#include "nsIGenericFactory.h" #include "Trans.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(CTrans) static nsModuleComponentInfo components[] ={{ TRANS_CLASSNAME, TRANS_CID, TRANS_CONTRACTID, CTransConstructor, } }; NS_IMPL_NSGETMODULE("TransModule", components)