-rw-r--r-- | gammu/emb/common/service/gsmmisc.c | 4 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmpbk.c | 17 | ||||
-rw-r--r-- | gammu/emb/gammu/gammu.c | 2 | ||||
-rw-r--r-- | kabc/addressbook.cpp | 148 | ||||
-rw-r--r-- | kabc/addressbook.h | 2 | ||||
-rw-r--r-- | kabc/addressee.cpp | 46 | ||||
-rw-r--r-- | kabc/addressee.h | 1 | ||||
-rw-r--r-- | kabc/phonenumber.cpp | 4 | ||||
-rw-r--r-- | kaddressbook/kabcore.cpp | 76 | ||||
-rw-r--r-- | libkdepim/ksyncprefsdialog.cpp | 7 |
10 files changed, 210 insertions, 97 deletions
diff --git a/gammu/emb/common/service/gsmmisc.c b/gammu/emb/common/service/gsmmisc.c index 6959a22..1c6ec8b 100644 --- a/gammu/emb/common/service/gsmmisc.c +++ b/gammu/emb/common/service/gsmmisc.c @@ -204,3 +204,3 @@ void SaveVCALText(char *Buffer, int *Length, char *Text, char *Start) if (UnicodeLength(Text) != 0) { - EncodeUTF8QuotedPrintable(buffer,Text); + EncodeUTF8(buffer,Text); if (UnicodeLength(Text)==strlen(buffer)) { @@ -208,3 +208,3 @@ void SaveVCALText(char *Buffer, int *Length, char *Text, char *Start) } else { - *Length+=sprintf(Buffer+(*Length), "%s;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c",Start,buffer,13,10); + *Length+=sprintf(Buffer+(*Length), "%s:%s%c%c",Start,buffer,13,10); } diff --git a/gammu/emb/common/service/gsmpbk.c b/gammu/emb/common/service/gsmpbk.c index 05e5cb9..f7cf7d7 100644 --- a/gammu/emb/common/service/gsmpbk.c +++ b/gammu/emb/common/service/gsmpbk.c @@ -133,3 +133,3 @@ void GSM_EncodeVCARD(char *Buffer, int *Length, GSM_MemoryEntry *pbk, bool heade *Length+=sprintf(Buffer+(*Length),"TEL"); - if (Number == i) (*Length)+=sprintf(Buffer+(*Length),";PREF"); + (*Length)+=sprintf(Buffer+(*Length),";PREF"); break; @@ -137,3 +137,3 @@ void GSM_EncodeVCARD(char *Buffer, int *Length, GSM_MemoryEntry *pbk, bool heade *Length+=sprintf(Buffer+(*Length),"TEL"); - if (Number == i) (*Length)+=sprintf(Buffer+(*Length),";PREF"); + //if (Number == i) (*Length)+=sprintf(Buffer+(*Length),";PREF"); *Length+=sprintf(Buffer+(*Length),";CELL"); @@ -142,4 +142,4 @@ void GSM_EncodeVCARD(char *Buffer, int *Length, GSM_MemoryEntry *pbk, bool heade *Length+=sprintf(Buffer+(*Length),"TEL"); - if (Number == i) (*Length)+=sprintf(Buffer+(*Length),";PREF"); - *Length+=sprintf(Buffer+(*Length),";WORK;VOICE"); + //if (Number == i) (*Length)+=sprintf(Buffer+(*Length),";PREF"); + *Length+=sprintf(Buffer+(*Length),";WORK"); break; @@ -147,3 +147,3 @@ void GSM_EncodeVCARD(char *Buffer, int *Length, GSM_MemoryEntry *pbk, bool heade *Length+=sprintf(Buffer+(*Length),"TEL"); - if (Number == i) (*Length)+=sprintf(Buffer+(*Length),";PREF"); + //if (Number == i) (*Length)+=sprintf(Buffer+(*Length),";PREF"); *Length+=sprintf(Buffer+(*Length),";FAX"); @@ -152,4 +152,4 @@ void GSM_EncodeVCARD(char *Buffer, int *Length, GSM_MemoryEntry *pbk, bool heade *Length+=sprintf(Buffer+(*Length),"TEL"); - if (Number == i) (*Length)+=sprintf(Buffer+(*Length),";PREF"); - *Length+=sprintf(Buffer+(*Length),";HOME;VOICE"); + //if (Number == i) (*Length)+=sprintf(Buffer+(*Length),";PREF"); + *Length+=sprintf(Buffer+(*Length),";HOME"); break; @@ -162,3 +162,3 @@ void GSM_EncodeVCARD(char *Buffer, int *Length, GSM_MemoryEntry *pbk, bool heade */ - SaveVCALText(Buffer, Length, pbk->Entries[i].Text, "LABEL"); + //SaveVCALText(Buffer, Length, pbk->Entries[i].Text, "LABEL"); *Length+=sprintf(Buffer+(*Length),"ADR"); @@ -181,2 +181,3 @@ void GSM_EncodeVCARD(char *Buffer, int *Length, GSM_MemoryEntry *pbk, bool heade } + *Length+=sprintf(Buffer+(*Length), "X-KADDRESSBOOK-X-ExternalID:%d%c%c",pbk->Location,13,10); if (header) *Length+=sprintf(Buffer+(*Length),"END:VCARD%c%c",13,10); diff --git a/gammu/emb/gammu/gammu.c b/gammu/emb/gammu/gammu.c index 8db9afb..684e67c 100644 --- a/gammu/emb/gammu/gammu.c +++ b/gammu/emb/gammu/gammu.c @@ -4688,3 +4688,3 @@ static void Restore(int argc, char *argv[]) printmsgerr("%i entries in backup file\n",max); - if (answer_yes("Restore phone phonebook")) DoRestore = true; + /* LR if (answer_yes("Restore phone phonebook")) */DoRestore = true; } diff --git a/kabc/addressbook.cpp b/kabc/addressbook.cpp index d037d2f..ad0f702 100644 --- a/kabc/addressbook.cpp +++ b/kabc/addressbook.cpp @@ -343,5 +343,3 @@ bool AddressBook::load() - clear(); - KRES::Manager<Resource>::ActiveIterator it; @@ -350,6 +348,7 @@ bool AddressBook::load() if ( !(*it)->load() ) { - error( i18n("Unable to load resource '%1'").arg( (*it)->resourceName() ) ); + qDebug( i18n("Unable to load resource '%1'").arg( (*it)->resourceName() ) ); ok = false; + } else { + qDebug( i18n("Resource loaded: '%1'").arg( (*it)->resourceName() ) ); } - // mark all addressees as unchanged @@ -406,2 +405,71 @@ void AddressBook::export2File( QString fileName ) } +// if QStringList uids is empty, all are exported +bool AddressBook::export2PhoneFormat( QStringList uids ,QString fileName ) +{ + KABC::VCardConverter converter; + QString datastream; + Iterator it; + bool all = uids.isEmpty(); + for ( it = begin(); it != end(); ++it ) { + // for( QStringList::ConstIterator it = uids.begin(); it != uids.end(); ++it ) { + if ( ! all ) { + if ( ! ( uids.contains((*it).uid() ) )) + continue; + } + KABC::Addressee a = ( *it ); + if ( a.isEmpty() ) + continue; + a.simplifyEmails(); + a.simplifyPhoneNumbers(); + a.simplifyPhoneNumberTypes(); + a.simplifyAddresses(); + + QString vcard; + QString vcardnew; + converter.addresseeToVCard( a, vcard ); + int start = 0; + int next; + while ( (next = vcard.find("TYPE=", start) )>= 0 ) { + int semi = vcard.find(";", next); + int dopp = vcard.find(":", next); + int sep; + if ( semi < dopp && semi >= 0 ) + sep = semi ; + else + sep = dopp; + vcardnew +=vcard.mid( start, next - start); + vcardnew +=vcard.mid( next+5,sep -next -5 ).upper(); + start = sep; + } + vcardnew += vcard.mid( start,vcard.length() ); + vcard = ""; + start = 0; + while ( (next = vcardnew.find("ADR", start) )>= 0 ) { + int sep = vcardnew.find(":", next); + vcard +=vcardnew.mid( start, next - start+3); + start = sep; + } + vcard += vcardnew.mid( start,vcardnew.length() ); + vcard.replace ( QRegExp(";;;") , "" ); + vcard.replace ( QRegExp(";;") , "" ); + datastream += vcard; + + } + + QFile outFile(fileName); + if ( outFile.open(IO_WriteOnly) ) { + datastream.replace ( QRegExp("VERSION:3.0") , "VERSION:2.1" ); + QTextStream t( &outFile ); // use a text stream + t.setEncoding( QTextStream::UnicodeUTF8 ); + t <<datastream; + t << "\r\n\r\n"; + outFile.close(); + + } else { + qDebug("Error open temp file "); + return false; + } + return true; + +} void AddressBook::importFromFile( QString fileName, bool replaceLabel, bool removeOld ) @@ -427,2 +495,5 @@ void AddressBook::importFromFile( QString fileName, bool replaceLabel, bool rem for ( it = list.begin(); it != list.end(); ++it ) { + QString id = (*it).custom( "KADDRESSBOOK", "X-ExternalID" ); + if ( !id.isEmpty() ) + (*it).setIDStr(id ); (*it).setResource( 0 ); @@ -482,11 +553,55 @@ void AddressBook::preparePhoneSync( QString currentSyncDevice, bool isPreSync ) (*ait).setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); - else + else { (*ait).setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); + (*ait).setID( currentSyncDevice,id ); + + } + } +} +void AddressBook::findNewExtIds( QString fileName, QString currentSyncDevice ) +{ + + setUntagged(); + KABC::Addressee::List list; + QFile file( fileName ); + file.open( IO_ReadOnly ); + QByteArray rawData = file.readAll(); + file.close(); + QString data; + + data = QString::fromUtf8( rawData.data(), rawData.size() + 1 ); + KABC::VCardTool tool; + list = tool.parseVCards( data ); + KABC::Addressee::List::Iterator it; + for ( it = list.begin(); it != list.end(); ++it ) { + Iterator ait; + for ( ait = begin(); ait != end(); ++ait ) { + if ( !(*ait).tagged() ) { + if ( (*ait).containsAdr(*it)) { + (*ait).setTagged(true); + QString id = (*it).custom( "KADDRESSBOOK", "X-ExternalID" ); + (*it).setIDStr( ":"); + (*it).setID( currentSyncDevice,id ); + (*it).setExternalUID( id ); + (*it).setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); + (*it).setUid( ( (*ait).uid() )); + break; + } + } + + } + if ( ait == end() ) + qDebug("ERROR:: no ext ID found for uid: %s", (*it).uid().latin1()); + } + clear(); + for ( it = list.begin(); it != list.end(); ++it ) { + insertAddressee( (*it) ); } } + bool AddressBook::saveABphone( QString fileName ) { - smplifyAddressees(); + //smplifyAddressees(); qDebug("saveABphone:: saving AB... "); - if ( ! saveAB() ) + if ( ! export2PhoneFormat( QStringList() ,fileName ) ) return false; @@ -500,5 +615,2 @@ bool AddressBook::saveABphone( QString fileName ) } - qDebug("reloading phone book... "); - if ( !load() ) - return false; return true; @@ -518,8 +630,15 @@ bool AddressBook::saveAB() KRES::Manager<Resource> *manager = d->mManager; + qDebug("SaveAB::saving..." ); for ( it = manager->activeBegin(); it != manager->activeEnd(); ++it ) { + qDebug("SaveAB::checking resource..." ); + if ( (*it)->readOnly() ) + qDebug("readonly." ); + if ( (*it)->isOpen() ) + qDebug("open" ); + if ( !(*it)->readOnly() && (*it)->isOpen() ) { Ticket *ticket = requestSaveTicket( *it ); -// qDebug("StdAddressBook::save '%s'", (*it)->resourceName().latin1() ); + qDebug("StdAddressBook::save '%s'", (*it)->resourceName().latin1() ); if ( !ticket ) { - error( i18n( "Unable to save to resource '%1'. It is locked." ) + qDebug( i18n( "Unable to save to resource '%1'. It is locked." ) .arg( (*it)->resourceName() ) ); @@ -532,2 +651,5 @@ bool AddressBook::saveAB() ok = false; + else + qDebug("StdAddressBook::saved '%s'", ticket->resource()->resourceName().latin1() ); + } else @@ -595,3 +717,3 @@ Ticket *AddressBook::requestSaveTicket( Resource *resource ) } - +//void insertAddressee( const Addressee &, bool setRev = true, bool takeResource = false); void AddressBook::insertAddressee( const Addressee &a, bool setRev, bool takeResource ) diff --git a/kabc/addressbook.h b/kabc/addressbook.h index cc755d1..df9048b 100644 --- a/kabc/addressbook.h +++ b/kabc/addressbook.h @@ -148,2 +148,3 @@ class AddressBook : public QObject void export2File( QString fileName ); + bool export2PhoneFormat( QStringList uids ,QString fileName ); void importFromFile( QString fileName, bool replaceLabel = false, bool removeOld = false ); @@ -151,2 +152,3 @@ class AddressBook : public QObject void removeUntagged(); + void findNewExtIds( QString fileName, QString currentSyncDevice ); /** diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp index 607ae26..548305a 100644 --- a/kabc/addressee.cpp +++ b/kabc/addressee.cpp @@ -305,3 +305,9 @@ void Addressee::mergeContact( const Addressee& ad ) if ( ( !mData->url.isValid() && ad.mData->url.isValid() ) ) mData->url = ad.mData->url ; + PhoneNumber::List phoneAD = phoneNumbers(); + PhoneNumber::List::Iterator phoneItAD; + bool found = false; + for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) { + + } // pending: @@ -313,3 +319,3 @@ void Addressee::mergeContact( const Addressee& ad ) // merging keys - qDebug("merge contact %s ", ad.uid().latin1()); + //qDebug("merge contact %s ", ad.uid().latin1()); setUid( ad.uid() ); @@ -335,5 +341,39 @@ bool Addressee::removeVoice() } + +bool Addressee::containsAdr(const Addressee& ad ) +{ + if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false; + if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false; + if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ; + if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ; + if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ; + if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ; + if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ; + + // compare phone numbers + PhoneNumber::List phoneN = ad.phoneNumbers(); + PhoneNumber::List::Iterator phoneIt; + bool found = false; + for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { + bool found = false; + PhoneNumber::List phoneL = ad.phoneNumbers(); + PhoneNumber::List::Iterator phoneItL; + for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) { + if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) { + found = true; + break; + } + } + if ( ! found ) + return false; + } + return true; + +} void Addressee::simplifyAddresses() { - if ( mData->addresses.count() < 3 ) return ; + int max = 2; + if ( mData->url.isValid() ) + max = 1; + if ( mData->addresses.count() <= max ) return ; int count = 0; @@ -342,3 +382,3 @@ void Addressee::simplifyAddresses() for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { - if ( count > 1 ) + if ( count >= max ) list.append( *it ); diff --git a/kabc/addressee.h b/kabc/addressee.h index 0aa2c51..03138f6 100644 --- a/kabc/addressee.h +++ b/kabc/addressee.h @@ -124,2 +124,3 @@ class Addressee bool removeVoice(); + bool containsAdr(const Addressee& addr ); diff --git a/kabc/phonenumber.cpp b/kabc/phonenumber.cpp index e5abc0e..6e94c7e 100644 --- a/kabc/phonenumber.cpp +++ b/kabc/phonenumber.cpp @@ -74,6 +74,4 @@ bool PhoneNumber::simplifyNumber() mNumber = ""; - if ( Number.at(0) == '+' ) - mNumber += "+"; for ( i = 0; i < Number.length(); ++i) { - if ( Number.at(i).isDigit() ) + if ( Number.at(i).isDigit() || Number.at(i) == '+'|| Number.at(i) == '*'|| Number.at(i) == '#' ) mNumber += Number.at(i); diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp index a7967cb..cd261f6 100644 --- a/kaddressbook/kabcore.cpp +++ b/kaddressbook/kabcore.cpp @@ -187,4 +187,4 @@ class KAex2phonePrefs : public QDialog lay->addWidget( temphb ); - mWriteToSim= new QCheckBox( i18n("Write Contacts to SIM card\n(if not, write to phone memory)"), this ); - lay->addWidget( mWriteToSim ); + // mWriteToSim = new QCheckBox( i18n("Write Contacts to SIM card\n(if not, write to phone memory)"), this ); + // lay->addWidget( mWriteToSim ); lay->addWidget(lab = new QLabel( i18n("NOTE: This will remove all old\ncontact data on phone!"), this ) ); @@ -696,60 +696,10 @@ void KABCore::export2phone() #ifdef _WIN32_ - QString fileName = locateLocal("tmp", "tempfile.vcf"); + QString fileName = locateLocal("tmp", "phonefile.vcf"); #else - QString fileName = "/tmp/kdepimtemp.vcf"; + QString fileName = "/tmp/phonefile.vcf"; #endif - KABC::VCardConverter converter; - QString description; - QString datastream; - for( QStringList::ConstIterator it = uids.begin(); it != uids.end(); ++it ) { - KABC::Addressee a = mAddressBook->findByUid( *it ); - - if ( a.isEmpty() ) - continue; - a.simplifyEmails(); - a.simplifyPhoneNumbers(); - a.simplifyPhoneNumberTypes(); - a.simplifyAddresses(); - - if (description.isEmpty()) - description = a.formattedName(); - QString vcard; - QString vcardnew; - converter.addresseeToVCard( a, vcard ); - int start = 0; - int next; - while ( (next = vcard.find("TYPE=", start) )>= 0 ) { - int semi = vcard.find(";", next); - int dopp = vcard.find(":", next); - int sep; - if ( semi < dopp && semi >= 0 ) - sep = semi ; - else - sep = dopp; - vcardnew +=vcard.mid( start, next - start); - vcardnew +=vcard.mid( next+5,sep -next -5 ).upper(); - start = sep; - } - vcardnew += vcard.mid( start,vcard.length() ); - vcard = ""; - start = 0; - while ( (next = vcardnew.find("ADR", start) )>= 0 ) { - int sep = vcardnew.find(":", next); - vcard +=vcardnew.mid( start, next - start+3); - start = sep; - } - vcard += vcardnew.mid( start,vcardnew.length() ); - vcard.replace ( QRegExp(";;;") , "" ); - vcard.replace ( QRegExp(";;") , "" ); - datastream += vcard; + if ( ! mAddressBook->export2PhoneFormat( uids ,fileName ) ) + return; - } - QFile outFile(fileName); - if ( outFile.open(IO_WriteOnly) ) { - datastream.replace ( QRegExp("VERSION:3.0") , "VERSION:2.1" ); - QTextStream t( &outFile ); // use a text stream - t.setEncoding( QTextStream::UnicodeUTF8 ); - t <<datastream; - outFile.close(); if ( PhoneAccess::writeToPhone( fileName ) ) @@ -759,7 +709,2 @@ void KABCore::export2phone() - } else { - qDebug("Error open temp file "); - return; - } - @@ -2845,2 +2790,3 @@ bool KABCore::syncExternal(KSyncManager* manager, QString resource) if ( syncManager->mWriteBackFile ) { + abLocal.removeSyncAddressees( false ); abLocal.saveAB(); @@ -2877,3 +2823,4 @@ bool KABCore::syncPhone() bool syncOK = false; - if ( abLocal.load() ) { + { + abLocal.importFromFile( fileName ); qDebug("AB phone loaded ,sync device %s",mCurrentSyncDevice.latin1()); @@ -2885,5 +2832,6 @@ bool KABCore::syncPhone() if ( syncManager->mWriteBackFile ) { + abLocal.removeSyncAddressees( true ); abLocal.saveABphone( fileName ); - abLocal.preparePhoneSync( mCurrentSyncDevice, false ); - abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice ); + abLocal.findNewExtIds( fileName, mCurrentSyncDevice ); + //abLocal.preparePhoneSync( mCurrentSyncDevice, false ); abLocal.postExternSync( mAddressBook,mCurrentSyncDevice ); diff --git a/libkdepim/ksyncprefsdialog.cpp b/libkdepim/ksyncprefsdialog.cpp index 84cc448..cf8f996 100644 --- a/libkdepim/ksyncprefsdialog.cpp +++ b/libkdepim/ksyncprefsdialog.cpp @@ -202,3 +202,3 @@ void KSyncPrefsDialog::setupSyncAlgTab() ++iii; - mWriteContactToSIM= new QCheckBox( i18n("Sync contacts with phone SIM card (If not, sync with phone memory)"), phoneWidget ); + mWriteContactToSIM = 0;//new QCheckBox( i18n("Sync contacts with phone SIM card (If not, sync with phone memory)"), phoneWidget ); QHBox* temphb = new QHBox( phoneWidget ); @@ -415,2 +415,3 @@ void KSyncPrefsDialog::profileChanged( int item ) + if ( mWriteContactToSIM ) mWriteContactToSIM->setChecked( prof->getWriteContactToSIM()); @@ -582,3 +583,3 @@ void KSyncPrefsDialog::saveProfile() prof->setWriteBackFutureWeeks(mWriteBackFutureWeeks->value()); - + if ( mWriteContactToSIM ) prof->setWriteContactToSIM(mWriteContactToSIM->isChecked()); @@ -717,3 +718,3 @@ void KSyncPrefsDialog::helpModel() { - QString hint = i18n("Leave empty or\ninsert name of phone model:\n"); + QString hint = i18n("Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n"); hint += "E.g. for Nokia 6310i:\n6310i\nAlso possible:\nobex\nfor Obex connection"; |