summaryrefslogtreecommitdiff
Unidiff
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
@@ -1118,32 +1118,32 @@ static VObject *createVObject( const OContact &c )
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
@@ -1379,29 +1379,29 @@ static OContact parseVObject( VObject *obj )
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() );
@@ -1455,25 +1455,34 @@ void OContact::writeVCard( const QString &filename, const OContact &contact)
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.
@@ -1518,71 +1527,71 @@ QMap<QString,QString> OContact::toExtraMap() const
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
@@ -1598,25 +1607,25 @@ void OContact::insertEmail( const QString &v )
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
@@ -1631,23 +1640,23 @@ void OContact::removeEmail( const QString &v )
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,24 +1,24 @@
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();
@@ -101,25 +101,25 @@ public:
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;
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
@@ -225,25 +225,25 @@ template <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>
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
@@ -12,24 +12,25 @@ struct ORecur::Data : public QShared {
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() {
@@ -69,24 +70,27 @@ char ORecur::days() const{
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}
@@ -101,27 +105,32 @@ void ORecur::setEndDate( const QDate& dt) {
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
@@ -22,33 +22,35 @@ public:
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
@@ -3,42 +3,45 @@
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() ) {
@@ -135,24 +138,30 @@ QDate OTodo::dueDate()const
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{
@@ -176,24 +185,32 @@ void OTodo::setPriority(int prio )
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 {
@@ -349,38 +366,40 @@ QMap<int, QString> OTodo::toMap() const {
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
@@ -7,42 +7,49 @@
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
@@ -102,24 +109,34 @@ public:
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
@@ -161,31 +178,39 @@ public:
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 );
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,24 +1,24 @@
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();
@@ -101,25 +101,25 @@ public:
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;
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
@@ -12,24 +12,25 @@ struct ORecur::Data : public QShared {
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() {
@@ -69,24 +70,27 @@ char ORecur::days() const{
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}
@@ -101,27 +105,32 @@ void ORecur::setEndDate( const QDate& dt) {
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
@@ -22,33 +22,35 @@ public:
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
@@ -1118,32 +1118,32 @@ static VObject *createVObject( const OContact &c )
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
@@ -1379,29 +1379,29 @@ static OContact parseVObject( VObject *obj )
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() );
@@ -1455,25 +1455,34 @@ void OContact::writeVCard( const QString &filename, const OContact &contact)
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.
@@ -1518,71 +1527,71 @@ QMap<QString,QString> OContact::toExtraMap() const
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
@@ -1598,25 +1607,25 @@ void OContact::insertEmail( const QString &v )
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
@@ -1631,23 +1640,23 @@ void OContact::removeEmail( const QString &v )
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
@@ -225,25 +225,25 @@ template <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>
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
@@ -3,42 +3,45 @@
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() ) {
@@ -135,24 +138,30 @@ QDate OTodo::dueDate()const
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{
@@ -176,24 +185,32 @@ void OTodo::setPriority(int prio )
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 {
@@ -349,38 +366,40 @@ QMap<int, QString> OTodo::toMap() const {
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
@@ -7,42 +7,49 @@
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
@@ -102,24 +109,34 @@ public:
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
@@ -161,31 +178,39 @@ public:
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 );