/* -*- C++ -*-
This file implements the basic personal information management class
used in the TDE addressbook .
the TDE addressbook
$ Author : Mirko Boehm $
$ Copyright : ( C ) 1996 - 2001 , Mirko Boehm $
$ Contact : mirko @ kde . org
http : //www.kde.org $
$ License : GPL with the following explicit clarification :
This code may be linked against any version of the Qt toolkit
from Troll Tech , Norway . $
$ Id $
*/
# include "addressbook.h"
# include "qconfigDB.h"
# include <tqfileinfo.h>
# include <tqstringlist.h>
# include <tdeapplication.h>
# include <tdeglobal.h>
# include <kstandarddirs.h>
# include <tdelocale.h>
# include <kdebug.h>
# include <tdemessagebox.h>
extern " C " {
# include <sys/stat.h>
# include <sys/types.h>
# include <fcntl.h>
# include <unistd.h>
}
// ----- some defines:
# ifdef KAB_KDEBUG_AREA
# undef KAB_KDEBUG_AREA
# endif
# define KAB_KDEBUG_AREA 800
# ifdef STD_USERFILENAME
# undef STD_USERFILENAME
# endif
# define STD_USERFILENAME "kab / addressbook.kab"
# ifdef STD_CONFIGFILENAME
# undef STD_CONFIGFILENAME
# endif
# define STD_CONFIGFILENAME "kab / kab.config"
# ifdef ENTRY_SECTION
# undef ENTRY_SECTION
# endif
# define ENTRY_SECTION "entries"
// the name of the file-local configuration section
# ifdef LOCAL_CONFIG_SECTION
# undef LOCAL_CONFIG_SECTION
# endif
# define LOCAL_CONFIG_SECTION "config"
// the name of the subsection for each entry
# ifdef ADDRESS_SUBSECTION
# undef ADDRESS_SUBSECTION
# endif
# define ADDRESS_SUBSECTION "addresses"
# ifdef KAB_TEMPLATEFILE
# undef KAB_TEMPLATEFILE
# endif
# define KAB_TEMPLATEFILE "kab / template.kab"
# ifdef KAB_CONFIGTEMPLATE
# undef KAB_CONFIGTEMPLATE
# endif
# define KAB_CONFIGTEMPLATE "kab / template.config"
# ifdef KAB_CATEGORY_KEY
# undef KAB_CATEGORY_KEY
# endif
# define KAB_CATEGORY_KEY "categories"
const char * AddressBook : : Entry : : Address : : Fields [ ] = {
" headline " , " position " ,
" org " , " orgunit " , " orgsubunit " ,
" deliverylabel " , " address " , " zip " , " town " , " country " , " state " } ;
const int AddressBook : : Entry : : Address : : NoOfFields
= sizeof ( AddressBook : : Entry : : Address : : Fields )
/ sizeof ( AddressBook : : Entry : : Address : : Fields [ 0 ] ) ;
const char * AddressBook : : Entry : : Fields [ ] = {
" title " , " rank " , " fn " , " nameprefix " , " firstname " , " middlename " , " lastname " ,
" birthday " , " comment " , " talk " , " emails " , " keywords " , " telephone " ,
" urls " , " user1 " , " user2 " , " user3 " , " user4 " , " custom " , " categories " } ;
const int AddressBook : : Entry : : NoOfFields
= sizeof ( AddressBook : : Entry : : Fields ) / sizeof ( AddressBook : : Entry : : Fields [ 0 ] ) ;
struct QStringLess
: public binary_function < const TQString & , const TQString & , bool >
{
/** The function operator, inline. */
bool operator ( ) ( const TQString & x , const TQString & y ) const
{
return x < y ; // make one Qt operator fit exactly
}
} ;
// ----- the derived map class:
class StringKabKeyMap : public map < TQString , KabKey , QStringLess >
{ /* Same as map, but a class for compilation reasons. This way we do not need
* to include the QStringLess class into the addressbook header file . */
} ;
// ----- another derived map class:
class KeyNameMap : public map < const char * , TQString , less < const char * > >
{ // same thing
} ;
KeyNameMap * AddressBook : : Entry : : fields ;
KeyNameMap * AddressBook : : Entry : : Address : : fields ;
bool
KabKey : : operator = = ( const KabKey & key ) const
{
// ###########################################################################
return key . getKey ( ) = = getKey ( ) ;
// ###########################################################################
}
void
KabKey : : setKey ( const TQCString & text )
{
// ###########################################################################
key = text ;
// ###########################################################################
}
TQCString
KabKey : : getKey ( ) const
{
// ###########################################################################
return key ;
// ###########################################################################
}
AddressBook : : Entry : : Address : : Address ( )
{
}
bool AddressBook : : Entry : : Address : : nameOfField ( const char * key , TQString & value )
{
KeyNameMap : : iterator pos ;
// -----
if ( fields = = 0 )
{ // this is executed exactly one time per application instance,
// as fields is static
int counter = 0 ;
fields = new KeyNameMap ;
TQ_CHECK_PTR ( fields ) ;
if ( ! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Headline " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Position " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Organization " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Department " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Sub-Department " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Delivery Label " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " street/postal " , " Address " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Zipcode " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " City " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Country " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " As in addresses " , " State " ) ) ) . second )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::Entry::Address::nameOfField (while "
< < " creating field-name map): TYPO, correct this. "
< < endl ;
} else {
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::Entry::Address::nameOfField: "
< < " inserted field names. " < < endl ;
}
# if ! defined NDEBUG
TQString name ;
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::Entry::Address::nameOfField: " < < endl
< < " Created key-fieldname-map. Defined fields are: "
< < endl ;
for ( counter = 0 ; counter < AddressBook : : Entry : : Address : : NoOfFields ;
+ + counter )
{
pos = fields - > find ( Fields [ counter ] ) ;
if ( pos = = fields - > end ( ) )
{
kdDebug ( KAB_KDEBUG_AREA ) < < " UNDEFINED " < < endl ;
} else {
kdDebug ( KAB_KDEBUG_AREA )
< < " " < < Fields [ counter ] < < " ( "
< < ( * pos ) . second . utf8 ( ) < < " ) " < < endl ;
}
}
# endif
}
// ----- now finally do the lookup:
pos = fields - > find ( key ) ;
if ( pos = = fields - > end ( ) )
{
return false ;
} else {
value = ( * pos ) . second ;
return true ;
}
}
bool AddressBook : : Entry : : nameOfField ( const char * key , TQString & value )
{
KeyNameMap : : iterator pos ;
// -----
if ( fields = = 0 )
{ // this is executed exactly one time per application instance,
// as fields is static
int counter = 0 ;
fields = new KeyNameMap ;
TQ_CHECK_PTR ( fields ) ;
if ( ! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " person " , " Title " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Rank " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Formatted Name " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Name Prefix " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " First Name " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Middle Name " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Last Name " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Birthday " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Comment " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Talk Addresses " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Email Addresses " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Keywords " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Telephone Number " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " URLs " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " User Field 1 " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " User Field 2 " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " User Field 3 " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " User Field 4 " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Custom " ) ) ) . second
| |
! fields - > insert
( map < const char * , TQString , less < const char * > > : : value_type
( Fields [ counter + + ] , i18n ( " Categories " ) ) ) . second )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::Entry::Address::nameOfField (while "
< < " creating field-name map): TYPO, correct this. " < < endl ;
} else {
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::Entry::Address::nameOfField: "
< < " inserted field names. " < < endl ;
}
# if ! defined NDEBUG
TQString name ;
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::Entry::nameOfField: " < < endl
< < " Created key-fieldname-map. Defined fields are: " < < endl ;
for ( counter = 0 ; counter < AddressBook : : Entry : : Address : : NoOfFields ;
+ + counter )
{
pos = fields - > find ( Fields [ counter ] ) ;
if ( pos = = fields - > end ( ) )
{
kdDebug ( KAB_KDEBUG_AREA ) < < " UNDEFINED " < < endl ;
} else {
kdDebug ( KAB_KDEBUG_AREA )
< < " " < < Fields [ counter ] < < " ( "
< < ( * pos ) . second . utf8 ( ) < < " ) " < < endl ;
}
}
# endif
}
// ----- now finally do the lookup:
pos = fields - > find ( key ) ;
if ( pos = = fields - > end ( ) )
{
return false ;
} else {
value = ( * pos ) . second ;
return true ;
}
}
AddressBook : : ErrorCode
AddressBook : : Entry : : getAddress ( int index , Address & address ) const
{
// ###########################################################################
list < Address > : : const_iterator pos ;
// -----
if ( index > = 0 & & ( unsigned ) index < addresses . size ( ) )
{
pos = addresses . begin ( ) ;
advance ( pos , index ) ;
address = * pos ;
return AddressBook : : NoError ;
} else {
return AddressBook : : OutOfRange ;
}
// ###########################################################################
}
int AddressBook : : Entry : : noOfAddresses ( ) const
{
return addresses . size ( ) ;
}
AddressBook : : AddressBook ( TQWidget * parent , const char * name , bool loadit )
: TQFrame ( parent , name ) ,
config ( new QConfigDB ( this ) ) ,
data ( new QConfigDB ( this ) ) ,
entries ( new StringKabKeyMap ) ,
state ( NoFile )
{
register bool GUARD ; GUARD = true ;
// ###########################################################################
TQString dir , filename ;
bool createBackup = true ;
KeyValueMap * keys ;
// ----- do memory checks (do not rely on exception handling):
if ( config = = 0 | | data = = 0 | | entries = = 0 )
{
KMessageBox : : error ( this ,
i18n ( " Cannot initialize local variables. " ) ,
i18n ( " Out of Memory " ) ) ;
kapp - > quit ( ) ; // It is critical, but will possibly never happen.
}
connect ( data , TQT_SIGNAL ( fileChanged ( ) ) , TQT_SLOT ( dataFileChanged ( ) ) ) ;
connect ( data , TQT_SIGNAL ( changed ( QConfigDB * ) ) ,
TQT_SLOT ( reloaded ( QConfigDB * ) ) ) ;
connect ( config , TQT_SIGNAL ( fileChanged ( ) ) , TQT_SLOT ( configFileChanged ( ) ) ) ;
// ----- set style:
filename = locate ( " data " , STD_CONFIGFILENAME ) ;
if ( filename . isEmpty ( ) )
{
filename = locateLocal ( " data " , STD_CONFIGFILENAME ) ;
// config does not exist yet
if ( createConfigFile ( ) ! = NoError )
{
KMessageBox : : sorry ( this ,
i18n ( " Your local kab configuration file "
" \" %1 \" "
" could not be created. kab will probably not "
" work correctly without it. \n "
" Make sure you have not removed write permission "
" from your local TDE directory (usually ~/.trinity). " ) . arg ( filename ) ) ;
state = PermDenied ;
}
}
loadConfigFile ( ) ;
// ----- now get some configuration settings:
if ( config - > get ( " config " , keys ) )
{
keys - > get ( " CreateBackupOnStartup " , createBackup ) ;
}
// ----- check and possibly create user standard file:
filename = locate ( " data " , STD_USERFILENAME ) ;
if ( filename . isEmpty ( ) ) // if it does not exist
{
filename = locateLocal ( " data " , STD_USERFILENAME ) ;
if ( createNew ( filename ) ! = NoError ) // ...and we cannot create it
{
KMessageBox : : sorry ( this ,
i18n ( " Your standard kab database file "
" \" %1 \" "
" could not be created. kab will probably not "
" work correctly without it. \n "
" Make sure you have not removed write permission "
" from your local TDE directory (usually ~/.trinity). " ) . arg ( filename ) ) ;
state = PermDenied ;
} else {
KMessageBox : : information
( this ,
i18n ( " kab has created your standard addressbook in \n \" %1 \" " )
. arg ( filename ) ) ;
}
}
// ----- load the user standard file:
if ( loadit )
{
if ( load ( filename ) ! = NoError )
{ // ----- the standard file could not be loaded
state = PermDenied ;
} else {
if ( createBackup )
{
// ----- create the backup file:
TQString temp = data - > fileName ( ) ;
if ( data - > setFileName ( temp + " .backup " , false , false ) )
{
if ( ! data - > save ( ) )
{
KMessageBox : : information
( this ,
i18n ( " Cannot create backup file (permission denied). " ) ,
i18n ( " File Error " ) ) ;
}
} else {
KMessageBox : : error
( this ,
i18n ( " Cannot open backup file for "
" writing (permission denied). " ) ,
i18n ( " File Error " ) ) ;
}
// ----- reset the filename:
if ( ! data - > setFileName ( temp , true , true ) )
{
KMessageBox : : error
( this ,
i18n ( " Critical error: \n "
" Permissions changed in local directory! " ) ,
i18n ( " File Error " ) ) ;
closeFile ( false ) ;
state = PermDenied ;
} else {
state = NoError ;
}
}
}
}
// -----
data - > watch ( true ) ;
// ###########################################################################
}
AddressBook : : ~ AddressBook ( )
{
// ###########################################################################
delete data ;
delete config ;
delete entries ;
// ###########################################################################
}
QConfigDB * AddressBook : : getConfig ( )
{
// ###########################################################################
return config ;
// ###########################################################################
}
AddressBook : : ErrorCode AddressBook : : getState ( )
{
// ###########################################################################
return state ;
// ###########################################################################
}
AddressBook : : ErrorCode AddressBook : : load ( const TQString & filename )
{
// ----- Remark: Close the file if it could not be loaded!
// ###########################################################################
ErrorCode rc = NoError ;
TQFileInfo newfile , oldfile ;
// -----
TQString fname = ( filename . isEmpty ( ) ) ? data - > fileName ( ) : filename ;
if ( fname . isEmpty ( ) ) // there was never a filename set:
{
state = NoFile ;
return NoFile ;
}
// -----
newfile . setFile ( fname ) ;
oldfile . setFile ( data - > fileName ( ) ) ;
if ( isSameFile ( fname , data - > fileName ( ) ) )
{ // ----- possibly deleted file:
if ( data - > load ( ) )
{
emit ( setStatus ( i18n ( " File reloaded. " ) ) ) ;
state = NoError ;
} else {
switch
( KMessageBox : : questionYesNo
( this ,
i18n ( " The currently loaded file "
" \" %1 \" "
" cannot be reloaded. kab may close or save it. \n "
" Save it if you accidentally deleted your data file. \n "
" Close it if you intended to do so. \n "
" Your file will be closed by default. " )
. arg ( oldfile . absFilePath ( ) ) ,
i18n ( " File Error " ) ,
KStdGuiItem : : close ( ) , KStdGuiItem : : save ( ) ) )
{
case KMessageBox : : No : // save
if ( ! data - > save ( i18n ( " (Safety copy on file error) " ) . ascii ( ) , true ) )
{
KMessageBox : : information ( this ,
i18n ( " Cannot save the file; will close it now. " ) ,
i18n ( " File Error " ) ) ;
closeFile ( false ) ;
state = NoFile ;
rc = PermDenied ;
} else {
state = NoError ;
rc = NoError ;
}
break ; // no error if we could save the file
default : // close
closeFile ( false ) ;
state = NoFile ;
rc = NoSuchFile ;
break ;
}
}
} else { // ----- set new filename
if ( data - > setFileName ( fname , true , true ) )
{
if ( data - > load ( ) )
{
emit ( changed ( ) ) ;
emit ( setStatus ( i18n ( " File opened. " ) ) ) ;
state = NoError ;
} else {
KMessageBox : : information ( this ,
i18n ( " Could not load the file. " ) ,
i18n ( " File Error " ) ) ;
closeFile ( false ) ;
emit ( setStatus ( i18n ( " No such file. " ) ) ) ;
rc = NoSuchFile ;
}
} else {
if ( KMessageBox : : questionYesNo
( this ,
i18n ( " The file \" %1 \" cannot be found. "
" Create a new one? " ) . arg ( fname ) ,
i18n ( " No Such File " ) ,
i18n ( " Create " ) , KStdGuiItem : : cancel ( ) ) = = KMessageBox : : Yes )
{
if ( createNew ( fname ) = = NoError )
{
emit ( setStatus ( i18n ( " New file. " ) ) ) ;
} else { // ----- do not close here, stick with the old file:
emit ( setStatus ( i18n ( " Canceled. " ) ) ) ;
}
}
}
}
// -----
if ( rc = = NoError )
{
data - > watch ( true ) ;
updateMirrorMap ( ) ;
}
// -----
return rc ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : getListOfNames ( TQStringList * strings , bool reverse , bool initials )
{
register bool GUARD ; GUARD = false ;
// ###########################################################################
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::getListOfNames: called. \n " ;
StringKabKeyMap : : iterator pos ;
TQString desc ;
ErrorCode rc = NoError ;
ErrorCode temp ;
// ----- erase the list contents:
strings - > clear ( ) ;
// ----- ...and fill it:
for ( pos = entries - > begin ( ) ; pos ! = entries - > end ( ) ; + + pos )
{
temp = literalName ( ( * pos ) . second , desc , reverse , initials ) ;
if ( temp ! = AddressBook : : NoError )
{
desc = i18n ( " (Internal error in kab) " ) ;
rc = InternError ;
}
if ( desc . isEmpty ( ) )
{
desc = i18n ( " (empty entry) " ) ;
}
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < <
" AddressBook::getListOfNames: adding " < < desc < < endl ;
strings - > append ( desc ) ;
}
// ----- any problems?
kdDebug ( GUARD , KAB_KDEBUG_AREA )
< < " AddressBook::getListOfNames: done, "
< < strings - > count ( )
< < " entries. \n " ;
return rc ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : literalName ( const KabKey & key , TQString & text , bool rev , bool init )
{
// ###########################################################################
Entry entry ;
ErrorCode rc ;
// ----- get the entry:
rc = getEntry ( key , entry ) ;
if ( rc ! = NoError )
{
return rc ;
}
// -----
return literalName ( entry , text , rev , init ) ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : literalName ( const Entry & entry , TQString & text , bool rev , bool init )
{
register bool GUARD ; GUARD = false ;
// ###########################################################################
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::literalName: called. \n " ;
TQString firstname , middlename , lastname , nameprefix ;
// ----- is the formatted name set?
if ( ! entry . fn . isEmpty ( ) )
{
text = entry . fn ;
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < <
" AddressBook::literalName: done (fn). \n " ;
return NoError ;
}
// ----- prepare the strings:
firstname = entry . firstname . simplifyWhiteSpace ( ) ;
middlename = entry . middlename . simplifyWhiteSpace ( ) ;
lastname = entry . lastname . simplifyWhiteSpace ( ) ;
nameprefix = entry . nameprefix . simplifyWhiteSpace ( ) ;
// ----- create the initials:
if ( init )
{
if ( ! firstname . isEmpty ( ) ) firstname = firstname . mid ( 0 , 1 ) + ' . ' ;
if ( ! middlename . isEmpty ( ) ) middlename = middlename . mid ( 0 , 1 ) + ' . ' ;
// if(!lastname.isEmpty()) lastname=lastname.mid(0, 1)+'.';
}
// ----- assemble the string:
text = " " ;
if ( rev )
{ // name, firstname - add. name - name prefix
if ( ! lastname . isEmpty ( ) )
{
text = lastname ;
}
if ( ! firstname . isEmpty ( ) | | ! middlename . isEmpty ( ) | | ! nameprefix . isEmpty ( ) )
{
text + = ' , ' ;
}
if ( ! firstname . isEmpty ( ) )
{
if ( ! text . isEmpty ( ) )
{
text + = ' ' ;
}
text + = firstname ;
}
if ( ! middlename . isEmpty ( ) )
{
if ( ! text . isEmpty ( ) )
{
text + = ' ' ;
}
text + = middlename ;
}
if ( ! nameprefix . isEmpty ( ) )
{
if ( ! text . isEmpty ( ) )
{
text + = ' ' ;
}
text + = nameprefix ;
}
} else {
// firstname - add. name - name prefix - name
text = firstname ;
if ( ! middlename . isEmpty ( ) )
{
if ( ! text . isEmpty ( ) )
{
text + = ' ' ;
}
text + = middlename ;
}
if ( ! nameprefix . isEmpty ( ) )
{
if ( ! text . isEmpty ( ) )
{
text + = ' ' ;
}
text + = nameprefix ;
}
if ( ! lastname . isEmpty ( ) )
{
if ( ! text . isEmpty ( ) )
{
text + = ' ' ;
}
text + = lastname ;
}
}
// -----
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::literalName: done: "
< < text < < " . \n " ;
return NoError ;
// ###########################################################################
}
unsigned int
AddressBook : : noOfEntries ( )
{
// ###########################################################################
return entries - > size ( ) ;
// ###########################################################################
}
void
AddressBook : : dataFileChanged ( )
{
// ###########################################################################
data - > watch ( false ) ; // will be restarted after successful load
load ( ) ;
// ###########################################################################
}
void
AddressBook : : configFileChanged ( )
{
register bool GUARD ; GUARD = true ;
// ###########################################################################
if ( ! config - > load ( ) )
{
KMessageBox : : error ( this ,
i18n ( " Cannot reload configuration file! " ) ,
i18n ( " File Error " ) ) ;
} else {
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::configFileChanged: "
" config file reloaded. \n " ;
emit ( setStatus ( i18n ( " Configuration file reloaded. " ) ) ) ;
}
// ###########################################################################
}
void
AddressBook : : reloaded ( QConfigDB * db )
{
register bool GUARD ; GUARD = false ;
// ###########################################################################
if ( db = = data )
{
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::reloaded: file has been "
" reloaded. \n " ;
updateMirrorMap ( ) ; // WORK_TO_DO: what's up with the return value?
changed ( ) ;
}
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : save ( const TQString & filename , bool force )
{
// ###########################################################################
if ( filename . isEmpty ( ) )
{
if ( data - > save ( 0 , force ) )
{
emit ( setStatus ( i18n ( " File saved. " ) ) ) ;
return NoError ;
} else {
return PermDenied ;
}
} else {
if ( data - > setFileName ( filename , false , false ) )
{
if ( data - > save ( 0 , true ) )
{
emit ( newFile ( filename ) ) ;
return NoError ;
} else {
return PermDenied ;
}
} else {
return PermDenied ;
}
}
// ###########################################################################
}
bool
AddressBook : : isSameFile ( const TQString & a , const TQString & b )
{
// ###########################################################################
TQFileInfo filea ( a ) , fileb ( b ) ;
// -----
return filea . absFilePath ( ) = = fileb . absFilePath ( ) ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : closeFile ( bool saveit )
{
// ###########################################################################
if ( saveit )
{
if ( save ( ) ! = NoError )
{
emit ( setStatus ( i18n ( " Permission denied. " ) ) ) ;
return PermDenied ;
}
}
data - > clear ( ) ;
// data->reset(); WORK_TO_DO: File name is not reset by now.
emit ( setStatus ( i18n ( " File closed. " ) ) ) ;
return NoError ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : getEntry ( const KabKey & key , Entry & entry )
{
// ###########################################################################
Section * section ;
// -----
if ( getEntry ( key , section ) = = NoError )
{
return makeEntryFromSection ( section , entry ) ;
} else {
return NoSuchEntry ;
}
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : getEntry ( const KabKey & key , Section * & section )
{
register bool GUARD ; GUARD = false ;
// ###########################################################################
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::getEntry: searching entry "
" with key " < < key . getKey ( ) . data ( ) < < endl ;
StringKabKeyMap : : iterator pos ;
// -----
for ( pos = entries - > begin ( ) ; pos ! = entries - > end ( ) ; + + pos )
{
if ( ( * pos ) . second = = key )
{
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < <
" AddressBook::getEntry: key exists. " < < endl ;
break ;
}
}
if ( pos = = entries - > end ( ) )
{
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < <
" AddressBook::getEntry: no such entry. \n " ;
return NoSuchEntry ;
} else {
if ( data - > get ( ( TQCString ) ENTRY_SECTION + ' / ' + key . getKey ( ) , section ) )
{
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < <
" AddressBook::getEntry: done. " < < endl ;
return NoError ;
} else {
return InternError ;
}
}
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : getEntries ( list < Entry > & thelist )
{
// ###########################################################################
StringKabKeyMap : : iterator pos ;
Entry entry ;
ErrorCode rc ;
// -----
kdDebug ( ! thelist . empty ( ) , KAB_KDEBUG_AREA )
< < " AddressBook::getEntries: warning - non-empty value list! " < < endl ;
thelist . erase ( thelist . begin ( ) , thelist . end ( ) ) ;
for ( pos = entries - > begin ( ) ; pos ! = entries - > end ( ) ; + + pos )
{
rc = getEntry ( ( * pos ) . second , entry ) ;
if ( rc = = NoError )
{
thelist . push_back ( entry ) ;
} else {
return InternError ;
}
}
// -----
return NoError ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : getKey ( int index , KabKey & key )
{
// ###########################################################################
StringKabKeyMap : : iterator pos ;
// -----
if ( ( unsigned ) index < entries - > size ( ) )
{
pos = entries - > begin ( ) ;
advance ( pos , index ) ;
key = ( * pos ) . second ;
return NoError ;
} else {
return NoSuchEntry ;
}
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : getIndex ( const KabKey & key , int & index )
{
register bool GUARD ; GUARD = true ;
// ###########################################################################
StringKabKeyMap : : iterator pos ;
// -----
index = 0 ;
for ( pos = entries - > begin ( ) ; pos ! = entries - > end ( ) ; + + pos )
{
// kdDebug(KAB_KDEBUG_AREA) << (*pos).second.getKey().data() << " <--> " <<
// key.getKey().data() << endl;
if ( ( * pos ) . second = = key ) break ;
+ + index ;
}
kdDebug ( pos = = entries - > end ( ) , KAB_KDEBUG_AREA ) < <
" AddressBook::getIndex: no such key. " < < endl ;
if ( pos = = entries - > end ( ) )
{
return NoSuchEntry ;
} else {
return NoError ;
}
// ###########################################################################
}
Section *
AddressBook : : entrySection ( )
{
// ###########################################################################
Section * section ;
// -----
if ( ! data - > get ( ENTRY_SECTION , section ) )
{
return 0 ;
} else {
return section ;
}
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : add ( const Entry & entry , KabKey & key , bool update )
{
bool GUARD ; GUARD = true ;
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::add: called. " < < endl ;
// ###########################################################################
Section * theEntries = entrySection ( ) ;
Section * newEntry ;
KabKey nextKey ;
ErrorCode locked ;
ErrorCode rc ;
// -----
if ( theEntries = = 0 )
{
kdDebug ( KAB_KDEBUG_AREA ) < < " AddressBook::add: no entries section. "
< < endl ;
return NoFile ;
}
newEntry = new Section ;
if ( newEntry = = 0 )
{
KMessageBox : : error ( this ,
i18n ( " Cannot initialize local variables. " ) ,
i18n ( " Out of Memory " ) ) ;
kapp - > quit ( ) ; // It is critical, but will possibly never happen.
return InternError ; // shut the compiler up...
}
// ----- lock the file:
locked = lock ( ) ;
switch ( locked )
{
case PermDenied :
kdDebug ( GUARD , KAB_KDEBUG_AREA )
< < " AddressBook::add: permission denied. " < < endl ;
return PermDenied ; // cannot get r/w mode
case Locked :
kdDebug ( GUARD , KAB_KDEBUG_AREA )
< < " AddressBook::add: db is already in r/w mode. " < < endl ;
break ;
case NoError :
kdDebug ( GUARD , KAB_KDEBUG_AREA )
< < " AddressBook::add: got writing permissions. " < < endl ;
break ;
default :
kdDebug ( GUARD , KAB_KDEBUG_AREA )
< < " AddressBook::add: unknown response, exiting. " < < endl ;
return InternError ;
}
// -----
if ( makeSectionFromEntry ( entry , * newEntry ) = = NoError )
{
nextKey = nextAvailEntryKey ( ) ;
if ( ! theEntries - > add ( nextKey . getKey ( ) , newEntry ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::add: Cannot insert section. \n " ;
rc = InternError ;
} else {
key = nextKey ;
emit ( changed ( ) ) ;
rc = NoError ;
}
if ( update ) updateMirrorMap ( ) ;
} else {
rc = InternError ;
}
if ( locked ! = Locked )
{ // ----- unlock the file here:
kdDebug ( GUARD , KAB_KDEBUG_AREA )
< < " AddressBook::add: dropped writing permissions. " < < endl ;
locked = unlock ( ) ;
}
// -----
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::add: done. " < < endl ;
if ( locked ! = NoError )
{
return locked ;
}
if ( rc ! = NoError )
{
return rc ;
}
return NoError ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : change ( const KabKey & key , const Entry & entry )
{
// ###########################################################################
Section * theEntries = entrySection ( ) ;
Section * oldEntry ;
ErrorCode locked ;
ErrorCode rc ;
// -----
if ( theEntries = = 0 )
{
return NoFile ;
}
// ----- lock the file:
locked = lock ( ) ;
if ( locked = = PermDenied )
{
return PermDenied ; // cannot get r/w mode
}
// -----
if ( ! theEntries - > find ( key . getKey ( ) , oldEntry ) )
{
rc = NoSuchEntry ;
} else {
oldEntry - > clear ( ) ;
rc = makeSectionFromEntry ( entry , * oldEntry ) ;
emit ( changed ( ) ) ;
}
// -----
if ( locked ! = PermDenied )
{ // ----- unlock the file here:
locked = unlock ( ) ;
}
if ( locked = = NoError )
{
return rc ;
} else {
return locked ;
}
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : remove ( const KabKey & key )
{
// ###########################################################################
Section * theEntries = entrySection ( ) ;
ErrorCode locked ;
ErrorCode rc ;
// -----
if ( theEntries = = 0 )
{
return NoFile ;
}
// ----- lock the file:
locked = lock ( ) ;
if ( locked = = PermDenied )
{
return PermDenied ; // cannot get r/w mode
}
// -----
if ( theEntries - > remove ( key . getKey ( ) ) )
{
rc = NoError ;
emit ( changed ( ) ) ;
} else {
rc = NoSuchEntry ;
}
// -----
if ( locked ! = PermDenied )
{ // ----- unlock the file here:
locked = unlock ( ) ;
}
if ( locked = = NoError )
{
return rc ;
} else {
return locked ;
}
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : lock ( )
{
// ###########################################################################
if ( ! data - > isRO ( ) ) return Locked ;
if ( data - > setFileName ( data - > fileName ( ) , false , false ) )
{
return NoError ;
} else {
KMessageBox : : information ( this ,
i18n ( " The file you wanted to change could not be locked. \n "
" It is probably in use by another application or read-only. " ) ,
i18n ( " File Error " ) ) ;
return PermDenied ;
}
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : unlock ( )
{
// ###########################################################################
if ( data - > isRO ( ) ) return PermDenied ;
if ( data - > setFileName ( data - > fileName ( ) , true , true ) )
{
return NoError ;
} else {
return InternError ;
}
// ###########################################################################
}
KabKey
AddressBook : : nextAvailEntryKey ( )
{
// ###########################################################################
int max = 0 ;
int temp ;
Section : : StringSectionMap : : iterator pos ;
Section * section = entrySection ( ) ;
KabKey key ;
TQCString dummy ;
bool good = true ;
// -----
if ( section ! = 0 )
{
for ( pos = section - > sectionsBegin ( ) ; pos ! = section - > sectionsEnd ( ) ; + + pos )
{
temp = 0 ;
temp = ( * pos ) . first . toInt ( & good ) ;
if ( ! good )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::nextAvailEntryKey: non-integer entry "
< < endl ;
}
if ( temp > max )
{
max = temp ;
}
}
}
// -----
dummy . setNum ( + + max ) ;
key . setKey ( dummy ) ;
// CHECK(key.getKey().toInt(&good)==max);
return key ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : updateMirrorMap ( )
{
register bool GUARD ; GUARD = false ;
// ###########################################################################
kdDebug ( GUARD , KAB_KDEBUG_AREA )
< < " AddressBook::updateMirrorMap: updating mirror map. \n " ;
TQString key ;
Entry entry ;
ErrorCode ec ;
KabKey kk ;
Section * section = entrySection ( ) ;
Section : : StringSectionMap : : iterator pos ;
// -----
entries - > erase ( entries - > begin ( ) , entries - > end ( ) ) ;
if ( section = = 0 )
{
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::updateMirrorMap: done, "
" no file loaded. " < < endl ;
return NoError ;
}
for ( pos = section - > sectionsBegin ( ) ; pos ! = section - > sectionsEnd ( ) ; + + pos )
{
if ( makeEntryFromSection ( ( * pos ) . second , entry ) ! = NoError )
{
// return InternError; // it is saver to continue without a key
}
key = " " ;
ec = literalName ( entry , key , true , false ) ;
if ( key . isEmpty ( ) | | ec ! = NoError )
{
key = i18n ( " (empty entry) " ) ;
}
key + = ( * pos ) . first ; // append the section name to make the key unique
kk . setKey ( ( * pos ) . first ) ;
entries - > insert ( StringKabKeyMap : : value_type ( key , kk ) ) ;
}
// -----
kdDebug ( GUARD , KAB_KDEBUG_AREA ) < < " AddressBook::updateMirrorMap: done. "
< < endl ;
return NoError ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : makeEntryFromSection ( Section * section , Entry & entry )
{
// ###########################################################################
Section * addresses ;
Section * addressSection ;
Section : : StringSectionMap : : iterator pos ;
KeyValueMap * keys ;
Entry temp ;
Entry : : Address address ;
Entry : : Address addressDummy ;
int count ;
// ----- create the aggregats:
const TQCString StringKeys [ ] = {
" title " ,
" rank " ,
" fn " ,
" nameprefix " ,
" firstname " ,
" middlename " ,
" lastname " ,
" comment " ,
" user1 " ,
" user2 " ,
" user3 " ,
" user4 "
} ;
TQString * StringValues [ ] = {
& temp . title ,
& temp . rank ,
& temp . fn ,
& temp . nameprefix ,
& temp . firstname ,
& temp . middlename ,
& temp . lastname ,
& temp . comment ,
& temp . user1 ,
& temp . user2 ,
& temp . user3 ,
& temp . user4
} ;
const int StringKeySize = sizeof ( StringKeys ) / sizeof ( StringKeys [ 0 ] ) ;
const TQCString StringListKeys [ ] = {
" talk " ,
" emails " ,
" keywords " ,
" telephone " ,
" URLs " ,
" custom " ,
" categories "
} ;
TQStringList * StringListValues [ ] = {
& temp . talk ,
& temp . emails ,
& temp . keywords ,
& temp . telephone ,
& temp . URLs ,
& temp . custom ,
& temp . categories
} ;
const int StringListKeySize = sizeof ( StringListKeys ) / sizeof ( StringListKeys [ 0 ] ) ;
// ----- first parse "addresses" subsection:
if ( ! section - > find ( ADDRESS_SUBSECTION , addresses ) )
{
return InternError ; // no subsection called "addresses"
}
for ( pos = addresses - > sectionsBegin ( ) ; pos ! = addresses - > sectionsEnd ( ) ; + + pos )
{
if ( ! addresses - > find ( ( * pos ) . first , addressSection ) )
{
return InternError ; // no section we have an iterator for?
}
keys = addressSection - > getKeys ( ) ;
address = addressDummy ; // clean it up
if ( makeAddressFromMap ( keys , address ) = = AddressBook : : NoError )
{
// ----- add the address to the list of addresses:
temp . addresses . push_back ( address ) ;
} else {
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::makeEntryFromSection: cannot find all fields "
< < " in an address subsection. " < < endl ;
}
}
// ----- now parse all other fields directly:
keys = section - > getKeys ( ) ;
for ( count = 0 ; count < StringKeySize ; + + count )
{
if ( ! keys - > get ( StringKeys [ count ] , * StringValues [ count ] ) )
{
/* Spits out lots of warnings:
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::makeEntryFromSection: error: could not get "
< < " value for key " < < ( const char * ) StringKeys [ count ]
< < " . " < < endl ;
*/
}
}
for ( count = 0 ; count < StringListKeySize ; + + count )
{
if ( ! keys - > get ( StringListKeys [ count ] , * StringListValues [ count ] ) )
{
/* Spits out lots of warnings:
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::makeEntryFromSection: error: could not get "
< < " value for key " < < ( const char * ) StringListKeys [ count ]
< < " . " < < endl ;
*/
}
}
// ----- finally get the birthday:
keys - > get ( " birthday " , temp . birthday ) ; // this may return false (no date)
// -----
entry = temp ;
return NoError ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : makeAddressFromMap ( KeyValueMap * keys , Entry : : Address & address )
{
// ###########################################################################
const TQCString Keys [ ] = {
" headline " ,
" position " ,
" org " ,
" orgunit " ,
" orgsubunit " ,
// "role",
" deliverylabel " ,
" address " ,
" zip " ,
" town " ,
" country " ,
" state "
} ;
TQString * strings [ ] = {
& address . headline ,
& address . position ,
& address . org ,
& address . orgUnit ,
& address . orgSubUnit ,
// &address.role,
& address . deliveryLabel ,
& address . address ,
& address . zip ,
& address . town ,
& address . country ,
& address . state
} ;
const int Size = sizeof ( Keys ) / sizeof ( Keys [ 0 ] ) ;
int count ;
// -----
for ( count = 0 ; count < Size ; + + count )
{
keys - > get ( Keys [ count ] , * strings [ count ] ) ;
}
return NoError ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : makeSectionFromEntry ( const Entry & entry , Section & section )
{
// ###########################################################################
list < Entry : : Address > : : const_iterator addPos ;
Section * addresses = 0 ;
Section * address = 0 ;
TQCString key ; // used for creating address subsection keys
int count = 0 ; // counts the addresses
KeyValueMap * keys ;
// ----- prepare the section object:
section . clear ( ) ;
// ----- first create "addresses" subsection:
if ( ! section . add ( ADDRESS_SUBSECTION ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::makeSectionFromEntry: cannot create " < < " subsection. "
< < " " < < endl ;
return InternError ;
}
if ( ! section . find ( ADDRESS_SUBSECTION , addresses ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::makeSectionFromEntry: cannot get new section. " < < endl ;
return InternError ;
}
// ----- now insert addresses:
for ( addPos = entry . addresses . begin ( ) ; addPos ! = entry . addresses . end ( ) ; + + addPos )
{
+ + count ;
key . setNum ( count ) ;
if ( ! addresses - > add ( key ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::makeSectionFromEntry: cannot create address " < < endl ;
return InternError ;
}
if ( ! addresses - > find ( key , address ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::makeSectionFromEntry: cannot get new " < < endl ;
return InternError ;
}
keys = address - > getKeys ( ) ;
// ----- now insert keys into address:
if ( ! keys - > insert ( " headline " , ( * addPos ) . headline ) | |
! keys - > insert ( " position " , ( * addPos ) . position ) | |
! keys - > insert ( " org " , ( * addPos ) . org ) | |
! keys - > insert ( " orgunit " , ( * addPos ) . orgUnit ) | |
! keys - > insert ( " orgsubunit " , ( * addPos ) . orgSubUnit ) | |
// !keys->insert("role", (*addPos).role) ||
! keys - > insert ( " deliverylabel " , ( * addPos ) . deliveryLabel ) | |
! keys - > insert ( " address " , ( * addPos ) . address ) | |
! keys - > insert ( " zip " , ( * addPos ) . zip ) | |
! keys - > insert ( " town " , ( * addPos ) . town ) | |
! keys - > insert ( " country " , ( * addPos ) . country ) | |
! keys - > insert ( " state " , ( * addPos ) . state ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::makeSectionFromEntry: cannot completely "
< < " insert this address. " < < endl ;
return InternError ;
}
}
// ----- now add the other fields:
keys = section . getKeys ( ) ;
if ( ! keys - > insert ( " title " , entry . title ) | |
! keys - > insert ( " rank " , entry . rank ) | |
! keys - > insert ( " fn " , entry . fn ) | |
! keys - > insert ( " nameprefix " , entry . nameprefix ) | |
! keys - > insert ( " firstname " , entry . firstname ) | |
! keys - > insert ( " middlename " , entry . middlename ) | |
! keys - > insert ( " lastname " , entry . lastname ) | |
! keys - > insert ( " birthday " , entry . birthday ) | |
! keys - > insert ( " comment " , entry . comment ) | |
! keys - > insert ( " talk " , entry . talk ) | |
! keys - > insert ( " emails " , entry . emails ) | |
! keys - > insert ( " keywords " , entry . keywords ) | |
! keys - > insert ( " telephone " , entry . telephone ) | |
! keys - > insert ( " URLs " , entry . URLs ) | |
! keys - > insert ( " user1 " , entry . user1 ) | |
! keys - > insert ( " user2 " , entry . user2 ) | |
! keys - > insert ( " user3 " , entry . user3 ) | |
! keys - > insert ( " user4 " , entry . user4 ) | |
! keys - > insert ( " custom " , entry . custom ) | |
! keys - > insert ( " categories " , entry . categories ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::makeEntryFromSection: cannot insert "
< < " all fields of the entry. " < < endl ;
return InternError ;
}
// -----
return NoError ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : createNew ( const TQString & filename )
{
// ###########################################################################
const TQString KabTemplateFile = locate ( " data " , " kab/template.kab " ) ;
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::createNew: template file is \" "
< < ( const char * ) KabTemplateFile . utf8 ( ) < < " \" . " < < endl ;
QConfigDB db ;
// -----
if ( KabTemplateFile . isEmpty ( )
| | ! db . setFileName ( KabTemplateFile , true , true ) )
{
KMessageBox : : error ( this ,
i18n ( " Cannot find kab's template file. \n "
" You cannot create new files. " ) ,
i18n ( " File Error " ) ) ;
return InternError ;
}
if ( ! db . load ( ) )
{
KMessageBox : : error ( this ,
i18n ( " Cannot read kab's template file. \n "
" You cannot create new files. " ) ,
i18n ( " Format Error " ) ) ;
return InternError ;
}
if ( ! db . setFileName ( filename , false , false ) )
{
KMessageBox : : error ( this ,
i18n ( " Cannot create the file \n \" " )
+ filename + " \" \n " +
i18n ( " Could not create the new file. " ) ,
i18n ( " File Error " ) ) ;
return PermDenied ;
}
if ( ! db . save ( ) )
{
KMessageBox : : error ( this ,
i18n ( " Cannot save the file \n \" " )
+ filename + " \" \n " +
i18n ( " Could not create the new file. " ) ,
i18n ( " File Error " ) ) ;
return InternError ;
}
// -----
return NoError ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : createConfigFile ( )
{
// ###########################################################################
const TQString ConfigTemplateFile = locate ( " data " , " kab/template.config " ) ;
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::createConfigFile: config template file is \" "
< < ( const char * ) ConfigTemplateFile . utf8 ( ) < < " \" . " < < endl ;
const TQString filename = locateLocal ( " data " , STD_CONFIGFILENAME ) ;
QConfigDB db ;
// -----
if ( ConfigTemplateFile . isEmpty ( )
| | ! db . setFileName ( ConfigTemplateFile , true , true ) )
{
KMessageBox : : error ( this ,
i18n ( " Cannot find kab's configuration template file. \n "
" kab cannot be configured. " ) ,
i18n ( " File Error " ) ) ;
return InternError ;
}
if ( ! db . load ( ) )
{
KMessageBox : : error ( this ,
i18n ( " Cannot read kab's configuration template file. \n "
" kab cannot be configured. " ) ,
i18n ( " File Error " ) ) ;
return InternError ;
}
if ( ! db . setFileName ( filename , false , false ) )
{
KMessageBox : : error ( this ,
i18n ( " Cannot create the file \n \" " )
+ filename + " \" \n " +
i18n ( " Could not create the new configuration file. " ) ,
i18n ( " File Error " ) ) ;
return PermDenied ;
}
if ( ! db . save ( ) )
{
KMessageBox : : error ( this ,
i18n ( " Cannot save the file \n \" " )
+ filename + " \" \n " +
i18n ( " Could not create the new configuration file. " ) ,
i18n ( " File Error " ) ) ;
return InternError ;
}
// -----
return NoError ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : loadConfigFile ( )
{
// ###########################################################################
TQString file = locateLocal ( " data " , STD_CONFIGFILENAME ) ;
if ( config - > setFileName ( file , true , true ) )
{
if ( config - > load ( ) )
{
return NoError ;
} else {
KMessageBox : : information ( this ,
i18n ( " Cannot load kab's local configuration file. \n "
" There may be a formatting error. \n "
" kab cannot be configured. " ) ,
i18n ( " File Error " ) ) ;
return InternError ;
}
} else {
KMessageBox : : information ( this ,
i18n ( " Cannot find kab's local configuration file. \n "
" kab cannot be configured. " ) ,
i18n ( " File Error " ) ) ;
return NoSuchFile ;
}
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : makeVCardFromEntry ( const Entry & , const TQString & )
{
// ###########################################################################
return NotImplemented ;
// ###########################################################################
}
AddressBook : : ErrorCode
AddressBook : : makeEntryFromVCard ( const TQString & , Entry & )
{
// ###########################################################################
return NotImplemented ;
// ###########################################################################
}
TQString
AddressBook : : getStandardFileName ( )
{
// ###########################################################################
return locateLocal ( " data " , STD_USERFILENAME ) ;
// ###########################################################################
}
TQString AddressBook : : phoneType ( AddressBook : : Telephone phone )
{
switch ( phone )
{
case Fixed : return i18n ( " fixed " ) ; break ;
case Mobile : return i18n ( " mobile " ) ; break ;
case Fax : return i18n ( " fax " ) ; break ;
case Modem : return i18n ( " modem " ) ; break ;
default : return i18n ( " general " ) ;
}
}
void AddressBook : : externalChange ( )
{
updateMirrorMap ( ) ;
}
Section * AddressBook : : configurationSection ( )
{
Section * section ;
if ( data ! = 0 )
{
if ( data - > get ( LOCAL_CONFIG_SECTION , section ) )
{
return section ;
} else {
return 0 ;
}
} else {
return 0 ;
}
}
AddressBook : : ErrorCode AddressBook : : Entry : : get ( const char * fieldname , TQVariant & field )
{
// "title", "rank", "fn", "nameprefix", "firstname", "middlename", "lastname",
// "birthday", "comment", "talk", "emails", "keywords", "telephone",
// "urls", "user1", "user2", "user3", "user4", "custom"
int dummy = 0 ;
// -----
if ( fieldname = = Fields [ dummy + + ] )
{ // the title
field = title ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the rank
field = rank ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the formatted name
field = fn ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the nameprefix
field = nameprefix ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the firstname
field = firstname ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the middle name
field = middlename ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the last name
field = lastname ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the birthday
field = TQString ( birthday . toString ( ) ) ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the comment
field = comment ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the talk addresses
field = talk ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the email addresses
field = emails ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the keywords
field = keywords ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the telephones
field = telephone ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the urls
field = URLs ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the user field 1
field = user1 ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the user field 2
field = user2 ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the user field 3
field = user3 ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the user field 4
field = user4 ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the custom fields (app specific)
field = custom ;
return NoError ;
}
// ----- we did not find that field:
return NoSuchField ;
}
AddressBook : : ErrorCode AddressBook : : Entry : : Address : : get ( const char * fieldname ,
TQVariant & field )
{
// "headline", "position",
// "org", "orgunit", "orgsubunit",
// "deliverylabel", "address", "zip", "town", "country", "state"
int dummy = 0 ;
// -----
if ( fieldname = = Fields [ dummy + + ] )
{ // the headline
field = headline ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the position
field = position ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the organization
field = org ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the organizational unit
field = orgUnit ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the organizational subunit
field = orgSubUnit ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the delivery label
field = deliveryLabel ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the address
field = address ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the zip code
field = zip ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the town
field = town ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the country
field = country ;
return NoError ;
}
if ( fieldname = = Fields [ dummy + + ] )
{ // the state
field = state ;
return NoError ;
}
// ----- we did not find that field:
return NoSuchField ;
}
Section * AddressBook : : categoriesSection ( )
{
const TQString Predefines [ ] = {
i18n ( " Business " ) ,
i18n ( " Private " ) ,
i18n ( " Dates " ) } ;
size_t Size = sizeof ( Predefines ) / sizeof ( Predefines [ 0 ] ) ;
Section * section ;
Section * categories ;
KeyValueMap * keys ;
// -----
if ( data - > get ( KAB_CATEGORY_KEY , section ) )
{
// it exists, go ahead
return section ;
} else {
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::categoriesSection: creating categories structure. " < < endl ;
// it does not exist - create it
if ( ! data - > createSection ( KAB_CATEGORY_KEY ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::categoriesSection: error creating categories section. "
< < endl ;
return 0 ;
}
data - > get ( KAB_CATEGORY_KEY , section ) ;
// add the predefined categories:
categories = new Section ;
keys = categories - > getKeys ( ) ;
for ( size_t count = 0 ; count < Size ; + + count )
{
TQStringList values ;
values . append ( Predefines [ count ] ) ;
keys - > insert ( TQCString ( ) . setNum ( count ) , values ) ;
}
section - > add ( KAB_CATEGORY_KEY , categories ) ;
keys = section - > getKeys ( ) ;
keys - > insert ( " NextAvailableCatKey " , ( long ) Size ) ;
}
save ( ) ;
if ( data - > get ( KAB_CATEGORY_KEY , section ) )
return section ;
return 0 ; // might not happen
}
AddressBook : : ErrorCode AddressBook : : categories ( CategoriesMap & cat )
{ // WORK_TO_DO: use a permanent cached map and update on changed()
kdDebug ( KAB_KDEBUG_AREA , ! cat . isEmpty ( ) )
< < " AddressBook::categories: warning - categories map is supposed to be empty! "
< < endl ;
Section * section ;
Section * categories ;
KeyValueMap * keys ;
int key ;
bool rc ;
TQStringList values ;
StringStringMap : : iterator pos ;
// ----- query categories section:
section = categoriesSection ( ) ;
TQ_CHECK_PTR ( section ) ;
// -----
if ( ! section - > find ( KAB_CATEGORY_KEY , categories ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::categories: error in database structure. "
< < endl ;
return InternError ;
}
// ----- everything is set up, create the categories map:
// use an iterator to walk over all elements of categories key-value-map:
keys = categories - > getKeys ( ) ;
for ( pos = keys - > begin ( ) ; pos ! = keys - > end ( ) ; + + pos )
{
if ( ! keys - > get ( ( * pos ) . first , values ) )
{
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::categories: internal error querying categories. "
< < endl ;
} else {
key = ( * pos ) . first . toInt ( & rc ) ;
if ( rc )
{
cat . insert ( key , values [ 0 ] ) ;
} else {
kdDebug ( KAB_KDEBUG_AREA )
< < " AddressBook::categories: error - non-integer category key - ignored. "
< < endl ;
}
}
}
return NoError ;
}
# include "addressbook.moc"