如何创建自己的的message Folder

本文介绍了Symbian系统中的短信管理系统,包括短信的组织结构、索引方式及实际存储等关键技术点,并提供了如何在系统中创建自定义文件夹的具体步骤。

            symbian messing system 简介

 

    1   在symbian系统中,短信息有一个一个的entry组成,每个entry都有一个唯一的ID,通常用TMsvId 类型表示 。一个entry可以为四种类型  (1)    folder   ( 2) message  (3) attachment  (4 ) a service entry 


  2  一个entry 可以包含其他的entry ,当然自己也可以为另一个entry的子entry , 这就形成了一个和文件系统类似的树结构系统。


   3 其中树的根节点为  RootIndexEntry    在树节点下有四个 子节点 ,分别为 Inbox , OutBox , Draft  , SentBox 就是我们常用的收件箱,发件箱,草稿箱,等等。

  

4   service entry 是一类特殊的entry ,包含许多特殊的信息如 (1) 服务 (2)账号 。 通常只有一个。 但是也可以由多个,比如每一个email entry 都有一个service entry都有一个sevice entry ,MMS entry 也有多个,但是sms通常只有一个。

 


                                      二 信息索引  


    1   messing server 通常维护一个对各种信息通用的entry索引,当服务器运行的时候,索引被读入内存,只有当系统出现故障的时候才把索引放到文件存储中。   索引中存储的只是每个消息的轻量级信息,诸如大小,日期 ,类型等等。 这样就能快速的得到每个entry的概要信息 ,从而使收件箱快速的展示每一串短信,TMsvEntry 就是表示上述索引的类。

 

                                        三实际存储

 

在messaging system 中每个entry都有一个实际存储,这个实际的存储就有了类型的差别。通常每个message entry 用这个实际存储来存储消息的正文和消息头。而service entry 则存储配置信息,附件也存储在这个entry中,通常用CMsvStore来表示这个这个存储。

                             

通常通过CMsvSession 的GetEntryL(TMsvId aEntryId); 来获得CMsvEntry 的引用,例如你要是想得到rootentry ,那么你就需要传递KMsvRootIndexId (在MSCIDS.h)中定义 。

 

                                          四 在messaging system中增加自己定义的folder

 

 

 

 这种自己定义的文件夹和收件箱,草稿箱,发送箱是一个等级的。方法如下(找了好久才找到的):

   

      在msvids.h 中增加以下一项

const TMsvId KMsvMyFoldersEntryId=KMsvMyFoldersEntryIdValue;

在msvstd.hrh中增加以下一项 
#define KMsvMyFoldersEntryIdValue 0x1008



TMsvId msvServId;
CMsvEntry * entry1 = NULL ;
CMsvEntry * rootEntry = NULL ;
CMsvEntry * entryRootService = NULL ;
 
TInt newFldrID = 0 ;
 
//Get the entry (whatever is passed in)
entry1 = iSmsMtm- > Session( ) .GetEntryL ( KMsvMyFoldersEntryIdValue) ; 自己定义的文件ID ,就是上述在系统头文件中修改的
CleanupStack:: PushL ( entry1) ;
 
if ( entry1)
{
msvServId = entry1- > OwningService( ) ; //得到父目录的ID
 
entryRootService = iSmsMtm- > Session( ) .GetEntryL ( msvServId) ; //这句不知道有什么用
CleanupStack:: PushL ( entryRootService) ;
 
rootEntry = iSmsMtm- > Session( ) .GetEntryL ( msvServId) ; //得到你要创建目录的父目录的CMsvEntry对象
CleanupStack:: PushL ( rootEntry) ;
 
rootEntry- > SetEntryL( KMsvMyFoldersEntryIdValue) ; // set to parent
 
TMsvEntry newServiceEntry;
TTime ttime;
ttime.HomeTime ( ) ;
newServiceEntry.iDate = ttime;
newServiceEntry.iSize = 0 ;
newServiceEntry.iType = KUidMsvFolderEntry;
newServiceEntry.iMtm = KUidMsvLocalServiceMtm;
newServiceEntry.iServiceId = iSmsMtm- > ServiceId( ) ;
newServiceEntry.iDetails .Set ( _L( "Wiki" ) ) ;
newServiceEntry.iDescription .Set ( KNullDesC) ;
newServiceEntry.SetVisible ( ETrue) ;
 
rootEntry- > CreateL( newServiceEntry) ; //在根目录下创建myFolder的 TMsvEntry的对象
newFldrID = newServiceEntry.Id ( ) ; //得到myFolder的TMsvId 的值
iNewFolderId= newFldrID;
CleanupStack:: PopAndDestroy ( ) ;
CleanupStack:: PopAndDestroy ( ) ;
}


上述就是基本的操作,淡然你最好就是在创建 的时候先查询一下 ,判断你要创建的文件名是否与系统已有文件冲突















 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

由于没有提供关于`workfolder.dll`的具体引用内容,以下为一般性的C#中使用动态链接库(DLL)的相关介绍。 ### 功能介绍 通常,DLL 文件包含了可被多个程序共享的代码和数据。`workfolder.dll`可能包含了与工作文件夹操作相关的功能,比如文件夹的创建、删除、文件的读写、文件夹路径的管理等。 ### 使用方法 在C#中使用`workfolder.dll`,一般有以下两种常见方式: #### 1. 使用 `DllImport` 特性(用于非托管 DLL) 如果`workfolder.dll`是一个非托管 DLL,可以使用`DllImport`特性来调用其中的函数。示例代码如下: ```csharp using System; using System.Runtime.InteropServices; class Program { // 假设 workfolder.dll 中有一个名为 DoWork 的函数 [DllImport("workfolder.dll")] public static extern int DoWork(); static void Main() { int result = DoWork(); Console.WriteLine($"Function returned: {result}"); } } ``` #### 2. 添加引用(用于托管 DLL) 如果`workfolder.dll`是一个托管 DLL,可以通过以下步骤添加引用: - 在 Visual Studio 中,右键点击项目,选择“添加” -> “引用”。 - 在“引用管理器”中,选择“浏览”,找到`workfolder.dll`文件并添加。 - 在代码中使用`using`语句引入命名空间,然后就可以使用其中的类和方法了。示例代码如下: ```csharp using WorkFolderNamespace; // 假设命名空间为 WorkFolderNamespace class Program { static void Main() { // 假设 WorkFolderClass 是 workfolder.dll 中的一个类 WorkFolderClass workFolder = new WorkFolderClass(); workFolder.SomeMethod(); } } ``` ### 错误处理 在使用`workfolder.dll`时,可能会遇到各种错误,以下是一些常见的错误处理方法: #### 1. 加载 DLL 失败 如果在使用`DllImport`时无法加载 DLL,可能会抛出`DllNotFoundException`异常。可以使用`try-catch`块来捕获并处理该异常: ```csharp try { int result = DoWork(); Console.WriteLine($"Function returned: {result}"); } catch (DllNotFoundException ex) { Console.WriteLine($"Failed to load workfolder.dll: {ex.Message}"); } ``` #### 2. 调用方法失败 在调用 DLL 中的方法时,可能会抛出其他异常,比如`EntryPointNotFoundException`(找不到指定的入口点)等。同样可以使用`try-catch`块来捕获并处理这些异常: ```csharp try { WorkFolderClass workFolder = new WorkFolderClass(); workFolder.SomeMethod(); } catch (EntryPointNotFoundException ex) { Console.WriteLine($"Failed to call method: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"An error occurred: {ex.Message}"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值