Diffstat (limited to 'libopie/pim/otodoaccessxml.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | libopie/pim/otodoaccessxml.cpp | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/libopie/pim/otodoaccessxml.cpp b/libopie/pim/otodoaccessxml.cpp index 22b2469..cda300b 100644 --- a/libopie/pim/otodoaccessxml.cpp +++ b/libopie/pim/otodoaccessxml.cpp | |||
@@ -1,43 +1,71 @@ | |||
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 "otodoaccessxml.h" | 18 | #include "otodoaccessxml.h" |
19 | 19 | ||
20 | namespace { | ||
21 | // FROM TT again | ||
22 | char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) | ||
23 | { | ||
24 | char needleChar; | ||
25 | char haystackChar; | ||
26 | if (!needle || !haystack || !hLen || !nLen) | ||
27 | return 0; | ||
28 | |||
29 | const char* hsearch = haystack; | ||
30 | |||
31 | if ((needleChar = *needle++) != 0) { | ||
32 | nLen--; //(to make up for needle++) | ||
33 | do { | ||
34 | do { | ||
35 | if ((haystackChar = *hsearch++) == 0) | ||
36 | return (0); | ||
37 | if (hsearch >= haystack + hLen) | ||
38 | return (0); | ||
39 | } while (haystackChar != needleChar); | ||
40 | } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0); | ||
41 | hsearch--; | ||
42 | } | ||
43 | return ((char *)hsearch); | ||
44 | } | ||
45 | } | ||
46 | |||
47 | |||
20 | OTodoAccessXML::OTodoAccessXML( const QString& appName, | 48 | OTodoAccessXML::OTodoAccessXML( const QString& appName, |
21 | const QString& fileName ) | 49 | const QString& fileName ) |
22 | : OTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false ) | 50 | : OTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false ) |
23 | { | 51 | { |
24 | if (!fileName.isEmpty() ) | 52 | if (!fileName.isEmpty() ) |
25 | m_file = fileName; | 53 | m_file = fileName; |
26 | else | 54 | else |
27 | m_file = Global::applicationFileName( "todolist", "todolist.xml" ); | 55 | m_file = Global::applicationFileName( "todolist", "todolist.xml" ); |
28 | } | 56 | } |
29 | OTodoAccessXML::~OTodoAccessXML() { | 57 | OTodoAccessXML::~OTodoAccessXML() { |
30 | 58 | ||
31 | } | 59 | } |
32 | bool OTodoAccessXML::load() { | 60 | bool OTodoAccessXML::load() { |
33 | m_opened = true; | 61 | m_opened = true; |
34 | m_changed = false; | 62 | m_changed = false; |
35 | /* initialize dict */ | 63 | /* initialize dict */ |
36 | /* | 64 | /* |
37 | * UPDATE dict if you change anything!!! | 65 | * UPDATE dict if you change anything!!! |
38 | */ | 66 | */ |
39 | QAsciiDict<int> dict(21); | 67 | QAsciiDict<int> dict(21); |
40 | dict.setAutoDelete( TRUE ); | 68 | dict.setAutoDelete( TRUE ); |
41 | dict.insert("Categories" , new int(OTodo::Category) ); | 69 | dict.insert("Categories" , new int(OTodo::Category) ); |
42 | dict.insert("Uid" , new int(OTodo::Uid) ); | 70 | dict.insert("Uid" , new int(OTodo::Uid) ); |
43 | dict.insert("HasDate" , new int(OTodo::HasDate) ); | 71 | dict.insert("HasDate" , new int(OTodo::HasDate) ); |
@@ -64,49 +92,49 @@ bool OTodoAccessXML::load() { | |||
64 | int fd = ::open( QFile::encodeName(m_file).data(), O_RDONLY ); | 92 | int fd = ::open( QFile::encodeName(m_file).data(), O_RDONLY ); |
65 | struct stat attribut; | 93 | struct stat attribut; |
66 | if ( fd < 0 ) return false; | 94 | if ( fd < 0 ) return false; |
67 | 95 | ||
68 | if ( fstat(fd, &attribut ) == -1 ) { | 96 | if ( fstat(fd, &attribut ) == -1 ) { |
69 | ::close( fd ); | 97 | ::close( fd ); |
70 | return false; | 98 | return false; |
71 | } | 99 | } |
72 | void* map_addr = ::mmap(NULL, attribut.st_size, PROT_READ, MAP_SHARED, fd, 0 ); | 100 | void* map_addr = ::mmap(NULL, attribut.st_size, PROT_READ, MAP_SHARED, fd, 0 ); |
73 | if ( map_addr == ( (caddr_t)-1) ) { | 101 | if ( map_addr == ( (caddr_t)-1) ) { |
74 | ::close(fd ); | 102 | ::close(fd ); |
75 | return false; | 103 | return false; |
76 | } | 104 | } |
77 | /* advise the kernel who we want to read it */ | 105 | /* advise the kernel who we want to read it */ |
78 | ::madvise( map_addr, attribut.st_size, MADV_SEQUENTIAL ); | 106 | ::madvise( map_addr, attribut.st_size, MADV_SEQUENTIAL ); |
79 | /* we do not the file any more */ | 107 | /* we do not the file any more */ |
80 | ::close( fd ); | 108 | ::close( fd ); |
81 | 109 | ||
82 | char* dt = (char*)map_addr; | 110 | char* dt = (char*)map_addr; |
83 | int len = attribut.st_size; | 111 | int len = attribut.st_size; |
84 | int i = 0; | 112 | int i = 0; |
85 | char *point; | 113 | char *point; |
86 | const char* collectionString = "<Task "; | 114 | const char* collectionString = "<Task "; |
87 | int strLen = strlen(collectionString); | 115 | int strLen = strlen(collectionString); |
88 | while ( dt+i != 0 && ( point = strstr( dt+i, collectionString ) ) != 0l ) { | 116 | while ( ( point = strstrlen( dt+i, len -i, collectionString, strLen ) ) != 0l ) { |
89 | i = point -dt; | 117 | i = point -dt; |
90 | i+= strLen; | 118 | i+= strLen; |
91 | qWarning("Found a start at %d %d", i, (point-dt) ); | 119 | qWarning("Found a start at %d %d", i, (point-dt) ); |
92 | 120 | ||
93 | OTodo ev; | 121 | OTodo ev; |
94 | m_year = m_month = m_day = 0; | 122 | m_year = m_month = m_day = 0; |
95 | 123 | ||
96 | while ( TRUE ) { | 124 | while ( TRUE ) { |
97 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) | 125 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) |
98 | ++i; | 126 | ++i; |
99 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) | 127 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) |
100 | break; | 128 | break; |
101 | 129 | ||
102 | // we have another attribute, read it. | 130 | // we have another attribute, read it. |
103 | int j = i; | 131 | int j = i; |
104 | while ( j < len && dt[j] != '=' ) | 132 | while ( j < len && dt[j] != '=' ) |
105 | ++j; | 133 | ++j; |
106 | QCString attr( dt+i, j-i+1); | 134 | QCString attr( dt+i, j-i+1); |
107 | 135 | ||
108 | i = ++j; // skip = | 136 | i = ++j; // skip = |
109 | 137 | ||
110 | // find the start of quotes | 138 | // find the start of quotes |
111 | while ( i < len && dt[i] != '"' ) | 139 | while ( i < len && dt[i] != '"' ) |
112 | ++i; | 140 | ++i; |