author | zecke <zecke> | 2003-02-21 23:31:52 (UTC) |
---|---|---|
committer | zecke <zecke> | 2003-02-21 23:31:52 (UTC) |
commit | 46f47c0a1e542a8b4222f3ced8f3304534c7509d (patch) (unidiff) | |
tree | 82dc97a07bae77387987711c0c21697691955937 /libopie | |
parent | a7448ec87d97a0128618e83ad7526bd884ef8853 (diff) | |
download | opie-46f47c0a1e542a8b4222f3ced8f3304534c7509d.zip opie-46f47c0a1e542a8b4222f3ced8f3304534c7509d.tar.gz opie-46f47c0a1e542a8b4222f3ced8f3304534c7509d.tar.bz2 |
Add XML datebookresource
-clean up todoaccessxml header
-implement some more stuff in the oeven tester
-extend DefaultFactory to not crash and to use datebook
-reading of OEvents is working nicely.. saving will be added
tomorrow
-fix spelling in ODateBookAcces
-rw-r--r-- | libopie/libopie.pro | 2 | ||||
-rw-r--r-- | libopie/pim/obackendfactory.h | 41 | ||||
-rw-r--r-- | libopie/pim/odatebookaccess.cpp | 5 | ||||
-rw-r--r-- | libopie/pim/odatebookaccess.h | 4 | ||||
-rw-r--r-- | libopie/pim/odatebookaccessbackend_xml.cpp | 395 | ||||
-rw-r--r-- | libopie/pim/odatebookaccessbackend_xml.h | 48 | ||||
-rw-r--r-- | libopie/pim/oevent.cpp | 5 | ||||
-rw-r--r-- | libopie/pim/opimnotify.h | 2 | ||||
-rw-r--r-- | libopie/pim/otodoaccessxml.cpp | 2 | ||||
-rw-r--r-- | libopie/pim/test/oevent_test.cpp | 27 |
10 files changed, 512 insertions, 19 deletions
diff --git a/libopie/libopie.pro b/libopie/libopie.pro index 70399ea..391f30e 100644 --- a/libopie/libopie.pro +++ b/libopie/libopie.pro | |||
@@ -1,116 +1,118 @@ | |||
1 | TEMPLATE = lib | 1 | TEMPLATE = lib |
2 | CONFIG += qte warn_on release | 2 | CONFIG += qte warn_on release |
3 | HEADERS = ofontmenu.h \ | 3 | HEADERS = ofontmenu.h \ |
4 | ocolorbutton.h \ | 4 | ocolorbutton.h \ |
5 | ofiledialog.h ofileselector.h \ | 5 | ofiledialog.h ofileselector.h \ |
6 | ocheckitem.h \ | 6 | ocheckitem.h \ |
7 | xmltree.h \ | 7 | xmltree.h \ |
8 | colordialog.h colorpopupmenu.h \ | 8 | colordialog.h colorpopupmenu.h \ |
9 | oclickablelabel.h oprocctrl.h \ | 9 | oclickablelabel.h oprocctrl.h \ |
10 | oprocess.h odevice.h odevicebutton.h \ | 10 | oprocess.h odevice.h odevicebutton.h \ |
11 | otimepicker.h otabwidget.h \ | 11 | otimepicker.h otabwidget.h \ |
12 | otabbar.h otabinfo.h \ | 12 | otabbar.h otabinfo.h \ |
13 | ofontselector.h \ | 13 | ofontselector.h \ |
14 | pim/opimrecord.h \ | 14 | pim/opimrecord.h \ |
15 | pim/otodo.h \ | 15 | pim/otodo.h \ |
16 | pim/orecordlist.h \ | 16 | pim/orecordlist.h \ |
17 | pim/opimaccesstemplate.h \ | 17 | pim/opimaccesstemplate.h \ |
18 | pim/opimaccessbackend.h \ | 18 | pim/opimaccessbackend.h \ |
19 | pim/otodoaccess.h \ | 19 | pim/otodoaccess.h \ |
20 | pim/otodoaccessbackend.h \ | 20 | pim/otodoaccessbackend.h \ |
21 | pim/ocontact.h \ | 21 | pim/ocontact.h \ |
22 | pim/ocontactaccess.h \ | 22 | pim/ocontactaccess.h \ |
23 | pim/ocontactaccessbackend.h \ | 23 | pim/ocontactaccessbackend.h \ |
24 | pim/ocontactaccessbackend_xml.h \ | 24 | pim/ocontactaccessbackend_xml.h \ |
25 | pim/ocontactaccessbackend_vcard.h \ | 25 | pim/ocontactaccessbackend_vcard.h \ |
26 | pim/obackendfactory.h \ | 26 | pim/obackendfactory.h \ |
27 | pim/opimcache.h \ | 27 | pim/opimcache.h \ |
28 | pim/otodoaccessvcal.h \ | 28 | pim/otodoaccessvcal.h \ |
29 | pim/orecur.h \ | 29 | pim/orecur.h \ |
30 | pim/opimstate.h \ | 30 | pim/opimstate.h \ |
31 | pim/opimxrefpartner.h \ | 31 | pim/opimxrefpartner.h \ |
32 | pim/opimxref.h \ | 32 | pim/opimxref.h \ |
33 | pim/opimxrefmanager.h \ | 33 | pim/opimxrefmanager.h \ |
34 | pim/opimmaintainer.h \ | 34 | pim/opimmaintainer.h \ |
35 | pim/opimnotify.h \ | 35 | pim/opimnotify.h \ |
36 | pim/opimnotifymanager.h \ | 36 | pim/opimnotifymanager.h \ |
37 | pim/opimmainwindow.h \ | 37 | pim/opimmainwindow.h \ |
38 | pim/opimresolver.h \ | 38 | pim/opimresolver.h \ |
39 | pim/oevent.h \ | 39 | pim/oevent.h \ |
40 | pim/otimezone.h \ | 40 | pim/otimezone.h \ |
41 | pim/odatebookaccess.h \ | 41 | pim/odatebookaccess.h \ |
42 | pim/odatebookaccessbackend.h \ | 42 | pim/odatebookaccessbackend.h \ |
43 | pim/odatebookaccessbackend_xml.h \ | ||
43 | orecurrancewidget.h \ | 44 | orecurrancewidget.h \ |
44 | oticker.h | 45 | oticker.h |
45 | # pim/otodoaccesssql.h \ | 46 | # pim/otodoaccesssql.h \ |
46 | 47 | ||
47 | SOURCES = ofontmenu.cc \ | 48 | SOURCES = ofontmenu.cc \ |
48 | ocolorbutton.cpp \ | 49 | ocolorbutton.cpp \ |
49 | sharp_compat.cpp \ | 50 | sharp_compat.cpp \ |
50 | xmltree.cc \ | 51 | xmltree.cc \ |
51 | ofiledialog.cc ofileselector.cc \ | 52 | ofiledialog.cc ofileselector.cc \ |
52 | ocheckitem.cpp \ | 53 | ocheckitem.cpp \ |
53 | colordialog.cpp \ | 54 | colordialog.cpp \ |
54 | colorpopupmenu.cpp oclickablelabel.cpp \ | 55 | colorpopupmenu.cpp oclickablelabel.cpp \ |
55 | oprocctrl.cpp oprocess.cpp \ | 56 | oprocctrl.cpp oprocess.cpp \ |
56 | odevice.cpp odevicebutton.cpp otimepicker.cpp \ | 57 | odevice.cpp odevicebutton.cpp otimepicker.cpp \ |
57 | otabwidget.cpp otabbar.cpp \ | 58 | otabwidget.cpp otabbar.cpp \ |
58 | ofontselector.cpp \ | 59 | ofontselector.cpp \ |
59 | pim/otodo.cpp \ | 60 | pim/otodo.cpp \ |
60 | pim/opimrecord.cpp \ | 61 | pim/opimrecord.cpp \ |
61 | pim/otodoaccess.cpp \ | 62 | pim/otodoaccess.cpp \ |
62 | pim/otodoaccessbackend.cpp \ | 63 | pim/otodoaccessbackend.cpp \ |
63 | pim/otodoaccessxml.cpp \ | 64 | pim/otodoaccessxml.cpp \ |
64 | pim/ocontact.cpp \ | 65 | pim/ocontact.cpp \ |
65 | pim/ocontactaccess.cpp \ | 66 | pim/ocontactaccess.cpp \ |
66 | pim/ocontactaccessbackend_vcard.cpp \ | 67 | pim/ocontactaccessbackend_vcard.cpp \ |
67 | pim/otodoaccessvcal.cpp \ | 68 | pim/otodoaccessvcal.cpp \ |
68 | pim/orecur.cpp \ | 69 | pim/orecur.cpp \ |
69 | pim/opimstate.cpp \ | 70 | pim/opimstate.cpp \ |
70 | pim/opimxrefpartner.cpp \ | 71 | pim/opimxrefpartner.cpp \ |
71 | pim/opimxref.cpp \ | 72 | pim/opimxref.cpp \ |
72 | pim/opimxrefmanager.cpp \ | 73 | pim/opimxrefmanager.cpp \ |
73 | pim/opimmaintainer.cpp \ | 74 | pim/opimmaintainer.cpp \ |
74 | pim/opimnotify.cpp \ | 75 | pim/opimnotify.cpp \ |
75 | pim/opimnotifymanager.cpp \ | 76 | pim/opimnotifymanager.cpp \ |
76 | pim/opimmainwindow.cpp \ | 77 | pim/opimmainwindow.cpp \ |
77 | pim/opimresolver.cpp \ | 78 | pim/opimresolver.cpp \ |
78 | pim/oevent.cpp \ | 79 | pim/oevent.cpp \ |
79 | pim/otimezone.cpp \ | 80 | pim/otimezone.cpp \ |
80 | pim/odatebookaccess.cpp \ | 81 | pim/odatebookaccess.cpp \ |
81 | pim/odatebookaccessbackend.cpp \ | 82 | pim/odatebookaccessbackend.cpp \ |
83 | pim/odatebookaccessbackend_xml.cpp \ | ||
82 | orecurrancewidget.cpp \ | 84 | orecurrancewidget.cpp \ |
83 | oticker.cpp | 85 | oticker.cpp |
84 | # pim/otodoaccesssql.cpp \ | 86 | # pim/otodoaccesssql.cpp \ |
85 | 87 | ||
86 | TARGET = opie | 88 | TARGET = opie |
87 | INCLUDEPATH += $(OPIEDIR)/include | 89 | INCLUDEPATH += $(OPIEDIR)/include |
88 | DESTDIR = $(OPIEDIR)/lib$(PROJMAK) | 90 | DESTDIR = $(OPIEDIR)/lib$(PROJMAK) |
89 | #VERSION = 1.0.0 | 91 | #VERSION = 1.0.0 |
90 | 92 | ||
91 | LIBS += -lqpe | 93 | LIBS += -lqpe |
92 | 94 | ||
93 | # LIBS += -lopiesql | 95 | # LIBS += -lopiesql |
94 | 96 | ||
95 | INTERFACES = otimepickerbase.ui orecurrancebase.ui | 97 | INTERFACES = otimepickerbase.ui orecurrancebase.ui |
96 | 98 | ||
97 | TRANSLATIONS = ../i18n/de/libopie.ts \ | 99 | TRANSLATIONS = ../i18n/de/libopie.ts \ |
98 | ../i18n/xx/libopie.ts \ | 100 | ../i18n/xx/libopie.ts \ |
99 | ../i18n/en/libopie.ts \ | 101 | ../i18n/en/libopie.ts \ |
100 | ../i18n/es/libopie.ts \ | 102 | ../i18n/es/libopie.ts \ |
101 | ../i18n/fr/libopie.ts \ | 103 | ../i18n/fr/libopie.ts \ |
102 | ../i18n/hu/libopie.ts \ | 104 | ../i18n/hu/libopie.ts \ |
103 | ../i18n/ja/libopie.ts \ | 105 | ../i18n/ja/libopie.ts \ |
104 | ../i18n/ko/libopie.ts \ | 106 | ../i18n/ko/libopie.ts \ |
105 | ../i18n/no/libopie.ts \ | 107 | ../i18n/no/libopie.ts \ |
106 | ../i18n/pl/libopie.ts \ | 108 | ../i18n/pl/libopie.ts \ |
107 | ../i18n/pt/libopie.ts \ | 109 | ../i18n/pt/libopie.ts \ |
108 | ../i18n/pt_BR/libopie.ts \ | 110 | ../i18n/pt_BR/libopie.ts \ |
109 | ../i18n/sl/libopie.ts \ | 111 | ../i18n/sl/libopie.ts \ |
110 | ../i18n/zh_CN/libopie.ts \ | 112 | ../i18n/zh_CN/libopie.ts \ |
111 | ../i18n/zh_TW/libopie.ts \ | 113 | ../i18n/zh_TW/libopie.ts \ |
112 | ../i18n/da/libopie.ts | 114 | ../i18n/da/libopie.ts |
113 | 115 | ||
114 | 116 | ||
115 | 117 | ||
116 | include ( $(OPIEDIR)/include.pro ) | 118 | include ( $(OPIEDIR)/include.pro ) |
diff --git a/libopie/pim/obackendfactory.h b/libopie/pim/obackendfactory.h index b796fb8..3a73210 100644 --- a/libopie/pim/obackendfactory.h +++ b/libopie/pim/obackendfactory.h | |||
@@ -1,113 +1,130 @@ | |||
1 | /* | 1 | /* |
2 | * Class to manage Backends. | 2 | * Class to manage Backends. |
3 | * | 3 | * |
4 | * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) | 4 | * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) |
5 | * | 5 | * |
6 | * ===================================================================== | 6 | * ===================================================================== |
7 | *This program is free software; you can redistribute it and/or | 7 | *This program is free software; you can redistribute it and/or |
8 | *modify it under the terms of the GNU Library General Public | 8 | *modify it under the terms of the GNU Library General Public |
9 | * License as published by the Free Software Foundation; | 9 | * License as published by the Free Software Foundation; |
10 | * either version 2 of the License, or (at your option) any later | 10 | * either version 2 of the License, or (at your option) any later |
11 | * version. | 11 | * version. |
12 | * ===================================================================== | 12 | * ===================================================================== |
13 | * ToDo: Use plugins | 13 | * ToDo: Use plugins |
14 | * ===================================================================== | 14 | * ===================================================================== |
15 | * Version: $Id$ | 15 | * Version: $Id$ |
16 | * ===================================================================== | 16 | * ===================================================================== |
17 | * History: | 17 | * History: |
18 | * $Log$ | 18 | * $Log$ |
19 | * Revision 1.5 2003/02/21 23:31:52 zecke | ||
20 | * Add XML datebookresource | ||
21 | * -clean up todoaccessxml header | ||
22 | * -implement some more stuff in the oeven tester | ||
23 | * -extend DefaultFactory to not crash and to use datebook | ||
24 | * | ||
25 | * -reading of OEvents is working nicely.. saving will be added | ||
26 | * tomorrow | ||
27 | * -fix spelling in ODateBookAcces | ||
28 | * | ||
19 | * Revision 1.4 2002/10/14 15:55:18 eilers | 29 | * Revision 1.4 2002/10/14 15:55:18 eilers |
20 | * Redeactivate SQL.. ;) | 30 | * Redeactivate SQL.. ;) |
21 | * | 31 | * |
22 | * Revision 1.3 2002/10/10 17:08:58 zecke | 32 | * Revision 1.3 2002/10/10 17:08:58 zecke |
23 | * The Cache is finally in place | 33 | * The Cache is finally in place |
24 | * I tested it with my todolist and it 'works' for 10.000 todos the hits are awesome ;) | 34 | * I tested it with my todolist and it 'works' for 10.000 todos the hits are awesome ;) |
25 | * The read ahead functionality does not make sense for XMLs backends because most of the stuff is already in memory. While using readahead on SQL makes things a lot faster.... | 35 | * The read ahead functionality does not make sense for XMLs backends because most of the stuff is already in memory. While using readahead on SQL makes things a lot faster.... |
26 | * I still have to fully implement read ahead | 36 | * I still have to fully implement read ahead |
27 | * This change is bic but sc | 37 | * This change is bic but sc |
28 | * | 38 | * |
29 | * Revision 1.2 2002/10/08 09:27:36 eilers | 39 | * Revision 1.2 2002/10/08 09:27:36 eilers |
30 | * Fixed libopie.pro to include the new pim-API. | 40 | * Fixed libopie.pro to include the new pim-API. |
31 | * The SQL-Stuff is currently deactivated. Otherwise everyone who wants to | 41 | * The SQL-Stuff is currently deactivated. Otherwise everyone who wants to |
32 | * compile itself would need to install libsqlite, libopiesql... | 42 | * compile itself would need to install libsqlite, libopiesql... |
33 | * Therefore, the backend currently uses XML only.. | 43 | * Therefore, the backend currently uses XML only.. |
34 | * | 44 | * |
35 | * Revision 1.1 2002/10/07 17:35:01 eilers | 45 | * Revision 1.1 2002/10/07 17:35:01 eilers |
36 | * added OBackendFactory for advanced backend access | 46 | * added OBackendFactory for advanced backend access |
37 | * | 47 | * |
38 | * | 48 | * |
39 | * ===================================================================== | 49 | * ===================================================================== |
40 | */ | 50 | */ |
41 | #ifndef OPIE_BACKENDFACTORY_H_ | 51 | #ifndef OPIE_BACKENDFACTORY_H_ |
42 | #define OPIE_BACKENDFACTORY_H_ | 52 | #define OPIE_BACKENDFACTORY_H_ |
43 | 53 | ||
44 | #include <qstring.h> | 54 | #include <qstring.h> |
45 | #include <qasciidict.h> | 55 | #include <qasciidict.h> |
46 | #include <qpe/config.h> | 56 | #include <qpe/config.h> |
47 | 57 | ||
48 | #include "otodoaccessxml.h" | 58 | #include "otodoaccessxml.h" |
49 | #include "ocontactaccessbackend_xml.h" | 59 | #include "ocontactaccessbackend_xml.h" |
60 | #include "odatebookaccessbackend_xml.h" | ||
50 | 61 | ||
51 | #ifdef __USE_SQL | 62 | #ifdef __USE_SQL |
52 | #include "otodoaccesssql.h" | 63 | #include "otodoaccesssql.h" |
53 | #endif | 64 | #endif |
54 | 65 | ||
55 | 66 | ||
56 | template<class T> | 67 | template<class T> |
57 | class OBackendFactory | 68 | class OBackendFactory |
58 | { | 69 | { |
59 | public: | 70 | public: |
60 | OBackendFactory() {}; | 71 | OBackendFactory() {}; |
61 | 72 | ||
62 | enum BACKENDS { | 73 | enum BACKENDS { |
63 | TODO, | 74 | TODO, |
64 | CONTACT, | 75 | CONTACT, |
65 | DATE | 76 | DATE |
66 | }; | 77 | }; |
67 | 78 | ||
68 | static T* Default( const QString backendName, const QString& appName ){ | 79 | static T* Default( const QString backendName, const QString& appName ){ |
69 | 80 | ||
70 | // __asm__("int3"); | 81 | // __asm__("int3"); |
71 | 82 | ||
72 | Config config( "pimaccess" ); | 83 | Config config( "pimaccess" ); |
73 | config.setGroup ( backendName ); | 84 | config.setGroup ( backendName ); |
74 | QString backend = config.readEntry( "usebackend" ); | 85 | QString backend = config.readEntry( "usebackend" ); |
75 | 86 | ||
76 | QAsciiDict<int> dict ( 3 ); | 87 | QAsciiDict<int> dict ( 3 ); |
77 | dict.setAutoDelete ( TRUE ); | 88 | dict.setAutoDelete ( TRUE ); |
78 | 89 | ||
79 | dict.insert( "todo", new int (TODO) ); | 90 | dict.insert( "todo", new int (TODO) ); |
80 | dict.insert( "contact", new int (CONTACT) ); | 91 | dict.insert( "contact", new int (CONTACT) ); |
92 | dict.insert( "datebook", new int(DATE) ); | ||
81 | 93 | ||
82 | qWarning ("TODO is: %d", TODO); | 94 | qWarning ("TODO is: %d", TODO); |
83 | qWarning ("CONTACT is: %d", CONTACT); | 95 | qWarning ("CONTACT is: %d", CONTACT); |
84 | 96 | ||
85 | switch ( *dict.take( backendName ) ){ | 97 | int *find = dict[ backendName ]; |
98 | if (!find ) return 0; | ||
99 | |||
100 | switch ( *find ){ | ||
86 | case TODO: | 101 | case TODO: |
87 | #ifdef __USE_SQL | 102 | #ifdef __USE_SQL |
88 | if ( backend == "sql" ) | 103 | if ( backend == "sql" ) |
89 | return (T*) new OTodoAccessBackendSQL(""); | 104 | return (T*) new OTodoAccessBackendSQL(""); |
90 | #else | 105 | #else |
91 | if ( backend == "sql" ) | 106 | if ( backend == "sql" ) |
92 | qWarning ("OBackendFactory:: sql Backend not implemented! Using XML instead!"); | 107 | qWarning ("OBackendFactory:: sql Backend not implemented! Using XML instead!"); |
93 | #endif | 108 | #endif |
94 | 109 | ||
95 | return (T*) new OTodoAccessXML( appName ); | 110 | return (T*) new OTodoAccessXML( appName ); |
96 | case CONTACT: | 111 | case CONTACT: |
97 | if ( backend == "sql" ) | 112 | if ( backend == "sql" ) |
98 | qWarning ("OBackendFactory:: sql Backend not implemented! Using XML instead!"); | 113 | qWarning ("OBackendFactory:: sql Backend not implemented! Using XML instead!"); |
99 | 114 | ||
100 | return (T*) new OContactAccessBackend_XML( appName ); | 115 | return (T*) new OContactAccessBackend_XML( appName ); |
101 | case DATE: | 116 | case DATE: |
102 | qWarning ("OBackendFactory:: DATE-Backend not implemented!"); | 117 | if ( backend == "sql" ) |
103 | return NULL; | 118 | qWarning("OBackendFactory:: sql Backend not implemented! Using XML instead!"); |
119 | |||
120 | return (T*) new ODateBookAccessBackend_XML( appName ); | ||
104 | default: | 121 | default: |
105 | return NULL; | 122 | return NULL; |
106 | } | 123 | } |
107 | 124 | ||
108 | 125 | ||
109 | } | 126 | } |
110 | }; | 127 | }; |
111 | 128 | ||
112 | 129 | ||
113 | #endif | 130 | #endif |
diff --git a/libopie/pim/odatebookaccess.cpp b/libopie/pim/odatebookaccess.cpp index 5f97e7c..08e61ff 100644 --- a/libopie/pim/odatebookaccess.cpp +++ b/libopie/pim/odatebookaccess.cpp | |||
@@ -1,37 +1,38 @@ | |||
1 | #include "obackendfactory.h" | 1 | #include "obackendfactory.h" |
2 | #include "odatebookaccess.h" | 2 | #include "odatebookaccess.h" |
3 | 3 | ||
4 | ODateBookAccess::ODateBookAccess( ODateBookAccessBackend* back, enum Access ac ) | 4 | ODateBookAccess::ODateBookAccess( ODateBookAccessBackend* back, enum Access ac ) |
5 | : OPimAccessTemplate<OEvent>( back ) | 5 | : OPimAccessTemplate<OEvent>( back ) |
6 | { | 6 | { |
7 | if (!back ) | 7 | if (!back ) |
8 | back = OBackendFactory<ODateBookAccessBackend>::Default("datebook", QString::null ); | 8 | back = OBackendFactory<ODateBookAccessBackend>::Default("datebook", QString::null ); |
9 | 9 | ||
10 | m_backEnd = back; | 10 | m_backEnd = back; |
11 | setBackEnd( m_backEnd ); | ||
11 | } | 12 | } |
12 | ODateBookAccess::~ODateBookAccess() { | 13 | ODateBookAccess::~ODateBookAccess() { |
13 | } | 14 | } |
14 | ODateBookAccess::List ODateBookAccess::rawEvents()const { | 15 | ODateBookAccess::List ODateBookAccess::rawEvents()const { |
15 | QArray<int> ints = m_backEnd->rawEvents(); | 16 | QArray<int> ints = m_backEnd->rawEvents(); |
16 | 17 | ||
17 | List lis( ints, this ); | 18 | List lis( ints, this ); |
18 | return lis; | 19 | return lis; |
19 | } | 20 | } |
20 | ODateBookAccess::List ODateBookAccess::rawRepeats()const { | 21 | ODateBookAccess::List ODateBookAccess::rawRepeats()const { |
21 | QArray<int> ints = m_backEnd->rawRepeats(); | 22 | QArray<int> ints = m_backEnd->rawRepeats(); |
22 | 23 | ||
23 | List lis( ints, this ); | 24 | List lis( ints, this ); |
24 | return lis; | 25 | return lis; |
25 | } | 26 | } |
26 | ODateBookAccess::List ODateBookAccess::nonRepeats()const { | 27 | ODateBookAccess::List ODateBookAccess::nonRepeats()const { |
27 | QArray<int> ints = m_backEnd->nonRepeats(); | 28 | QArray<int> ints = m_backEnd->nonRepeats(); |
28 | 29 | ||
29 | List lis( ints, this ); | 30 | List lis( ints, this ); |
30 | return lis; | 31 | return lis; |
31 | } | 32 | } |
32 | OEffectiveEvent::ValueList ODateBookAccess::effecticeEvents( const QDate& from, const QDate& to ) { | 33 | OEffectiveEvent::ValueList ODateBookAccess::effectiveEvents( const QDate& from, const QDate& to ) { |
33 | return m_backEnd->effecticeEvents( from, to ); | 34 | return m_backEnd->effecticeEvents( from, to ); |
34 | } | 35 | } |
35 | OEffectiveEvent::ValueList ODateBookAccess::effecticeEvents( const QDateTime& start ) { | 36 | OEffectiveEvent::ValueList ODateBookAccess::effectiveEvents( const QDateTime& start ) { |
36 | return m_backEnd->effecticeEvents( start ); | 37 | return m_backEnd->effecticeEvents( start ); |
37 | } | 38 | } |
diff --git a/libopie/pim/odatebookaccess.h b/libopie/pim/odatebookaccess.h index 3f2c728..7047039 100644 --- a/libopie/pim/odatebookaccess.h +++ b/libopie/pim/odatebookaccess.h | |||
@@ -1,32 +1,32 @@ | |||
1 | #ifndef OPIE_DATE_BOOK_ACCESS_H | 1 | #ifndef OPIE_DATE_BOOK_ACCESS_H |
2 | #define OPIE_DATE_BOOK_ACCESS_H | 2 | #define OPIE_DATE_BOOK_ACCESS_H |
3 | 3 | ||
4 | #include "odatebookaccessbackend.h" | 4 | #include "odatebookaccessbackend.h" |
5 | #include "opimaccesstemplate.h" | 5 | #include "opimaccesstemplate.h" |
6 | 6 | ||
7 | #include "oevent.h" | 7 | #include "oevent.h" |
8 | 8 | ||
9 | class ODateBookAccess : public OPimAccessTemplate<OEvent> { | 9 | class ODateBookAccess : public OPimAccessTemplate<OEvent> { |
10 | public: | 10 | public: |
11 | ODateBookAccess( ODateBookAccessBackend* = 0l, enum Access acc = Random ); | 11 | ODateBookAccess( ODateBookAccessBackend* = 0l, enum Access acc = Random ); |
12 | ~ODateBookAccess(); | 12 | ~ODateBookAccess(); |
13 | 13 | ||
14 | /** return all events */ | 14 | /** return all events */ |
15 | List rawEvents()const; | 15 | List rawEvents()const; |
16 | 16 | ||
17 | /** return repeating events */ | 17 | /** return repeating events */ |
18 | List rawRepeats()const; | 18 | List rawRepeats()const; |
19 | 19 | ||
20 | /** return non repeating events */ | 20 | /** return non repeating events */ |
21 | List nonRepeats()const; | 21 | List nonRepeats()const; |
22 | 22 | ||
23 | OEffectiveEvent::ValueList effecticeEvents( const QDate& from, const QDate& to ); | 23 | OEffectiveEvent::ValueList effectiveEvents( const QDate& from, const QDate& to ); |
24 | OEffectiveEvent::ValueList effecticeEvents( const QDateTime& start ); | 24 | OEffectiveEvent::ValueList effectiveEvents( const QDateTime& start ); |
25 | 25 | ||
26 | private: | 26 | private: |
27 | ODateBookAccessBackend* m_backEnd; | 27 | ODateBookAccessBackend* m_backEnd; |
28 | class Private; | 28 | class Private; |
29 | Private* d; | 29 | Private* d; |
30 | }; | 30 | }; |
31 | 31 | ||
32 | #endif | 32 | #endif |
diff --git a/libopie/pim/odatebookaccessbackend_xml.cpp b/libopie/pim/odatebookaccessbackend_xml.cpp new file mode 100644 index 0000000..a4c514b --- a/dev/null +++ b/libopie/pim/odatebookaccessbackend_xml.cpp | |||
@@ -0,0 +1,395 @@ | |||
1 | #include <errno.h> | ||
2 | #include <fcntl.h> | ||
3 | |||
4 | #include <sys/types.h> | ||
5 | #include <sys/mman.h> | ||
6 | #include <sys/stat.h> | ||
7 | |||
8 | #include <unistd.h> | ||
9 | |||
10 | #include <qasciidict.h> | ||
11 | #include <qfile.h> | ||
12 | |||
13 | #include <qtopia/global.h> | ||
14 | #include <qtopia/stringutil.h> | ||
15 | |||
16 | #include "opimnotifymanager.h" | ||
17 | #include "orecur.h" | ||
18 | #include "otimezone.h" | ||
19 | #include "odatebookaccessbackend_xml.h" | ||
20 | |||
21 | namespace { | ||
22 | time_t start, end, created, rp_end; | ||
23 | ORecur* rec; | ||
24 | ORecur* recur() { | ||
25 | if (!rec) | ||
26 | rec = new ORecur; | ||
27 | |||
28 | return rec; | ||
29 | } | ||
30 | int alarmTime; | ||
31 | int snd; | ||
32 | enum Attribute{ | ||
33 | FDescription = 0, | ||
34 | FLocation, | ||
35 | FCategories, | ||
36 | FUid, | ||
37 | FType, | ||
38 | FAlarm, | ||
39 | FSound, | ||
40 | FRType, | ||
41 | FRWeekdays, | ||
42 | FRPosition, | ||
43 | FRFreq, | ||
44 | FRHasEndDate, | ||
45 | FREndDate, | ||
46 | FRStart, | ||
47 | FREnd, | ||
48 | FNote, | ||
49 | FCreated | ||
50 | }; | ||
51 | } | ||
52 | |||
53 | ODateBookAccessBackend_XML::ODateBookAccessBackend_XML( const QString& , | ||
54 | const QString& fileName ) | ||
55 | : ODateBookAccessBackend() { | ||
56 | m_name = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.xml" ) : fileName; | ||
57 | m_changed = false; | ||
58 | } | ||
59 | ODateBookAccessBackend_XML::~ODateBookAccessBackend_XML() { | ||
60 | } | ||
61 | bool ODateBookAccessBackend_XML::load() { | ||
62 | return loadFile(); | ||
63 | } | ||
64 | bool ODateBookAccessBackend_XML::reload() { | ||
65 | clear(); | ||
66 | return load(); | ||
67 | } | ||
68 | bool ODateBookAccessBackend_XML::save() { | ||
69 | if (!m_changed) return true; | ||
70 | m_changed = false; | ||
71 | |||
72 | return true; | ||
73 | } | ||
74 | QArray<int> ODateBookAccessBackend_XML::allRecords()const { | ||
75 | QArray<int> ints( m_raw.count()+ m_rep.count() ); | ||
76 | uint i = 0; | ||
77 | QMap<int, OEvent>::ConstIterator it; | ||
78 | |||
79 | for ( it = m_raw.begin(); it != m_raw.end(); ++it ) { | ||
80 | ints[i] = it.key(); | ||
81 | i++; | ||
82 | } | ||
83 | for ( it = m_rep.begin(); it != m_rep.end(); ++it ) { | ||
84 | ints[i] = it.key(); | ||
85 | i++; | ||
86 | } | ||
87 | |||
88 | return ints; | ||
89 | } | ||
90 | QArray<int> ODateBookAccessBackend_XML::queryByExample(const OEvent&, int ) { | ||
91 | return QArray<int>(); | ||
92 | } | ||
93 | void ODateBookAccessBackend_XML::clear() { | ||
94 | m_raw.clear(); | ||
95 | m_rep.clear(); | ||
96 | } | ||
97 | OEvent ODateBookAccessBackend_XML::find( int uid ) const{ | ||
98 | if ( m_raw.contains( uid ) ) | ||
99 | return m_raw[uid]; | ||
100 | else | ||
101 | return m_rep[uid]; | ||
102 | } | ||
103 | bool ODateBookAccessBackend_XML::add( const OEvent& ev ) { | ||
104 | m_changed = true; | ||
105 | if (ev.hasRecurrence() ) | ||
106 | m_rep.insert( ev.uid(), ev ); | ||
107 | else | ||
108 | m_raw.insert( ev.uid(), ev ); | ||
109 | |||
110 | return true; | ||
111 | } | ||
112 | bool ODateBookAccessBackend_XML::remove( int uid ) { | ||
113 | m_changed = true; | ||
114 | m_rep.remove( uid ); | ||
115 | m_rep.remove( uid ); | ||
116 | |||
117 | return true; | ||
118 | } | ||
119 | bool ODateBookAccessBackend_XML::replace( const OEvent& ev ) { | ||
120 | replace( ev.uid() ); | ||
121 | return add( ev ); | ||
122 | } | ||
123 | QArray<int> ODateBookAccessBackend_XML::rawEvents()const { | ||
124 | return allRecords(); | ||
125 | } | ||
126 | QArray<int> ODateBookAccessBackend_XML::rawRepeats()const { | ||
127 | QArray<int> ints( m_rep.count() ); | ||
128 | uint i = 0; | ||
129 | QMap<int, OEvent>::ConstIterator it; | ||
130 | |||
131 | for ( it = m_rep.begin(); it != m_rep.end(); ++it ) { | ||
132 | ints[i] = it.key(); | ||
133 | i++; | ||
134 | } | ||
135 | |||
136 | return ints; | ||
137 | } | ||
138 | QArray<int> ODateBookAccessBackend_XML::nonRepeats()const { | ||
139 | QArray<int> ints( m_raw.count() ); | ||
140 | uint i = 0; | ||
141 | QMap<int, OEvent>::ConstIterator it; | ||
142 | |||
143 | for ( it = m_raw.begin(); it != m_raw.end(); ++it ) { | ||
144 | ints[i] = it.key(); | ||
145 | i++; | ||
146 | } | ||
147 | |||
148 | return ints; | ||
149 | } | ||
150 | OEvent::ValueList ODateBookAccessBackend_XML::directNonRepeats() { | ||
151 | OEvent::ValueList list; | ||
152 | QMap<int, OEvent>::ConstIterator it; | ||
153 | for (it = m_raw.begin(); it != m_raw.end(); ++it ) | ||
154 | list.append( it.data() ); | ||
155 | |||
156 | return list; | ||
157 | } | ||
158 | OEvent::ValueList ODateBookAccessBackend_XML::directRawRepeats() { | ||
159 | OEvent::ValueList list; | ||
160 | QMap<int, OEvent>::ConstIterator it; | ||
161 | for (it = m_rep.begin(); it != m_rep.end(); ++it ) | ||
162 | list.append( it.data() ); | ||
163 | |||
164 | return list; | ||
165 | } | ||
166 | bool ODateBookAccessBackend_XML::loadFile() { | ||
167 | m_changed = false; | ||
168 | |||
169 | int fd = ::open( QFile::encodeName(m_name).data(), O_RDONLY ); | ||
170 | if ( fd < 0 ) return false; | ||
171 | |||
172 | struct stat attribute; | ||
173 | if ( ::fstat(fd, &attribute ) == -1 ) { | ||
174 | ::close( fd ); | ||
175 | return false; | ||
176 | } | ||
177 | void* map_addr = ::mmap(NULL, attribute.st_size, PROT_READ, MAP_SHARED, fd, 0 ); | ||
178 | if ( map_addr == ( (caddr_t)-1) ) { | ||
179 | ::close( fd ); | ||
180 | return false; | ||
181 | } | ||
182 | |||
183 | ::madvise( map_addr, attribute.st_size, MADV_SEQUENTIAL ); | ||
184 | ::close( fd ); | ||
185 | |||
186 | QAsciiDict<int> dict(FCreated+1); | ||
187 | dict.setAutoDelete( true ); | ||
188 | dict.insert( "description", new int(FDescription) ); | ||
189 | dict.insert( "location", new int(FLocation) ); | ||
190 | dict.insert( "categories", new int(FCategories) ); | ||
191 | dict.insert( "uid", new int(FUid) ); | ||
192 | dict.insert( "type", new int(FType) ); | ||
193 | dict.insert( "alarm", new int(FAlarm) ); | ||
194 | dict.insert( "sound", new int(FSound) ); | ||
195 | dict.insert( "rtype", new int(FRType) ); | ||
196 | dict.insert( "rweekdays", new int(FRWeekdays) ); | ||
197 | dict.insert( "rposition", new int(FRPosition) ); | ||
198 | dict.insert( "rfreq", new int(FRFreq) ); | ||
199 | dict.insert( "rhasenddate", new int(FRHasEndDate) ); | ||
200 | dict.insert( "enddt", new int(FREndDate) ); | ||
201 | dict.insert( "start", new int(FRStart) ); | ||
202 | dict.insert( "end", new int(FREnd) ); | ||
203 | dict.insert( "note", new int(FNote) ); | ||
204 | dict.insert( "created", new int(FCreated) ); | ||
205 | |||
206 | char* dt = (char*)map_addr; | ||
207 | int len = attribute.st_size; | ||
208 | int i = 0; | ||
209 | char* point; | ||
210 | const char* collectionString = "<event "; | ||
211 | int strLen = ::strlen(collectionString); | ||
212 | int *find; | ||
213 | while ( dt + 1 != 0 && (( point = ::strstr( dt+i, collectionString ) ) != 0 ) ) { | ||
214 | i = point -dt; | ||
215 | i+= strLen; | ||
216 | |||
217 | alarmTime = -1; | ||
218 | snd = 0; // silent | ||
219 | |||
220 | OEvent ev; | ||
221 | rec = 0; | ||
222 | |||
223 | while ( TRUE ) { | ||
224 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) | ||
225 | ++i; | ||
226 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) | ||
227 | break; | ||
228 | |||
229 | |||
230 | // we have another attribute, read it. | ||
231 | int j = i; | ||
232 | while ( j < len && dt[j] != '=' ) | ||
233 | ++j; | ||
234 | QCString attr( dt+i, j-i+1); | ||
235 | |||
236 | i = ++j; // skip = | ||
237 | |||
238 | // find the start of quotes | ||
239 | while ( i < len && dt[i] != '"' ) | ||
240 | ++i; | ||
241 | j = ++i; | ||
242 | |||
243 | bool haveUtf = FALSE; | ||
244 | bool haveEnt = FALSE; | ||
245 | while ( j < len && dt[j] != '"' ) { | ||
246 | if ( ((unsigned char)dt[j]) > 0x7f ) | ||
247 | haveUtf = TRUE; | ||
248 | if ( dt[j] == '&' ) | ||
249 | haveEnt = TRUE; | ||
250 | ++j; | ||
251 | } | ||
252 | if ( i == j ) { | ||
253 | // empty value | ||
254 | i = j + 1; | ||
255 | continue; | ||
256 | } | ||
257 | |||
258 | QCString value( dt+i, j-i+1 ); | ||
259 | i = j + 1; | ||
260 | |||
261 | QString str = (haveUtf ? QString::fromUtf8( value ) | ||
262 | : QString::fromLatin1( value ) ); | ||
263 | if ( haveEnt ) | ||
264 | str = Qtopia::plainString( str ); | ||
265 | |||
266 | /* | ||
267 | * add key + value | ||
268 | */ | ||
269 | find = dict[attr.data()]; | ||
270 | if (!find) | ||
271 | ev.setCustomField( attr, value ); | ||
272 | else { | ||
273 | setField( ev, *find, value ); | ||
274 | } | ||
275 | } | ||
276 | /* time to finalize */ | ||
277 | finalizeRecord( ev ); | ||
278 | add( ev ); | ||
279 | delete rec; | ||
280 | } | ||
281 | ::munmap(map_addr, attribute.st_size ); | ||
282 | m_changed = false; // changed during add | ||
283 | |||
284 | return true; | ||
285 | } | ||
286 | void ODateBookAccessBackend_XML::finalizeRecord( OEvent& ev ) { | ||
287 | /* AllDay is alway in UTC */ | ||
288 | if ( ev.isAllDay() ) { | ||
289 | OTimeZone utc = OTimeZone::utc(); | ||
290 | ev.setStartDateTime( utc.fromUTCDateTime( start ) ); | ||
291 | ev.setEndDateTime ( utc.fromUTCDateTime( end ) ); | ||
292 | }else { | ||
293 | OTimeZone zone( ev.timeZone().isEmpty() ? OTimeZone::current() : ev.timeZone() ); | ||
294 | ev.setStartDateTime( zone.toDateTime( start ) ); | ||
295 | ev.setEndDateTime ( zone.toDateTime( end ) ); | ||
296 | } | ||
297 | if ( rec && rec->doesRecur() ) { | ||
298 | OTimeZone utc = OTimeZone::utc(); | ||
299 | ORecur recu( *rec ); // call copy c'tor; | ||
300 | recu.setEndDate ( utc.fromUTCDateTime( rp_end ).date() ); | ||
301 | recu.setCreatedDateTime( utc.fromUTCDateTime( created ) ); | ||
302 | recu.setStart( ev.startDateTime().date() ); | ||
303 | ev.setRecurrence( recu ); | ||
304 | } | ||
305 | |||
306 | if (alarmTime != -1 ) { | ||
307 | QDateTime dt = ev.startDateTime().addSecs( -1*alarmTime*60 ); | ||
308 | OPimAlarm al( snd , dt ); | ||
309 | ev.notifiers().add( al ); | ||
310 | } | ||
311 | if ( m_raw.contains( ev.uid() ) || m_rep.contains( ev.uid() ) ) { | ||
312 | ev.setUid( 1 ); | ||
313 | } | ||
314 | if ( ev.hasRecurrence() ) | ||
315 | m_rep.insert( ev.uid(), ev ); | ||
316 | else | ||
317 | m_raw.insert( ev.uid(), ev ); | ||
318 | |||
319 | } | ||
320 | void ODateBookAccessBackend_XML::setField( OEvent& e, int id, const QString& value) { | ||
321 | // qWarning(" setting %s", value.latin1() ); | ||
322 | switch( id ) { | ||
323 | case FDescription: | ||
324 | e.setDescription( value ); | ||
325 | break; | ||
326 | case FLocation: | ||
327 | e.setLocation( value ); | ||
328 | break; | ||
329 | case FCategories: | ||
330 | e.setCategories( e.idsFromString( value ) ); | ||
331 | break; | ||
332 | case FUid: | ||
333 | e.setUid( value.toInt() ); | ||
334 | break; | ||
335 | case FType: | ||
336 | if ( value == "AllDay" ) { | ||
337 | e.setAllDay( true ); | ||
338 | e.setTimeZone( "UTC" ); | ||
339 | } | ||
340 | break; | ||
341 | case FAlarm: | ||
342 | alarmTime = value.toInt(); | ||
343 | break; | ||
344 | case FSound: | ||
345 | snd = value == "loud" ? OPimAlarm::Loud : OPimAlarm::Silent; | ||
346 | break; | ||
347 | // recurrence stuff | ||
348 | case FRType: | ||
349 | if ( value == "Daily" ) | ||
350 | recur()->setType( ORecur::Daily ); | ||
351 | else if ( value == "Weekly" ) | ||
352 | recur()->setType( ORecur::Weekly); | ||
353 | else if ( value == "MonthlyDay" ) | ||
354 | recur()->setType( ORecur::MonthlyDay ); | ||
355 | else if ( value == "MonthlyDate" ) | ||
356 | recur()->setType( ORecur::MonthlyDate ); | ||
357 | else if ( value == "Yearly" ) | ||
358 | recur()->setType( ORecur::Yearly ); | ||
359 | else | ||
360 | recur()->setType( ORecur::NoRepeat ); | ||
361 | break; | ||
362 | case FRWeekdays: | ||
363 | recur()->setDays( value.toInt() ); | ||
364 | break; | ||
365 | case FRPosition: | ||
366 | recur()->setPosition( value.toInt() ); | ||
367 | break; | ||
368 | case FRFreq: | ||
369 | recur()->setFrequency( value.toInt() ); | ||
370 | break; | ||
371 | case FRHasEndDate: | ||
372 | recur()->setHasEndDate( value.toInt() ); | ||
373 | break; | ||
374 | case FREndDate: { | ||
375 | rp_end = (time_t) value.toLong(); | ||
376 | break; | ||
377 | } | ||
378 | case FRStart: { | ||
379 | start = (time_t) value.toLong(); | ||
380 | break; | ||
381 | } | ||
382 | case FREnd: { | ||
383 | end = ( (time_t) value.toLong() ); | ||
384 | break; | ||
385 | } | ||
386 | case FNote: | ||
387 | e.setNote( value ); | ||
388 | break; | ||
389 | case FCreated: | ||
390 | created = value.toInt(); | ||
391 | break; | ||
392 | default: | ||
393 | break; | ||
394 | } | ||
395 | } | ||
diff --git a/libopie/pim/odatebookaccessbackend_xml.h b/libopie/pim/odatebookaccessbackend_xml.h new file mode 100644 index 0000000..40f69d8 --- a/dev/null +++ b/libopie/pim/odatebookaccessbackend_xml.h | |||
@@ -0,0 +1,48 @@ | |||
1 | #ifndef OPIE_DATE_BOOK_ACCESS_BACKEND_XML__H | ||
2 | #define OPIE_DATE_BOOK_ACCESS_BACKEND_XML__H | ||
3 | |||
4 | #include <qmap.h> | ||
5 | |||
6 | #include "odatebookaccessbackend.h" | ||
7 | |||
8 | class ODateBookAccessBackend_XML : public ODateBookAccessBackend { | ||
9 | public: | ||
10 | ODateBookAccessBackend_XML( const QString& appName, | ||
11 | const QString& fileName = QString::null); | ||
12 | ~ODateBookAccessBackend_XML(); | ||
13 | |||
14 | bool load(); | ||
15 | bool reload(); | ||
16 | bool save(); | ||
17 | |||
18 | QArray<int> allRecords()const; | ||
19 | QArray<int> queryByExample( const OEvent&, int ); | ||
20 | OEvent find( int uid )const; | ||
21 | void clear(); | ||
22 | bool add( const OEvent& ev ); | ||
23 | bool remove( int uid ); | ||
24 | bool replace( const OEvent& ev ); | ||
25 | |||
26 | QArray<UID> rawEvents()const; | ||
27 | QArray<UID> rawRepeats()const; | ||
28 | QArray<UID> nonRepeats()const; | ||
29 | |||
30 | OEvent::ValueList directNonRepeats(); | ||
31 | OEvent::ValueList directRawRepeats(); | ||
32 | |||
33 | private: | ||
34 | bool m_changed :1 ; | ||
35 | bool loadFile(); | ||
36 | inline void finalizeRecord( OEvent& ev ); | ||
37 | inline void setField( OEvent&, int field, const QString& val ); | ||
38 | QString m_name; | ||
39 | QMap<int, OEvent> m_raw; | ||
40 | QMap<int, OEvent> m_rep; | ||
41 | |||
42 | struct Data; | ||
43 | Data* data; | ||
44 | class Private; | ||
45 | Private *d; | ||
46 | }; | ||
47 | |||
48 | #endif | ||
diff --git a/libopie/pim/oevent.cpp b/libopie/pim/oevent.cpp index aaae3b2..ada596c 100644 --- a/libopie/pim/oevent.cpp +++ b/libopie/pim/oevent.cpp | |||
@@ -142,96 +142,101 @@ QDateTime OEvent::createdDateTime()const { | |||
142 | return data->created; | 142 | return data->created; |
143 | } | 143 | } |
144 | void OEvent::setCreatedDateTime( const QDateTime& time ) { | 144 | void OEvent::setCreatedDateTime( const QDateTime& time ) { |
145 | changeOrModify(); | 145 | changeOrModify(); |
146 | data->created = time; | 146 | data->created = time; |
147 | } | 147 | } |
148 | QDateTime OEvent::startDateTime()const { | 148 | QDateTime OEvent::startDateTime()const { |
149 | if ( data->isAllDay ) | 149 | if ( data->isAllDay ) |
150 | return QDateTime( data->start.date(), QTime(0, 0, 0 ) ); | 150 | return QDateTime( data->start.date(), QTime(0, 0, 0 ) ); |
151 | return data->start; | 151 | return data->start; |
152 | } | 152 | } |
153 | QDateTime OEvent::startDateTimeInZone()const { | 153 | QDateTime OEvent::startDateTimeInZone()const { |
154 | /* if no timezone, or all day event or if the current and this timeZone match... */ | 154 | /* if no timezone, or all day event or if the current and this timeZone match... */ |
155 | if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime(); | 155 | if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime(); |
156 | 156 | ||
157 | OTimeZone zone(data->timezone ); | 157 | OTimeZone zone(data->timezone ); |
158 | return zone.toDateTime( data->start, OTimeZone::current() ); | 158 | return zone.toDateTime( data->start, OTimeZone::current() ); |
159 | } | 159 | } |
160 | void OEvent::setStartDateTime( const QDateTime& dt ) { | 160 | void OEvent::setStartDateTime( const QDateTime& dt ) { |
161 | changeOrModify(); | 161 | changeOrModify(); |
162 | data->start = dt; | 162 | data->start = dt; |
163 | } | 163 | } |
164 | QDateTime OEvent::endDateTime()const { | 164 | QDateTime OEvent::endDateTime()const { |
165 | /* | 165 | /* |
166 | * if all Day event the end time needs | 166 | * if all Day event the end time needs |
167 | * to be on the same day as the start | 167 | * to be on the same day as the start |
168 | */ | 168 | */ |
169 | if ( data->isAllDay ) | 169 | if ( data->isAllDay ) |
170 | return QDateTime( data->start.date(), QTime(23, 59, 59 ) ); | 170 | return QDateTime( data->start.date(), QTime(23, 59, 59 ) ); |
171 | return data->end; | 171 | return data->end; |
172 | } | 172 | } |
173 | QDateTime OEvent::endDateTimeInZone()const { | 173 | QDateTime OEvent::endDateTimeInZone()const { |
174 | /* if no timezone, or all day event or if the current and this timeZone match... */ | 174 | /* if no timezone, or all day event or if the current and this timeZone match... */ |
175 | if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime(); | 175 | if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime(); |
176 | 176 | ||
177 | OTimeZone zone(data->timezone ); | 177 | OTimeZone zone(data->timezone ); |
178 | return zone.toDateTime( data->end, OTimeZone::current() ); | 178 | return zone.toDateTime( data->end, OTimeZone::current() ); |
179 | } | 179 | } |
180 | void OEvent::setEndDateTime( const QDateTime& dt ) { | 180 | void OEvent::setEndDateTime( const QDateTime& dt ) { |
181 | changeOrModify(); | 181 | changeOrModify(); |
182 | data->end = dt; | 182 | data->end = dt; |
183 | } | 183 | } |
184 | bool OEvent::isMultipleDay()const { | 184 | bool OEvent::isMultipleDay()const { |
185 | return data->end.date().day() - data->start.date().day(); | 185 | return data->end.date().day() - data->start.date().day(); |
186 | } | 186 | } |
187 | bool OEvent::isAllDay()const { | 187 | bool OEvent::isAllDay()const { |
188 | return data->isAllDay; | 188 | return data->isAllDay; |
189 | } | 189 | } |
190 | void OEvent::setAllDay( bool allDay ) { | ||
191 | changeOrModify(); | ||
192 | data->isAllDay = allDay; | ||
193 | if (allDay ) data->timezone = "UTC"; | ||
194 | } | ||
190 | void OEvent::setTimeZone( const QString& tz ) { | 195 | void OEvent::setTimeZone( const QString& tz ) { |
191 | changeOrModify(); | 196 | changeOrModify(); |
192 | data->timezone = tz; | 197 | data->timezone = tz; |
193 | } | 198 | } |
194 | QString OEvent::timeZone()const { | 199 | QString OEvent::timeZone()const { |
195 | return data->timezone; | 200 | return data->timezone; |
196 | } | 201 | } |
197 | bool OEvent::match( const QRegExp& )const { | 202 | bool OEvent::match( const QRegExp& )const { |
198 | // FIXME | 203 | // FIXME |
199 | return false; | 204 | return false; |
200 | } | 205 | } |
201 | QString OEvent::toRichText()const { | 206 | QString OEvent::toRichText()const { |
202 | // FIXME | 207 | // FIXME |
203 | return "OEvent test"; | 208 | return "OEvent test"; |
204 | } | 209 | } |
205 | QString OEvent::toShortText()const { | 210 | QString OEvent::toShortText()const { |
206 | return "OEvent shotText"; | 211 | return "OEvent shotText"; |
207 | } | 212 | } |
208 | QString OEvent::type()const { | 213 | QString OEvent::type()const { |
209 | return QString::fromLatin1("OEvent"); | 214 | return QString::fromLatin1("OEvent"); |
210 | } | 215 | } |
211 | QString OEvent::recordField( int /*id */ )const { | 216 | QString OEvent::recordField( int /*id */ )const { |
212 | return QString::null; | 217 | return QString::null; |
213 | } | 218 | } |
214 | int OEvent::rtti() { | 219 | int OEvent::rtti() { |
215 | return OPimResolver::DateBook; | 220 | return OPimResolver::DateBook; |
216 | } | 221 | } |
217 | bool OEvent::loadFromStream( QDataStream& ) { | 222 | bool OEvent::loadFromStream( QDataStream& ) { |
218 | return true; | 223 | return true; |
219 | } | 224 | } |
220 | bool OEvent::saveToStream( QDataStream& )const { | 225 | bool OEvent::saveToStream( QDataStream& )const { |
221 | return true; | 226 | return true; |
222 | } | 227 | } |
223 | void OEvent::changeOrModify() { | 228 | void OEvent::changeOrModify() { |
224 | if ( data->count != 1 ) { | 229 | if ( data->count != 1 ) { |
225 | data->deref(); | 230 | data->deref(); |
226 | Data* d2 = new Data; | 231 | Data* d2 = new Data; |
227 | d2->description = data->description; | 232 | d2->description = data->description; |
228 | d2->location = data->location; | 233 | d2->location = data->location; |
229 | d2->manager = data->manager; | 234 | d2->manager = data->manager; |
230 | d2->recur = data->recur; | 235 | d2->recur = data->recur; |
231 | d2->note = data->note; | 236 | d2->note = data->note; |
232 | d2->created = data->created; | 237 | d2->created = data->created; |
233 | d2->start = data->start; | 238 | d2->start = data->start; |
234 | d2->end = data->end; | 239 | d2->end = data->end; |
235 | d2->isAllDay = data->isAllDay; | 240 | d2->isAllDay = data->isAllDay; |
236 | d2->timezone = data->timezone; | 241 | d2->timezone = data->timezone; |
237 | 242 | ||
diff --git a/libopie/pim/opimnotify.h b/libopie/pim/opimnotify.h index 3501948..b0de000 100644 --- a/libopie/pim/opimnotify.h +++ b/libopie/pim/opimnotify.h | |||
@@ -27,97 +27,97 @@ public: | |||
27 | OPimNotify &operator=(const OPimNotify& ); | 27 | OPimNotify &operator=(const OPimNotify& ); |
28 | bool operator==( const OPimNotify& ); | 28 | bool operator==( const OPimNotify& ); |
29 | 29 | ||
30 | virtual QString type()const = 0; | 30 | virtual QString type()const = 0; |
31 | 31 | ||
32 | /** start date */ | 32 | /** start date */ |
33 | QDateTime dateTime()const; | 33 | QDateTime dateTime()const; |
34 | QString service()const; | 34 | QString service()const; |
35 | 35 | ||
36 | /** | 36 | /** |
37 | * RETURN the parent uid | 37 | * RETURN the parent uid |
38 | */ | 38 | */ |
39 | int parent()const; | 39 | int parent()const; |
40 | 40 | ||
41 | /** | 41 | /** |
42 | * in Seconds | 42 | * in Seconds |
43 | */ | 43 | */ |
44 | int duration()const; | 44 | int duration()const; |
45 | 45 | ||
46 | /** | 46 | /** |
47 | * Start Time + Duration | 47 | * Start Time + Duration |
48 | */ | 48 | */ |
49 | QDateTime endTime()const; | 49 | QDateTime endTime()const; |
50 | 50 | ||
51 | void setDateTime( const QDateTime& ); | 51 | void setDateTime( const QDateTime& ); |
52 | void setDuration( int dur ); | 52 | void setDuration( int dur ); |
53 | void setParent(int uid ); | 53 | void setParent(int uid ); |
54 | void setService( const QString& ); | 54 | void setService( const QString& ); |
55 | 55 | ||
56 | 56 | ||
57 | private: | 57 | private: |
58 | inline void copyIntern(); | 58 | inline void copyIntern(); |
59 | void deref(); | 59 | void deref(); |
60 | struct Data; | 60 | struct Data; |
61 | Data* data; | 61 | Data* data; |
62 | 62 | ||
63 | /* d-pointer */ | 63 | /* d-pointer */ |
64 | class NotifyPrivate; | 64 | class NotifyPrivate; |
65 | NotifyPrivate* d; | 65 | NotifyPrivate* d; |
66 | 66 | ||
67 | }; | 67 | }; |
68 | /** | 68 | /** |
69 | * An alarm is a sound/mail/buzzer played/send | 69 | * An alarm is a sound/mail/buzzer played/send |
70 | * at a given time to inform about | 70 | * at a given time to inform about |
71 | * an Event | 71 | * an Event |
72 | */ | 72 | */ |
73 | class OPimAlarm : public OPimNotify { | 73 | class OPimAlarm : public OPimNotify { |
74 | public: | 74 | public: |
75 | enum Sound{Loud=0, Silent, Custom }; | 75 | enum Sound{Loud=1, Silent=0, Custom=2 }; |
76 | OPimAlarm( int sound = Silent, const QDateTime& start = QDateTime(), int duration = 0, int parent = 0 ); | 76 | OPimAlarm( int sound = Silent, const QDateTime& start = QDateTime(), int duration = 0, int parent = 0 ); |
77 | OPimAlarm( const OPimAlarm& ); | 77 | OPimAlarm( const OPimAlarm& ); |
78 | ~OPimAlarm(); | 78 | ~OPimAlarm(); |
79 | 79 | ||
80 | OPimAlarm &operator=( const OPimAlarm& ); | 80 | OPimAlarm &operator=( const OPimAlarm& ); |
81 | bool operator==( const OPimAlarm& ); | 81 | bool operator==( const OPimAlarm& ); |
82 | QString type()const; | 82 | QString type()const; |
83 | 83 | ||
84 | int sound()const; | 84 | int sound()const; |
85 | QString file()const; | 85 | QString file()const; |
86 | 86 | ||
87 | void setSound( int ); | 87 | void setSound( int ); |
88 | /* only when sound is custom... */ | 88 | /* only when sound is custom... */ |
89 | void setFile( const QString& sound ); | 89 | void setFile( const QString& sound ); |
90 | 90 | ||
91 | private: | 91 | private: |
92 | void deref(); | 92 | void deref(); |
93 | void copyIntern(); | 93 | void copyIntern(); |
94 | struct Data; | 94 | struct Data; |
95 | Data * data; | 95 | Data * data; |
96 | 96 | ||
97 | class Private; | 97 | class Private; |
98 | Private* d; | 98 | Private* d; |
99 | 99 | ||
100 | }; | 100 | }; |
101 | 101 | ||
102 | /** | 102 | /** |
103 | * A Reminder will be put into the | 103 | * A Reminder will be put into the |
104 | * datebook | 104 | * datebook |
105 | */ | 105 | */ |
106 | class OPimReminder : public OPimNotify { | 106 | class OPimReminder : public OPimNotify { |
107 | public: | 107 | public: |
108 | 108 | ||
109 | /** | 109 | /** |
110 | * c'tor of a reminder | 110 | * c'tor of a reminder |
111 | * @param uid The uid of the Record inside the Datebook | 111 | * @param uid The uid of the Record inside the Datebook |
112 | * @param start the StartDate invalid for all day... | 112 | * @param start the StartDate invalid for all day... |
113 | * @param duration The duration of the event ( -1 for all day ) | 113 | * @param duration The duration of the event ( -1 for all day ) |
114 | * @param parent The 'parent' record of this reminder | 114 | * @param parent The 'parent' record of this reminder |
115 | */ | 115 | */ |
116 | OPimReminder( int uid = 0, const QDateTime& start = QDateTime(), | 116 | OPimReminder( int uid = 0, const QDateTime& start = QDateTime(), |
117 | int duration = 0, int parent = 0 ); | 117 | int duration = 0, int parent = 0 ); |
118 | OPimReminder( const OPimReminder& ); | 118 | OPimReminder( const OPimReminder& ); |
119 | OPimReminder &operator=(const OPimReminder& ); | 119 | OPimReminder &operator=(const OPimReminder& ); |
120 | 120 | ||
121 | QString type()const; | 121 | QString type()const; |
122 | 122 | ||
123 | bool operator==( const OPimReminder& ); | 123 | bool operator==( const OPimReminder& ); |
diff --git a/libopie/pim/otodoaccessxml.cpp b/libopie/pim/otodoaccessxml.cpp index c3416cb..22b2469 100644 --- a/libopie/pim/otodoaccessxml.cpp +++ b/libopie/pim/otodoaccessxml.cpp | |||
@@ -1,67 +1,65 @@ | |||
1 | #include <errno.h> | 1 | #include <errno.h> |
2 | #include <fcntl.h> | 2 | #include <fcntl.h> |
3 | 3 | ||
4 | #include <sys/mman.h> | 4 | #include <sys/mman.h> |
5 | #include <sys/stat.h> | 5 | #include <sys/stat.h> |
6 | #include <sys/types.h> | 6 | #include <sys/types.h> |
7 | 7 | ||
8 | #include <unistd.h> | 8 | #include <unistd.h> |
9 | 9 | ||
10 | 10 | ||
11 | #include <qfile.h> | 11 | #include <qfile.h> |
12 | #include <qvector.h> | 12 | #include <qvector.h> |
13 | 13 | ||
14 | #include <qpe/global.h> | 14 | #include <qpe/global.h> |
15 | #include <qpe/stringutil.h> | 15 | #include <qpe/stringutil.h> |
16 | #include <qpe/timeconversion.h> | 16 | #include <qpe/timeconversion.h> |
17 | 17 | ||
18 | #include <opie/xmltree.h> | ||
19 | |||
20 | #include "otodoaccessxml.h" | 18 | #include "otodoaccessxml.h" |
21 | 19 | ||
22 | OTodoAccessXML::OTodoAccessXML( const QString& appName, | 20 | OTodoAccessXML::OTodoAccessXML( const QString& appName, |
23 | const QString& fileName ) | 21 | const QString& fileName ) |
24 | : OTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false ) | 22 | : OTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false ) |
25 | { | 23 | { |
26 | if (!fileName.isEmpty() ) | 24 | if (!fileName.isEmpty() ) |
27 | m_file = fileName; | 25 | m_file = fileName; |
28 | else | 26 | else |
29 | m_file = Global::applicationFileName( "todolist", "todolist.xml" ); | 27 | m_file = Global::applicationFileName( "todolist", "todolist.xml" ); |
30 | } | 28 | } |
31 | OTodoAccessXML::~OTodoAccessXML() { | 29 | OTodoAccessXML::~OTodoAccessXML() { |
32 | 30 | ||
33 | } | 31 | } |
34 | bool OTodoAccessXML::load() { | 32 | bool OTodoAccessXML::load() { |
35 | m_opened = true; | 33 | m_opened = true; |
36 | m_changed = false; | 34 | m_changed = false; |
37 | /* initialize dict */ | 35 | /* initialize dict */ |
38 | /* | 36 | /* |
39 | * UPDATE dict if you change anything!!! | 37 | * UPDATE dict if you change anything!!! |
40 | */ | 38 | */ |
41 | QAsciiDict<int> dict(21); | 39 | QAsciiDict<int> dict(21); |
42 | dict.setAutoDelete( TRUE ); | 40 | dict.setAutoDelete( TRUE ); |
43 | dict.insert("Categories" , new int(OTodo::Category) ); | 41 | dict.insert("Categories" , new int(OTodo::Category) ); |
44 | dict.insert("Uid" , new int(OTodo::Uid) ); | 42 | dict.insert("Uid" , new int(OTodo::Uid) ); |
45 | dict.insert("HasDate" , new int(OTodo::HasDate) ); | 43 | dict.insert("HasDate" , new int(OTodo::HasDate) ); |
46 | dict.insert("Completed" , new int(OTodo::Completed) ); | 44 | dict.insert("Completed" , new int(OTodo::Completed) ); |
47 | dict.insert("Description" , new int(OTodo::Description) ); | 45 | dict.insert("Description" , new int(OTodo::Description) ); |
48 | dict.insert("Summary" , new int(OTodo::Summary) ); | 46 | dict.insert("Summary" , new int(OTodo::Summary) ); |
49 | dict.insert("Priority" , new int(OTodo::Priority) ); | 47 | dict.insert("Priority" , new int(OTodo::Priority) ); |
50 | dict.insert("DateDay" , new int(OTodo::DateDay) ); | 48 | dict.insert("DateDay" , new int(OTodo::DateDay) ); |
51 | dict.insert("DateMonth" , new int(OTodo::DateMonth) ); | 49 | dict.insert("DateMonth" , new int(OTodo::DateMonth) ); |
52 | dict.insert("DateYear" , new int(OTodo::DateYear) ); | 50 | dict.insert("DateYear" , new int(OTodo::DateYear) ); |
53 | dict.insert("Progress" , new int(OTodo::Progress) ); | 51 | dict.insert("Progress" , new int(OTodo::Progress) ); |
54 | dict.insert("Completed", new int(OTodo::Completed) ); | 52 | dict.insert("Completed", new int(OTodo::Completed) ); |
55 | dict.insert("CrossReference", new int(OTodo::CrossReference) ); | 53 | dict.insert("CrossReference", new int(OTodo::CrossReference) ); |
56 | dict.insert("State", new int(OTodo::State) ); | 54 | dict.insert("State", new int(OTodo::State) ); |
57 | dict.insert("Recurrence", new int(OTodo::Recurrence) ); | 55 | dict.insert("Recurrence", new int(OTodo::Recurrence) ); |
58 | dict.insert("Alarms", new int(OTodo::Alarms) ); | 56 | dict.insert("Alarms", new int(OTodo::Alarms) ); |
59 | dict.insert("Reminders", new int(OTodo::Reminders) ); | 57 | dict.insert("Reminders", new int(OTodo::Reminders) ); |
60 | dict.insert("Notifiers", new int(OTodo::Notifiers) ); | 58 | dict.insert("Notifiers", new int(OTodo::Notifiers) ); |
61 | dict.insert("Maintainer", new int(OTodo::Maintainer) ); | 59 | dict.insert("Maintainer", new int(OTodo::Maintainer) ); |
62 | 60 | ||
63 | // here the custom XML parser from TT it's GPL | 61 | // here the custom XML parser from TT it's GPL |
64 | // but we want to push OpiePIM... to TT..... | 62 | // but we want to push OpiePIM... to TT..... |
65 | // mmap part from zecke :) | 63 | // mmap part from zecke :) |
66 | int fd = ::open( QFile::encodeName(m_file).data(), O_RDONLY ); | 64 | int fd = ::open( QFile::encodeName(m_file).data(), O_RDONLY ); |
67 | struct stat attribut; | 65 | struct stat attribut; |
diff --git a/libopie/pim/test/oevent_test.cpp b/libopie/pim/test/oevent_test.cpp index 50cc032..6f04995 100644 --- a/libopie/pim/test/oevent_test.cpp +++ b/libopie/pim/test/oevent_test.cpp | |||
@@ -1,23 +1,50 @@ | |||
1 | #include <qdatetime.h> | 1 | #include <qdatetime.h> |
2 | 2 | ||
3 | #include "../oevent.h" | 3 | #include "../oevent.h" |
4 | #include "../odatebookaccess.h" | ||
4 | 5 | ||
5 | int main(int argc, char* argv ) { | 6 | int main(int argc, char* argv ) { |
6 | OEvent ev; | 7 | OEvent ev; |
7 | ev.setUid( 20 ); | 8 | ev.setUid( 20 ); |
8 | 9 | ||
9 | ev.setDescription( "Foo" ); | 10 | ev.setDescription( "Foo" ); |
10 | 11 | ||
11 | OEvent ev2 = ev; | 12 | OEvent ev2 = ev; |
12 | ev2.setDescription("Foo2"); | 13 | ev2.setDescription("Foo2"); |
13 | qWarning("%s", ev2.description().latin1() ); | 14 | qWarning("%s", ev2.description().latin1() ); |
14 | qWarning("%s", ev.description().latin1() ); | 15 | qWarning("%s", ev.description().latin1() ); |
15 | 16 | ||
16 | QDateTime time = QDateTime::currentDateTime(); | 17 | QDateTime time = QDateTime::currentDateTime(); |
17 | ev2.setStartDateTime( time ); | 18 | ev2.setStartDateTime( time ); |
18 | ev2.setTimeZone( "Europe/London" ); | 19 | ev2.setTimeZone( "Europe/London" ); |
19 | 20 | ||
20 | qWarning("%s", ev2.startDateTime().toString().latin1() ); | 21 | qWarning("%s", ev2.startDateTime().toString().latin1() ); |
21 | qWarning("%s", ev2.startDateTimeInZone().toString().latin1() ); | 22 | qWarning("%s", ev2.startDateTimeInZone().toString().latin1() ); |
23 | |||
24 | ODateBookAccess acc; | ||
25 | if(!acc.load() ) qWarning("could not load"); | ||
26 | |||
27 | ODateBookAccess::List::Iterator it; | ||
28 | ODateBookAccess::List list = acc.allRecords(); | ||
29 | |||
30 | for( it = list.begin(); it != list.end(); ++it ){ | ||
31 | OEvent ev = (*it); | ||
32 | qWarning("Summary: %s",ev.description().latin1() ); | ||
33 | qWarning("Start: %s End: %s",ev.startDateTime().toString().latin1(), ev.endDateTime().toString().latin1() ); | ||
34 | qWarning("All Day: %d",ev.isAllDay() ); | ||
35 | |||
36 | } | ||
37 | QDate date1(2003,02,01 ); | ||
38 | QDate date2(2003,03,01 ); | ||
39 | |||
40 | OEffectiveEvent::ValueList effList = acc.effectiveEvents( date1,date2 ); | ||
41 | OEffectiveEvent::ValueList::Iterator effIt; | ||
42 | |||
43 | for( effIt = effList.begin(); effIt != effList.end(); ++effIt ){ | ||
44 | OEffectiveEvent ef = (*effIt); | ||
45 | qWarning("Summary: %s", ef.description().latin1() ); | ||
46 | qWarning("Date: %s", ef.date().toString().latin1() ); | ||
47 | } | ||
48 | |||
22 | return 0; | 49 | return 0; |
23 | } | 50 | } |