Trên Symbian chuỗi được biết và cài đặt dưới các descriptor thay vì string như trên C/C++ chuẩn hay Java. Chúng được cài đặt qua các lớp khác nhau mang lại sự tiện lợi như trên C++ chuẩn hay Java. Nhưng khác với C++ chuẩn và Java vốn dùng trên PC, chuỗi trên Symbian đã được quản lý theo phong cách mới để phù hợp với bộ nhớ nhỏ trên điện thoại Symbian. Ngoài ra descriptor có thể dùng để lưu trữ các dữ liệu nhị phân.
Các loại descriptor : Trên Symbian, chuỗi được cài đặt trong các loại descriptor sau : + Abstract descriptor. + Pointer descriptor. + Buffer descriptor. + Heap descriptor. + Literal descriptor
Abstract descriptor: Symbian cung cấp 2 lớp TDesC và TDes để biểu diễn chuỗi.
- TDesC là một descriptor hằng, không thể thay đổi nội dung được. Nó có một địa chỉ và một chiều dài. Với TDesC, chúng ta có thể thao tác chuỗi qua các hàm mà nó cung cấp nhưng không thể thay đổi được dữ liệu.
- TDes là một descriptor có thể sửa đổi dữ liệu được. Ngoài các thuộc tính kế thừa từ TDesC, nó có một độ dài tối đa cho phép dữ liệu được mở rộng, nối, cắt trong giới hạn của chiều dài tối đa. TDes cung cấp đầy đủ các hàm thao tác chuỗi, kể cả các hàm sửa đổi chuỗi mà trên TDesC không có.
Hai lớp này cung cấp nhiều hàm để thao tác với chuỗi, tất cả các descriptor còn lại đều kế thừa từ abstract descriptor qua 2 lớp này.
Pointer descriptor : Đây là một loại descriptor mà dữ liệu của nó do một descriptor khác lưu giữ, có thể là trên heap, stack hay trên ROM. Gồm có hai loại như sau :
- TPtrC kế thừa từ TDesC, nó chỉ có chiều dài và địa chỉ, nên chỉ mất 2 từ nhớ 32 bit (8 byte).
Tìm hiểu công nghệ Bluetooth và viết ứng dụng minh họa
- TPtr kế thừa từ TDes, nó được dùng để mô tả một vùng đệm (buffer) trên heap với một thuộc tính độ dài tối đa được thêm vào.
Hình 6-1 Mô hình đối tượng TPtrC và TPtr
TPtrC và TPtr gần giống như conts char* và char* trên C, nhưng trong bản thân nó đã có chiều dài, không cần phải quét tìm ký tự kết thúc như trên C.
Sử dụng poiter descriptor : _LIT(KExample,"Example"); TPtrC examPtr(KExample); TPtr examPtr(KExample);
Buffer descriptor : Cũng gồm có 2 lớp là TBufC<n> và TBuf<n>, chứa dữ liệu ngay trong chúng, lưu trữ trong ngăn xếp stack, tương tự như char[] trong C, đối số n ở đây chính là khai báo chiều dài tối đa của chuỗi.
Tìm hiểu công nghệ Bluetooth và viết ứng dụng minh họa
Hình 6-2 Mô hình đối tượng TBufC và TBuf
Các descriptor này sử dụng cơ chế mẫu (template) trong C++ với tham số là một số nguyên để mô tả chiều dài.
Sử dụng Buffer Descriptor : _LIT(KExample,"Example"); TBufC <7> examStack(KExample); hoặc
TBuf <7> examStack(KExample);
Lưu ý: do kích thước stack cấp cho một ứng dụng là rất nhỏ nên chuỗi cấp trên stack cũng chỉ nên cấp cho các chuỗi nhỏ, thường dưới 128 byte, nếu lớn hơn nên cấp trên heap.
Heap descriptor : Lớp cài đặt : HBufC.
Tìm hiểu công nghệ Bluetooth và viết ứng dụng minh họa
HBufC chứa dữ liệu của chúng trong các ô trên heap. Điều này gần giống với (char*) malloc (length+1) trong C. Giống như trên C, loại này được dùng khi chúng ta không biết độ dài là bao nhiêu. Các buffer descriptor lưu trữ trên heap, chúng thường được tham khảo thông qua con trỏ HBufC* thay vì trực tiếp HBufC.
Sử dụng Heap descriptor : _LIT(KExample,"Example");
HBufC* examHeap = KExample().AllocLC(); Hay :
HBufC* iHelloBufC = HBufC::NewL(20); *iHelloBufC = KExample;
Literal descriptor : Đây là một loại descriptor hằng, gần giống như static char[] trên C. Chúng thường được dùng dưới dạng các macro gồm 3 dạng : _LIT, _L, và _S. Literal descriptor được dùng để tạo ra các hằng descriptor chứa các chuỗi.
• Macro _LIT : Khai báo như sau: _LIT(KHello,"Hello World");
Với khai báo như vậy, KHello được xem là tên 1 đối tượng TLITC16, nó sẽ chỉ đến một đoạn dữ liệu nhị phân của chương trình chứa nội dung cần lưu trữ, trong trường hợp này là chuỗi "Hello World". Lúc này thông qua tên đối tượng TLIT16 là KHello, ta có thể hoàn toàn sử dụng nó như là một descriptor hằng.
• Macro _L : Khai báo như sau : _L("Hello World");
Cũng giống như ở trên, với khai báo _L, một vùng dữ liệu trên file chương trình được dùng để chứa chuỗi khai báo, nhưng khác với ở trên, chúng không có tên, không có gì để nắm giữ, điều khiển chúng. Trong trường hợp này, hệ thống sẽ tạo một pointer descriptor là TPtrC trên stack tạm thờiđảm nhận việc kiểm soát và xử lý chuỗi dữ liệu này. Hiện nay, Symbian đã đề xuất
Tìm hiểu công nghệ Bluetooth và viết ứng dụng minh họa
bỏ kiểu khai báo này do tốn thêm stack cho đối tương tạm TPtr và chi phí khởi tạo nó. Tuy nhiên nhờ ưu điểm là giảm code lại khỏi phải đặt tên nên chúng vẫn thường được dùng với mục đích test. Ví dụ, một khi ứng dụng lỗi, để test xem có phải hàm này gây ra hay không, chúng ta có thể làm theo cách sau: ngay sau hàm nghi ngờ, chúng ta đặt hàm sau:
User::Infoprint(_L("Error here !"); Thay vì phải viết :
_LIT(KMsg,”Error here!”); User::Infoprint(KMsg);
• Macro _S : cũng gần giống như macro _L, tuy nhiên nó không yêu cầu tao đối tượng tạm TPtr mà sẽ cho phép sử dụng chuỗi trực tiếp như trên C.
Tìm hiểu công nghệ Bluetooth và viết ứng dụng minh họa
Hình 6-4 Sơđồ hệ thống các descriptor