summaryrefslogtreecommitdiff
authorzecke <zecke>2002-11-02 12:36:34 (UTC)
committer zecke <zecke>2002-11-02 12:36:34 (UTC)
commitffd0a764e4ac7f9bf29edf3b9b4d341e153ecf4a (patch) (unidiff)
tree601ac645a3768c1fe89fce01243f54a24f08dc15
parent74f49994a9c19bdfdbfdfb57a5cf5e1a1f966b53 (diff)
downloadopie-ffd0a764e4ac7f9bf29edf3b9b4d341e153ecf4a.zip
opie-ffd0a764e4ac7f9bf29edf3b9b4d341e153ecf4a.tar.gz
opie-ffd0a764e4ac7f9bf29edf3b9b4d341e153ecf4a.tar.bz2
Fix a vCard problem in OContact
cell phones do not set the UId property... add some more states to otodo
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/ocontact.cpp41
-rw-r--r--libopie/pim/opimrecord.h4
-rw-r--r--libopie/pim/opimstate.cpp64
-rw-r--r--libopie/pim/opimstate.h44
-rw-r--r--libopie/pim/orecordlist.h2
-rw-r--r--libopie/pim/orecur.cpp9
-rw-r--r--libopie/pim/orecur.h2
-rw-r--r--libopie/pim/otodo.cpp23
-rw-r--r--libopie/pim/otodo.h27
-rw-r--r--libopie2/opiepim/core/opimrecord.h4
-rw-r--r--libopie2/opiepim/core/opimstate.cpp64
-rw-r--r--libopie2/opiepim/core/opimstate.h44
-rw-r--r--libopie2/opiepim/core/orecur.cpp9
-rw-r--r--libopie2/opiepim/core/orecur.h2
-rw-r--r--libopie2/opiepim/ocontact.cpp41
-rw-r--r--libopie2/opiepim/orecordlist.h2
-rw-r--r--libopie2/opiepim/otodo.cpp23
-rw-r--r--libopie2/opiepim/otodo.h27
18 files changed, 388 insertions, 44 deletions
diff --git a/libopie/pim/ocontact.cpp b/libopie/pim/ocontact.cpp
index acd65c4..cd238ef 100644
--- a/libopie/pim/ocontact.cpp
+++ b/libopie/pim/ocontact.cpp
@@ -1098,72 +1098,72 @@ static VObject *createVObject( const OContact &c )
1098 1098
1099 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); 1099 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() );
1100 safeAddProp( work_phone, VCWorkProp ); 1100 safeAddProp( work_phone, VCWorkProp );
1101 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); 1101 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() );
1102 safeAddProp( work_phone, VCWorkProp ); 1102 safeAddProp( work_phone, VCWorkProp );
1103 safeAddProp( work_phone, VCCellularProp ); 1103 safeAddProp( work_phone, VCCellularProp );
1104 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); 1104 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() );
1105 safeAddProp( work_phone, VCWorkProp ); 1105 safeAddProp( work_phone, VCWorkProp );
1106 safeAddProp( work_phone, VCFaxProp ); 1106 safeAddProp( work_phone, VCFaxProp );
1107 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); 1107 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() );
1108 safeAddProp( work_phone, VCWorkProp ); 1108 safeAddProp( work_phone, VCWorkProp );
1109 safeAddProp( work_phone, VCPagerProp ); 1109 safeAddProp( work_phone, VCPagerProp );
1110 1110
1111 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); 1111 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() );
1112 safeAddProp( url, VCWorkProp ); 1112 safeAddProp( url, VCWorkProp );
1113 1113
1114 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); 1114 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() );
1115 safeAddProp( title, VCWorkProp ); 1115 safeAddProp( title, VCWorkProp );
1116 1116
1117 1117
1118 QStringList emails = c.emailList(); 1118 QStringList emails = c.emailList();
1119 emails.prepend( c.defaultEmail() ); 1119 emails.prepend( c.defaultEmail() );
1120 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { 1120 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) {
1121 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); 1121 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it );
1122 safeAddProp( email, VCInternetProp ); 1122 safeAddProp( email, VCInternetProp );
1123 } 1123 }
1124 1124
1125 safeAddPropValue( vcard, VCNoteProp, c.notes() ); 1125 safeAddPropValue( vcard, VCNoteProp, c.notes() );
1126 1126
1127 // Exporting Birthday regarding RFC 2425 (5.8.4) 1127 // Exporting Birthday regarding RFC 2425 (5.8.4)
1128 if ( c.birthday().isValid() ){ 1128 if ( c.birthday().isValid() ){
1129 QString birthd_rfc2425 = QString("%1-%2-%3") 1129 QString birthd_rfc2425 = QString("%1-%2-%3")
1130 .arg( c.birthday().year() ) 1130 .arg( c.birthday().year() )
1131 .arg( c.birthday().month(), 2 ) 1131 .arg( c.birthday().month(), 2 )
1132 .arg( c.birthday().day(), 2 ); 1132 .arg( c.birthday().day(), 2 );
1133 // Now replace spaces with "0"... 1133 // Now replace spaces with "0"...
1134 int pos = 0; 1134 int pos = 0;
1135 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 ) 1135 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 )
1136 birthd_rfc2425.replace( pos, 1, "0" ); 1136 birthd_rfc2425.replace( pos, 1, "0" );
1137 1137
1138 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1()); 1138 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1());
1139 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() ); 1139 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() );
1140 } 1140 }
1141 1141
1142 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { 1142 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) {
1143 VObject *org = safeAddProp( vcard, VCOrgProp ); 1143 VObject *org = safeAddProp( vcard, VCOrgProp );
1144 safeAddPropValue( org, VCOrgNameProp, c.company() ); 1144 safeAddPropValue( org, VCOrgNameProp, c.company() );
1145 safeAddPropValue( org, VCOrgUnitProp, c.department() ); 1145 safeAddPropValue( org, VCOrgUnitProp, c.department() );
1146 safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); 1146 safeAddPropValue( org, VCOrgUnit2Prop, c.office() );
1147 } 1147 }
1148 1148
1149 // some values we have to export as custom fields 1149 // some values we have to export as custom fields
1150 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); 1150 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() );
1151 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); 1151 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() );
1152 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); 1152 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() );
1153 1153
1154 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); 1154 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() );
1155 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); 1155 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() );
1156 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) ); 1156 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) );
1157 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); 1157 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() );
1158 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); 1158 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() );
1159 1159
1160 return vcard; 1160 return vcard;
1161} 1161}
1162 1162
1163 1163
1164/*! 1164/*!
1165 \internal 1165 \internal
1166*/ 1166*/
1167static QDate convVCardDateToDate( const QString& datestr ) 1167static QDate convVCardDateToDate( const QString& datestr )
1168{ 1168{
1169 int monthPos = datestr.find('-'); 1169 int monthPos = datestr.find('-');
@@ -1359,69 +1359,69 @@ static OContact parseVObject( VObject *obj )
1359 else if ( name == VCOrgUnitProp ) 1359 else if ( name == VCOrgUnitProp )
1360 c.setDepartment( value ); 1360 c.setDepartment( value );
1361 else if ( name == VCOrgUnit2Prop ) 1361 else if ( name == VCOrgUnit2Prop )
1362 c.setOffice( value ); 1362 c.setOffice( value );
1363 } 1363 }
1364 } 1364 }
1365 else if ( name == VCTitleProp ) { 1365 else if ( name == VCTitleProp ) {
1366 c.setJobTitle( value ); 1366 c.setJobTitle( value );
1367 } 1367 }
1368 else if ( name == "X-Qtopia-Profession" ) { 1368 else if ( name == "X-Qtopia-Profession" ) {
1369 c.setProfession( value ); 1369 c.setProfession( value );
1370 } 1370 }
1371 else if ( name == "X-Qtopia-Manager" ) { 1371 else if ( name == "X-Qtopia-Manager" ) {
1372 c.setManager( value ); 1372 c.setManager( value );
1373 } 1373 }
1374 else if ( name == "X-Qtopia-Assistant" ) { 1374 else if ( name == "X-Qtopia-Assistant" ) {
1375 c.setAssistant( value ); 1375 c.setAssistant( value );
1376 } 1376 }
1377 else if ( name == "X-Qtopia-Spouse" ) { 1377 else if ( name == "X-Qtopia-Spouse" ) {
1378 c.setSpouse( value ); 1378 c.setSpouse( value );
1379 } 1379 }
1380 else if ( name == "X-Qtopia-Gender" ) { 1380 else if ( name == "X-Qtopia-Gender" ) {
1381 c.setGender( value ); 1381 c.setGender( value );
1382 } 1382 }
1383 else if ( name == "X-Qtopia-Anniversary" ) { 1383 else if ( name == "X-Qtopia-Anniversary" ) {
1384 c.setAnniversary( TimeConversion::fromString( value ) ); 1384 c.setAnniversary( TimeConversion::fromString( value ) );
1385 } 1385 }
1386 else if ( name == "X-Qtopia-Nickname" ) { 1386 else if ( name == "X-Qtopia-Nickname" ) {
1387 c.setNickname( value ); 1387 c.setNickname( value );
1388 } 1388 }
1389 else if ( name == "X-Qtopia-Children" ) { 1389 else if ( name == "X-Qtopia-Children" ) {
1390 c.setChildren( value ); 1390 c.setChildren( value );
1391 } 1391 }
1392 else if ( name == VCBirthDateProp ) { 1392 else if ( name == VCBirthDateProp ) {
1393 // Reading Birthdate regarding RFC 2425 (5.8.4) 1393 // Reading Birthdate regarding RFC 2425 (5.8.4)
1394 c.setBirthday( convVCardDateToDate( value ) ); 1394 c.setBirthday( convVCardDateToDate( value ) );
1395 1395
1396 } 1396 }
1397 1397
1398#if 0 1398#if 0
1399 else { 1399 else {
1400 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); 1400 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) );
1401 VObjectIterator nit; 1401 VObjectIterator nit;
1402 initPropIterator( &nit, o ); 1402 initPropIterator( &nit, o );
1403 while( moreIteration( &nit ) ) { 1403 while( moreIteration( &nit ) ) {
1404 VObject *o = nextVObject( &nit ); 1404 VObject *o = nextVObject( &nit );
1405 QCString name = vObjectName( o ); 1405 QCString name = vObjectName( o );
1406 QString value = vObjectStringZValue( o ); 1406 QString value = vObjectStringZValue( o );
1407 printf(" subprop: %s = %s\n", name.data(), value.latin1() ); 1407 printf(" subprop: %s = %s\n", name.data(), value.latin1() );
1408 } 1408 }
1409 } 1409 }
1410#endif 1410#endif
1411 } 1411 }
1412 c.setFileAs(); 1412 c.setFileAs();
1413 return c; 1413 return c;
1414} 1414}
1415 1415
1416/*! 1416/*!
1417 Writes the list of \a contacts as a set of VCards to the file \a filename. 1417 Writes the list of \a contacts as a set of VCards to the file \a filename.
1418*/ 1418*/
1419void OContact::writeVCard( const QString &filename, const QValueList<OContact> &contacts) 1419void OContact::writeVCard( const QString &filename, const QValueList<OContact> &contacts)
1420{ 1420{
1421 QFileDirect f( filename.utf8().data() ); 1421 QFileDirect f( filename.utf8().data() );
1422 if ( !f.open( IO_WriteOnly ) ) { 1422 if ( !f.open( IO_WriteOnly ) ) {
1423 qWarning("Unable to open vcard write"); 1423 qWarning("Unable to open vcard write");
1424 return; 1424 return;
1425 } 1425 }
1426 1426
1427 QValueList<OContact>::ConstIterator it; 1427 QValueList<OContact>::ConstIterator it;
@@ -1435,219 +1435,228 @@ void OContact::writeVCard( const QString &filename, const QValueList<OContact> &
1435 1435
1436/*! 1436/*!
1437 writes \a contact as a VCard to the file \a filename. 1437 writes \a contact as a VCard to the file \a filename.
1438*/ 1438*/
1439void OContact::writeVCard( const QString &filename, const OContact &contact) 1439void OContact::writeVCard( const QString &filename, const OContact &contact)
1440{ 1440{
1441 QFileDirect f( filename.utf8().data() ); 1441 QFileDirect f( filename.utf8().data() );
1442 if ( !f.open( IO_WriteOnly ) ) { 1442 if ( !f.open( IO_WriteOnly ) ) {
1443 qWarning("Unable to open vcard write"); 1443 qWarning("Unable to open vcard write");
1444 return; 1444 return;
1445 } 1445 }
1446 1446
1447 VObject *obj = createVObject( contact ); 1447 VObject *obj = createVObject( contact );
1448 writeVObject( f.directHandle() , obj ); 1448 writeVObject( f.directHandle() , obj );
1449 cleanVObject( obj ); 1449 cleanVObject( obj );
1450 1450
1451 cleanStrTbl(); 1451 cleanStrTbl();
1452} 1452}
1453 1453
1454/*! 1454/*!
1455 Returns the set of contacts read as VCards from the file \a filename. 1455 Returns the set of contacts read as VCards from the file \a filename.
1456*/ 1456*/
1457QValueList<OContact> OContact::readVCard( const QString &filename ) 1457QValueList<OContact> OContact::readVCard( const QString &filename )
1458{ 1458{
1459 qDebug("trying to open %s, exists=%d", filename.utf8().data(), QFileInfo( filename.utf8().data() ).size() ); 1459 qDebug("trying to open %s, exists=%d", filename.utf8().data(), QFileInfo( filename.utf8().data() ).size() );
1460 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() ); 1460 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() );
1461 1461
1462 qDebug("vobject = %p", obj ); 1462 qDebug("vobject = %p", obj );
1463 1463
1464 QValueList<OContact> contacts; 1464 QValueList<OContact> contacts;
1465 1465
1466 while ( obj ) { 1466 while ( obj ) {
1467 contacts.append( parseVObject( obj ) ); 1467 OContact con = parseVObject( obj );
1468 /*
1469 * if uid is 0 assign a new one
1470 * this at least happens on
1471 * Nokia6210
1472 */
1473 if ( con.uid() == 0 )
1474 con.setUid( 1 );
1475
1476 contacts.append(con );
1468 1477
1469 VObject *t = obj; 1478 VObject *t = obj;
1470 obj = nextVObjectInList(obj); 1479 obj = nextVObjectInList(obj);
1471 cleanVObject( t ); 1480 cleanVObject( t );
1472 } 1481 }
1473 1482
1474 return contacts; 1483 return contacts;
1475} 1484}
1476 1485
1477/*! 1486/*!
1478 Returns TRUE if the contact matches the regular expression \a regexp. 1487 Returns TRUE if the contact matches the regular expression \a regexp.
1479 Otherwise returns FALSE. 1488 Otherwise returns FALSE.
1480*/ 1489*/
1481bool OContact::match( const QString &regexp ) const 1490bool OContact::match( const QString &regexp ) const
1482{ 1491{
1483 return match(QRegExp(regexp)); 1492 return match(QRegExp(regexp));
1484} 1493}
1485 1494
1486/*! 1495/*!
1487 \overload 1496 \overload
1488 Returns TRUE if the contact matches the regular expression \a regexp. 1497 Returns TRUE if the contact matches the regular expression \a regexp.
1489 Otherwise returns FALSE. 1498 Otherwise returns FALSE.
1490*/ 1499*/
1491bool OContact::match( const QRegExp &r ) const 1500bool OContact::match( const QRegExp &r ) const
1492{ 1501{
1493 bool match; 1502 bool match;
1494 match = false; 1503 match = false;
1495 QMap<int, QString>::ConstIterator it; 1504 QMap<int, QString>::ConstIterator it;
1496 for ( it = mMap.begin(); it != mMap.end(); ++it ) { 1505 for ( it = mMap.begin(); it != mMap.end(); ++it ) {
1497 if ( (*it).find( r ) > -1 ) { 1506 if ( (*it).find( r ) > -1 ) {
1498 match = true; 1507 match = true;
1499 break; 1508 break;
1500 } 1509 }
1501 } 1510 }
1502 return match; 1511 return match;
1503} 1512}
1504 1513
1505 1514
1506QString OContact::toShortText() const 1515QString OContact::toShortText() const
1507{ 1516{
1508 return ( fullName() ); 1517 return ( fullName() );
1509} 1518}
1510QString OContact::type() const 1519QString OContact::type() const
1511{ 1520{
1512 return QString::fromLatin1( "OContact" ); 1521 return QString::fromLatin1( "OContact" );
1513} 1522}
1514 1523
1515// Definition is missing ! (se) 1524// Definition is missing ! (se)
1516QMap<QString,QString> OContact::toExtraMap() const 1525QMap<QString,QString> OContact::toExtraMap() const
1517{ 1526{
1518 qWarning ("Function not implemented: OContact::toExtraMap()"); 1527 qWarning ("Function not implemented: OContact::toExtraMap()");
1519 QMap <QString,QString> useless; 1528 QMap <QString,QString> useless;
1520 return useless; 1529 return useless;
1521} 1530}
1522 1531
1523class QString OContact::recordField( int pos ) const 1532class QString OContact::recordField( int pos ) const
1524{ 1533{
1525 QStringList SLFIELDS = fields(); // ?? why this ? (se) 1534 QStringList SLFIELDS = fields(); // ?? why this ? (se)
1526 return SLFIELDS[pos]; 1535 return SLFIELDS[pos];
1527} 1536}
1528 1537
1529// In future releases, we should store birthday and anniversary 1538// In future releases, we should store birthday and anniversary
1530// internally as QDate instead of QString ! 1539// internally as QDate instead of QString !
1531// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se) 1540// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se)
1532 1541
1533/*! \fn void OContact::setBirthday( const QDate& date ) 1542/*! \fn void OContact::setBirthday( const QDate& date )
1534 Sets the birthday for the contact to \a date. 1543 Sets the birthday for the contact to \a date.
1535*/ 1544*/
1536void OContact::setBirthday( const QDate &v ) 1545void OContact::setBirthday( const QDate &v )
1537{ 1546{
1538 if ( ( !v.isNull() ) && ( v.isValid() ) ) 1547 if ( ( !v.isNull() ) && ( v.isValid() ) )
1539 replace( Qtopia::Birthday, TimeConversion::toString( v ) ); 1548 replace( Qtopia::Birthday, TimeConversion::toString( v ) );
1540 1549
1541} 1550}
1542 1551
1543 1552
1544/*! \fn void OContact::setAnniversary( const QDate &date ) 1553/*! \fn void OContact::setAnniversary( const QDate &date )
1545 Sets the anniversary of the contact to \a date. 1554 Sets the anniversary of the contact to \a date.
1546*/ 1555*/
1547void OContact::setAnniversary( const QDate &v ) 1556void OContact::setAnniversary( const QDate &v )
1548{ 1557{
1549 if ( ( !v.isNull() ) && ( v.isValid() ) ) 1558 if ( ( !v.isNull() ) && ( v.isValid() ) )
1550 replace( Qtopia::Anniversary, TimeConversion::toString( v ) ); 1559 replace( Qtopia::Anniversary, TimeConversion::toString( v ) );
1551} 1560}
1552 1561
1553/*! \fn QDate OContact::birthday() const 1562/*! \fn QDate OContact::birthday() const
1554 Returns the birthday of the contact. 1563 Returns the birthday of the contact.
1555*/ 1564*/
1556QDate OContact::birthday() const 1565QDate OContact::birthday() const
1557{ 1566{
1558 QString str = find( Qtopia::Birthday ); 1567 QString str = find( Qtopia::Birthday );
1559 qWarning ("Birthday %s", str.latin1() ); 1568 qWarning ("Birthday %s", str.latin1() );
1560 if ( !str.isEmpty() ) 1569 if ( !str.isEmpty() )
1561 return TimeConversion::fromString ( str ); 1570 return TimeConversion::fromString ( str );
1562 else 1571 else
1563 return QDate(); 1572 return QDate();
1564} 1573}
1565 1574
1566 1575
1567/*! \fn QDate OContact::anniversary() const 1576/*! \fn QDate OContact::anniversary() const
1568 Returns the anniversary of the contact. 1577 Returns the anniversary of the contact.
1569*/ 1578*/
1570QDate OContact::anniversary() const 1579QDate OContact::anniversary() const
1571{ 1580{
1572 QDate empty; 1581 QDate empty;
1573 QString str = find( Qtopia::Anniversary ); 1582 QString str = find( Qtopia::Anniversary );
1574 qWarning ("Anniversary %s", str.latin1() ); 1583 qWarning ("Anniversary %s", str.latin1() );
1575 if ( !str.isEmpty() ) 1584 if ( !str.isEmpty() )
1576 return TimeConversion::fromString ( str ); 1585 return TimeConversion::fromString ( str );
1577 else 1586 else
1578 return empty; 1587 return empty;
1579} 1588}
1580 1589
1581 1590
1582void OContact::insertEmail( const QString &v ) 1591void OContact::insertEmail( const QString &v )
1583{ 1592{
1584 //qDebug("insertEmail %s", v.latin1()); 1593 //qDebug("insertEmail %s", v.latin1());
1585 QString e = v.simplifyWhiteSpace(); 1594 QString e = v.simplifyWhiteSpace();
1586 QString def = defaultEmail(); 1595 QString def = defaultEmail();
1587 1596
1588 // if no default, set it as the default email and don't insert 1597 // if no default, set it as the default email and don't insert
1589 if ( def.isEmpty() ) { 1598 if ( def.isEmpty() ) {
1590 setDefaultEmail( e ); // will insert into the list for us 1599 setDefaultEmail( e ); // will insert into the list for us
1591 return; 1600 return;
1592 } 1601 }
1593 1602
1594 // otherwise, insert assuming doesn't already exist 1603 // otherwise, insert assuming doesn't already exist
1595 QString emailsStr = find( Qtopia::Emails ); 1604 QString emailsStr = find( Qtopia::Emails );
1596 if ( emailsStr.contains( e )) 1605 if ( emailsStr.contains( e ))
1597 return; 1606 return;
1598 if ( !emailsStr.isEmpty() ) 1607 if ( !emailsStr.isEmpty() )
1599 emailsStr += emailSeparator(); 1608 emailsStr += emailSeparator();
1600 emailsStr += e; 1609 emailsStr += e;
1601 replace( Qtopia::Emails, emailsStr ); 1610 replace( Qtopia::Emails, emailsStr );
1602} 1611}
1603 1612
1604void OContact::removeEmail( const QString &v ) 1613void OContact::removeEmail( const QString &v )
1605{ 1614{
1606 QString e = v.simplifyWhiteSpace(); 1615 QString e = v.simplifyWhiteSpace();
1607 QString def = defaultEmail(); 1616 QString def = defaultEmail();
1608 QString emailsStr = find( Qtopia::Emails ); 1617 QString emailsStr = find( Qtopia::Emails );
1609 QStringList emails = emailList(); 1618 QStringList emails = emailList();
1610 1619
1611 // otherwise, must first contain it 1620 // otherwise, must first contain it
1612 if ( !emailsStr.contains( e ) ) 1621 if ( !emailsStr.contains( e ) )
1613 return; 1622 return;
1614 1623
1615 // remove it 1624 // remove it
1616 //qDebug(" removing email from list %s", e.latin1()); 1625 //qDebug(" removing email from list %s", e.latin1());
1617 emails.remove( e ); 1626 emails.remove( e );
1618 // reset the string 1627 // reset the string
1619 emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator 1628 emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator
1620 replace( Qtopia::Emails, emailsStr ); 1629 replace( Qtopia::Emails, emailsStr );
1621 1630
1622 // if default, then replace the default email with the first one 1631 // if default, then replace the default email with the first one
1623 if ( def == e ) { 1632 if ( def == e ) {
1624 //qDebug("removeEmail is default; setting new default"); 1633 //qDebug("removeEmail is default; setting new default");
1625 if ( !emails.count() ) 1634 if ( !emails.count() )
1626 clearEmails(); 1635 clearEmails();
1627 else // setDefaultEmail will remove e from the list 1636 else // setDefaultEmail will remove e from the list
1628 setDefaultEmail( emails.first() ); 1637 setDefaultEmail( emails.first() );
1629 } 1638 }
1630} 1639}
1631void OContact::clearEmails() 1640void OContact::clearEmails()
1632{ 1641{
1633 mMap.remove( Qtopia::DefaultEmail ); 1642 mMap.remove( Qtopia::DefaultEmail );
1634 mMap.remove( Qtopia::Emails ); 1643 mMap.remove( Qtopia::Emails );
1635} 1644}
1636void OContact::setDefaultEmail( const QString &v ) 1645void OContact::setDefaultEmail( const QString &v )
1637{ 1646{
1638 QString e = v.simplifyWhiteSpace(); 1647 QString e = v.simplifyWhiteSpace();
1639 1648
1640 //qDebug("OContact::setDefaultEmail %s", e.latin1()); 1649 //qDebug("OContact::setDefaultEmail %s", e.latin1());
1641 replace( Qtopia::DefaultEmail, e ); 1650 replace( Qtopia::DefaultEmail, e );
1642 1651
1643 if ( !e.isEmpty() ) 1652 if ( !e.isEmpty() )
1644 insertEmail( e ); 1653 insertEmail( e );
1645 1654
1646} 1655}
1647 1656
1648void OContact::insertEmails( const QStringList &v ) 1657void OContact::insertEmails( const QStringList &v )
1649{ 1658{
1650 for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it ) 1659 for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it )
1651 insertEmail( *it ); 1660 insertEmail( *it );
1652} 1661}
1653 1662
diff --git a/libopie/pim/opimrecord.h b/libopie/pim/opimrecord.h
index dbb94ed..d9ccad4 100644
--- a/libopie/pim/opimrecord.h
+++ b/libopie/pim/opimrecord.h
@@ -1,44 +1,44 @@
1#ifndef OPIE_PIM_RECORD_H 1#ifndef OPIE_PIM_RECORD_H
2#define OPIE_PIM_RECORD_H 2#define OPIE_PIM_RECORD_H
3 3
4#include <qmap.h> 4#include <qmap.h>
5#include <qstring.h> 5#include <qstring.h>
6#include <qstringlist.h> 6#include <qstringlist.h>
7 7
8#include <qpe/palmtoprecord.h> 8#include <qpe/palmtoprecord.h>
9 9
10 10
11/** 11/**
12 * This is the base class for 12 * This is the base class for
13 * all PIM Records 13 * all PIM Records
14 * 14 *
15 */ 15 */
16class OPimRecord : public Qtopia::Record { 16class OPimRecord : public Qtopia::Record {
17public: 17public:
18 /** 18 /**
19 * c'tor 19 * c'tor
20 * uid of 0 isEmpty 20 * uid of 0 isEmpty
21 * uid of 1 will be assigned a new one 21 * uid of 1 will be assigned a new one
22 */ 22 */
23 OPimRecord(int uid = 0); 23 OPimRecord(int uid = 0);
24 ~OPimRecord(); 24 ~OPimRecord();
25 25
26 /** 26 /**
27 * copy c'tor 27 * copy c'tor
28 */ 28 */
29 OPimRecord( const OPimRecord& rec ); 29 OPimRecord( const OPimRecord& rec );
30 30
31 /** 31 /**
32 * copy operator 32 * copy operator
33 */ 33 */
34 OPimRecord &operator=( const OPimRecord& ); 34 OPimRecord &operator=( const OPimRecord& );
35 35
36 /** 36 /**
37 * category names resolved 37 * category names resolved
38 */ 38 */
39 QStringList categoryNames()const; 39 QStringList categoryNames()const;
40 40
41 /** 41 /**
42 * set category names they will be resolved 42 * set category names they will be resolved
43 */ 43 */
44 void setCategoryNames( const QStringList& ); 44 void setCategoryNames( const QStringList& );
@@ -81,53 +81,53 @@ public:
81 virtual QMap<QString, QString> toExtraMap()const = 0; 81 virtual QMap<QString, QString> toExtraMap()const = 0;
82 82
83 /** 83 /**
84 * the name for a recordField 84 * the name for a recordField
85 */ 85 */
86 virtual QString recordField(int)const = 0; 86 virtual QString recordField(int)const = 0;
87 87
88 /** 88 /**
89 * the related apps names 89 * the related apps names
90 */ 90 */
91 QStringList relatedApps()const; 91 QStringList relatedApps()const;
92 92
93 /** 93 /**
94 * the realtions between an app 94 * the realtions between an app
95 */ 95 */
96 QArray<int> relations( const QString& app )const; 96 QArray<int> relations( const QString& app )const;
97 97
98 /** 98 /**
99 * clear the relations for all relations 99 * clear the relations for all relations
100 * with app 100 * with app
101 */ 101 */
102 void clearRelation( const QString& app ); 102 void clearRelation( const QString& app );
103 103
104 /** 104 /**
105 * add a relation 105 * add a relation
106 */ 106 */
107 void addRelation( const QString& app, int id ); 107 void addRelation( const QString& app, int id );
108 108
109 /** 109 /**
110 * set the relations for an app 110 * set the relations for an app
111 */ 111 */
112 void setRelations( const QString&, QArray<int> ids ); 112 void setRelations( const QString&, QArray<int> ids );
113 113
114 /** 114 /**
115 * set the uid 115 * set the uid
116 */ 116 */
117 virtual void setUid( int uid ); 117 virtual void setUid( int uid );
118 118
119protected: 119protected:
120 Qtopia::UidGen &uidGen(); 120 Qtopia::UidGen &uidGen();
121 QString crossToString()const; 121 QString crossToString()const;
122 122
123private: 123private:
124 class OPimRecordPrivate; 124 class OPimRecordPrivate;
125 OPimRecordPrivate *d; 125 OPimRecordPrivate *d;
126 QMap<QString, QArray<int> > m_relations; 126 QMap<QString, QArray<int> > m_relations;
127 static Qtopia::UidGen m_uidGen; 127 static Qtopia::UidGen m_uidGen;
128 128
129}; 129};
130 130
131 131
132 132
133#endif 133#endif
diff --git a/libopie/pim/opimstate.cpp b/libopie/pim/opimstate.cpp
new file mode 100644
index 0000000..6fb2feb
--- a/dev/null
+++ b/libopie/pim/opimstate.cpp
@@ -0,0 +1,64 @@
1#include <qshared.h>
2
3#include "opimstate.h"
4
5/*
6 * for one int this does not make
7 * much sense but never the less
8 * we will do it for the future
9 */
10struct OPimState::Data : public QShared {
11 Data() : QShared(),state(Undefined) {
12 }
13 int state;
14};
15
16OPimState::OPimState( int state ) {
17 data = new Data;
18 data->state = state;
19}
20OPimState::OPimState( const OPimState& st) :
21 data( st.data ) {
22 /* ref up */
23 data->ref();
24}
25OPimState::~OPimState() {
26 if ( data->deref() ) {
27 delete data ;
28 data = 0;
29 }
30}
31bool OPimState::operator==( const OPimState& st) {
32 if ( data->state == st.data->state ) return true;
33
34 return false;
35}
36OPimState &OPimState::operator=( const OPimState& st) {
37 st.data->ref();
38 deref();
39 data = st.data;
40
41 return *this;
42}
43void OPimState::setState( int st) {
44 copyInternally();
45 data->state = st;
46}
47int OPimState::state()const {
48 return data->state;
49}
50void OPimState::deref() {
51 if ( data->deref() ) {
52 delete data;
53 data = 0l;
54 }
55}
56void OPimState::copyInternally() {
57 /* we need to change it */
58 if ( data->count != 1 ) {
59 data->deref();
60 Data* d2 = new Data;
61 d2->state = data->state;
62 data = d2;
63 }
64}
diff --git a/libopie/pim/opimstate.h b/libopie/pim/opimstate.h
new file mode 100644
index 0000000..731181e
--- a/dev/null
+++ b/libopie/pim/opimstate.h
@@ -0,0 +1,44 @@
1#ifndef OPIE_PIM_STATE_H
2#define OPIE_PIM_STATE_H
3
4#include <qstring.h>
5
6/**
7 * The State of a Task
8 * This class encapsules the state of a todo
9 * and it's shared too
10 */
11/*
12 * in c a simple struct would be enough ;)
13 * g_new_state();
14 * g_do_some_thing( state_t* );
15 * ;)
16 */
17class OPimState {
18public:
19 enum State {
20 Started = 0,
21 Postponed,
22 Finished,
23 NotStarted,
24 Undefined
25 };
26 OPimState( int state = Undefined );
27 OPimState( const OPimState& );
28 ~OPimState();
29
30 bool operator==( const OPimState& );
31 OPimState &operator=( const OPimState& );
32 void setState( int state);
33 int state()const;
34private:
35 void deref();
36 inline void copyInternally();
37 struct Data;
38 Data* data;
39 class Private;
40 Private *d;
41};
42
43
44#endif
diff --git a/libopie/pim/orecordlist.h b/libopie/pim/orecordlist.h
index 2f4a5d3..8ed41e2 100644
--- a/libopie/pim/orecordlist.h
+++ b/libopie/pim/orecordlist.h
@@ -205,65 +205,65 @@ bool ORecordListIterator<T>::operator==( const ORecordListIterator<T>& it ) {
205 if ( m_end == it.m_end ) return true; 205 if ( m_end == it.m_end ) return true;
206 206
207 if ( m_uids != it.m_uids ) return false; 207 if ( m_uids != it.m_uids ) return false;
208 if ( m_current != it.m_current ) return false; 208 if ( m_current != it.m_current ) return false;
209 if ( m_temp != it.m_temp ) return false; 209 if ( m_temp != it.m_temp ) return false;
210 210
211 return true; 211 return true;
212} 212}
213template <class T> 213template <class T>
214bool ORecordListIterator<T>::operator!=( const ORecordListIterator<T>& it ) { 214bool ORecordListIterator<T>::operator!=( const ORecordListIterator<T>& it ) {
215 return !(*this == it ); 215 return !(*this == it );
216} 216}
217template <class T> 217template <class T>
218ORecordListIterator<T>::ORecordListIterator( const QArray<int> uids, 218ORecordListIterator<T>::ORecordListIterator( const QArray<int> uids,
219 const Base* t ) 219 const Base* t )
220 : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ), 220 : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ),
221 m_direction( false ) 221 m_direction( false )
222{ 222{
223} 223}
224template <class T> 224template <class T>
225uint ORecordListIterator<T>::current()const { 225uint ORecordListIterator<T>::current()const {
226 return m_current; 226 return m_current;
227} 227}
228template <class T> 228template <class T>
229void ORecordListIterator<T>::setCurrent( uint cur ) { 229void ORecordListIterator<T>::setCurrent( uint cur ) {
230 if( cur < m_uids.count() ) { 230 if( cur < m_uids.count() ) {
231 m_end = false; 231 m_end = false;
232 m_current= cur; 232 m_current= cur;
233 } 233 }
234} 234}
235template <class T> 235template <class T>
236uint ORecordListIterator<T>::count()const { 236uint ORecordListIterator<T>::count()const {
237 return m_uids.count(); 237 return m_uids.count();
238} 238}
239template <class T> 239template <class T>
240ORecordList<T>::ORecordList( const QArray<int>& ids, 240ORecordList<T>::ORecordList( const QArray<int>& ids,
241 const Base* acc ) 241 const Base* acc )
242 : m_ids( ids ), m_acc( acc ) 242 : m_ids( ids ), m_acc( acc )
243{ 243{
244} 244}
245template <class T> 245template <class T>
246ORecordList<T>::~ORecordList() { 246ORecordList<T>::~ORecordList() {
247/* nothing to do here */ 247/* nothing to do here */
248} 248}
249template <class T> 249template <class T>
250ORecordList<T>::Iterator ORecordList<T>::begin() { 250ORecordList<T>::Iterator ORecordList<T>::begin() {
251 Iterator it( m_ids, m_acc ); 251 Iterator it( m_ids, m_acc );
252 return it; 252 return it;
253} 253}
254template <class T> 254template <class T>
255ORecordList<T>::Iterator ORecordList<T>::end() { 255ORecordList<T>::Iterator ORecordList<T>::end() {
256 Iterator it( m_ids, m_acc ); 256 Iterator it( m_ids, m_acc );
257 it.m_end = true; 257 it.m_end = true;
258 it.m_current = m_ids.count(); 258 it.m_current = m_ids.count();
259 259
260 return it; 260 return it;
261} 261}
262template <class T> 262template <class T>
263uint ORecordList<T>::count()const { 263uint ORecordList<T>::count()const {
264return m_ids.count(); 264return m_ids.count();
265} 265}
266template <class T> 266template <class T>
267T ORecordList<T>::operator[]( uint i ) { 267T ORecordList<T>::operator[]( uint i ) {
268 if ( i < 0 || (i+1) > m_ids.count() ) 268 if ( i < 0 || (i+1) > m_ids.count() )
269 return T(); 269 return T();
diff --git a/libopie/pim/orecur.cpp b/libopie/pim/orecur.cpp
index 6c81f8f..257d4fd 100644
--- a/libopie/pim/orecur.cpp
+++ b/libopie/pim/orecur.cpp
@@ -1,127 +1,136 @@
1#include <qshared.h> 1#include <qshared.h>
2 2
3#include <qtopia/timeconversion.h> 3#include <qtopia/timeconversion.h>
4 4
5#include "orecur.h" 5#include "orecur.h"
6 6
7struct ORecur::Data : public QShared { 7struct ORecur::Data : public QShared {
8 Data() : QShared() { 8 Data() : QShared() {
9 type = ORecur::NoRepeat; 9 type = ORecur::NoRepeat;
10 freq = -1; 10 freq = -1;
11 days = 0; 11 days = 0;
12 pos = 0; 12 pos = 0;
13 create = -1; 13 create = -1;
14 hasEnd = FALSE; 14 hasEnd = FALSE;
15 end = 0; 15 end = 0;
16 } 16 }
17 char days; // Q_UINT8 for 8 seven days;) 17 char days; // Q_UINT8 for 8 seven days;)
18 ORecur::RepeatType type; 18 ORecur::RepeatType type;
19 int freq; 19 int freq;
20 int pos; 20 int pos;
21 bool hasEnd : 1; 21 bool hasEnd : 1;
22 time_t end; 22 time_t end;
23 time_t create; 23 time_t create;
24 int rep;
24}; 25};
25 26
26 27
27ORecur::ORecur() { 28ORecur::ORecur() {
28 data = new Data; 29 data = new Data;
29} 30}
30ORecur::ORecur( const ORecur& rec) 31ORecur::ORecur( const ORecur& rec)
31 : data( rec.data ) 32 : data( rec.data )
32{ 33{
33 data->ref(); 34 data->ref();
34} 35}
35ORecur::~ORecur() { 36ORecur::~ORecur() {
36 if ( data->deref() ) { 37 if ( data->deref() ) {
37 delete data; 38 delete data;
38 data = 0l; 39 data = 0l;
39 } 40 }
40} 41}
41void ORecur::deref() { 42void ORecur::deref() {
42 if ( data->deref() ) { 43 if ( data->deref() ) {
43 delete data; 44 delete data;
44 data = 0l; 45 data = 0l;
45 } 46 }
46} 47}
47bool ORecur::operator==( const ORecur& )const { 48bool ORecur::operator==( const ORecur& )const {
48 return false; 49 return false;
49} 50}
50ORecur &ORecur::operator=( const ORecur& re) { 51ORecur &ORecur::operator=( const ORecur& re) {
51 re.data->ref(); 52 re.data->ref();
52 deref(); 53 deref();
53 data = re.data; 54 data = re.data;
54 55
55 return *this; 56 return *this;
56} 57}
57ORecur::RepeatType ORecur::type()const{ 58ORecur::RepeatType ORecur::type()const{
58 return data->type; 59 return data->type;
59} 60}
60int ORecur::frequency()const { 61int ORecur::frequency()const {
61 return data->freq; 62 return data->freq;
62} 63}
63int ORecur::position()const { 64int ORecur::position()const {
64 return data->pos; 65 return data->pos;
65} 66}
66char ORecur::days() const{ 67char ORecur::days() const{
67 return data->days; 68 return data->days;
68} 69}
69bool ORecur::hasEndDate()const { 70bool ORecur::hasEndDate()const {
70 return data->hasEnd; 71 return data->hasEnd;
71} 72}
72QDate ORecur::endDate()const { 73QDate ORecur::endDate()const {
73 return TimeConversion::fromUTC( data->end ).date(); 74 return TimeConversion::fromUTC( data->end ).date();
74} 75}
75time_t ORecur::endDateUTC()const { 76time_t ORecur::endDateUTC()const {
76 return data->end; 77 return data->end;
77} 78}
78time_t ORecur::createTime()const { 79time_t ORecur::createTime()const {
79 return data->create; 80 return data->create;
80} 81}
82int ORecur::repetition()const {
83 return data->rep;
84}
81void ORecur::setType( const RepeatType& z) { 85void ORecur::setType( const RepeatType& z) {
82 checkOrModify(); 86 checkOrModify();
83 data->type = z; 87 data->type = z;
84} 88}
85void ORecur::setFrequency( int freq ) { 89void ORecur::setFrequency( int freq ) {
86 checkOrModify(); 90 checkOrModify();
87 data->freq = freq; 91 data->freq = freq;
88} 92}
89void ORecur::setPosition( int pos ) { 93void ORecur::setPosition( int pos ) {
90 checkOrModify(); 94 checkOrModify();
91 data->pos = pos; 95 data->pos = pos;
92} 96}
93void ORecur::setDays( char c ) { 97void ORecur::setDays( char c ) {
94 checkOrModify(); 98 checkOrModify();
95 data->days = c; 99 data->days = c;
96} 100}
97void ORecur::setEndDate( const QDate& dt) { 101void ORecur::setEndDate( const QDate& dt) {
98 checkOrModify(); 102 checkOrModify();
99 data->end = TimeConversion::toUTC( dt ); 103 data->end = TimeConversion::toUTC( dt );
100} 104}
101void ORecur::setEndDateUTC( time_t t) { 105void ORecur::setEndDateUTC( time_t t) {
102 checkOrModify(); 106 checkOrModify();
103 data->end = t; 107 data->end = t;
104} 108}
105void ORecur::setCreateTime( time_t t) { 109void ORecur::setCreateTime( time_t t) {
106 checkOrModify(); 110 checkOrModify();
107 data->create = t; 111 data->create = t;
108} 112}
109void ORecur::setHasEndDate( bool b) { 113void ORecur::setHasEndDate( bool b) {
110 checkOrModify(); 114 checkOrModify();
111 data->hasEnd = b; 115 data->hasEnd = b;
112} 116}
117void ORecur::setRepitition( int rep ) {
118 checkOrModify();
119 data->rep = rep;
120}
113void ORecur::checkOrModify() { 121void ORecur::checkOrModify() {
114 if ( data->count != 1 ) { 122 if ( data->count != 1 ) {
115 data->deref(); 123 data->deref();
116 Data* d2 = new Data; 124 Data* d2 = new Data;
117 d2->days = data->days; 125 d2->days = data->days;
118 d2->type = data->type; 126 d2->type = data->type;
119 d2->freq = data->freq; 127 d2->freq = data->freq;
120 d2->pos = data->pos; 128 d2->pos = data->pos;
121 d2->hasEnd = data->hasEnd; 129 d2->hasEnd = data->hasEnd;
122 d2->end = data->end; 130 d2->end = data->end;
123 d2->create = data->create; 131 d2->create = data->create;
132 d2->rep = data->rep;
124 data = d2; 133 data = d2;
125 } 134 }
126} 135}
127 136
diff --git a/libopie/pim/orecur.h b/libopie/pim/orecur.h
index 89258f8..d24d72d 100644
--- a/libopie/pim/orecur.h
+++ b/libopie/pim/orecur.h
@@ -2,53 +2,55 @@
2 * GPL from TT 2 * GPL from TT
3 */ 3 */
4 4
5#ifndef OPIE_RECUR_H 5#ifndef OPIE_RECUR_H
6#define OPIE_RECUR_H 6#define OPIE_RECUR_H
7 7
8#include <sys/types.h> 8#include <sys/types.h>
9 9
10#include <qdatetime.h> 10#include <qdatetime.h>
11 11
12 12
13 13
14class ORecur { 14class ORecur {
15public: 15public:
16 enum RepeatType{ NoRepeat = -1, Daily, Weekly, MonthlyDay, 16 enum RepeatType{ NoRepeat = -1, Daily, Weekly, MonthlyDay,
17 MonthlyDate, Yearly }; 17 MonthlyDate, Yearly };
18 enum Days { MON = 0x01, TUE = 0x02, WED = 0x04, THU = 0x08, 18 enum Days { MON = 0x01, TUE = 0x02, WED = 0x04, THU = 0x08,
19 FRI = 0x10, SAT = 0x20, SUN = 0x40 }; 19 FRI = 0x10, SAT = 0x20, SUN = 0x40 };
20 ORecur(); 20 ORecur();
21 ORecur( const ORecur& ); 21 ORecur( const ORecur& );
22 ~ORecur(); 22 ~ORecur();
23 23
24 ORecur &operator=( const ORecur& ); 24 ORecur &operator=( const ORecur& );
25 bool operator==(const ORecur& )const; 25 bool operator==(const ORecur& )const;
26 RepeatType type()const; 26 RepeatType type()const;
27 int frequency()const; 27 int frequency()const;
28 int position()const; 28 int position()const;
29 char days()const; 29 char days()const;
30 bool hasEndDate()const; 30 bool hasEndDate()const;
31 QDate endDate()const; 31 QDate endDate()const;
32 time_t endDateUTC()const; 32 time_t endDateUTC()const;
33 time_t createTime()const; 33 time_t createTime()const;
34 int repetition()const;
34 35
35 void setType( const RepeatType& ); 36 void setType( const RepeatType& );
36 void setFrequency( int freq ); 37 void setFrequency( int freq );
37 void setPosition( int pos ); 38 void setPosition( int pos );
38 void setDays( char c); 39 void setDays( char c);
39 void setEndDate( const QDate& dt ); 40 void setEndDate( const QDate& dt );
40 void setEndDateUTC( time_t ); 41 void setEndDateUTC( time_t );
41 void setCreateTime( time_t ); 42 void setCreateTime( time_t );
42 void setHasEndDate( bool b ); 43 void setHasEndDate( bool b );
44 void setRepitition(int );
43private: 45private:
44 void deref(); 46 void deref();
45 inline void checkOrModify(); 47 inline void checkOrModify();
46 48
47 49
48 class Data; 50 class Data;
49 Data* data; 51 Data* data;
50 class ORecurPrivate; 52 class ORecurPrivate;
51 ORecurPrivate *d; 53 ORecurPrivate *d;
52}; 54};
53 55
54#endif 56#endif
diff --git a/libopie/pim/otodo.cpp b/libopie/pim/otodo.cpp
index 765d5a9..0d5b1d3 100644
--- a/libopie/pim/otodo.cpp
+++ b/libopie/pim/otodo.cpp
@@ -1,64 +1,67 @@
1 1
2#include <qobject.h> 2#include <qobject.h>
3#include <qshared.h> 3#include <qshared.h>
4 4
5 5
6 6
7#include <qpe/palmtopuidgen.h> 7#include <qpe/palmtopuidgen.h>
8#include <qpe/stringutil.h> 8#include <qpe/stringutil.h>
9#include <qpe/palmtoprecord.h> 9#include <qpe/palmtoprecord.h>
10#include <qpe/stringutil.h> 10#include <qpe/stringutil.h>
11#include <qpe/categories.h> 11#include <qpe/categories.h>
12#include <qpe/categoryselect.h> 12#include <qpe/categoryselect.h>
13 13
14 14
15 15#include "opimstate.h"
16#include "orecur.h"
16#include "otodo.h" 17#include "otodo.h"
17 18
18 19
19struct OTodo::OTodoData : public QShared { 20struct OTodo::OTodoData : public QShared {
20 OTodoData() : QShared() { 21 OTodoData() : QShared() {
21 }; 22 };
22 23
23 QDate date; 24 QDate date;
24 bool isCompleted:1; 25 bool isCompleted:1;
25 bool hasDate:1; 26 bool hasDate:1;
26 int priority; 27 int priority;
27 QString desc; 28 QString desc;
28 QString sum; 29 QString sum;
29 QMap<QString, QString> extra; 30 QMap<QString, QString> extra;
30 ushort prog; 31 ushort prog;
31 bool hasAlarmDateTime :1; 32 bool hasAlarmDateTime :1;
32 QDateTime alarmDateTime; 33 QDateTime alarmDateTime;
34 OPimState state;
35 ORecur recur;
33}; 36};
34 37
35OTodo::OTodo(const OTodo &event ) 38OTodo::OTodo(const OTodo &event )
36 : OPimRecord( event ), data( event.data ) 39 : OPimRecord( event ), data( event.data )
37{ 40{
38 data->ref(); 41 data->ref();
39// qWarning("ref up"); 42// qWarning("ref up");
40} 43}
41OTodo::~OTodo() { 44OTodo::~OTodo() {
42 45
43// qWarning("~OTodo " ); 46// qWarning("~OTodo " );
44 if ( data->deref() ) { 47 if ( data->deref() ) {
45// qWarning("OTodo::dereffing"); 48// qWarning("OTodo::dereffing");
46 delete data; 49 delete data;
47 data = 0l; 50 data = 0l;
48 } 51 }
49} 52}
50OTodo::OTodo(bool completed, int priority, 53OTodo::OTodo(bool completed, int priority,
51 const QArray<int> &category, 54 const QArray<int> &category,
52 const QString& summary, 55 const QString& summary,
53 const QString &description, 56 const QString &description,
54 ushort progress, 57 ushort progress,
55 bool hasDate, QDate date, int uid ) 58 bool hasDate, QDate date, int uid )
56 : OPimRecord( uid ) 59 : OPimRecord( uid )
57{ 60{
58// qWarning("OTodoData " + summary); 61// qWarning("OTodoData " + summary);
59 setCategories( category ); 62 setCategories( category );
60 63
61 data = new OTodoData; 64 data = new OTodoData;
62 65
63 data->date = date; 66 data->date = date;
64 data->isCompleted = completed; 67 data->isCompleted = completed;
@@ -115,105 +118,119 @@ bool OTodo::hasDueDate() const
115 return data->hasDate; 118 return data->hasDate;
116} 119}
117bool OTodo::hasAlarmDateTime() const 120bool OTodo::hasAlarmDateTime() const
118{ 121{
119 return data->hasAlarmDateTime; 122 return data->hasAlarmDateTime;
120} 123}
121int OTodo::priority()const 124int OTodo::priority()const
122{ 125{
123 return data->priority; 126 return data->priority;
124} 127}
125QString OTodo::summary() const 128QString OTodo::summary() const
126{ 129{
127 return data->sum; 130 return data->sum;
128} 131}
129ushort OTodo::progress() const 132ushort OTodo::progress() const
130{ 133{
131 return data->prog; 134 return data->prog;
132} 135}
133QDate OTodo::dueDate()const 136QDate OTodo::dueDate()const
134{ 137{
135 return data->date; 138 return data->date;
136} 139}
137 140
138QDateTime OTodo::alarmDateTime() const 141QDateTime OTodo::alarmDateTime() const
139{ 142{
140 return data->alarmDateTime; 143 return data->alarmDateTime;
141} 144}
142 145
143QString OTodo::description()const 146QString OTodo::description()const
144{ 147{
145 return data->desc; 148 return data->desc;
146} 149}
150OPimState OTodo::state()const {
151 return data->state;
152}
153ORecur OTodo::recurrence()const {
154 return data->recur;
155}
147void OTodo::setCompleted( bool completed ) 156void OTodo::setCompleted( bool completed )
148{ 157{
149 changeOrModify(); 158 changeOrModify();
150 data->isCompleted = completed; 159 data->isCompleted = completed;
151} 160}
152void OTodo::setHasDueDate( bool hasDate ) 161void OTodo::setHasDueDate( bool hasDate )
153{ 162{
154 changeOrModify(); 163 changeOrModify();
155 data->hasDate = hasDate; 164 data->hasDate = hasDate;
156} 165}
157void OTodo::setHasAlarmDateTime( bool hasAlarmDateTime ) 166void OTodo::setHasAlarmDateTime( bool hasAlarmDateTime )
158{ 167{
159 changeOrModify(); 168 changeOrModify();
160 data->hasAlarmDateTime = hasAlarmDateTime; 169 data->hasAlarmDateTime = hasAlarmDateTime;
161} 170}
162void OTodo::setDescription(const QString &desc ) 171void OTodo::setDescription(const QString &desc )
163{ 172{
164// qWarning( "desc " + desc ); 173// qWarning( "desc " + desc );
165 changeOrModify(); 174 changeOrModify();
166 data->desc = Qtopia::simplifyMultiLineSpace(desc ); 175 data->desc = Qtopia::simplifyMultiLineSpace(desc );
167} 176}
168void OTodo::setSummary( const QString& sum ) 177void OTodo::setSummary( const QString& sum )
169{ 178{
170 changeOrModify(); 179 changeOrModify();
171 data->sum = sum; 180 data->sum = sum;
172} 181}
173void OTodo::setPriority(int prio ) 182void OTodo::setPriority(int prio )
174{ 183{
175 changeOrModify(); 184 changeOrModify();
176 data->priority = prio; 185 data->priority = prio;
177} 186}
178void OTodo::setDueDate( QDate date ) 187void OTodo::setDueDate( QDate date )
179{ 188{
180 changeOrModify(); 189 changeOrModify();
181 data->date = date; 190 data->date = date;
182} 191}
183void OTodo::setAlarmDateTime( const QDateTime& alarm ) 192void OTodo::setAlarmDateTime( const QDateTime& alarm )
184{ 193{
185 changeOrModify(); 194 changeOrModify();
186 data->alarmDateTime = alarm; 195 data->alarmDateTime = alarm;
187} 196}
197void OTodo::setState( const OPimState& state ) {
198 changeOrModify();
199 data->state = state;
200}
201void OTodo::setRecurrence( const ORecur& rec) {
202 changeOrModify();
203 data->recur = rec;
204}
188bool OTodo::isOverdue( ) 205bool OTodo::isOverdue( )
189{ 206{
190 if( data->hasDate && !data->isCompleted) 207 if( data->hasDate && !data->isCompleted)
191 return QDate::currentDate() > data->date; 208 return QDate::currentDate() > data->date;
192 return false; 209 return false;
193} 210}
194void OTodo::setProgress(ushort progress ) 211void OTodo::setProgress(ushort progress )
195{ 212{
196 changeOrModify(); 213 changeOrModify();
197 data->prog = progress; 214 data->prog = progress;
198} 215}
199QString OTodo::toShortText() const { 216QString OTodo::toShortText() const {
200 return summary(); 217 return summary();
201} 218}
202/*! 219/*!
203 Returns a richt text string 220 Returns a richt text string
204*/ 221*/
205QString OTodo::toRichText() const 222QString OTodo::toRichText() const
206{ 223{
207 QString text; 224 QString text;
208 QStringList catlist; 225 QStringList catlist;
209 226
210 // Description of the todo 227 // Description of the todo
211 if ( !summary().isEmpty() ) { 228 if ( !summary().isEmpty() ) {
212 text += "<b>" + QObject::tr( "Summary:") + "</b><br>"; 229 text += "<b>" + QObject::tr( "Summary:") + "</b><br>";
213 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 230 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
214 } 231 }
215 if( !description().isEmpty() ){ 232 if( !description().isEmpty() ){
216 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; 233 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
217 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ; 234 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ;
218 } 235 }
219 text += "<br><br><br>"; 236 text += "<br><br><br>";
@@ -329,58 +346,60 @@ OTodo &OTodo::operator=(const OTodo &item )
329 346
330QMap<int, QString> OTodo::toMap() const { 347QMap<int, QString> OTodo::toMap() const {
331 QMap<int, QString> map; 348 QMap<int, QString> map;
332 349
333 map.insert( Uid, QString::number( uid() ) ); 350 map.insert( Uid, QString::number( uid() ) );
334 map.insert( Category, idsToString( categories() ) ); 351 map.insert( Category, idsToString( categories() ) );
335 map.insert( HasDate, QString::number( data->hasDate ) ); 352 map.insert( HasDate, QString::number( data->hasDate ) );
336 map.insert( Completed, QString::number( data->isCompleted ) ); 353 map.insert( Completed, QString::number( data->isCompleted ) );
337 map.insert( Description, data->desc ); 354 map.insert( Description, data->desc );
338 map.insert( Summary, data->sum ); 355 map.insert( Summary, data->sum );
339 map.insert( Priority, QString::number( data->priority ) ); 356 map.insert( Priority, QString::number( data->priority ) );
340 map.insert( DateDay, QString::number( data->date.day() ) ); 357 map.insert( DateDay, QString::number( data->date.day() ) );
341 map.insert( DateMonth, QString::number( data->date.month() ) ); 358 map.insert( DateMonth, QString::number( data->date.month() ) );
342 map.insert( DateYear, QString::number( data->date.year() ) ); 359 map.insert( DateYear, QString::number( data->date.year() ) );
343 map.insert( Progress, QString::number( data->prog ) ); 360 map.insert( Progress, QString::number( data->prog ) );
344 map.insert( CrossReference, crossToString() ); 361 map.insert( CrossReference, crossToString() );
345 map.insert( HasAlarmDateTime, QString::number( data->hasAlarmDateTime ) ); 362 map.insert( HasAlarmDateTime, QString::number( data->hasAlarmDateTime ) );
346 map.insert( AlarmDateTime, data->alarmDateTime.toString() ); 363 map.insert( AlarmDateTime, data->alarmDateTime.toString() );
347 364
348 return map; 365 return map;
349} 366}
350 367
351QMap<QString, QString> OTodo::toExtraMap()const { 368QMap<QString, QString> OTodo::toExtraMap()const {
352 return data->extra; 369 return data->extra;
353} 370}
354/** 371/**
355 * change or modify looks at the ref count and either 372 * change or modify looks at the ref count and either
356 * creates a new QShared Object or it can modify it 373 * creates a new QShared Object or it can modify it
357 * right in place 374 * right in place
358 */ 375 */
359void OTodo::changeOrModify() { 376void OTodo::changeOrModify() {
360 if ( data->count != 1 ) { 377 if ( data->count != 1 ) {
361// qWarning("changeOrModify"); 378 qWarning("changeOrModify");
362 data->deref(); 379 data->deref();
363 OTodoData* d2 = new OTodoData(); 380 OTodoData* d2 = new OTodoData();
364 copy(data, d2 ); 381 copy(data, d2 );
365 data = d2; 382 data = d2;
366 } 383 }
367} 384}
368void OTodo::copy( OTodoData* src, OTodoData* dest ) { 385void OTodo::copy( OTodoData* src, OTodoData* dest ) {
369 dest->date = src->date; 386 dest->date = src->date;
370 dest->isCompleted = src->isCompleted; 387 dest->isCompleted = src->isCompleted;
371 dest->hasDate = src->hasDate; 388 dest->hasDate = src->hasDate;
372 dest->priority = src->priority; 389 dest->priority = src->priority;
373 dest->desc = src->desc; 390 dest->desc = src->desc;
374 dest->sum = src->sum; 391 dest->sum = src->sum;
375 dest->extra = src->extra; 392 dest->extra = src->extra;
376 dest->prog = src->prog; 393 dest->prog = src->prog;
377 dest->hasAlarmDateTime = src->hasAlarmDateTime; 394 dest->hasAlarmDateTime = src->hasAlarmDateTime;
378 dest->alarmDateTime = src->alarmDateTime; 395 dest->alarmDateTime = src->alarmDateTime;
396 dest->state = src->state;
397 dest->recur = src->recur;
379} 398}
380QString OTodo::type() const { 399QString OTodo::type() const {
381 return QString::fromLatin1("OTodo"); 400 return QString::fromLatin1("OTodo");
382} 401}
383QString OTodo::recordField(int id )const { 402QString OTodo::recordField(int id )const {
384 return QString::null; 403 return QString::null;
385} 404}
386 405
diff --git a/libopie/pim/otodo.h b/libopie/pim/otodo.h
index 5bd91d6..2cdc587 100644
--- a/libopie/pim/otodo.h
+++ b/libopie/pim/otodo.h
@@ -1,68 +1,75 @@
1 1
2#ifndef OPIE_TODO_EVENT_H 2#ifndef OPIE_TODO_EVENT_H
3#define OPIE_TODO_EVENT_H 3#define OPIE_TODO_EVENT_H
4 4
5 5
6#include <qarray.h> 6#include <qarray.h>
7#include <qmap.h> 7#include <qmap.h>
8#include <qregexp.h> 8#include <qregexp.h>
9#include <qstringlist.h> 9#include <qstringlist.h>
10#include <qdatetime.h> 10#include <qdatetime.h>
11#include <qvaluelist.h> 11#include <qvaluelist.h>
12 12
13#include <qpe/recordfields.h> 13#include <qpe/recordfields.h>
14#include <qpe/palmtopuidgen.h> 14#include <qpe/palmtopuidgen.h>
15 15
16#include <opie/opimrecord.h> 16#include <opie/opimrecord.h>
17 17
18 18
19class OPimState;
20class ORecur;
19class OTodo : public OPimRecord { 21class OTodo : public OPimRecord {
20public: 22public:
21 typedef QValueList<OTodo> ValueList; 23 typedef QValueList<OTodo> ValueList;
22 enum RecordFields { 24 enum RecordFields {
23 Uid = Qtopia::UID_ID, 25 Uid = Qtopia::UID_ID,
24 Category = Qtopia::CATEGORY_ID, 26 Category = Qtopia::CATEGORY_ID,
25 HasDate, 27 HasDate,
26 Completed, 28 Completed,
27 Description, 29 Description,
28 Summary, 30 Summary,
29 Priority, 31 Priority,
30 DateDay, 32 DateDay,
31 DateMonth, 33 DateMonth,
32 DateYear, 34 DateYear,
33 Progress, 35 Progress,
34 CrossReference, 36 CrossReference,
35 HasAlarmDateTime, 37 HasAlarmDateTime,
36 AlarmDateTime 38 AlarmDateTime,
39 State,
40 Recurrance,
41 Alarms,
42 Reminders,
43 Notifiers
37 }; 44 };
38 public: 45 public:
39 // priorities from Very low to very high 46 // priorities from Very low to very high
40 enum TaskPriority { VeryHigh=1, High, Normal, Low, VeryLow }; 47 enum TaskPriority { VeryHigh=1, High, Normal, Low, VeryLow };
41 48
42 /* Constructs a new ToDoEvent 49 /* Constructs a new ToDoEvent
43 @param completed Is the TodoEvent completed 50 @param completed Is the TodoEvent completed
44 @param priority What is the priority of this ToDoEvent 51 @param priority What is the priority of this ToDoEvent
45 @param category Which category does it belong( uid ) 52 @param category Which category does it belong( uid )
46 @param summary A small summary of the todo 53 @param summary A small summary of the todo
47 @param description What is this ToDoEvent about 54 @param description What is this ToDoEvent about
48 @param hasDate Does this Event got a deadline 55 @param hasDate Does this Event got a deadline
49 @param date what is the deadline? 56 @param date what is the deadline?
50 @param uid what is the UUID of this Event 57 @param uid what is the UUID of this Event
51 **/ 58 **/
52 OTodo( bool completed = false, int priority = Normal, 59 OTodo( bool completed = false, int priority = Normal,
53 const QStringList &category = QStringList(), 60 const QStringList &category = QStringList(),
54 const QString &summary = QString::null , 61 const QString &summary = QString::null ,
55 const QString &description = QString::null, 62 const QString &description = QString::null,
56 ushort progress = 0, 63 ushort progress = 0,
57 bool hasDate = false, QDate date = QDate::currentDate(), 64 bool hasDate = false, QDate date = QDate::currentDate(),
58 int uid = 0 /*empty*/ ); 65 int uid = 0 /*empty*/ );
59 66
60 OTodo( bool completed, int priority, 67 OTodo( bool completed, int priority,
61 const QArray<int>& category, 68 const QArray<int>& category,
62 const QString& summary = QString::null, 69 const QString& summary = QString::null,
63 const QString& description = QString::null, 70 const QString& description = QString::null,
64 ushort progress = 0, 71 ushort progress = 0,
65 bool hasDate = false, QDate date = QDate::currentDate(), 72 bool hasDate = false, QDate date = QDate::currentDate(),
66 int uid = 0 /* empty */ ); 73 int uid = 0 /* empty */ );
67 74
68 /* Copy c'tor 75 /* Copy c'tor
@@ -82,128 +89,146 @@ public:
82 89
83 /** 90 /**
84 * Does this Event have a deadline 91 * Does this Event have a deadline
85 */ 92 */
86 bool hasDueDate() const; 93 bool hasDueDate() const;
87 94
88 /** 95 /**
89 * Does this Event has an alarm time ? 96 * Does this Event has an alarm time ?
90 */ 97 */
91 bool hasAlarmDateTime() const; 98 bool hasAlarmDateTime() const;
92 99
93 /** 100 /**
94 * What is the priority? 101 * What is the priority?
95 */ 102 */
96 int priority()const ; 103 int priority()const ;
97 104
98 /** 105 /**
99 * progress as ushort 0, 20, 40, 60, 80 or 100% 106 * progress as ushort 0, 20, 40, 60, 80 or 100%
100 */ 107 */
101 ushort progress() const; 108 ushort progress() const;
102 109
103 /** 110 /**
104 * The due Date 111 * The due Date
105 */ 112 */
106 QDate dueDate()const; 113 QDate dueDate()const;
107 114
108 /** 115 /**
109 * Alarm Date and Time 116 * Alarm Date and Time
110 */ 117 */
111 QDateTime alarmDateTime()const; 118 QDateTime alarmDateTime()const;
112 119
113 /** 120 /**
121 * What is the state of this OTodo?
122 */
123 OPimState state()const;
124
125 /**
126 * the recurrance of this
127 */
128 ORecur recurrence()const;
129
130 /**
114 * The description of the todo 131 * The description of the todo
115 */ 132 */
116 QString description()const; 133 QString description()const;
117 134
118 /** 135 /**
119 * A small summary of the todo 136 * A small summary of the todo
120 */ 137 */
121 QString summary() const; 138 QString summary() const;
122 139
123 /** 140 /**
124 * @reimplemented 141 * @reimplemented
125 * Return this todoevent in a RichText formatted QString 142 * Return this todoevent in a RichText formatted QString
126 */ 143 */
127 QString toRichText() const; 144 QString toRichText() const;
128 145
129 /** 146 /**
130 * reimplementation 147 * reimplementation
131 */ 148 */
132 QString type()const; 149 QString type()const;
133 QString toShortText()const; 150 QString toShortText()const;
134 QMap<QString, QString> toExtraMap()const; 151 QMap<QString, QString> toExtraMap()const;
135 QString recordField(int id )const; 152 QString recordField(int id )const;
136 153
137 /** 154 /**
138 * toMap puts all data into the map. int relates 155 * toMap puts all data into the map. int relates
139 * to ToDoEvent RecordFields enum 156 * to ToDoEvent RecordFields enum
140 */ 157 */
141 QMap<int, QString> toMap()const; 158 QMap<int, QString> toMap()const;
142 159
143 /** 160 /**
144 * Set if this Todo is completed 161 * Set if this Todo is completed
145 */ 162 */
146 void setCompleted(bool completed ); 163 void setCompleted(bool completed );
147 164
148 /** 165 /**
149 * set if this todo got an end data 166 * set if this todo got an end data
150 */ 167 */
151 void setHasDueDate( bool hasDate ); 168 void setHasDueDate( bool hasDate );
152 169
153 /** 170 /**
154 * set if this todo has an alarm time and date 171 * set if this todo has an alarm time and date
155 */ 172 */
156 void setHasAlarmDateTime ( bool hasAlarm ); 173 void setHasAlarmDateTime ( bool hasAlarm );
157 174
158 /** 175 /**
159 * Set the priority of the Todo 176 * Set the priority of the Todo
160 */ 177 */
161 void setPriority(int priority ); 178 void setPriority(int priority );
162 179
163 /** 180 /**
164 * Set the progress. 181 * Set the progress.
165 */ 182 */
166 void setProgress( ushort progress ); 183 void setProgress( ushort progress );
167 184
168 /** 185 /**
169 * set the end date 186 * set the end date
170 */ 187 */
171 void setDueDate( QDate date ); 188 void setDueDate( QDate date );
172 189
190
191 void setRecurrence( const ORecur& );
173 /** 192 /**
174 * set the alarm time 193 * set the alarm time
175 */ 194 */
176 void setAlarmDateTime ( const QDateTime& alarm ); 195 void setAlarmDateTime ( const QDateTime& alarm );
177 196
178 void setDescription(const QString& ); 197 void setDescription(const QString& );
179 void setSummary(const QString& ); 198 void setSummary(const QString& );
199
200 /**
201 * set the state of a Todo
202 * @param state State what the todo should take
203 */
204 void setState( const OPimState& state);
180 bool isOverdue(); 205 bool isOverdue();
181 206
182 207
183 bool match( const QRegExp &r )const; 208 bool match( const QRegExp &r )const;
184 209
185 bool operator<(const OTodo &toDoEvent )const; 210 bool operator<(const OTodo &toDoEvent )const;
186 bool operator<=(const OTodo &toDoEvent )const; 211 bool operator<=(const OTodo &toDoEvent )const;
187 bool operator!=(const OTodo &toDoEvent )const; 212 bool operator!=(const OTodo &toDoEvent )const;
188 bool operator>(const OTodo &toDoEvent )const; 213 bool operator>(const OTodo &toDoEvent )const;
189 bool operator>=(const OTodo &toDoEvent)const; 214 bool operator>=(const OTodo &toDoEvent)const;
190 bool operator==(const OTodo &toDoEvent )const; 215 bool operator==(const OTodo &toDoEvent )const;
191 OTodo &operator=(const OTodo &toDoEvent ); 216 OTodo &operator=(const OTodo &toDoEvent );
192 217
193 private: 218 private:
194 class OTodoPrivate; 219 class OTodoPrivate;
195 struct OTodoData; 220 struct OTodoData;
196 221
197 void deref(); 222 void deref();
198 inline void changeOrModify(); 223 inline void changeOrModify();
199 void copy( OTodoData* src, OTodoData* dest ); 224 void copy( OTodoData* src, OTodoData* dest );
200 OTodoPrivate *d; 225 OTodoPrivate *d;
201 OTodoData *data; 226 OTodoData *data;
202 227
203}; 228};
204inline bool OTodo::operator!=(const OTodo &toDoEvent )const { 229inline bool OTodo::operator!=(const OTodo &toDoEvent )const {
205 return !(*this == toDoEvent); 230 return !(*this == toDoEvent);
206} 231}
207 232
208 233
209#endif 234#endif
diff --git a/libopie2/opiepim/core/opimrecord.h b/libopie2/opiepim/core/opimrecord.h
index dbb94ed..d9ccad4 100644
--- a/libopie2/opiepim/core/opimrecord.h
+++ b/libopie2/opiepim/core/opimrecord.h
@@ -1,44 +1,44 @@
1#ifndef OPIE_PIM_RECORD_H 1#ifndef OPIE_PIM_RECORD_H
2#define OPIE_PIM_RECORD_H 2#define OPIE_PIM_RECORD_H
3 3
4#include <qmap.h> 4#include <qmap.h>
5#include <qstring.h> 5#include <qstring.h>
6#include <qstringlist.h> 6#include <qstringlist.h>
7 7
8#include <qpe/palmtoprecord.h> 8#include <qpe/palmtoprecord.h>
9 9
10 10
11/** 11/**
12 * This is the base class for 12 * This is the base class for
13 * all PIM Records 13 * all PIM Records
14 * 14 *
15 */ 15 */
16class OPimRecord : public Qtopia::Record { 16class OPimRecord : public Qtopia::Record {
17public: 17public:
18 /** 18 /**
19 * c'tor 19 * c'tor
20 * uid of 0 isEmpty 20 * uid of 0 isEmpty
21 * uid of 1 will be assigned a new one 21 * uid of 1 will be assigned a new one
22 */ 22 */
23 OPimRecord(int uid = 0); 23 OPimRecord(int uid = 0);
24 ~OPimRecord(); 24 ~OPimRecord();
25 25
26 /** 26 /**
27 * copy c'tor 27 * copy c'tor
28 */ 28 */
29 OPimRecord( const OPimRecord& rec ); 29 OPimRecord( const OPimRecord& rec );
30 30
31 /** 31 /**
32 * copy operator 32 * copy operator
33 */ 33 */
34 OPimRecord &operator=( const OPimRecord& ); 34 OPimRecord &operator=( const OPimRecord& );
35 35
36 /** 36 /**
37 * category names resolved 37 * category names resolved
38 */ 38 */
39 QStringList categoryNames()const; 39 QStringList categoryNames()const;
40 40
41 /** 41 /**
42 * set category names they will be resolved 42 * set category names they will be resolved
43 */ 43 */
44 void setCategoryNames( const QStringList& ); 44 void setCategoryNames( const QStringList& );
@@ -81,53 +81,53 @@ public:
81 virtual QMap<QString, QString> toExtraMap()const = 0; 81 virtual QMap<QString, QString> toExtraMap()const = 0;
82 82
83 /** 83 /**
84 * the name for a recordField 84 * the name for a recordField
85 */ 85 */
86 virtual QString recordField(int)const = 0; 86 virtual QString recordField(int)const = 0;
87 87
88 /** 88 /**
89 * the related apps names 89 * the related apps names
90 */ 90 */
91 QStringList relatedApps()const; 91 QStringList relatedApps()const;
92 92
93 /** 93 /**
94 * the realtions between an app 94 * the realtions between an app
95 */ 95 */
96 QArray<int> relations( const QString& app )const; 96 QArray<int> relations( const QString& app )const;
97 97
98 /** 98 /**
99 * clear the relations for all relations 99 * clear the relations for all relations
100 * with app 100 * with app
101 */ 101 */
102 void clearRelation( const QString& app ); 102 void clearRelation( const QString& app );
103 103
104 /** 104 /**
105 * add a relation 105 * add a relation
106 */ 106 */
107 void addRelation( const QString& app, int id ); 107 void addRelation( const QString& app, int id );
108 108
109 /** 109 /**
110 * set the relations for an app 110 * set the relations for an app
111 */ 111 */
112 void setRelations( const QString&, QArray<int> ids ); 112 void setRelations( const QString&, QArray<int> ids );
113 113
114 /** 114 /**
115 * set the uid 115 * set the uid
116 */ 116 */
117 virtual void setUid( int uid ); 117 virtual void setUid( int uid );
118 118
119protected: 119protected:
120 Qtopia::UidGen &uidGen(); 120 Qtopia::UidGen &uidGen();
121 QString crossToString()const; 121 QString crossToString()const;
122 122
123private: 123private:
124 class OPimRecordPrivate; 124 class OPimRecordPrivate;
125 OPimRecordPrivate *d; 125 OPimRecordPrivate *d;
126 QMap<QString, QArray<int> > m_relations; 126 QMap<QString, QArray<int> > m_relations;
127 static Qtopia::UidGen m_uidGen; 127 static Qtopia::UidGen m_uidGen;
128 128
129}; 129};
130 130
131 131
132 132
133#endif 133#endif
diff --git a/libopie2/opiepim/core/opimstate.cpp b/libopie2/opiepim/core/opimstate.cpp
new file mode 100644
index 0000000..6fb2feb
--- a/dev/null
+++ b/libopie2/opiepim/core/opimstate.cpp
@@ -0,0 +1,64 @@
1#include <qshared.h>
2
3#include "opimstate.h"
4
5/*
6 * for one int this does not make
7 * much sense but never the less
8 * we will do it for the future
9 */
10struct OPimState::Data : public QShared {
11 Data() : QShared(),state(Undefined) {
12 }
13 int state;
14};
15
16OPimState::OPimState( int state ) {
17 data = new Data;
18 data->state = state;
19}
20OPimState::OPimState( const OPimState& st) :
21 data( st.data ) {
22 /* ref up */
23 data->ref();
24}
25OPimState::~OPimState() {
26 if ( data->deref() ) {
27 delete data ;
28 data = 0;
29 }
30}
31bool OPimState::operator==( const OPimState& st) {
32 if ( data->state == st.data->state ) return true;
33
34 return false;
35}
36OPimState &OPimState::operator=( const OPimState& st) {
37 st.data->ref();
38 deref();
39 data = st.data;
40
41 return *this;
42}
43void OPimState::setState( int st) {
44 copyInternally();
45 data->state = st;
46}
47int OPimState::state()const {
48 return data->state;
49}
50void OPimState::deref() {
51 if ( data->deref() ) {
52 delete data;
53 data = 0l;
54 }
55}
56void OPimState::copyInternally() {
57 /* we need to change it */
58 if ( data->count != 1 ) {
59 data->deref();
60 Data* d2 = new Data;
61 d2->state = data->state;
62 data = d2;
63 }
64}
diff --git a/libopie2/opiepim/core/opimstate.h b/libopie2/opiepim/core/opimstate.h
new file mode 100644
index 0000000..731181e
--- a/dev/null
+++ b/libopie2/opiepim/core/opimstate.h
@@ -0,0 +1,44 @@
1#ifndef OPIE_PIM_STATE_H
2#define OPIE_PIM_STATE_H
3
4#include <qstring.h>
5
6/**
7 * The State of a Task
8 * This class encapsules the state of a todo
9 * and it's shared too
10 */
11/*
12 * in c a simple struct would be enough ;)
13 * g_new_state();
14 * g_do_some_thing( state_t* );
15 * ;)
16 */
17class OPimState {
18public:
19 enum State {
20 Started = 0,
21 Postponed,
22 Finished,
23 NotStarted,
24 Undefined
25 };
26 OPimState( int state = Undefined );
27 OPimState( const OPimState& );
28 ~OPimState();
29
30 bool operator==( const OPimState& );
31 OPimState &operator=( const OPimState& );
32 void setState( int state);
33 int state()const;
34private:
35 void deref();
36 inline void copyInternally();
37 struct Data;
38 Data* data;
39 class Private;
40 Private *d;
41};
42
43
44#endif
diff --git a/libopie2/opiepim/core/orecur.cpp b/libopie2/opiepim/core/orecur.cpp
index 6c81f8f..257d4fd 100644
--- a/libopie2/opiepim/core/orecur.cpp
+++ b/libopie2/opiepim/core/orecur.cpp
@@ -1,127 +1,136 @@
1#include <qshared.h> 1#include <qshared.h>
2 2
3#include <qtopia/timeconversion.h> 3#include <qtopia/timeconversion.h>
4 4
5#include "orecur.h" 5#include "orecur.h"
6 6
7struct ORecur::Data : public QShared { 7struct ORecur::Data : public QShared {
8 Data() : QShared() { 8 Data() : QShared() {
9 type = ORecur::NoRepeat; 9 type = ORecur::NoRepeat;
10 freq = -1; 10 freq = -1;
11 days = 0; 11 days = 0;
12 pos = 0; 12 pos = 0;
13 create = -1; 13 create = -1;
14 hasEnd = FALSE; 14 hasEnd = FALSE;
15 end = 0; 15 end = 0;
16 } 16 }
17 char days; // Q_UINT8 for 8 seven days;) 17 char days; // Q_UINT8 for 8 seven days;)
18 ORecur::RepeatType type; 18 ORecur::RepeatType type;
19 int freq; 19 int freq;
20 int pos; 20 int pos;
21 bool hasEnd : 1; 21 bool hasEnd : 1;
22 time_t end; 22 time_t end;
23 time_t create; 23 time_t create;
24 int rep;
24}; 25};
25 26
26 27
27ORecur::ORecur() { 28ORecur::ORecur() {
28 data = new Data; 29 data = new Data;
29} 30}
30ORecur::ORecur( const ORecur& rec) 31ORecur::ORecur( const ORecur& rec)
31 : data( rec.data ) 32 : data( rec.data )
32{ 33{
33 data->ref(); 34 data->ref();
34} 35}
35ORecur::~ORecur() { 36ORecur::~ORecur() {
36 if ( data->deref() ) { 37 if ( data->deref() ) {
37 delete data; 38 delete data;
38 data = 0l; 39 data = 0l;
39 } 40 }
40} 41}
41void ORecur::deref() { 42void ORecur::deref() {
42 if ( data->deref() ) { 43 if ( data->deref() ) {
43 delete data; 44 delete data;
44 data = 0l; 45 data = 0l;
45 } 46 }
46} 47}
47bool ORecur::operator==( const ORecur& )const { 48bool ORecur::operator==( const ORecur& )const {
48 return false; 49 return false;
49} 50}
50ORecur &ORecur::operator=( const ORecur& re) { 51ORecur &ORecur::operator=( const ORecur& re) {
51 re.data->ref(); 52 re.data->ref();
52 deref(); 53 deref();
53 data = re.data; 54 data = re.data;
54 55
55 return *this; 56 return *this;
56} 57}
57ORecur::RepeatType ORecur::type()const{ 58ORecur::RepeatType ORecur::type()const{
58 return data->type; 59 return data->type;
59} 60}
60int ORecur::frequency()const { 61int ORecur::frequency()const {
61 return data->freq; 62 return data->freq;
62} 63}
63int ORecur::position()const { 64int ORecur::position()const {
64 return data->pos; 65 return data->pos;
65} 66}
66char ORecur::days() const{ 67char ORecur::days() const{
67 return data->days; 68 return data->days;
68} 69}
69bool ORecur::hasEndDate()const { 70bool ORecur::hasEndDate()const {
70 return data->hasEnd; 71 return data->hasEnd;
71} 72}
72QDate ORecur::endDate()const { 73QDate ORecur::endDate()const {
73 return TimeConversion::fromUTC( data->end ).date(); 74 return TimeConversion::fromUTC( data->end ).date();
74} 75}
75time_t ORecur::endDateUTC()const { 76time_t ORecur::endDateUTC()const {
76 return data->end; 77 return data->end;
77} 78}
78time_t ORecur::createTime()const { 79time_t ORecur::createTime()const {
79 return data->create; 80 return data->create;
80} 81}
82int ORecur::repetition()const {
83 return data->rep;
84}
81void ORecur::setType( const RepeatType& z) { 85void ORecur::setType( const RepeatType& z) {
82 checkOrModify(); 86 checkOrModify();
83 data->type = z; 87 data->type = z;
84} 88}
85void ORecur::setFrequency( int freq ) { 89void ORecur::setFrequency( int freq ) {
86 checkOrModify(); 90 checkOrModify();
87 data->freq = freq; 91 data->freq = freq;
88} 92}
89void ORecur::setPosition( int pos ) { 93void ORecur::setPosition( int pos ) {
90 checkOrModify(); 94 checkOrModify();
91 data->pos = pos; 95 data->pos = pos;
92} 96}
93void ORecur::setDays( char c ) { 97void ORecur::setDays( char c ) {
94 checkOrModify(); 98 checkOrModify();
95 data->days = c; 99 data->days = c;
96} 100}
97void ORecur::setEndDate( const QDate& dt) { 101void ORecur::setEndDate( const QDate& dt) {
98 checkOrModify(); 102 checkOrModify();
99 data->end = TimeConversion::toUTC( dt ); 103 data->end = TimeConversion::toUTC( dt );
100} 104}
101void ORecur::setEndDateUTC( time_t t) { 105void ORecur::setEndDateUTC( time_t t) {
102 checkOrModify(); 106 checkOrModify();
103 data->end = t; 107 data->end = t;
104} 108}
105void ORecur::setCreateTime( time_t t) { 109void ORecur::setCreateTime( time_t t) {
106 checkOrModify(); 110 checkOrModify();
107 data->create = t; 111 data->create = t;
108} 112}
109void ORecur::setHasEndDate( bool b) { 113void ORecur::setHasEndDate( bool b) {
110 checkOrModify(); 114 checkOrModify();
111 data->hasEnd = b; 115 data->hasEnd = b;
112} 116}
117void ORecur::setRepitition( int rep ) {
118 checkOrModify();
119 data->rep = rep;
120}
113void ORecur::checkOrModify() { 121void ORecur::checkOrModify() {
114 if ( data->count != 1 ) { 122 if ( data->count != 1 ) {
115 data->deref(); 123 data->deref();
116 Data* d2 = new Data; 124 Data* d2 = new Data;
117 d2->days = data->days; 125 d2->days = data->days;
118 d2->type = data->type; 126 d2->type = data->type;
119 d2->freq = data->freq; 127 d2->freq = data->freq;
120 d2->pos = data->pos; 128 d2->pos = data->pos;
121 d2->hasEnd = data->hasEnd; 129 d2->hasEnd = data->hasEnd;
122 d2->end = data->end; 130 d2->end = data->end;
123 d2->create = data->create; 131 d2->create = data->create;
132 d2->rep = data->rep;
124 data = d2; 133 data = d2;
125 } 134 }
126} 135}
127 136
diff --git a/libopie2/opiepim/core/orecur.h b/libopie2/opiepim/core/orecur.h
index 89258f8..d24d72d 100644
--- a/libopie2/opiepim/core/orecur.h
+++ b/libopie2/opiepim/core/orecur.h
@@ -2,53 +2,55 @@
2 * GPL from TT 2 * GPL from TT
3 */ 3 */
4 4
5#ifndef OPIE_RECUR_H 5#ifndef OPIE_RECUR_H
6#define OPIE_RECUR_H 6#define OPIE_RECUR_H
7 7
8#include <sys/types.h> 8#include <sys/types.h>
9 9
10#include <qdatetime.h> 10#include <qdatetime.h>
11 11
12 12
13 13
14class ORecur { 14class ORecur {
15public: 15public:
16 enum RepeatType{ NoRepeat = -1, Daily, Weekly, MonthlyDay, 16 enum RepeatType{ NoRepeat = -1, Daily, Weekly, MonthlyDay,
17 MonthlyDate, Yearly }; 17 MonthlyDate, Yearly };
18 enum Days { MON = 0x01, TUE = 0x02, WED = 0x04, THU = 0x08, 18 enum Days { MON = 0x01, TUE = 0x02, WED = 0x04, THU = 0x08,
19 FRI = 0x10, SAT = 0x20, SUN = 0x40 }; 19 FRI = 0x10, SAT = 0x20, SUN = 0x40 };
20 ORecur(); 20 ORecur();
21 ORecur( const ORecur& ); 21 ORecur( const ORecur& );
22 ~ORecur(); 22 ~ORecur();
23 23
24 ORecur &operator=( const ORecur& ); 24 ORecur &operator=( const ORecur& );
25 bool operator==(const ORecur& )const; 25 bool operator==(const ORecur& )const;
26 RepeatType type()const; 26 RepeatType type()const;
27 int frequency()const; 27 int frequency()const;
28 int position()const; 28 int position()const;
29 char days()const; 29 char days()const;
30 bool hasEndDate()const; 30 bool hasEndDate()const;
31 QDate endDate()const; 31 QDate endDate()const;
32 time_t endDateUTC()const; 32 time_t endDateUTC()const;
33 time_t createTime()const; 33 time_t createTime()const;
34 int repetition()const;
34 35
35 void setType( const RepeatType& ); 36 void setType( const RepeatType& );
36 void setFrequency( int freq ); 37 void setFrequency( int freq );
37 void setPosition( int pos ); 38 void setPosition( int pos );
38 void setDays( char c); 39 void setDays( char c);
39 void setEndDate( const QDate& dt ); 40 void setEndDate( const QDate& dt );
40 void setEndDateUTC( time_t ); 41 void setEndDateUTC( time_t );
41 void setCreateTime( time_t ); 42 void setCreateTime( time_t );
42 void setHasEndDate( bool b ); 43 void setHasEndDate( bool b );
44 void setRepitition(int );
43private: 45private:
44 void deref(); 46 void deref();
45 inline void checkOrModify(); 47 inline void checkOrModify();
46 48
47 49
48 class Data; 50 class Data;
49 Data* data; 51 Data* data;
50 class ORecurPrivate; 52 class ORecurPrivate;
51 ORecurPrivate *d; 53 ORecurPrivate *d;
52}; 54};
53 55
54#endif 56#endif
diff --git a/libopie2/opiepim/ocontact.cpp b/libopie2/opiepim/ocontact.cpp
index acd65c4..cd238ef 100644
--- a/libopie2/opiepim/ocontact.cpp
+++ b/libopie2/opiepim/ocontact.cpp
@@ -1098,72 +1098,72 @@ static VObject *createVObject( const OContact &c )
1098 1098
1099 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); 1099 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() );
1100 safeAddProp( work_phone, VCWorkProp ); 1100 safeAddProp( work_phone, VCWorkProp );
1101 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); 1101 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() );
1102 safeAddProp( work_phone, VCWorkProp ); 1102 safeAddProp( work_phone, VCWorkProp );
1103 safeAddProp( work_phone, VCCellularProp ); 1103 safeAddProp( work_phone, VCCellularProp );
1104 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); 1104 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() );
1105 safeAddProp( work_phone, VCWorkProp ); 1105 safeAddProp( work_phone, VCWorkProp );
1106 safeAddProp( work_phone, VCFaxProp ); 1106 safeAddProp( work_phone, VCFaxProp );
1107 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); 1107 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() );
1108 safeAddProp( work_phone, VCWorkProp ); 1108 safeAddProp( work_phone, VCWorkProp );
1109 safeAddProp( work_phone, VCPagerProp ); 1109 safeAddProp( work_phone, VCPagerProp );
1110 1110
1111 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); 1111 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() );
1112 safeAddProp( url, VCWorkProp ); 1112 safeAddProp( url, VCWorkProp );
1113 1113
1114 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); 1114 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() );
1115 safeAddProp( title, VCWorkProp ); 1115 safeAddProp( title, VCWorkProp );
1116 1116
1117 1117
1118 QStringList emails = c.emailList(); 1118 QStringList emails = c.emailList();
1119 emails.prepend( c.defaultEmail() ); 1119 emails.prepend( c.defaultEmail() );
1120 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { 1120 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) {
1121 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); 1121 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it );
1122 safeAddProp( email, VCInternetProp ); 1122 safeAddProp( email, VCInternetProp );
1123 } 1123 }
1124 1124
1125 safeAddPropValue( vcard, VCNoteProp, c.notes() ); 1125 safeAddPropValue( vcard, VCNoteProp, c.notes() );
1126 1126
1127 // Exporting Birthday regarding RFC 2425 (5.8.4) 1127 // Exporting Birthday regarding RFC 2425 (5.8.4)
1128 if ( c.birthday().isValid() ){ 1128 if ( c.birthday().isValid() ){
1129 QString birthd_rfc2425 = QString("%1-%2-%3") 1129 QString birthd_rfc2425 = QString("%1-%2-%3")
1130 .arg( c.birthday().year() ) 1130 .arg( c.birthday().year() )
1131 .arg( c.birthday().month(), 2 ) 1131 .arg( c.birthday().month(), 2 )
1132 .arg( c.birthday().day(), 2 ); 1132 .arg( c.birthday().day(), 2 );
1133 // Now replace spaces with "0"... 1133 // Now replace spaces with "0"...
1134 int pos = 0; 1134 int pos = 0;
1135 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 ) 1135 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 )
1136 birthd_rfc2425.replace( pos, 1, "0" ); 1136 birthd_rfc2425.replace( pos, 1, "0" );
1137 1137
1138 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1()); 1138 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1());
1139 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() ); 1139 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() );
1140 } 1140 }
1141 1141
1142 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { 1142 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) {
1143 VObject *org = safeAddProp( vcard, VCOrgProp ); 1143 VObject *org = safeAddProp( vcard, VCOrgProp );
1144 safeAddPropValue( org, VCOrgNameProp, c.company() ); 1144 safeAddPropValue( org, VCOrgNameProp, c.company() );
1145 safeAddPropValue( org, VCOrgUnitProp, c.department() ); 1145 safeAddPropValue( org, VCOrgUnitProp, c.department() );
1146 safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); 1146 safeAddPropValue( org, VCOrgUnit2Prop, c.office() );
1147 } 1147 }
1148 1148
1149 // some values we have to export as custom fields 1149 // some values we have to export as custom fields
1150 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); 1150 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() );
1151 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); 1151 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() );
1152 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); 1152 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() );
1153 1153
1154 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); 1154 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() );
1155 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); 1155 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() );
1156 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) ); 1156 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) );
1157 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); 1157 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() );
1158 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); 1158 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() );
1159 1159
1160 return vcard; 1160 return vcard;
1161} 1161}
1162 1162
1163 1163
1164/*! 1164/*!
1165 \internal 1165 \internal
1166*/ 1166*/
1167static QDate convVCardDateToDate( const QString& datestr ) 1167static QDate convVCardDateToDate( const QString& datestr )
1168{ 1168{
1169 int monthPos = datestr.find('-'); 1169 int monthPos = datestr.find('-');
@@ -1359,69 +1359,69 @@ static OContact parseVObject( VObject *obj )
1359 else if ( name == VCOrgUnitProp ) 1359 else if ( name == VCOrgUnitProp )
1360 c.setDepartment( value ); 1360 c.setDepartment( value );
1361 else if ( name == VCOrgUnit2Prop ) 1361 else if ( name == VCOrgUnit2Prop )
1362 c.setOffice( value ); 1362 c.setOffice( value );
1363 } 1363 }
1364 } 1364 }
1365 else if ( name == VCTitleProp ) { 1365 else if ( name == VCTitleProp ) {
1366 c.setJobTitle( value ); 1366 c.setJobTitle( value );
1367 } 1367 }
1368 else if ( name == "X-Qtopia-Profession" ) { 1368 else if ( name == "X-Qtopia-Profession" ) {
1369 c.setProfession( value ); 1369 c.setProfession( value );
1370 } 1370 }
1371 else if ( name == "X-Qtopia-Manager" ) { 1371 else if ( name == "X-Qtopia-Manager" ) {
1372 c.setManager( value ); 1372 c.setManager( value );
1373 } 1373 }
1374 else if ( name == "X-Qtopia-Assistant" ) { 1374 else if ( name == "X-Qtopia-Assistant" ) {
1375 c.setAssistant( value ); 1375 c.setAssistant( value );
1376 } 1376 }
1377 else if ( name == "X-Qtopia-Spouse" ) { 1377 else if ( name == "X-Qtopia-Spouse" ) {
1378 c.setSpouse( value ); 1378 c.setSpouse( value );
1379 } 1379 }
1380 else if ( name == "X-Qtopia-Gender" ) { 1380 else if ( name == "X-Qtopia-Gender" ) {
1381 c.setGender( value ); 1381 c.setGender( value );
1382 } 1382 }
1383 else if ( name == "X-Qtopia-Anniversary" ) { 1383 else if ( name == "X-Qtopia-Anniversary" ) {
1384 c.setAnniversary( TimeConversion::fromString( value ) ); 1384 c.setAnniversary( TimeConversion::fromString( value ) );
1385 } 1385 }
1386 else if ( name == "X-Qtopia-Nickname" ) { 1386 else if ( name == "X-Qtopia-Nickname" ) {
1387 c.setNickname( value ); 1387 c.setNickname( value );
1388 } 1388 }
1389 else if ( name == "X-Qtopia-Children" ) { 1389 else if ( name == "X-Qtopia-Children" ) {
1390 c.setChildren( value ); 1390 c.setChildren( value );
1391 } 1391 }
1392 else if ( name == VCBirthDateProp ) { 1392 else if ( name == VCBirthDateProp ) {
1393 // Reading Birthdate regarding RFC 2425 (5.8.4) 1393 // Reading Birthdate regarding RFC 2425 (5.8.4)
1394 c.setBirthday( convVCardDateToDate( value ) ); 1394 c.setBirthday( convVCardDateToDate( value ) );
1395 1395
1396 } 1396 }
1397 1397
1398#if 0 1398#if 0
1399 else { 1399 else {
1400 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); 1400 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) );
1401 VObjectIterator nit; 1401 VObjectIterator nit;
1402 initPropIterator( &nit, o ); 1402 initPropIterator( &nit, o );
1403 while( moreIteration( &nit ) ) { 1403 while( moreIteration( &nit ) ) {
1404 VObject *o = nextVObject( &nit ); 1404 VObject *o = nextVObject( &nit );
1405 QCString name = vObjectName( o ); 1405 QCString name = vObjectName( o );
1406 QString value = vObjectStringZValue( o ); 1406 QString value = vObjectStringZValue( o );
1407 printf(" subprop: %s = %s\n", name.data(), value.latin1() ); 1407 printf(" subprop: %s = %s\n", name.data(), value.latin1() );
1408 } 1408 }
1409 } 1409 }
1410#endif 1410#endif
1411 } 1411 }
1412 c.setFileAs(); 1412 c.setFileAs();
1413 return c; 1413 return c;
1414} 1414}
1415 1415
1416/*! 1416/*!
1417 Writes the list of \a contacts as a set of VCards to the file \a filename. 1417 Writes the list of \a contacts as a set of VCards to the file \a filename.
1418*/ 1418*/
1419void OContact::writeVCard( const QString &filename, const QValueList<OContact> &contacts) 1419void OContact::writeVCard( const QString &filename, const QValueList<OContact> &contacts)
1420{ 1420{
1421 QFileDirect f( filename.utf8().data() ); 1421 QFileDirect f( filename.utf8().data() );
1422 if ( !f.open( IO_WriteOnly ) ) { 1422 if ( !f.open( IO_WriteOnly ) ) {
1423 qWarning("Unable to open vcard write"); 1423 qWarning("Unable to open vcard write");
1424 return; 1424 return;
1425 } 1425 }
1426 1426
1427 QValueList<OContact>::ConstIterator it; 1427 QValueList<OContact>::ConstIterator it;
@@ -1435,219 +1435,228 @@ void OContact::writeVCard( const QString &filename, const QValueList<OContact> &
1435 1435
1436/*! 1436/*!
1437 writes \a contact as a VCard to the file \a filename. 1437 writes \a contact as a VCard to the file \a filename.
1438*/ 1438*/
1439void OContact::writeVCard( const QString &filename, const OContact &contact) 1439void OContact::writeVCard( const QString &filename, const OContact &contact)
1440{ 1440{
1441 QFileDirect f( filename.utf8().data() ); 1441 QFileDirect f( filename.utf8().data() );
1442 if ( !f.open( IO_WriteOnly ) ) { 1442 if ( !f.open( IO_WriteOnly ) ) {
1443 qWarning("Unable to open vcard write"); 1443 qWarning("Unable to open vcard write");
1444 return; 1444 return;
1445 } 1445 }
1446 1446
1447 VObject *obj = createVObject( contact ); 1447 VObject *obj = createVObject( contact );
1448 writeVObject( f.directHandle() , obj ); 1448 writeVObject( f.directHandle() , obj );
1449 cleanVObject( obj ); 1449 cleanVObject( obj );
1450 1450
1451 cleanStrTbl(); 1451 cleanStrTbl();
1452} 1452}
1453 1453
1454/*! 1454/*!
1455 Returns the set of contacts read as VCards from the file \a filename. 1455 Returns the set of contacts read as VCards from the file \a filename.
1456*/ 1456*/
1457QValueList<OContact> OContact::readVCard( const QString &filename ) 1457QValueList<OContact> OContact::readVCard( const QString &filename )
1458{ 1458{
1459 qDebug("trying to open %s, exists=%d", filename.utf8().data(), QFileInfo( filename.utf8().data() ).size() ); 1459 qDebug("trying to open %s, exists=%d", filename.utf8().data(), QFileInfo( filename.utf8().data() ).size() );
1460 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() ); 1460 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() );
1461 1461
1462 qDebug("vobject = %p", obj ); 1462 qDebug("vobject = %p", obj );
1463 1463
1464 QValueList<OContact> contacts; 1464 QValueList<OContact> contacts;
1465 1465
1466 while ( obj ) { 1466 while ( obj ) {
1467 contacts.append( parseVObject( obj ) ); 1467 OContact con = parseVObject( obj );
1468 /*
1469 * if uid is 0 assign a new one
1470 * this at least happens on
1471 * Nokia6210
1472 */
1473 if ( con.uid() == 0 )
1474 con.setUid( 1 );
1475
1476 contacts.append(con );
1468 1477
1469 VObject *t = obj; 1478 VObject *t = obj;
1470 obj = nextVObjectInList(obj); 1479 obj = nextVObjectInList(obj);
1471 cleanVObject( t ); 1480 cleanVObject( t );
1472 } 1481 }
1473 1482
1474 return contacts; 1483 return contacts;
1475} 1484}
1476 1485
1477/*! 1486/*!
1478 Returns TRUE if the contact matches the regular expression \a regexp. 1487 Returns TRUE if the contact matches the regular expression \a regexp.
1479 Otherwise returns FALSE. 1488 Otherwise returns FALSE.
1480*/ 1489*/
1481bool OContact::match( const QString &regexp ) const 1490bool OContact::match( const QString &regexp ) const
1482{ 1491{
1483 return match(QRegExp(regexp)); 1492 return match(QRegExp(regexp));
1484} 1493}
1485 1494
1486/*! 1495/*!
1487 \overload 1496 \overload
1488 Returns TRUE if the contact matches the regular expression \a regexp. 1497 Returns TRUE if the contact matches the regular expression \a regexp.
1489 Otherwise returns FALSE. 1498 Otherwise returns FALSE.
1490*/ 1499*/
1491bool OContact::match( const QRegExp &r ) const 1500bool OContact::match( const QRegExp &r ) const
1492{ 1501{
1493 bool match; 1502 bool match;
1494 match = false; 1503 match = false;
1495 QMap<int, QString>::ConstIterator it; 1504 QMap<int, QString>::ConstIterator it;
1496 for ( it = mMap.begin(); it != mMap.end(); ++it ) { 1505 for ( it = mMap.begin(); it != mMap.end(); ++it ) {
1497 if ( (*it).find( r ) > -1 ) { 1506 if ( (*it).find( r ) > -1 ) {
1498 match = true; 1507 match = true;
1499 break; 1508 break;
1500 } 1509 }
1501 } 1510 }
1502 return match; 1511 return match;
1503} 1512}
1504 1513
1505 1514
1506QString OContact::toShortText() const 1515QString OContact::toShortText() const
1507{ 1516{
1508 return ( fullName() ); 1517 return ( fullName() );
1509} 1518}
1510QString OContact::type() const 1519QString OContact::type() const
1511{ 1520{
1512 return QString::fromLatin1( "OContact" ); 1521 return QString::fromLatin1( "OContact" );
1513} 1522}
1514 1523
1515// Definition is missing ! (se) 1524// Definition is missing ! (se)
1516QMap<QString,QString> OContact::toExtraMap() const 1525QMap<QString,QString> OContact::toExtraMap() const
1517{ 1526{
1518 qWarning ("Function not implemented: OContact::toExtraMap()"); 1527 qWarning ("Function not implemented: OContact::toExtraMap()");
1519 QMap <QString,QString> useless; 1528 QMap <QString,QString> useless;
1520 return useless; 1529 return useless;
1521} 1530}
1522 1531
1523class QString OContact::recordField( int pos ) const 1532class QString OContact::recordField( int pos ) const
1524{ 1533{
1525 QStringList SLFIELDS = fields(); // ?? why this ? (se) 1534 QStringList SLFIELDS = fields(); // ?? why this ? (se)
1526 return SLFIELDS[pos]; 1535 return SLFIELDS[pos];
1527} 1536}
1528 1537
1529// In future releases, we should store birthday and anniversary 1538// In future releases, we should store birthday and anniversary
1530// internally as QDate instead of QString ! 1539// internally as QDate instead of QString !
1531// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se) 1540// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se)
1532 1541
1533/*! \fn void OContact::setBirthday( const QDate& date ) 1542/*! \fn void OContact::setBirthday( const QDate& date )
1534 Sets the birthday for the contact to \a date. 1543 Sets the birthday for the contact to \a date.
1535*/ 1544*/
1536void OContact::setBirthday( const QDate &v ) 1545void OContact::setBirthday( const QDate &v )
1537{ 1546{
1538 if ( ( !v.isNull() ) && ( v.isValid() ) ) 1547 if ( ( !v.isNull() ) && ( v.isValid() ) )
1539 replace( Qtopia::Birthday, TimeConversion::toString( v ) ); 1548 replace( Qtopia::Birthday, TimeConversion::toString( v ) );
1540 1549
1541} 1550}
1542 1551
1543 1552
1544/*! \fn void OContact::setAnniversary( const QDate &date ) 1553/*! \fn void OContact::setAnniversary( const QDate &date )
1545 Sets the anniversary of the contact to \a date. 1554 Sets the anniversary of the contact to \a date.
1546*/ 1555*/
1547void OContact::setAnniversary( const QDate &v ) 1556void OContact::setAnniversary( const QDate &v )
1548{ 1557{
1549 if ( ( !v.isNull() ) && ( v.isValid() ) ) 1558 if ( ( !v.isNull() ) && ( v.isValid() ) )
1550 replace( Qtopia::Anniversary, TimeConversion::toString( v ) ); 1559 replace( Qtopia::Anniversary, TimeConversion::toString( v ) );
1551} 1560}
1552 1561
1553/*! \fn QDate OContact::birthday() const 1562/*! \fn QDate OContact::birthday() const
1554 Returns the birthday of the contact. 1563 Returns the birthday of the contact.
1555*/ 1564*/
1556QDate OContact::birthday() const 1565QDate OContact::birthday() const
1557{ 1566{
1558 QString str = find( Qtopia::Birthday ); 1567 QString str = find( Qtopia::Birthday );
1559 qWarning ("Birthday %s", str.latin1() ); 1568 qWarning ("Birthday %s", str.latin1() );
1560 if ( !str.isEmpty() ) 1569 if ( !str.isEmpty() )
1561 return TimeConversion::fromString ( str ); 1570 return TimeConversion::fromString ( str );
1562 else 1571 else
1563 return QDate(); 1572 return QDate();
1564} 1573}
1565 1574
1566 1575
1567/*! \fn QDate OContact::anniversary() const 1576/*! \fn QDate OContact::anniversary() const
1568 Returns the anniversary of the contact. 1577 Returns the anniversary of the contact.
1569*/ 1578*/
1570QDate OContact::anniversary() const 1579QDate OContact::anniversary() const
1571{ 1580{
1572 QDate empty; 1581 QDate empty;
1573 QString str = find( Qtopia::Anniversary ); 1582 QString str = find( Qtopia::Anniversary );
1574 qWarning ("Anniversary %s", str.latin1() ); 1583 qWarning ("Anniversary %s", str.latin1() );
1575 if ( !str.isEmpty() ) 1584 if ( !str.isEmpty() )
1576 return TimeConversion::fromString ( str ); 1585 return TimeConversion::fromString ( str );
1577 else 1586 else
1578 return empty; 1587 return empty;
1579} 1588}
1580 1589
1581 1590
1582void OContact::insertEmail( const QString &v ) 1591void OContact::insertEmail( const QString &v )
1583{ 1592{
1584 //qDebug("insertEmail %s", v.latin1()); 1593 //qDebug("insertEmail %s", v.latin1());
1585 QString e = v.simplifyWhiteSpace(); 1594 QString e = v.simplifyWhiteSpace();
1586 QString def = defaultEmail(); 1595 QString def = defaultEmail();
1587 1596
1588 // if no default, set it as the default email and don't insert 1597 // if no default, set it as the default email and don't insert
1589 if ( def.isEmpty() ) { 1598 if ( def.isEmpty() ) {
1590 setDefaultEmail( e ); // will insert into the list for us 1599 setDefaultEmail( e ); // will insert into the list for us
1591 return; 1600 return;
1592 } 1601 }
1593 1602
1594 // otherwise, insert assuming doesn't already exist 1603 // otherwise, insert assuming doesn't already exist
1595 QString emailsStr = find( Qtopia::Emails ); 1604 QString emailsStr = find( Qtopia::Emails );
1596 if ( emailsStr.contains( e )) 1605 if ( emailsStr.contains( e ))
1597 return; 1606 return;
1598 if ( !emailsStr.isEmpty() ) 1607 if ( !emailsStr.isEmpty() )
1599 emailsStr += emailSeparator(); 1608 emailsStr += emailSeparator();
1600 emailsStr += e; 1609 emailsStr += e;
1601 replace( Qtopia::Emails, emailsStr ); 1610 replace( Qtopia::Emails, emailsStr );
1602} 1611}
1603 1612
1604void OContact::removeEmail( const QString &v ) 1613void OContact::removeEmail( const QString &v )
1605{ 1614{
1606 QString e = v.simplifyWhiteSpace(); 1615 QString e = v.simplifyWhiteSpace();
1607 QString def = defaultEmail(); 1616 QString def = defaultEmail();
1608 QString emailsStr = find( Qtopia::Emails ); 1617 QString emailsStr = find( Qtopia::Emails );
1609 QStringList emails = emailList(); 1618 QStringList emails = emailList();
1610 1619
1611 // otherwise, must first contain it 1620 // otherwise, must first contain it
1612 if ( !emailsStr.contains( e ) ) 1621 if ( !emailsStr.contains( e ) )
1613 return; 1622 return;
1614 1623
1615 // remove it 1624 // remove it
1616 //qDebug(" removing email from list %s", e.latin1()); 1625 //qDebug(" removing email from list %s", e.latin1());
1617 emails.remove( e ); 1626 emails.remove( e );
1618 // reset the string 1627 // reset the string
1619 emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator 1628 emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator
1620 replace( Qtopia::Emails, emailsStr ); 1629 replace( Qtopia::Emails, emailsStr );
1621 1630
1622 // if default, then replace the default email with the first one 1631 // if default, then replace the default email with the first one
1623 if ( def == e ) { 1632 if ( def == e ) {
1624 //qDebug("removeEmail is default; setting new default"); 1633 //qDebug("removeEmail is default; setting new default");
1625 if ( !emails.count() ) 1634 if ( !emails.count() )
1626 clearEmails(); 1635 clearEmails();
1627 else // setDefaultEmail will remove e from the list 1636 else // setDefaultEmail will remove e from the list
1628 setDefaultEmail( emails.first() ); 1637 setDefaultEmail( emails.first() );
1629 } 1638 }
1630} 1639}
1631void OContact::clearEmails() 1640void OContact::clearEmails()
1632{ 1641{
1633 mMap.remove( Qtopia::DefaultEmail ); 1642 mMap.remove( Qtopia::DefaultEmail );
1634 mMap.remove( Qtopia::Emails ); 1643 mMap.remove( Qtopia::Emails );
1635} 1644}
1636void OContact::setDefaultEmail( const QString &v ) 1645void OContact::setDefaultEmail( const QString &v )
1637{ 1646{
1638 QString e = v.simplifyWhiteSpace(); 1647 QString e = v.simplifyWhiteSpace();
1639 1648
1640 //qDebug("OContact::setDefaultEmail %s", e.latin1()); 1649 //qDebug("OContact::setDefaultEmail %s", e.latin1());
1641 replace( Qtopia::DefaultEmail, e ); 1650 replace( Qtopia::DefaultEmail, e );
1642 1651
1643 if ( !e.isEmpty() ) 1652 if ( !e.isEmpty() )
1644 insertEmail( e ); 1653 insertEmail( e );
1645 1654
1646} 1655}
1647 1656
1648void OContact::insertEmails( const QStringList &v ) 1657void OContact::insertEmails( const QStringList &v )
1649{ 1658{
1650 for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it ) 1659 for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it )
1651 insertEmail( *it ); 1660 insertEmail( *it );
1652} 1661}
1653 1662
diff --git a/libopie2/opiepim/orecordlist.h b/libopie2/opiepim/orecordlist.h
index 2f4a5d3..8ed41e2 100644
--- a/libopie2/opiepim/orecordlist.h
+++ b/libopie2/opiepim/orecordlist.h
@@ -205,65 +205,65 @@ bool ORecordListIterator<T>::operator==( const ORecordListIterator<T>& it ) {
205 if ( m_end == it.m_end ) return true; 205 if ( m_end == it.m_end ) return true;
206 206
207 if ( m_uids != it.m_uids ) return false; 207 if ( m_uids != it.m_uids ) return false;
208 if ( m_current != it.m_current ) return false; 208 if ( m_current != it.m_current ) return false;
209 if ( m_temp != it.m_temp ) return false; 209 if ( m_temp != it.m_temp ) return false;
210 210
211 return true; 211 return true;
212} 212}
213template <class T> 213template <class T>
214bool ORecordListIterator<T>::operator!=( const ORecordListIterator<T>& it ) { 214bool ORecordListIterator<T>::operator!=( const ORecordListIterator<T>& it ) {
215 return !(*this == it ); 215 return !(*this == it );
216} 216}
217template <class T> 217template <class T>
218ORecordListIterator<T>::ORecordListIterator( const QArray<int> uids, 218ORecordListIterator<T>::ORecordListIterator( const QArray<int> uids,
219 const Base* t ) 219 const Base* t )
220 : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ), 220 : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ),
221 m_direction( false ) 221 m_direction( false )
222{ 222{
223} 223}
224template <class T> 224template <class T>
225uint ORecordListIterator<T>::current()const { 225uint ORecordListIterator<T>::current()const {
226 return m_current; 226 return m_current;
227} 227}
228template <class T> 228template <class T>
229void ORecordListIterator<T>::setCurrent( uint cur ) { 229void ORecordListIterator<T>::setCurrent( uint cur ) {
230 if( cur < m_uids.count() ) { 230 if( cur < m_uids.count() ) {
231 m_end = false; 231 m_end = false;
232 m_current= cur; 232 m_current= cur;
233 } 233 }
234} 234}
235template <class T> 235template <class T>
236uint ORecordListIterator<T>::count()const { 236uint ORecordListIterator<T>::count()const {
237 return m_uids.count(); 237 return m_uids.count();
238} 238}
239template <class T> 239template <class T>
240ORecordList<T>::ORecordList( const QArray<int>& ids, 240ORecordList<T>::ORecordList( const QArray<int>& ids,
241 const Base* acc ) 241 const Base* acc )
242 : m_ids( ids ), m_acc( acc ) 242 : m_ids( ids ), m_acc( acc )
243{ 243{
244} 244}
245template <class T> 245template <class T>
246ORecordList<T>::~ORecordList() { 246ORecordList<T>::~ORecordList() {
247/* nothing to do here */ 247/* nothing to do here */
248} 248}
249template <class T> 249template <class T>
250ORecordList<T>::Iterator ORecordList<T>::begin() { 250ORecordList<T>::Iterator ORecordList<T>::begin() {
251 Iterator it( m_ids, m_acc ); 251 Iterator it( m_ids, m_acc );
252 return it; 252 return it;
253} 253}
254template <class T> 254template <class T>
255ORecordList<T>::Iterator ORecordList<T>::end() { 255ORecordList<T>::Iterator ORecordList<T>::end() {
256 Iterator it( m_ids, m_acc ); 256 Iterator it( m_ids, m_acc );
257 it.m_end = true; 257 it.m_end = true;
258 it.m_current = m_ids.count(); 258 it.m_current = m_ids.count();
259 259
260 return it; 260 return it;
261} 261}
262template <class T> 262template <class T>
263uint ORecordList<T>::count()const { 263uint ORecordList<T>::count()const {
264return m_ids.count(); 264return m_ids.count();
265} 265}
266template <class T> 266template <class T>
267T ORecordList<T>::operator[]( uint i ) { 267T ORecordList<T>::operator[]( uint i ) {
268 if ( i < 0 || (i+1) > m_ids.count() ) 268 if ( i < 0 || (i+1) > m_ids.count() )
269 return T(); 269 return T();
diff --git a/libopie2/opiepim/otodo.cpp b/libopie2/opiepim/otodo.cpp
index 765d5a9..0d5b1d3 100644
--- a/libopie2/opiepim/otodo.cpp
+++ b/libopie2/opiepim/otodo.cpp
@@ -1,64 +1,67 @@
1 1
2#include <qobject.h> 2#include <qobject.h>
3#include <qshared.h> 3#include <qshared.h>
4 4
5 5
6 6
7#include <qpe/palmtopuidgen.h> 7#include <qpe/palmtopuidgen.h>
8#include <qpe/stringutil.h> 8#include <qpe/stringutil.h>
9#include <qpe/palmtoprecord.h> 9#include <qpe/palmtoprecord.h>
10#include <qpe/stringutil.h> 10#include <qpe/stringutil.h>
11#include <qpe/categories.h> 11#include <qpe/categories.h>
12#include <qpe/categoryselect.h> 12#include <qpe/categoryselect.h>
13 13
14 14
15 15#include "opimstate.h"
16#include "orecur.h"
16#include "otodo.h" 17#include "otodo.h"
17 18
18 19
19struct OTodo::OTodoData : public QShared { 20struct OTodo::OTodoData : public QShared {
20 OTodoData() : QShared() { 21 OTodoData() : QShared() {
21 }; 22 };
22 23
23 QDate date; 24 QDate date;
24 bool isCompleted:1; 25 bool isCompleted:1;
25 bool hasDate:1; 26 bool hasDate:1;
26 int priority; 27 int priority;
27 QString desc; 28 QString desc;
28 QString sum; 29 QString sum;
29 QMap<QString, QString> extra; 30 QMap<QString, QString> extra;
30 ushort prog; 31 ushort prog;
31 bool hasAlarmDateTime :1; 32 bool hasAlarmDateTime :1;
32 QDateTime alarmDateTime; 33 QDateTime alarmDateTime;
34 OPimState state;
35 ORecur recur;
33}; 36};
34 37
35OTodo::OTodo(const OTodo &event ) 38OTodo::OTodo(const OTodo &event )
36 : OPimRecord( event ), data( event.data ) 39 : OPimRecord( event ), data( event.data )
37{ 40{
38 data->ref(); 41 data->ref();
39// qWarning("ref up"); 42// qWarning("ref up");
40} 43}
41OTodo::~OTodo() { 44OTodo::~OTodo() {
42 45
43// qWarning("~OTodo " ); 46// qWarning("~OTodo " );
44 if ( data->deref() ) { 47 if ( data->deref() ) {
45// qWarning("OTodo::dereffing"); 48// qWarning("OTodo::dereffing");
46 delete data; 49 delete data;
47 data = 0l; 50 data = 0l;
48 } 51 }
49} 52}
50OTodo::OTodo(bool completed, int priority, 53OTodo::OTodo(bool completed, int priority,
51 const QArray<int> &category, 54 const QArray<int> &category,
52 const QString& summary, 55 const QString& summary,
53 const QString &description, 56 const QString &description,
54 ushort progress, 57 ushort progress,
55 bool hasDate, QDate date, int uid ) 58 bool hasDate, QDate date, int uid )
56 : OPimRecord( uid ) 59 : OPimRecord( uid )
57{ 60{
58// qWarning("OTodoData " + summary); 61// qWarning("OTodoData " + summary);
59 setCategories( category ); 62 setCategories( category );
60 63
61 data = new OTodoData; 64 data = new OTodoData;
62 65
63 data->date = date; 66 data->date = date;
64 data->isCompleted = completed; 67 data->isCompleted = completed;
@@ -115,105 +118,119 @@ bool OTodo::hasDueDate() const
115 return data->hasDate; 118 return data->hasDate;
116} 119}
117bool OTodo::hasAlarmDateTime() const 120bool OTodo::hasAlarmDateTime() const
118{ 121{
119 return data->hasAlarmDateTime; 122 return data->hasAlarmDateTime;
120} 123}
121int OTodo::priority()const 124int OTodo::priority()const
122{ 125{
123 return data->priority; 126 return data->priority;
124} 127}
125QString OTodo::summary() const 128QString OTodo::summary() const
126{ 129{
127 return data->sum; 130 return data->sum;
128} 131}
129ushort OTodo::progress() const 132ushort OTodo::progress() const
130{ 133{
131 return data->prog; 134 return data->prog;
132} 135}
133QDate OTodo::dueDate()const 136QDate OTodo::dueDate()const
134{ 137{
135 return data->date; 138 return data->date;
136} 139}
137 140
138QDateTime OTodo::alarmDateTime() const 141QDateTime OTodo::alarmDateTime() const
139{ 142{
140 return data->alarmDateTime; 143 return data->alarmDateTime;
141} 144}
142 145
143QString OTodo::description()const 146QString OTodo::description()const
144{ 147{
145 return data->desc; 148 return data->desc;
146} 149}
150OPimState OTodo::state()const {
151 return data->state;
152}
153ORecur OTodo::recurrence()const {
154 return data->recur;
155}
147void OTodo::setCompleted( bool completed ) 156void OTodo::setCompleted( bool completed )
148{ 157{
149 changeOrModify(); 158 changeOrModify();
150 data->isCompleted = completed; 159 data->isCompleted = completed;
151} 160}
152void OTodo::setHasDueDate( bool hasDate ) 161void OTodo::setHasDueDate( bool hasDate )
153{ 162{
154 changeOrModify(); 163 changeOrModify();
155 data->hasDate = hasDate; 164 data->hasDate = hasDate;
156} 165}
157void OTodo::setHasAlarmDateTime( bool hasAlarmDateTime ) 166void OTodo::setHasAlarmDateTime( bool hasAlarmDateTime )
158{ 167{
159 changeOrModify(); 168 changeOrModify();
160 data->hasAlarmDateTime = hasAlarmDateTime; 169 data->hasAlarmDateTime = hasAlarmDateTime;
161} 170}
162void OTodo::setDescription(const QString &desc ) 171void OTodo::setDescription(const QString &desc )
163{ 172{
164// qWarning( "desc " + desc ); 173// qWarning( "desc " + desc );
165 changeOrModify(); 174 changeOrModify();
166 data->desc = Qtopia::simplifyMultiLineSpace(desc ); 175 data->desc = Qtopia::simplifyMultiLineSpace(desc );
167} 176}
168void OTodo::setSummary( const QString& sum ) 177void OTodo::setSummary( const QString& sum )
169{ 178{
170 changeOrModify(); 179 changeOrModify();
171 data->sum = sum; 180 data->sum = sum;
172} 181}
173void OTodo::setPriority(int prio ) 182void OTodo::setPriority(int prio )
174{ 183{
175 changeOrModify(); 184 changeOrModify();
176 data->priority = prio; 185 data->priority = prio;
177} 186}
178void OTodo::setDueDate( QDate date ) 187void OTodo::setDueDate( QDate date )
179{ 188{
180 changeOrModify(); 189 changeOrModify();
181 data->date = date; 190 data->date = date;
182} 191}
183void OTodo::setAlarmDateTime( const QDateTime& alarm ) 192void OTodo::setAlarmDateTime( const QDateTime& alarm )
184{ 193{
185 changeOrModify(); 194 changeOrModify();
186 data->alarmDateTime = alarm; 195 data->alarmDateTime = alarm;
187} 196}
197void OTodo::setState( const OPimState& state ) {
198 changeOrModify();
199 data->state = state;
200}
201void OTodo::setRecurrence( const ORecur& rec) {
202 changeOrModify();
203 data->recur = rec;
204}
188bool OTodo::isOverdue( ) 205bool OTodo::isOverdue( )
189{ 206{
190 if( data->hasDate && !data->isCompleted) 207 if( data->hasDate && !data->isCompleted)
191 return QDate::currentDate() > data->date; 208 return QDate::currentDate() > data->date;
192 return false; 209 return false;
193} 210}
194void OTodo::setProgress(ushort progress ) 211void OTodo::setProgress(ushort progress )
195{ 212{
196 changeOrModify(); 213 changeOrModify();
197 data->prog = progress; 214 data->prog = progress;
198} 215}
199QString OTodo::toShortText() const { 216QString OTodo::toShortText() const {
200 return summary(); 217 return summary();
201} 218}
202/*! 219/*!
203 Returns a richt text string 220 Returns a richt text string
204*/ 221*/
205QString OTodo::toRichText() const 222QString OTodo::toRichText() const
206{ 223{
207 QString text; 224 QString text;
208 QStringList catlist; 225 QStringList catlist;
209 226
210 // Description of the todo 227 // Description of the todo
211 if ( !summary().isEmpty() ) { 228 if ( !summary().isEmpty() ) {
212 text += "<b>" + QObject::tr( "Summary:") + "</b><br>"; 229 text += "<b>" + QObject::tr( "Summary:") + "</b><br>";
213 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 230 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
214 } 231 }
215 if( !description().isEmpty() ){ 232 if( !description().isEmpty() ){
216 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; 233 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
217 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ; 234 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ;
218 } 235 }
219 text += "<br><br><br>"; 236 text += "<br><br><br>";
@@ -329,58 +346,60 @@ OTodo &OTodo::operator=(const OTodo &item )
329 346
330QMap<int, QString> OTodo::toMap() const { 347QMap<int, QString> OTodo::toMap() const {
331 QMap<int, QString> map; 348 QMap<int, QString> map;
332 349
333 map.insert( Uid, QString::number( uid() ) ); 350 map.insert( Uid, QString::number( uid() ) );
334 map.insert( Category, idsToString( categories() ) ); 351 map.insert( Category, idsToString( categories() ) );
335 map.insert( HasDate, QString::number( data->hasDate ) ); 352 map.insert( HasDate, QString::number( data->hasDate ) );
336 map.insert( Completed, QString::number( data->isCompleted ) ); 353 map.insert( Completed, QString::number( data->isCompleted ) );
337 map.insert( Description, data->desc ); 354 map.insert( Description, data->desc );
338 map.insert( Summary, data->sum ); 355 map.insert( Summary, data->sum );
339 map.insert( Priority, QString::number( data->priority ) ); 356 map.insert( Priority, QString::number( data->priority ) );
340 map.insert( DateDay, QString::number( data->date.day() ) ); 357 map.insert( DateDay, QString::number( data->date.day() ) );
341 map.insert( DateMonth, QString::number( data->date.month() ) ); 358 map.insert( DateMonth, QString::number( data->date.month() ) );
342 map.insert( DateYear, QString::number( data->date.year() ) ); 359 map.insert( DateYear, QString::number( data->date.year() ) );
343 map.insert( Progress, QString::number( data->prog ) ); 360 map.insert( Progress, QString::number( data->prog ) );
344 map.insert( CrossReference, crossToString() ); 361 map.insert( CrossReference, crossToString() );
345 map.insert( HasAlarmDateTime, QString::number( data->hasAlarmDateTime ) ); 362 map.insert( HasAlarmDateTime, QString::number( data->hasAlarmDateTime ) );
346 map.insert( AlarmDateTime, data->alarmDateTime.toString() ); 363 map.insert( AlarmDateTime, data->alarmDateTime.toString() );
347 364
348 return map; 365 return map;
349} 366}
350 367
351QMap<QString, QString> OTodo::toExtraMap()const { 368QMap<QString, QString> OTodo::toExtraMap()const {
352 return data->extra; 369 return data->extra;
353} 370}
354/** 371/**
355 * change or modify looks at the ref count and either 372 * change or modify looks at the ref count and either
356 * creates a new QShared Object or it can modify it 373 * creates a new QShared Object or it can modify it
357 * right in place 374 * right in place
358 */ 375 */
359void OTodo::changeOrModify() { 376void OTodo::changeOrModify() {
360 if ( data->count != 1 ) { 377 if ( data->count != 1 ) {
361// qWarning("changeOrModify"); 378 qWarning("changeOrModify");
362 data->deref(); 379 data->deref();
363 OTodoData* d2 = new OTodoData(); 380 OTodoData* d2 = new OTodoData();
364 copy(data, d2 ); 381 copy(data, d2 );
365 data = d2; 382 data = d2;
366 } 383 }
367} 384}
368void OTodo::copy( OTodoData* src, OTodoData* dest ) { 385void OTodo::copy( OTodoData* src, OTodoData* dest ) {
369 dest->date = src->date; 386 dest->date = src->date;
370 dest->isCompleted = src->isCompleted; 387 dest->isCompleted = src->isCompleted;
371 dest->hasDate = src->hasDate; 388 dest->hasDate = src->hasDate;
372 dest->priority = src->priority; 389 dest->priority = src->priority;
373 dest->desc = src->desc; 390 dest->desc = src->desc;
374 dest->sum = src->sum; 391 dest->sum = src->sum;
375 dest->extra = src->extra; 392 dest->extra = src->extra;
376 dest->prog = src->prog; 393 dest->prog = src->prog;
377 dest->hasAlarmDateTime = src->hasAlarmDateTime; 394 dest->hasAlarmDateTime = src->hasAlarmDateTime;
378 dest->alarmDateTime = src->alarmDateTime; 395 dest->alarmDateTime = src->alarmDateTime;
396 dest->state = src->state;
397 dest->recur = src->recur;
379} 398}
380QString OTodo::type() const { 399QString OTodo::type() const {
381 return QString::fromLatin1("OTodo"); 400 return QString::fromLatin1("OTodo");
382} 401}
383QString OTodo::recordField(int id )const { 402QString OTodo::recordField(int id )const {
384 return QString::null; 403 return QString::null;
385} 404}
386 405
diff --git a/libopie2/opiepim/otodo.h b/libopie2/opiepim/otodo.h
index 5bd91d6..2cdc587 100644
--- a/libopie2/opiepim/otodo.h
+++ b/libopie2/opiepim/otodo.h
@@ -1,68 +1,75 @@
1 1
2#ifndef OPIE_TODO_EVENT_H 2#ifndef OPIE_TODO_EVENT_H
3#define OPIE_TODO_EVENT_H 3#define OPIE_TODO_EVENT_H
4 4
5 5
6#include <qarray.h> 6#include <qarray.h>
7#include <qmap.h> 7#include <qmap.h>
8#include <qregexp.h> 8#include <qregexp.h>
9#include <qstringlist.h> 9#include <qstringlist.h>
10#include <qdatetime.h> 10#include <qdatetime.h>
11#include <qvaluelist.h> 11#include <qvaluelist.h>
12 12
13#include <qpe/recordfields.h> 13#include <qpe/recordfields.h>
14#include <qpe/palmtopuidgen.h> 14#include <qpe/palmtopuidgen.h>
15 15
16#include <opie/opimrecord.h> 16#include <opie/opimrecord.h>
17 17
18 18
19class OPimState;
20class ORecur;
19class OTodo : public OPimRecord { 21class OTodo : public OPimRecord {
20public: 22public:
21 typedef QValueList<OTodo> ValueList; 23 typedef QValueList<OTodo> ValueList;
22 enum RecordFields { 24 enum RecordFields {
23 Uid = Qtopia::UID_ID, 25 Uid = Qtopia::UID_ID,
24 Category = Qtopia::CATEGORY_ID, 26 Category = Qtopia::CATEGORY_ID,
25 HasDate, 27 HasDate,
26 Completed, 28 Completed,
27 Description, 29 Description,
28 Summary, 30 Summary,
29 Priority, 31 Priority,
30 DateDay, 32 DateDay,
31 DateMonth, 33 DateMonth,
32 DateYear, 34 DateYear,
33 Progress, 35 Progress,
34 CrossReference, 36 CrossReference,
35 HasAlarmDateTime, 37 HasAlarmDateTime,
36 AlarmDateTime 38 AlarmDateTime,
39 State,
40 Recurrance,
41 Alarms,
42 Reminders,
43 Notifiers
37 }; 44 };
38 public: 45 public:
39 // priorities from Very low to very high 46 // priorities from Very low to very high
40 enum TaskPriority { VeryHigh=1, High, Normal, Low, VeryLow }; 47 enum TaskPriority { VeryHigh=1, High, Normal, Low, VeryLow };
41 48
42 /* Constructs a new ToDoEvent 49 /* Constructs a new ToDoEvent
43 @param completed Is the TodoEvent completed 50 @param completed Is the TodoEvent completed
44 @param priority What is the priority of this ToDoEvent 51 @param priority What is the priority of this ToDoEvent
45 @param category Which category does it belong( uid ) 52 @param category Which category does it belong( uid )
46 @param summary A small summary of the todo 53 @param summary A small summary of the todo
47 @param description What is this ToDoEvent about 54 @param description What is this ToDoEvent about
48 @param hasDate Does this Event got a deadline 55 @param hasDate Does this Event got a deadline
49 @param date what is the deadline? 56 @param date what is the deadline?
50 @param uid what is the UUID of this Event 57 @param uid what is the UUID of this Event
51 **/ 58 **/
52 OTodo( bool completed = false, int priority = Normal, 59 OTodo( bool completed = false, int priority = Normal,
53 const QStringList &category = QStringList(), 60 const QStringList &category = QStringList(),
54 const QString &summary = QString::null , 61 const QString &summary = QString::null ,
55 const QString &description = QString::null, 62 const QString &description = QString::null,
56 ushort progress = 0, 63 ushort progress = 0,
57 bool hasDate = false, QDate date = QDate::currentDate(), 64 bool hasDate = false, QDate date = QDate::currentDate(),
58 int uid = 0 /*empty*/ ); 65 int uid = 0 /*empty*/ );
59 66
60 OTodo( bool completed, int priority, 67 OTodo( bool completed, int priority,
61 const QArray<int>& category, 68 const QArray<int>& category,
62 const QString& summary = QString::null, 69 const QString& summary = QString::null,
63 const QString& description = QString::null, 70 const QString& description = QString::null,
64 ushort progress = 0, 71 ushort progress = 0,
65 bool hasDate = false, QDate date = QDate::currentDate(), 72 bool hasDate = false, QDate date = QDate::currentDate(),
66 int uid = 0 /* empty */ ); 73 int uid = 0 /* empty */ );
67 74
68 /* Copy c'tor 75 /* Copy c'tor
@@ -82,128 +89,146 @@ public:
82 89
83 /** 90 /**
84 * Does this Event have a deadline 91 * Does this Event have a deadline
85 */ 92 */
86 bool hasDueDate() const; 93 bool hasDueDate() const;
87 94
88 /** 95 /**
89 * Does this Event has an alarm time ? 96 * Does this Event has an alarm time ?
90 */ 97 */
91 bool hasAlarmDateTime() const; 98 bool hasAlarmDateTime() const;
92 99
93 /** 100 /**
94 * What is the priority? 101 * What is the priority?
95 */ 102 */
96 int priority()const ; 103 int priority()const ;
97 104
98 /** 105 /**
99 * progress as ushort 0, 20, 40, 60, 80 or 100% 106 * progress as ushort 0, 20, 40, 60, 80 or 100%
100 */ 107 */
101 ushort progress() const; 108 ushort progress() const;
102 109
103 /** 110 /**
104 * The due Date 111 * The due Date
105 */ 112 */
106 QDate dueDate()const; 113 QDate dueDate()const;
107 114
108 /** 115 /**
109 * Alarm Date and Time 116 * Alarm Date and Time
110 */ 117 */
111 QDateTime alarmDateTime()const; 118 QDateTime alarmDateTime()const;
112 119
113 /** 120 /**
121 * What is the state of this OTodo?
122 */
123 OPimState state()const;
124
125 /**
126 * the recurrance of this
127 */
128 ORecur recurrence()const;
129
130 /**
114 * The description of the todo 131 * The description of the todo
115 */ 132 */
116 QString description()const; 133 QString description()const;
117 134
118 /** 135 /**
119 * A small summary of the todo 136 * A small summary of the todo
120 */ 137 */
121 QString summary() const; 138 QString summary() const;
122 139
123 /** 140 /**
124 * @reimplemented 141 * @reimplemented
125 * Return this todoevent in a RichText formatted QString 142 * Return this todoevent in a RichText formatted QString
126 */ 143 */
127 QString toRichText() const; 144 QString toRichText() const;
128 145
129 /** 146 /**
130 * reimplementation 147 * reimplementation
131 */ 148 */
132 QString type()const; 149 QString type()const;
133 QString toShortText()const; 150 QString toShortText()const;
134 QMap<QString, QString> toExtraMap()const; 151 QMap<QString, QString> toExtraMap()const;
135 QString recordField(int id )const; 152 QString recordField(int id )const;
136 153
137 /** 154 /**
138 * toMap puts all data into the map. int relates 155 * toMap puts all data into the map. int relates
139 * to ToDoEvent RecordFields enum 156 * to ToDoEvent RecordFields enum
140 */ 157 */
141 QMap<int, QString> toMap()const; 158 QMap<int, QString> toMap()const;
142 159
143 /** 160 /**
144 * Set if this Todo is completed 161 * Set if this Todo is completed
145 */ 162 */
146 void setCompleted(bool completed ); 163 void setCompleted(bool completed );
147 164
148 /** 165 /**
149 * set if this todo got an end data 166 * set if this todo got an end data
150 */ 167 */
151 void setHasDueDate( bool hasDate ); 168 void setHasDueDate( bool hasDate );
152 169
153 /** 170 /**
154 * set if this todo has an alarm time and date 171 * set if this todo has an alarm time and date
155 */ 172 */
156 void setHasAlarmDateTime ( bool hasAlarm ); 173 void setHasAlarmDateTime ( bool hasAlarm );
157 174
158 /** 175 /**
159 * Set the priority of the Todo 176 * Set the priority of the Todo
160 */ 177 */
161 void setPriority(int priority ); 178 void setPriority(int priority );
162 179
163 /** 180 /**
164 * Set the progress. 181 * Set the progress.
165 */ 182 */
166 void setProgress( ushort progress ); 183 void setProgress( ushort progress );
167 184
168 /** 185 /**
169 * set the end date 186 * set the end date
170 */ 187 */
171 void setDueDate( QDate date ); 188 void setDueDate( QDate date );
172 189
190
191 void setRecurrence( const ORecur& );
173 /** 192 /**
174 * set the alarm time 193 * set the alarm time
175 */ 194 */
176 void setAlarmDateTime ( const QDateTime& alarm ); 195 void setAlarmDateTime ( const QDateTime& alarm );
177 196
178 void setDescription(const QString& ); 197 void setDescription(const QString& );
179 void setSummary(const QString& ); 198 void setSummary(const QString& );
199
200 /**
201 * set the state of a Todo
202 * @param state State what the todo should take
203 */
204 void setState( const OPimState& state);
180 bool isOverdue(); 205 bool isOverdue();
181 206
182 207
183 bool match( const QRegExp &r )const; 208 bool match( const QRegExp &r )const;
184 209
185 bool operator<(const OTodo &toDoEvent )const; 210 bool operator<(const OTodo &toDoEvent )const;
186 bool operator<=(const OTodo &toDoEvent )const; 211 bool operator<=(const OTodo &toDoEvent )const;
187 bool operator!=(const OTodo &toDoEvent )const; 212 bool operator!=(const OTodo &toDoEvent )const;
188 bool operator>(const OTodo &toDoEvent )const; 213 bool operator>(const OTodo &toDoEvent )const;
189 bool operator>=(const OTodo &toDoEvent)const; 214 bool operator>=(const OTodo &toDoEvent)const;
190 bool operator==(const OTodo &toDoEvent )const; 215 bool operator==(const OTodo &toDoEvent )const;
191 OTodo &operator=(const OTodo &toDoEvent ); 216 OTodo &operator=(const OTodo &toDoEvent );
192 217
193 private: 218 private:
194 class OTodoPrivate; 219 class OTodoPrivate;
195 struct OTodoData; 220 struct OTodoData;
196 221
197 void deref(); 222 void deref();
198 inline void changeOrModify(); 223 inline void changeOrModify();
199 void copy( OTodoData* src, OTodoData* dest ); 224 void copy( OTodoData* src, OTodoData* dest );
200 OTodoPrivate *d; 225 OTodoPrivate *d;
201 OTodoData *data; 226 OTodoData *data;
202 227
203}; 228};
204inline bool OTodo::operator!=(const OTodo &toDoEvent )const { 229inline bool OTodo::operator!=(const OTodo &toDoEvent )const {
205 return !(*this == toDoEvent); 230 return !(*this == toDoEvent);
206} 231}
207 232
208 233
209#endif 234#endif