Mã nguồn cho 1 project viết bằng C++ bao gồm: o C++ source file( .cpp, .h)
o tập tin nguồn cho resource của chương trình ( resource files, bitmap, icons)
o những tập tin hệ thống của project: tập tin chứa thông tin xây dựng (bld.inf), 1 hay nhiều makefile specifications( .mmp)
SDK của cả Quartz và Crystal của Symbian cung cấp các công cụ để xây dựng chương trình bằng C++:
o công cụ xây dựng các makefiles và điều khiển các tác vụ mà được điều khiển bời tiến trình xây dựng (build process).
o công cụ để chuyển makefile specifications thành makefile hay
workspace của Visual C++ IDẸ
o Trình biên dịch GNU C++, phiên bản 98r2, thiết kết riêng cho các yêu cầu của EPOC và xây dựng các chương trình cho các máy hoạt động dựa trên ARM.
o Trình biên dịch và chuyển đổi các resources của chương trình (resource files, bitmap, icons)
KHOA CNTT –
ĐH KHTN
48 o Công cụ trợ giúp thường trú, để chuyển phần trợ giúp viết cho EPOC
R5 thành cho Quartz và Crystal.
o tập tin cài đặt từ hệ thống cài đặt của Symbian. o App wizard
o GUI icon và application information file builder.
o Perl, ngôn ngữ scripting được dùng bởi rất nhiều công cụ.
Để xây dựng và debug chương trình bằng mày giả lập thì cần phải có Microsoft Visual C ++,version 6.0.
3.3.2 Phát triển ứng dụng bằng Java
Mã nguồn cho 1 project viết bằng Java bao gồm: o Java source file( .java)
o Các tập tin cần thiết cho việc xác định ứng dụng sẽ được cài đặt như thế nào ( .app, .txt)
o Sử dụng JavaDoc cho việc documeting APIs và implemention.
SDK của cả Quartz và Crystal của Symbian cung cấp các công cụ để xây dựng chương trình bằng Java:
o batch files để xây dựng các tập tin JAR cho các máy giả lập. o GUIicon và application information file builder.
o GUI icon và application information file builder, như trong C++, nhưng có hổ trợ riêng cho các yêu cầu của Javạ
o tập tin cài đặt từ hệ thống cài đặt của Symbian.
Để xây dựng và debug chương trình bằng mày giả lập thì cần phải có môi trường lập trình Java chuẩn. Còn để phát triển và debug bằng phương pháp Java nguyên thủy cần có SDK của Quarzt hay Crystal C++: SDKs cho Java bao gồm phần bổ
KHOA CNTT –
ĐH KHTN
49 sung C++ SDKs chứa phần hổ trợ cho build-time của phương phát Java nguyên thủỵ Ta vẫn có thể dùng thư viện của Java mà không cần SDKs của C++.
Ngoài ra, SDKs của quarzt và Crystal cung cấp hổ trợđầy đủ cho việc xây dựng các ứng dụng.
3.3.3 Phát triển ứng dụng bằng WAP và HTML:
Cũng có thể nhưng rất hiếm khi dùng 2 ngôn ngữ này để xây dựng phần mềm trên HDH Symbian.Cách làm cũng giống như C++ và Java:
o viết trang HTML hay WML
o sao chép những trang này đến thư mục thích hợp trong máy giả lập. o dùng ứng dụng WAP hay WEB trên mày giả lập để biên dịch các
trang nàỵ
o sửa lại cho thật đúng và biên dịch những trang này trên máy giả lập. o dùng hệ thống cài đặt để cài đặt những trang này trên thiết bị thật. Thường thì người ta phát triển nội dung HTML và Wap bằng server và sau đó biên dịch trên thiết bị thật. Các thiết bị dùng HDH Symbian, và máy giả lập đều có thể nối mạng nội bộ với nhau bằng cách dùng Windows NT Remote Access Services (RAS), để giảm bớt giá thành kiểm tra và tăng tốc độ kiểm tra lên.
KHOA CNTT –
ĐH KHTN
50
Chương 4 Xây dựng ứng dụng VNSmartType
4.1 Giới thiệu
Ý tưởng : Như đã đề cập ở chương 1, với các thiết bị cầm tay thông minh như Pocket PC, smartphone nói chung, hệ điều hành Symbian 6.0 và Nokia 9210 nói riêng dường như chưa có một ứng dụng hỗ trợ soạn thảo Tiếng Việt hoàn chỉnh. Một bộ gõ Tiếng Việt, một số chức năng sao cho gõ soạn thảo nhanh chóng tiện lợi đối với những người sử dụng dạng điện thoại Crystal3 vẫn còn là điều mơước. Với các phím bấm tương đối nhỏ, soạn thảo không thể nhanh, việc có các chức năng hỗ trợ quả là rất quý giá và tiện lợi vô cùng. Đó là những ý tưởng ban đầu để hình thành nên VNSmartType. Một bộ gõ Tiếng Việt hoàn chỉnh, không những thế mà còn là một công cụ hỗ trợ soạn thảo đa dụng, dường như bạn không cần phải gõ từng chữ một với nhiều dấu rườm rà phức tạp vốn là đặc thù của Tiếng Việt.
4.2 Các chức năng
Trước hết VNSmartType phải là một bộ gõ tiếng việt, tương tự như Vietkey hay Unikey trên PC. Với vai trò là “một bộ gõ tiếng Việt”, VNSmartType phải hỗ trợ các kiểu gõ tiếng Việt khác nhau như chúng ta đã biết trên PC, đó là 3 kiểu gõ thông dụng nhất hiện nay4:
VNI TELEX VIQR
Và hỗ trợ toàn bộ bằng bảng mã Unicode (đây có thể xem là một trong những đặc tính mạnh mẽ của hệ điều hành Symbian 6.0). Với 3 kiểu gõ thông dụng này hầu
3 Dạng điện thoại có phần cứng tương tự máy tính cá nhân
4
KHOA CNTT –
ĐH KHTN
51 nhưđã đáp ứng nhu cầu của người dùng, đặc biệt cho người dùng cảm giác gần gũi với chiếc máy tính cá nhân quen thuộc.
Tuy nhiên, không phải không có những trở ngại, chúng ta hãy xem lại hình minh hoạ sau đây :
Hình 4-1 DTĐ Nokia 9210
Dễ dàng nhận thấy với Nokia 9210, sự hạn chế về các thiết bị là rất rõ ràng: bàn phím nhỏ, khó bấm, một số nút để soạn thảo nhanh trong PC bị lược bỏ, chính vì vậy dù đã hỗ trợ soạn thảo tiếng Việt khá hoàn chỉnh thì người dùng vẫn cảm thấy thật sự khó khăn khi thao tác. Chính vì vậy, một bộ gõ tiếng Việt cũng chưa thể khắc phục những hạn chế mà thiết bịđem lại cho người dùng. Vậy chúng ta cần gì ? Chúng ta cần một chức năng có khả năng tự động hoàn chỉnh từ khi chúng ta chỉ đánh một vài từđầu tiên (AutoComplete). Ví dụ chỉ cần đánh từ “ph” sẽ cho chúng ta một loạt các từ bắt đầu bằng “ph” như “phở gà”, ”phong thuỷ”, ”phương án”, ”phi vật thể”, ”phiếu thu tiền”…, và chỉ cần nhấn một phím, ta sẽ có được từ mình mong muốn.
KHOA CNTT –
ĐH KHTN
52 Chúng ta cần một chức năng có thể viết ra một từ thật dài mà ta thường hay dùng khi ta chỉ đánh một từ tắt của nó(AutoCorrect), ví dụ chúng ta chỉ cần đánh “it” lập tức cụm từ “dài ngoằn nghèo” “information technology” hay “Công nghệ thông tin” sẽ xuất hiện.
Nhận xét : Với 2 chức năng trên, chúng ta cảm thấy vô cùng tiện lợi và không cần phải gõ quá nhiều, việc này có ý nghĩa thật quan trọng trong thời đại công nghệ hiện nay khi công việc luôn dồn dập cấp bách và cần sự ngắn gọn, tiện lợi, nhanh chóng. Tiến xa hơn một bước, với Tiếng Việt chúng ta thường mất công bỏ các loại dấu khác nhau như huyền, sắc, ngã, hỏi, nặng… Việc ấy càng mất công khi thiết bị cầm tay vốn là quá nhỏ. Với AutoComplete và AutoCorrect chúng ta không cần đánh nhiều nhưng chúng ta cũng không thể lưu tất cả những từ của Tiếng Việt được, đó là chuyện không thể vì hạn chế về bộ nhớ xử lý….
Hai chức năng cơ bản trên chỉ hỗ trợ “những từ chúng ta thường dùng nhất”, xin nhắc lại “thường dùng nhất” mà thôi chúng ta không thể lạm dụng lưu quá nhiều từ sẽ dẫn tới xử lý chậm và tốn hao bộ nhớ.
Chính vì vậy VNSmartType hỗ trợ thêm chức năng “tự động thêm dấu văn bản” (Automatic Ađ Accents), đây là một chức năng khá thông minh, giúp chúng ta rất nhiều đặt biệt là khi có sự kết hợp với 2 chức năng hỗ trợ trên. Thử tượng tưởng thay vì chúng ta gõ “Cộng hoà xã hội chủ nghĩa Việt Nam” chúng ta chỉ cần gõ các chữ không dấu “Cong hoa xa hoi chu nghia Viet Nam” lập tức câu ấy sẽđược thêm các dấu Tiếng Việt nhanh chóng.
Có chức năng thêm dấu văn bản thì cũng phải có chức năng xoá dấu văn bản (Automatic Remove Accents), nhiều người nói rằng chức năng này vô lý quá, vì người Việt ai cũng muốn đọc văn bản có dấu chứ ai lại muốn đọc văn bản không dấu bao giờ !
Nhưng hãy nghĩ kỹ ! Với các đời điện thoại di động hiện nay, không phải máy nào cũng hỗ trợ Unicode, tức là rất nhiều máy không thể hiển thị tin nhắn Tiếng Việt, chính vì vậy nếu muốn gửi tin nhắn cho các loại máy khác nhau chúng ta nên có
KHOA CNTT –
ĐH KHTN
53 chức năng thêm dấu cũng như xoá dấu để các máy khác nhau đều nhận được tin nhắn đó. Càng quan trọng hơn nếu đó là một lời nhắn cấp bách !
Tóm lại : VNSmartType có các chức năng sau đây : - Bộ gõ Tiếng Việt hoàn chỉnh
- “Bộ tứ” chức năng hỗ trợ thông minh : o AutoComplete
o AutoCorrect
o Automatic Ađ Accents o Automatic Remove Accents
- Cùng với những chức năng người dùng khác như cho phép tìm, thêm xoá, sửa các từ trong list các từ của các chức năng…..
4.3 Kỹ thuật chạy nền (Background)
Trước hết, một bộ gõ tiếng Việt phải đáp ứng các yêu cầu cần thiết sau :
Chạy đồng thời với các chương trình khác, để bất cứđang ởứng dụng soạn thảo nào có hỗ trợ Unicode đều phát huy tác dụng được.
Bắt được phím bấm của các chương trình khác để từđó tuỳ biến xử lý hiển thị tiếng Việt.
Như vậy việc cần làm của chúng ta là phải tìm kiếm API hỗ trợ việc chạy đồng thời với các chương trình khác (nói ngắn gọn là chạy nền – chạy background) và tìm cách bắt tất cả các phím của các ứng dụng đồng thời với bộ gõ của chúng tạ
Việc chạy nền không quá khó khăn trong Symbian 6.0 vì hệđiều hành này đã hỗ trợ các API của lớp CAcitve được cụ thể hoá cho Dialog có tên là CancelDialog đã xây dựng sẵn. Đây là dialog được xây dựng kế thừa của lớp CActive, đối tượng được
KHOA CNTT –
ĐH KHTN
54
đóng gói để yêu cầu những dịch vụ không đồng bộ và để bắt tất cả các sự kiện. Sử dụng CancelDialog nhằm tạo thành 1 long running task dùng để chạy nền.
Đây là một hỗ trợ vô cùng ý nghĩa đối với người lập trình vì các API hỗ trợ trong Symbian đều rất khó khăn cho người lập trình vì tính phức tạp và khó thử nghiệm, vì thế việc có sẵn vài lớp và ứng dụng, nhất là những vấn đề liên quan đến tương tác người dùng là vô cùng quý giá.
Như vậy, chúng ta đã giải quyết được vấn đề thứ nhất là vấn đề chạy background nhờ sử dụng dialog có sẵn là CancelDialog của Symbian cung cấp.
4.4 Kỹ thuật bắt phím
Nhưđã nói ở trên, việc bắt các phím của các ứng dụng khác là yêu cầu bắt buộc của một bộ gõ tiếng Việt.
Symbian cung cấp một tập API phục vụ cho việc xen vào bắt các phím của các ứng dụng đang chạy, sử dụng cơ chế đồng hành của các tiến trình. Sau đây là một số khái niệm cũng như tổng quan một số lớp mà chúng ta sử dụng để xử lý bắt phím . (Chi tiết hơn xin tham khảo phần phụ lục).
Window Server Session
Khi một ứng dụng bắt đầu thì Symbian coi nhưđó là một session. Sesion này được quản lý bởi Window Server, do đó Window Server Session chính là nơi lưu trữ các thông tin về cửa sổ…Để lấy thông tin về cửa sổ ta có thể dùng các lớp thành viên của Window Server Client Side (tham khảo thêm trong SDK Documentation). Trong ví dụ này, chúng ta chỉ sử dụng lớp RWsSession và RWindowGroup.5
Window Group
Khi một session bắt đầu thì các cửa sổ được xem như là một Window Group. Để quản lý các thông tin này Symbian dùng lớp RWindowGroup.
KHOA CNTT –
ĐH KHTN
55
CActive, CActiveScheduler
Một đối tượng được quản lý trong scheduler được gọi là “active object” và lớp để biểu diễn đối tượng này là CActivẹ Để diễn tả cho bộđiều phối, Symbian cung cấp lớp CActiveScheduler6.
Cách bắt phím
Để bắt được phím đầu tiên ta phải lấy được bộ điều phối (scheduler) của Symbian. Sau đó ta thêm vào scheduler hàm xử lý để bắt tất cả sự kiện phím rồi xử lý. Việc này cũng tương tự như Hook trên Windows.Để bắt sự kiện phím ta làm những bước sau :
o Kết nối Window Server Session để lấy các thông tin về các cửa sổ. o Từ Window Server Session lấy Window Group.
o Từ Window Group ta sẽ “capture” các phím mà cần phải xử lý.
Sau các bước này, khi có sự kiện phím xảy ra mà phím này ta đang “capture” thì thông điệp này sẽđược gửi đến hàm xử lý. Sau đây là source code minh họa:
// Khai báo lớp CKeyboardScheduler để lấy bộ scheduler. class CKeyboardScheduler : public CActiveScheduler {
};
// Khai báo “active object” để chèn đối tượng này vào bộđiều phối (scheduler). class CLongProcess : public CActive
{ public: ….
KHOA CNTT – ĐH KHTN 56 // hàm chính dùng đểđăng ký và xử lý void ConstructL(); void RunL(); void CaptureASCIIiKey(); void CancelCaptureASCIIKey() ;….. private: …..
// các biến window server session, window group RWsSession iWs;
RWindowGroup iWg; ….
}
Sau đây là bản cài đặt hoàn chỉnh :
Void CLongProcess::ConstructL() { // con trỏđến bộđiều phối sẽ lấy được CKeyboardScheduler* runner; // Kết nối tới window server User::LeaveIfError(iWs.Connect());
KHOA CNTT –
ĐH KHTN
57 iWg=RWindowGroup(iWs);
// Tạo các thông số cần thiết cho window group
User::LeaveIfError(iWg.Construct((unsigned long)this,EFalse)); // “Capture” các phím cần thiết CaptureASCIIkeys(); // Lấy bộđiều phối hiện thời, nếu chưa có install mới if(!CActiveScheduler::Current()) { Runner=new CKeyboardScheduler(); if (Runner) CKeyboardScheduler::Install(Runner); } else Runner=(CKeyboardScheduler*)CActiveScheduler::Current(); // Thêm đối tượng của chúng ta vào bộđiều phốị
Runner->Ađ(this); } void CLongProcess::CaptureASCIIKey() { int ị j; // Các phím cần bắt từ FromKey->ToKey for (i=Fromkey;i<=Tokey;i++) { CapturedKeys[j]=iWg.CaptureKey(i,0,0);
KHOA CNTT –
ĐH KHTN
58 j++;
}
// bắt luôn 2 phím backspace và enter
CapturedKeys[j]=iWg.CaptureKey(8,0,0); j++;
CapturedKeys[j]=iWg.CaptureKey(13,0,0); }
void CLongProcess :: CancelCaptureASCIIKey() { int i; for(i=0;i<=NoOfCapturedKeys;i++) iWg.CancelCaptureKey(CapturedKeys[i]); } // Hàm xử lý khi có sự kiện xảy ra void CLongProcess:RunL() { TWsEvent iWsEvent; int rFocus; // Lấy thông tin của sự kiện iWs.GetEvent(iWsEvent); TInt eventType=iWsEvent.Type(); // lấy window đang được focus
KHOA CNTT – ĐH KHTN 59 rFocus=iWs.GetFocusWindowGroup(); // chỉ nhận sự kiện phím switch (eventType) { case EEventKey: // Đưa về sự kiện phím
TKeyEvent& key = *iWsEvent.Key();
// tạm thời giải phóng các phím để tránh gửi lặp lại CancelCaptureASCIIKey(); // Xử lý Xử lý tiếng việt-phần 4 // Kết thúc xử lý, bắt lại các phím CaptureASCIIkeys(); default: break; } // gửi yêu cầu nhận sự kiện iWs.EventReady(&iStatus);}
KHOA CNTT –
ĐH KHTN
60
4.5 Xử lý Tiếng Việt
Chúng ta đã chuẩn bị tất cả, 2 yêu cầu của một bộ gõ ta đã chuẩn bị xong, bây giờ việc còn lại là xử lý hiển thị tiếng Việt theo bảng mã Unicodẹ
Phần xử lý tiếng Việt sử dụng một số mảng để lưu trữ các ký tự tiếng Việt, các ký tự có thể làm thay đổi dấu của kí tự khác theo kiểu đánh Telex7 (các kiểu đánh khác cũng tương tự nhưng chỉ thay đổi các ký tự làm đổi dấu), và các mảng lưu các ký tự tiếng việt được phân loại theo dấu của nó.
_ToConvert_ch[NoToConvert]={'á,'Á,'d','D','é,'É,'ó,'Ó,'ú,'Ú,'[',']','f','F','j','J','r','R', 's','S','x','X','z','w','W'};
Mảng vietchars gồm các ký tự: a, â, ă, e, ê, i, o, ô, ơ, u, ư, y; A, Â, Ă, E, Ê, I, O, Ô, Ơ, U, Ư, Y
int _vietchars[24]= { 97, 226, 259, 101, 234, 105, 111, 244, 417, 117, 432, 121, 65, 194, 258, 69, 202, 73, 79, 212, 416, 85, 431, 89};
Mảng vietsac gồm các ký tự: cũng gồm các ký ở trên nhưng có thêm dấu sắc int _vietsac[24]= { 225, 7845, 7855, 233, 7871, 237, 243, 7889, 7899, 250, 7913, 253, 193, 7844, 7854, 201, 7870, 205, 211, 7888, 7898, 218, 7912, 221};
Mảng viethuyen gồm các ký tự: cũng gồm các ký ở trên nhưng có thêm dấu huyền