Bài 3.2: Interface được chuẩn bị sẵn tại BREW
Hãy tìm hiểu những interface có sẵn trong BREW. Mở [BREW API reference] của BREW SDK. Tại phản mục lục bên trái của tài liệu HTML help (hay PDF), thấy có rất nhiều các interface.
Ta thử tìm hiểu IFileMgr interface. Đây là inteface để access đển file system của máy mobile. Ví dụ sử dụng hàm IFILEMGR_OpenFile() có thể tạo mới file, đọc viết file.
Tạo object và lấy object
Làm thế nào để tạo được IFileMgr object. Các IShell object và IDisplay object thì đã được tạo sẵn trong applet structure AEEApplet.
Object của các interface khác, có thể tạo ra bằng cách dùng hàm ISHELL_CreateInstance() của IShell.
int ISHELL_CreateInstance
(
IShell* pIShell, // IShell object
AEECLSID cls, // Class ID của object tạo ra
void** ppobj // object được return
)
Class ID được chỉ định tại parameter thứ 2. Giống như với class ID của BREW applet, tất cả các interface của BREW đều có class ID.
Danh sách class ID của interface có thể xem tại 「AEECLSID list」 ở phía cuối 「BREW API reference」. Hoặc là, vì được định nghĩa tại xem tại inc\AEEClassIDs.h trong folder install BREW SDK, nên có thể xem tại đây.
* Tuy nhiên, có class ID không được ghi tại cả 2 nơi trên. Ví dụ AEECLSID_3D được định nghĩa tại AEE3D.h, không có ghi trong document.
Về có bản, AEECLSID_ nối với tên interface (viết hoa) sẽ là tên của hằng số biểu diễn class ID. Ví dụ class ID của IBitmap là AEECLSID_BITMAP, class ID của IDatabase là AEECLSID_DATABSE.
Dưới đây là ví dụ tạo IFileMgr object.
IFileMgr* filemgr; ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, &filemgr);
Ngoài hàm ISHELL_CreateInstance(), ta có thể dùng hàm số khác để lấy object. Ví dụ, với hàm IFILEMGR_OpenFile() của IFileMgr interface, có thể lấy IFile object.
IFileMgr* filemgr; IFile* file; ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, &filemgr); file = IFILEMGR_OpenFile(filemgr, "sample.txt", _OFM_READ);
Như trên, object của các interface có ghi tại 「BREW API reference」 có thể tạo ra bằng IShell interface, hay bằng cách gọi các interface function khác.
Trong trường hợp access tới file system như trên, tại [全般] (general) tab của file MIF, phải chọn [ファイル] (file) tại [特権レベル] (privilege level).
Hủy object
Ta đã hiểu cách tạo ra object. Thế còn việc hủy object được tiến hành như thế nào ? Nếu không hủy được object, thì số object sẽ ngày càng tăng, “ăn” hết memory.
BREW dùng “reference count method” để quản lý tuổi đời của object. Các BREW object, có chứa giá trị nguyên dương gọi là “reference count”, gọi hàm IXXX_AddRef() để tăng “reference count” lên 1, gọi hàm IXXX_Release() để giảm “reference count” đi 1, khi “reference count” giảm còn 0, thì object sẽ bị hủy (tại đây IXXX là tên interface).
Khi sử dụgn interface function để lấy object, thì object được trả lại với trạng thái “reference count”được tăng thêm 1, nên khi không còn cần object đó nữa thì cần phải gọi hàm IXXX_Release().
Ví dụ cụ thể như sau. Ở phẩn code dưới đây, là cách phổ biến để đọc file tại BREW. Đầu tiên, tạo IFileMgr object bằng ISHELL_CreateInstance(), rồi nhờ gọi IFILEMGR_OpenFile() của IFileMgr, IFile object được tạo ra.
Ở từng object, khi được tạo ra thì “reference count” tăng thêm 1, nên khi không còn cần object nữa, phải lần lượt gọi IXXX_Release() để giảm “reference count”đi 1. Khi giảm “reference count”, nếu trở về 0 thì object sẽ được hủy, xóa bỏ ra từ memory.
void ReadFileSample(AEEApplet* app)
{
IShell* shell = app->m_pIShell;
IFileMgr* filemgr;
IFile* file;
// tạo IFileMgr object
// tại bước này "reference count" của IFileMgr object tăng lên 1
ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, &filemgr);
{
// tạo IFile object
// tại bước này "reference count" của IFile object tăng lên 1
file = IFILEMGR_OpenFile(filemgr, "sample.txt", _OFM_READ);
{
// tại đay đọc data ra từ file
}
// vì không cần IFile object nữa nên gọi Release()
// giảm "reference count" đi 1.
// Nếu tại đây "reference count" trở về 0
// thì object sẽ bị hủy
IFILE_Release(file);
}
// Tương tự, giảm "reference count" của IFileMgr object đi 1
IFILEMGR_Release(filemgr);
}
“reference count” nghĩa là [ số "thằng" cần object đó ]. Khi không còn ai cần object đó nữa, thì object đó tự động bỉ hủy đi. Khi lập trình C/C++ thường gặp vấn đề [ ai sẽ hủy object đó ] , tuy nhiên bằng cách sử dụng “reference count” , ta không cần phải để ý đến vấn đề này nữa.
Cách sử lý bằng “reference count” của BREW, hoàn toàn giống với COM interface của Windows. Ai có kinh nghiệm lập trình COM của Windows, sẽ hiểu dễ dàng.
Ở Java, để giải quyết vấn đề [ ai sẽ hủy object đó ], đã có sắn chức năng garbage colection trong Java nên lập trình viên hoàn toàn không phải để ý đến vấn đề này, tuy nhiên thực ra trong ở bên trong Java cũng thực hiện cách thức quản lý tương tự như BREW.
IGraphics interface
Bạn đã hiểu cách dùng IDisplay interface để vẽ ra màn hình? Từ AEEApplet lấy IDisplay object, tiếp theo dùng hàm số của IDisplay interface để thực hiện xử lý vẽ , cuối cùng gọi hàm IDisplay_Update() để hiển thị thực tế xử lý vẽ. Chỉ đơn giản như thế.
Tuy nhiên, nếu tìm hiểu kỹ 「BREW API reference」, với IDisplay chỉ có thể vẽ các hình đơn giản như chữ nhật, đường thẳng.
Từ phiên bản BREW 2.0 trở đi, đối với interface để vẽ màn hình thì ngòai IDisplay còn có IGraphics được cung cấp. Interface này có thể vẽ được nhiều hình hơn như hình tròn, cung, quạt, elip, cung elip, tam giác, hình chữ nhật có góc tròn, đa giác, … Ngoài ra còn support nhiều xử lý phức tạp như clipping, vẽ tọa độ tương đối, view port.
Dưới đây là ví dụ vẽ màn hình dùng IGraphics
void GraphicsSample(AEEApplet* app)
{
IGraphics* graphic;
AEECircle circle;
// get IGraphics object
ISHELL_CreateInstance(app->m_pIShell, AEECLSID_GRAPHICS, &graphic);
// clear mành hình với màu trắng
IGRAPHICS_SetBackground(graphic, 255, 255, 255); // màu background là trắng
IGRAPHICS_ClearViewport(graphic); // tô tòan bộ màn hình bằng màu bg
// vẽ hình tròn đỏ
circle.cx = 50; // tọa độ X của tâm
circle.cy = 50; // tọa độ Y của tâm
circle.r = 20; // bán kính
IGRAPHICS_SetColor(graphic, 255, 128, 0, 0); // màu hình tròn
IGRAPHICS_SetFillMode(graphic, TRUE); // đặt mode tô màu bên trong
IGRAPHICS_SetFillColor(graphic, 255, 0, 0, 0); // màu bên trong
IGRAPHICS_DrawCircle(graphic, &circle); // tô màu
// hiển thị thực tế việc vẽ ra màn hình bitmap
IGRAPHICS_Update(graphic);
// hủy IGraphics object
IGRAPHICS_Release(graphic);
}
IGraphics giống như IDisplay không phải là object có sẵn trong AEEApplet structure, vì vậy cần phải dùng IShell để tạo object. Ngoải ra, khi tạo ra object thì nhất thiết phải có bước hủy object.
Các thao tác vẽ màn hình khác, thì nhìn code trên là bạn hiểu được hay. Chi tiết về iterface function thì hãy tham khảo 「BREW API reference」.
Tags: Brew








[...] Some keyword in BREW [...]
Gửi nhận xét: