Diffstat (limited to 'libopie2/opiepim/backend/otodoaccessxml.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | libopie2/opiepim/backend/otodoaccessxml.cpp | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/libopie2/opiepim/backend/otodoaccessxml.cpp b/libopie2/opiepim/backend/otodoaccessxml.cpp index b2dfe80..21f93a0 100644 --- a/libopie2/opiepim/backend/otodoaccessxml.cpp +++ b/libopie2/opiepim/backend/otodoaccessxml.cpp | |||
@@ -1,12 +1,22 @@ | |||
1 | #include <errno.h> | ||
2 | #include <fcntl.h> | ||
3 | |||
4 | #include <sys/mman.h> | ||
5 | #include <sys/stat.h> | ||
6 | #include <sys/types.h> | ||
7 | |||
8 | #include <unistd.h> | ||
9 | |||
10 | |||
1 | #include <qfile.h> | 11 | #include <qfile.h> |
2 | #include <qvector.h> | 12 | #include <qvector.h> |
3 | 13 | ||
4 | #include <qpe/global.h> | 14 | #include <qpe/global.h> |
5 | #include <qpe/stringutil.h> | 15 | #include <qpe/stringutil.h> |
6 | #include <qpe/timeconversion.h> | 16 | #include <qpe/timeconversion.h> |
7 | 17 | ||
8 | #include <opie/xmltree.h> | 18 | #include <opie/xmltree.h> |
9 | 19 | ||
10 | #include "otodoaccessxml.h" | 20 | #include "otodoaccessxml.h" |
11 | 21 | ||
12 | OTodoAccessXML::OTodoAccessXML( const QString& appName, | 22 | OTodoAccessXML::OTodoAccessXML( const QString& appName, |
@@ -43,38 +53,54 @@ bool OTodoAccessXML::load() { | |||
43 | dict.insert("Progress" , new int(OTodo::Progress) ); | 53 | dict.insert("Progress" , new int(OTodo::Progress) ); |
44 | dict.insert("Completed", new int(OTodo::Completed) ); | 54 | dict.insert("Completed", new int(OTodo::Completed) ); |
45 | dict.insert("CrossReference", new int(OTodo::CrossReference) ); | 55 | dict.insert("CrossReference", new int(OTodo::CrossReference) ); |
46 | dict.insert("State", new int(OTodo::State) ); | 56 | dict.insert("State", new int(OTodo::State) ); |
47 | dict.insert("Recurrence", new int(OTodo::Recurrence) ); | 57 | dict.insert("Recurrence", new int(OTodo::Recurrence) ); |
48 | dict.insert("Alarms", new int(OTodo::Alarms) ); | 58 | dict.insert("Alarms", new int(OTodo::Alarms) ); |
49 | dict.insert("Reminders", new int(OTodo::Reminders) ); | 59 | dict.insert("Reminders", new int(OTodo::Reminders) ); |
50 | dict.insert("Notifiers", new int(OTodo::Notifiers) ); | 60 | dict.insert("Notifiers", new int(OTodo::Notifiers) ); |
51 | dict.insert("Maintainer", new int(OTodo::Maintainer) ); | 61 | dict.insert("Maintainer", new int(OTodo::Maintainer) ); |
52 | 62 | ||
53 | // here the custom XML parser from TT it's GPL | 63 | // here the custom XML parser from TT it's GPL |
54 | // but we want to push OpiePIM... to TT..... | 64 | // but we want to push OpiePIM... to TT..... |
55 | QFile f(m_file ); | 65 | // mmap part from zecke :) |
56 | if (!f.open(IO_ReadOnly) ) | 66 | int fd = ::open( QFile::encodeName(m_file).data(), O_RDONLY ); |
67 | struct stat attribut; | ||
68 | if ( fd < 0 ) return false; | ||
69 | |||
70 | if ( fstat(fd, &attribut ) == -1 ) { | ||
71 | ::close( fd ); | ||
57 | return false; | 72 | return false; |
73 | } | ||
74 | void* map_addr = ::mmap(NULL, attribut.st_size, PROT_READ, MAP_SHARED, fd, 0 ); | ||
75 | if ( map_addr == ( (caddr_t)-1) ) { | ||
76 | ::close(fd ); | ||
77 | return false; | ||
78 | } | ||
79 | /* advise the kernel who we want to read it */ | ||
80 | ::madvise( map_addr, attribut.st_size, MADV_SEQUENTIAL ); | ||
81 | /* we do not the file any more */ | ||
82 | ::close( fd ); | ||
58 | 83 | ||
59 | QByteArray ba = f.readAll(); | 84 | char* dt = (char*)map_addr; |
60 | f.close(); | 85 | int len = attribut.st_size; |
61 | char* dt = ba.data(); | ||
62 | int len = ba.size(); | ||
63 | int i = 0; | 86 | int i = 0; |
64 | char *point; | 87 | char *point; |
65 | const char* collectionString = "<Task "; | 88 | const char* collectionString = "<Task "; |
89 | int strLen = strlen(collectionString); | ||
66 | while ( dt+i != 0 && ( point = strstr( dt+i, collectionString ) ) != 0l ) { | 90 | while ( dt+i != 0 && ( point = strstr( dt+i, collectionString ) ) != 0l ) { |
67 | i = point -dt; | 91 | i = point -dt; |
68 | i+= strlen(collectionString); | 92 | i+= strLen; |
93 | qWarning("Found a start at %d %d", i, (point-dt) ); | ||
94 | |||
69 | OTodo ev; | 95 | OTodo ev; |
70 | m_year = m_month = m_day = 0; | 96 | m_year = m_month = m_day = 0; |
71 | 97 | ||
72 | while ( TRUE ) { | 98 | while ( TRUE ) { |
73 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) | 99 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) |
74 | ++i; | 100 | ++i; |
75 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) | 101 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) |
76 | break; | 102 | break; |
77 | 103 | ||
78 | // we have another attribute, read it. | 104 | // we have another attribute, read it. |
79 | int j = i; | 105 | int j = i; |
80 | while ( j < len && dt[j] != '=' ) | 106 | while ( j < len && dt[j] != '=' ) |
@@ -111,35 +137,38 @@ bool OTodoAccessXML::load() { | |||
111 | if ( haveEnt ) | 137 | if ( haveEnt ) |
112 | str = Qtopia::plainString( str ); | 138 | str = Qtopia::plainString( str ); |
113 | 139 | ||
114 | /* | 140 | /* |
115 | * add key + value | 141 | * add key + value |
116 | */ | 142 | */ |
117 | todo( &dict, ev, attr, str ); | 143 | todo( &dict, ev, attr, str ); |
118 | 144 | ||
119 | } | 145 | } |
120 | /* | 146 | /* |
121 | * now add it | 147 | * now add it |
122 | */ | 148 | */ |
149 | qWarning("End at %d", i ); | ||
123 | if (m_events.contains( ev.uid() ) || ev.uid() == 0) { | 150 | if (m_events.contains( ev.uid() ) || ev.uid() == 0) { |
124 | ev.setUid( 1 ); | 151 | ev.setUid( 1 ); |
125 | m_changed = true; | 152 | m_changed = true; |
126 | } | 153 | } |
127 | if ( ev.hasDueDate() ) { | 154 | if ( ev.hasDueDate() ) { |
128 | ev.setDueDate( QDate(m_year, m_month, m_day) ); | 155 | ev.setDueDate( QDate(m_year, m_month, m_day) ); |
129 | } | 156 | } |
130 | m_events.insert(ev.uid(), ev ); | 157 | m_events.insert(ev.uid(), ev ); |
131 | m_year = m_month = m_day = -1; | 158 | m_year = m_month = m_day = -1; |
132 | } | 159 | } |
133 | 160 | ||
161 | munmap(map_addr, attribut.st_size ); | ||
162 | |||
134 | qWarning("counts %d records loaded!", m_events.count() ); | 163 | qWarning("counts %d records loaded!", m_events.count() ); |
135 | return true; | 164 | return true; |
136 | } | 165 | } |
137 | bool OTodoAccessXML::reload() { | 166 | bool OTodoAccessXML::reload() { |
138 | return load(); | 167 | return load(); |
139 | } | 168 | } |
140 | bool OTodoAccessXML::save() { | 169 | bool OTodoAccessXML::save() { |
141 | // qWarning("saving"); | 170 | // qWarning("saving"); |
142 | if (!m_opened || !m_changed ) { | 171 | if (!m_opened || !m_changed ) { |
143 | // qWarning("not saving"); | 172 | // qWarning("not saving"); |
144 | return true; | 173 | return true; |
145 | } | 174 | } |