Symbian OS中的訊息儲存與常用操作

2021-04-02 11:06:54 字數 4830 閱讀 2294

說明:前面訊息的基本知識主要參考《series60應用程式開發》中的有關內容,後面是前段做mtm開發中用到的**。

一、訊息儲存基本知識

symbian os

提供的訊息傳送架構基於

client/server

機制,伺服器負責管理手機上的各種訊息,在進行訊息相關操作之前我們需要了解

symbian os

是如何組織和儲存訊息的。

手機中的各種訊息都是以資料項(

entry

)形式供程式操作,資料項有

4種型別,

symbianos

為每種資料項提供了相應的常量標識

uid,這些

uid儲存在

msvuids.h

檔案中:

ø資料夾型別

,,對應常量

uid為

kuidmsvfolderentry

,和pc

上的檔案系統一樣,每個資料夾可以包含其它資料項也可能是其它資料項的子資料項。

ø訊息型別,對應常量

uid為

kuidmsvmessageentry

,它表示該資料項是一條訊息。

ø附件型別,對應常量

uid為

kuidmsvattachmententry

,它表示該資料項是某條資訊的附件。

ø服務型別,對應常量

uid為

kuidmsvserviceentry

,服務資料項包含某個訊息服務的配置資訊,在一般情況還擁有通過該服務收發的訊息資料項。

除了上面提到的四種型別

uid還有常用到的

uid是

kuidmsvrootentry

(msvids.h

),它指的是根資料項,根資料項包含了

4個標準資料夾資料項,分別是收件箱(

kmsvglobalinboxindexentryid

)、發件箱(

kmsvglobaloutboxindexentryid

)、草稿箱(

kmsvdraftentryid

)和已傳送項(

kmsvsententryid

),另外根資料項下面還包含有各種訊息服務的服務項,

symbian os

中訊息儲存如下圖所示:

symbian os

中的訊息伺服器負責儲存各種型別的資料項,這裡有兩個基本概念需要了解:訊息儲存和訊息索引。訊息儲存儲存了資料項的資料,儲存的資料格式取決於訊息服務,服務資料項使用訊息儲存儲存服務配置資訊,資料夾資料項不使用訊息儲存,

symbian

提供了cmsvstore

類來訪問資料項的訊息儲存;為了節省記憶體和快速檢索訊息,訊息伺服器把資料項的一些概要資訊(標題,日期,型別,

id等)寫到訊息索引中,當訊息伺服器啟動時將索引裝載到

ram中直到訊息伺服器關閉,

symbian

提供了tmsventry

類表示資料項的索引。

操作訊息常用的類和資料型別:

cmsvsession

cmsvsession

表示客戶端與訊息伺服器的會話,會用到它獲得下面將要提到的

cmsventry

上下文物件。

tmsvid

它只是乙個

tint32

的typedef

,訊息伺服器為每個資料項分配乙個惟一的數值做為標識,除了上面提到的幾個固定的標識,其它的標識都是動態分配的。想要對某個訊息進行操作必須先得到它的id,

symbian

中訊息相關的大部分函式都會用到

tmsvid

。tmsventry

上面已經提到過了它表示資料項的索引,只包含訊息的一些概要資訊,主要會用到

id()

成員函式得到資料項的標識

id和公有資料成員

idetails

、idescription

和idate

,前面兩個成員可以用來獲取和設定索引的概要資訊,

idate

成員可以獲取和設定資料項的日期及時間。

cmsventry

和cmsvserverentry

cmsventry

和cmsvserverentry

可以理解為資料項的上下文(

context

),這兩個類非常類似,只不過

cmsventry

用於客戶端,

cmsvserverentry

用於實現訊息的伺服器端,它提供了運算元據項的各種介面,可以根據指定

id定位資料項、獲得訊息儲存和訊息索引。

cmsvstore

上面已經提到過它表示資料項的儲存,可以通過

cmsventry

(cmsvserverentry

)的editstorel()

,readstorel()

函式取得可編輯儲存或唯讀儲存。

cmsventryselection

cmsventryselection

是乙個可以儲存

tmsvid

的陣列,在使用

cmsventry

(cmsvserverentry

)的許多操作中都會做為引數或者返回物件。

二、資料項常用操作

下面的訊息操作使用了乙個

cmsventry

或cmsvserverentry

的指標物件,這兩個類提供的功能基本一樣,但有一部分函式名會不一樣,可以查一下

sdk。

1.獲得當前資料項索引和

idtmsventry oldentry = iserverentry->entry();

tmsvid oldcontext = oldentry.id(); //

如果使用

cmsventry

可以直接使用

entryid()

2.定位到指定資料項

在更換當前資料項之前通常先儲存當前資料項索引

id,更換資料項並完成相關操作後再更換回原來的資料項,這可以避免影響其它函式,是乙個很好的習慣。

tmsvid oldcontext = iserverentry->entry().id();

//使用

setentry

()更換當前資料項到

root

iserverentry->setentry(kmsvrootindexentryid);

//具體操作後更換回原來資料項

iserverentry->setentry(oldcontext);

3.查詢資料項

下面的三個

cmsventry

成員函式都能完成在當前資料項下進行查詢的功能:

cmsventryselection* childrenwithmtml(tuid amtm) const;

根據訊息服務(

mtm)進行查詢,查詢訊息索引物件(

tmsventry

)的成員

imtm

等於amtm

的資料項id。

cmsventryselection* childrenwithservicel(tmsvid aid) const;

根據訊息服務

id進行查詢,查詢訊息索引物件(

tmsventry

)的成員

iserviceid

等於aid

的資料項id。

cmsventryselection* childrenwithtypel(tuid aentrytype) const;

根據資料項型別進行查詢,查詢訊息索引對角的(

tmsventry

)的成員

itype

等於aentrytype

的資料項id。

cmsvserverentry

與之相對應的三個函式為

getchildrenwithmtm(), getchildrenwithservice(), getchildrenwithtype(),

注意的一點是

cmsventry

的三個函式都返回乙個

cmsventryselection

物件的指標,使用完之後我們要負責釋放,使用

cmsvserverentry

的三個函式需要事先構造乙個

cmsventryselection

物件,用完之後也需要釋放。

找出pop3

郵箱個數的**

imsventry->setentryl( kuidmsgtypepop3 );

cmsventryselection* sel = null;

sel = entry->childrenwithmtml( kpki**tptechnologytypeuid );

tint cnt = sel->count();//

獲得集合中資料項的個數

delete sel;

4.更改訊息索引

tmsventry entry = imsventry->entry();

entry.idetails.set( _l( 「new details」 ) );

imsventry->changel( entry );//

把更改後的資料項索引寫回訊息索引中去

5.資料項的讀寫

在進行資料項的讀寫之前需要使用

editstorel()

,readstorel()

函式得到相應的儲存

cmsvstore

通過它提供的介面進行操作。

void cmessageview::viewmessagel(tmsvid aid)

Symbian OS中的binary檔案

前幾日,此文章寫到一半的時候,按儲存鍵,然後發表,發現竟是空白。進入編輯模式後,回滾也沒有效果,搞得興致全無,我對csdn的blog的編輯器印象分大跌。閒言少敘,書說正題。和windows系統一樣,symbian os也是用exe做為其可執行程式的副檔名。但是與windows exe檔案的pe結構不...

訊息佇列的儲存

kafka的儲存以partition為單位,每個partition包含一組訊息檔案 segment file 和一組索引檔案 index 並且訊息檔案和索引檔案一一對應,具有相同的檔名 副檔名不同 檔名就是這個檔案中第一條訊息的索引序號 每個索引中儲存索引序號 這條訊息在這個分割槽中的第幾條訊息 和...

訊息佇列的儲存

在先後使用scanner類中,nextint與nextline方法讀取資訊時,先使用nextint後使用nextline時就會發生問題 nextline並沒有產生阻塞效果,直接過去了。基於兩種方法的具體使用進行說明 圖一是nextline方法在使用時,會進行整行的讀取,以回車符截止,會將讀取到的所有...