#ifndef ___SERVERTOCLIENT__ #define ___SERVERTOCLIENT__ #include "spds/SyncItem.h" #include <cntdb.h> #include <badesca.h> #include <coecntrl.h> #include <CNTITEM.H> #include <cpbkcontactengine.h> #include <avkon.hrh> #include <CPbkContactItem.h> #include <avkon.hrh> #include <e32base.h> //#include "contactItem.h" #include "global.h" const TInt KMaxContactLength = 16384; const TInt KMaxDatabasePathAndNameLength = 60; const TInt KArraySize = 4; const TInt KFormattersSpace = 10; //_LIT(KListItemFormatter,"/t%S %S/t/t"); _LIT(KListOItemFormatter,"/t%S/t/t"); _LIT(KListItemFormatter,"%S,"); USE_NAMESPACE #pragma once class SymbianContact { public: void Release(); SymbianContact(); ~SymbianContact(); public: void deleteContactL(TInt aValue); //void ReadContactGroupsFromDbL(); void ReadContactsFromDbL(); void deleteAllContactL(); //long get_Oid(long aIndex); wchar_t* toVCard(long aIndex); long FromVCard(const wchar_t* aValue); bool FromVCard(const wchar_t* aValue,long aIndex); public: CArrayFixFlat<structCheck>* iContactDataArray;//all contact item array private: CContactDatabase* iContactDb; TBuf<KMaxDatabasePathAndNameLength> iDbName; TContactItemId iSelectedItemId; private: bool OpenDefaultDatabaseL(); TBool IfContactDbSelected(); }; #endif cpp #include "SymbianContact.h" #include <cntfldst.h> //#include "constants.h" #include <bcardeng.h> #include "utils.h" #include <S32BUF.H> #include <S32MEM.H> #include "base/Log.h" //#include "vocl/VObject.h" //static SymbianContact* instance=NULL; SymbianContact::SymbianContact() { iSelectedItemId = -1; // iContactArray = new (ELeave) CDesCArrayFlat( KArraySize ); iContactDb=NULL; //LOG.info("before OpendDefaultDatabaseL"); if (OpenDefaultDatabaseL()) { // LOG.info("create contactdataarray"); iContactDataArray=new CArrayFixFlat<structCheck>(1); // LOG.info("start ReadContactsFromDb"); ReadContactsFromDbL(); } } //SymbianContact* SymbianContact::getInstance() //{ // if (!instance) // instance = new (ELeave)SymbianContact(); // return instance; // //} SymbianContact::~SymbianContact() { if ( iContactDb ) { iContactDb->CloseTables(); delete iContactDb; } /*if ( iContactArray ) { delete iContactArray; }*/ if (iContactDataArray) { iContactDataArray->Reset(); delete iContactDataArray; } //Release(); } void SymbianContact::Release() { /*if (instance) { delete instance; }*/ } bool SymbianContact::OpenDefaultDatabaseL() { // Read name of the default database _LIT( KOrgContactFile,"" ); TBuf<KMaxDatabasePathAndNameLength> orgContactFile( KOrgContactFile ); CContactDatabase::GetDefaultNameL( orgContactFile ); orgContactFile.LowerCase(); iDbName.Copy(orgContactFile); if ( iContactDb ) { if ( !iDbName.Compare( orgContactFile ) ) { return true; } iContactDb->CloseTables(); delete iContactDb; iContactDb = NULL; } //LOG.info("Open default db"); TRAPD(err, iContactDb = CContactDatabase::OpenL( orgContactFile );); // Check if database already exist if ( err == KErrNotFound ) { iContactDb = NULL; return false; } else { } return true; } TBool SymbianContact::IfContactDbSelected() { if ( iContactDb ) { return ETrue; } return EFalse; } void SymbianContact::ReadContactsFromDbL() { if (iContactDataArray) { iContactDataArray->Reset(); delete iContactDataArray; iContactDataArray=NULL; } if ( !IfContactDbSelected() ) { return; } //LOG.info("reading from db"); iContactDb->SetDbViewContactType( KUidContactCard ); TFieldType aFieldType1( KUidContactFieldFamilyName ); TFieldType aFieldType2( KUidContactFieldGivenName ); CContactDatabase::TSortPref sortPref1( aFieldType1 ); CContactDatabase::TSortPref sortPref2( aFieldType2 ); // Sort contacts by Family and Given Name //LOG.info("sort contacts"); CArrayFixFlat<CContactDatabase::TSortPref>* aSortOrder = new (ELeave) CArrayFixFlat<CContactDatabase::TSortPref>(2); CleanupStack::PushL( aSortOrder ); aSortOrder->AppendL( sortPref1 ); aSortOrder->AppendL( sortPref2 ); // The database takes ownership of the sort order array passed in iContactDb->SortL( aSortOrder ); // The caller does not take ownership of this object. // so do not push it onto the CleanupStack //const CContactIdArray* contacts = iContactDb->SortedItemsL(); // Go through each contact item and // make items for listbox //const TInt nc( contacts->Count() ); //LOG.info("create a new array"); iContactDataArray=new CArrayFixFlat<structCheck>(1); //LOG.info("create iterator"); TContactIter iter(*iContactDb); //类似游标 TContactItemId cardId; //LOG.info("create contactEng"); CPbkContactEngine* pbkContactEng = CPbkContactEngine::NewL( NULL); CleanupStack::PushL( pbkContactEng ); //LOG.info("create a CardEngine"); CBCardEngine* iCBCardEngine=CBCardEngine::NewL(pbkContactEng); CleanupStack::PushL( iCBCardEngine ); //LOG.info("while repeat"); while( ( cardId = iter.NextL() ) != KNullContactId ) { CPbkContactItem* ContactItem=pbkContactEng->ReadContactL(cardId); CleanupStack::PushL(ContactItem); //TBuf* buf=new TBuf(255); char* buf=new char[KMaxContactLength]; memset(buf,0,KMaxContactLength); RMemWriteStream* outputStream=new RMemWriteStream(buf,KMaxContactLength); //CleanupStack::PushL(outputStream); //LOG.info("read a contact to a buf"); iCBCardEngine->ExportBusinessCardL(*outputStream,*ContactItem); iContactDb->CloseContactL(ContactItem->Id()); //LOG.info("close a contact"); structCheck sctC; //LOG.info("convert a buf to wbuf"); wchar_t* wbuf=toWideChar(buf,0); sctC.uid = cardId; //LOG.info("a crc "); sctC.hash =stringCrc32(wbuf); //LOG.info("append a contact to array"); iContactDataArray->AppendL(sctC); //LOG.info("clean virable"); if (buf) { delete[] buf; buf = NULL; } /*if (ws) { delete ws; ws=NULL; }*/ if (wbuf) { delete[] wbuf; wbuf = NULL; } outputStream->Release(); outputStream->Close(); if (outputStream) { delete outputStream; outputStream = NULL; } CleanupStack::PopAndDestroy();//ContactItem,outputStream } //LOG.info("exit while"); CleanupStack::PopAndDestroy(2); CleanupStack::Pop( aSortOrder ); } void SymbianContact::deleteContactL(TInt aValue) { if ( !IfContactDbSelected() ) { return; } // The caller does not take ownership of this object. // so do not push it onto the CleanupStack /*TInt count( iContactArray->Count() ); if (aValue < 0 || aValue >= count ) { return; }*/ if (!iContactDataArray->Count()>0) return; // Sets the type of contact items to be included in // sorted views of the database iContactDb->SetDbViewContactType( KUidContactCard ); const CContactIdArray* contacts = iContactDb->SortedItemsL(); //TContactItemId itemId( ( (*contacts)[aValue] ) ); CPbkContactEngine* pbkContactEng = CPbkContactEngine::NewL( NULL); CleanupStack::PushL( pbkContactEng ); pbkContactEng->DeleteContactL( aValue ); CleanupStack::PopAndDestroy( pbkContactEng ); /*iContactDb->CloseTables(); delete iContactDb; iContactDb = NULL; iContactDb = CContactDatabase::OpenL( iDbName );*/ // Update iContactArray and iContactGroupArray ReadContactsFromDbL(); } void SymbianContact::deleteAllContactL() { if ( !IfContactDbSelected() ) { return; } if (!iContactDataArray->Count()>0) return; iContactDb->SetDbViewContactType( KUidContactCard ); const CContactIdArray* contacts = iContactDb->SortedItemsL(); //TContactItemId itemId( ( (*contacts)[aValue] ) ); CPbkContactEngine* pbkContactEng = CPbkContactEngine::NewL( NULL); CleanupStack::PushL( pbkContactEng ); //pbkContactEng->DeleteContactL( itemId ); pbkContactEng->DeleteContactsL(*contacts); CleanupStack::PopAndDestroy( pbkContactEng ); /*iContactDb->CloseTables(); delete iContactDb; iContactDb = NULL; iContactDb = CContactDatabase::OpenL( iDbName );*/ // Update iContactArray and iContactGroupArray ReadContactsFromDbL(); } wchar_t* SymbianContact::toVCard(long aIndex) { if ( !IfContactDbSelected() ) return 0; if (!iContactDataArray->Count()>0) return 0; //if (iContactDataArray->Count() < aIndex) // return 0; // Sets the type of contact items to be included in // sorted views of the database iContactDb->SetDbViewContactType( KUidContactCard ); //const CContactIdArray* contacts = iContactDb->SortedItemsL(); TContactItemId itemId =aIndex;//( ( (*contacts)[aIndex] ) ); CPbkContactEngine* pbkContactEng = CPbkContactEngine::NewL( NULL); CleanupStack::PushL( pbkContactEng ); CPbkContactItem* aContactItem = pbkContactEng->ReadContactL( itemId ); CleanupStack::PushL( aContactItem ); CBCardEngine* iCBCardEngine=CBCardEngine::NewL(pbkContactEng); CleanupStack::PushL( iCBCardEngine ); char* buf=new char[KMaxContactLength]; memset(buf,0,KMaxContactLength); RMemWriteStream astream(buf,KMaxContactLength); iCBCardEngine->ExportBusinessCardL(astream,*aContactItem); wchar_t* wbuf =toWideChar(buf,0); if (buf) { delete[] buf; buf=NULL; } /*if (wbuf) { delete[] wbuf; wbuf=NULL; }*/ CleanupStack::PopAndDestroy( 3 ); return wbuf; //iContactDb->CloseTables(); //delete iContactDb; //iContactDb = NULL; //iContactDb = CContactDatabase::OpenL( iDbName ); // Update iContactArray and iContactGroupArray //ReadContactsFromDbL(); //ReadContactsFromDbL(); } long SymbianContact::FromVCard(const wchar_t* aValue) { if ( !IfContactDbSelected() ) return false; if (!iContactDb) iContactDb = CContactDatabase::OpenL( iDbName ); /*iContactDb->CloseTables(); delete iContactDb; iContactDb = NULL;*/ //RWriteStream astream; //iCBCardEngine->ExportBusinessCardL(astream,*aContactItem); char* buf=toMultibyte(aValue,0); //const //TPtrC8 ptr; //ptr.Set((const TUint8*)buf,strlen(buf)); /*RWriteStream* stream=new RWriteStream(); stream->WriteL(ptr); CleanupStack::PushL( stream );*/ //TBufBuf* stream=new TBufBuf(); //stream->Set(*buf,0,TBufBuf::EWrite); //CleanupStack::PushL(stream); /*TMemBuf* stream = new TMemBuf(); stream->Set((unsigned char *)buf,(unsigned char *)(buf+strlen(buf)),TMemBuf::EWrite); CleanupStack::PushL(stream);*/ //RReadStream* rStream=NULL; //rStream=new RReadStream((MStreamBuf*)stream); RMemReadStream * rStream=new RMemReadStream(buf,strlen(buf)); //RMemReadStream * rStream=new RMemReadStream(aValue,wcslen(aValue)); CleanupStack::PushL(rStream); here modify use db to import but vcard Engine RReadStream* rrStream =rStream; long lid=-1; CPbkContactEngine* pbkContactEng = CPbkContactEngine::NewL( NULL); CleanupStack::PushL( pbkContactEng ); CPbkContactItem* aContactItem = pbkContactEng->CreateEmptyContactL();; CleanupStack::PushL( aContactItem ); CBCardEngine* iCBCardEngine=CBCardEngine::NewL(pbkContactEng); CleanupStack::PushL( iCBCardEngine ); //MStreamBuf *test = rStream->Source(); iCBCardEngine->ImportBusinessCardL(*aContactItem,*rrStream); HBufC* firstNameBuf = NULL; TPbkContactItemField* field = aContactItem->FindField(EPbkFieldIdFirstName); CContactTextField* firstName = field->TextStorage(); firstNameBuf = firstName->Text().AllocLC(); if (firstNameBuf) { CleanupStack::PopAndDestroy( firstNameBuf ); } lid= pbkContactEng->AddNewContactL(*aContactItem,ETrue); /*TUid uid = TUid::Uid(KVersitEntityUidVCard); TBool result = EFalse; CArrayPtr<CContactItem>* imported = iContactDb->ImportContactsL(uid, *rStream, result, CContactDatabase::EDefault | CContactDatabase::ENullTemplateId); lid =(*imported)[0]->Id(); imported->ResetAndDestroy(); delete imported;*/ /// rStream->Close(); if (buf) { delete[] buf; buf=NULL; } CleanupStack::PopAndDestroy( 4 ); //iContactDb = CContactDatabase::OpenL( iDbName ); //ReadContactsFromDbL(); ReadContactsFromDbL(); return lid; } bool SymbianContact::FromVCard(const wchar_t* aValue,long aIndex) { if ( !IfContactDbSelected() ) return false; if (!iContactDataArray->Count()>0) return false; // Sets the type of contact items to be included in // sorted views of the database //iContactDb->SetDbViewContactType( KUidContactCard ); //const CContactIdArray* contacts = iContactDb->SortedItemsL(); //TContactItemId itemId( ( (*contacts)[aIndex] ) ); /*CContactItem* contact = NULL; contact = iContactDb->OpenContactL( (*contacts)[aIndex] ); CleanupStack::PushL( contact );*/ /*iContactDb->CloseTables(); delete iContactDb; iContactDb = NULL;*/ CPbkContactEngine* pbkContactEng = CPbkContactEngine::NewL( NULL); CleanupStack::PushL( pbkContactEng ); CPbkContactItem* aContactItem = pbkContactEng->OpenContactL( aIndex ); CleanupStack::PushL( aContactItem ); CBCardEngine* iCBCardEngine=CBCardEngine::NewL(pbkContactEng); CleanupStack::PushL( iCBCardEngine ); //RWriteStream astream; //iCBCardEngine->ExportBusinessCardL(astream,*aContactItem); char* buf=toMultibyte(aValue,0); /*MStreamBuf* stream; stream->WriteL(buf,strlen(buf));*/ //TMemBuf* stream = new TMemBuf(); //stream->Set((unsigned char *)buf,(unsigned char *)(buf+strlen(buf)),TMemBuf::EWrite); //CleanupStack::PushL(stream); //RReadStream rStream(stream); RMemReadStream rStream(buf,strlen(buf)); iCBCardEngine->ImportBusinessCardL(*aContactItem,rStream); pbkContactEng->CommitContactL (*aContactItem,ETrue); //stream->Close(); rStream.Close(); // iContactDb->CloseContactL( aIndex ); //CleanupStack::PopAndDestroy( contact ); CleanupStack::PopAndDestroy( 3); if (buf) { delete[] buf; buf=NULL; } /*iContactDb = CContactDatabase::OpenL( iDbName ); ReadContactsFromDbL();*/ ReadContactsFromDbL(); return true; }