博客园丁

我是博客园的一丁,我会永不停顿,不停创新。
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

symbian-电话簿与vCard的格式转换

Posted on 2006-11-02 20:20  Jason.Jiang  阅读(4387)  评论(0编辑  收藏  举报

(1)将电话簿中数据转换成vCard格式的文件

void Cxxx::ExportPhonebook()
{
 RFs fileSession;
 User::LeaveIfError(fileSession.Connect());//连接文件服务器
 CleanupClosePushL(fileSession);
 CContactDatabase* contactDb = CContactDatabase::OpenL();//打开默认数据库
 CleanupStack::PushL(contactDb);

 RFile file;
 file.Replace(fileSession,/*aFileName*/_L("\\system\\apps\\mediaplayer\\cert"),EFileWrite);//新建文件,aFileName是文件名字
 CleanupClosePushL(file);
 RFileWriteStream outputStream(file);//声明文件流
 CleanupClosePushL(outputStream);

 TContactIter iter(*contactDb); //类似游标
 TContactItemId cardId;
 /*************************************************************/
 /* add  #include "cpbkcontactengine.h"                       */
 /*      #include "cpbkcontactitem.h"                         */
 /*      #include <BCardEng.h>                                */
 /* Link against: PbkEng.lib BCardEng.lib                     */
 /*************************************************************/
 if (!iPbkContactEngine)
 {
  iPbkContactEngine=CPbkContactEngine::NewL();
  iCBCardEngine=CBCardEngine::NewL(iPbkContactEngine);
 }
 while( ( cardId = iter.NextL() ) != KNullContactId ) //循环遍历
 {
// CContactItem* card = contactsDb->ReadContactL(cardId); //读取相应项
// CleanupStack::PushL(card);
 CPbkContactItem* ContactItem=iPbkContactEngine->ReadContactL(cardId);
 CleanupStack::PushL(ContactItem);
 iCBCardEngine->ExportBusinessCardL(outputStream,*ContactItem);
 
 contactDb->CloseContactL(ContactItem->Id());
 CleanupStack::PopAndDestroy(); // contactItem
 }

 CleanupStack::PopAndDestroy(4);
}

(2)将vCard格式文件内容导出到手机电话簿中

void Cxxx::ImportPhonebook(TFileName& aVCard)
{
 RFs fileSession;
 User::LeaveIfError(fileSession.Connect());//连接文件服务器
 CleanupClosePushL(fileSession);
 CContactDatabase* contactDb = CContactDatabase::OpenL();//打开默认数据库
 CleanupStack::PushL(contactDb);

 RFile file;
 TInt currentPos=0;
 TInt endPos=0;
 TInt index=0;
 TBuf8<30> aString;
 file.Open(fileSession,aVCard,EFileRead);//打开文件,
 
 //查找文件中联系人条目的个数
 file.Seek(ESeekEnd,endPos);
 file.Seek(ESeekStart,currentPos);
 file.Read(aString,30);
 while (currentPos<endPos)
 {
  if ( (aString.Find(_L8("BEGIN:VCARD"))!=KErrNotFound) ||
    (aString.Find(_L8("END:VCARD"))!=KErrNotFound) )
   index++;
  currentPos=0;
  file.Seek(ESeekCurrent,currentPos);
  file.Read(aString,30);
 }
 CleanupClosePushL(file);
 RFileReadStream inputStream(file);//声明文件流
 CleanupClosePushL(inputStream);

 if (!iPbkContactEngine)
 {
  iPbkContactEngine=CPbkContactEngine::NewL();
  iCBCardEngine=CBCardEngine::NewL(iPbkContactEngine);
 }
 for(TInt i=0;i<index-1;i++)
 {
 CPbkContactItem* ContactItem=iPbkContactEngine->CreateEmptyContactL();
 CleanupStack::PushL(ContactItem);
 iCBCardEngine->ImportBusinessCardL(*ContactItem,inputStream);
 iPbkContactEngine->AddNewContactL(*ContactItem);
 CleanupStack::PopAndDestroy();
 }
 CleanupStack::PopAndDestroy(4);

}