author | ulf69 <ulf69> | 2004-08-19 23:29:05 (UTC) |
---|---|---|
committer | ulf69 <ulf69> | 2004-08-19 23:29:05 (UTC) |
commit | d81fbb0a720ba6eb0fbfa1d1eb0748877237a27e (patch) (unidiff) | |
tree | 9b723a5c4f7da306036495e35d1863fbee646984 /kabc/vcard | |
parent | d9b7a7296b031b3cf3e510a163367b9c4ab42d7a (diff) | |
download | kdepimpi-d81fbb0a720ba6eb0fbfa1d1eb0748877237a27e.zip kdepimpi-d81fbb0a720ba6eb0fbfa1d1eb0748877237a27e.tar.gz kdepimpi-d81fbb0a720ba6eb0fbfa1d1eb0748877237a27e.tar.bz2 |
bugfix: memoryleak in vCards during loading of addressbooks
-rw-r--r-- | kabc/vcard/ContentLine.cpp | 103 | ||||
-rw-r--r-- | kabc/vcard/VCardEntity.cpp | 23 | ||||
-rw-r--r-- | kabc/vcard/VCardv.cpp | 23 |
3 files changed, 97 insertions, 52 deletions
diff --git a/kabc/vcard/ContentLine.cpp b/kabc/vcard/ContentLine.cpp index 6fa1a8f..0fb5b5d 100644 --- a/kabc/vcard/ContentLine.cpp +++ b/kabc/vcard/ContentLine.cpp | |||
@@ -1,11 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | libvcard - vCard parsing library for vCard version 3.0 | 2 | libvcard - vCard parsing library for vCard version 3.0 |
3 | 3 | ||
4 | Copyright (C) 1999 Rik Hemsley rik@kde.org | 4 | Copyright (C) 1999 Rik Hemsley rik@kde.org |
5 | 5 | ||
6 | Permission is hereby granted, free of charge, to any person obtaining a copy | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy |
7 | of this software and associated documentation files (the "Software"), to | 7 | of this software and associated documentation files (the "Software"), to |
8 | deal in the Software without restriction, including without limitation the | 8 | deal in the Software without restriction, including without limitation the |
9 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | 9 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
10 | sell copies of the Software, and to permit persons to whom the Software is | 10 | sell copies of the Software, and to permit persons to whom the Software is |
11 | furnished to do so, subject to the following conditions: | 11 | furnished to do so, subject to the following conditions: |
@@ -65,35 +65,60 @@ | |||
65 | using namespace VCARD; | 65 | using namespace VCARD; |
66 | 66 | ||
67 | ContentLine::ContentLine() | 67 | ContentLine::ContentLine() |
68 | :Entity(), | 68 | :Entity(), |
69 | value_(0) | 69 | value_(0) |
70 | { | 70 | { |
71 | paramList_.setAutoDelete( TRUE ); | ||
71 | } | 72 | } |
72 | 73 | ||
73 | ContentLine::ContentLine(const ContentLine & x) | 74 | ContentLine::ContentLine(const ContentLine & x) |
74 | :Entity(x), | 75 | :Entity(x), |
75 | group_ (x.group_), | 76 | group_ (x.group_), |
76 | name_ (x.name_), | 77 | name_ (x.name_), |
77 | paramList_(x.paramList_), | 78 | /*US paramList_(x.paramList_),*/ |
78 | value_(x.value_->clone()) | 79 | value_(x.value_->clone()), |
80 | paramType_(x.paramType_), | ||
81 | valueType_(x.valueType_), | ||
82 | entityType_(x.entityType_) | ||
79 | { | 83 | { |
84 | paramList_.setAutoDelete( TRUE ); | ||
85 | |||
86 | |||
87 | ParamListIterator it(x.paramList_); | ||
88 | for (; it.current(); ++it) | ||
89 | { | ||
90 | Param *p = new Param; | ||
91 | p->setName( it.current()->name() ); | ||
92 | p->setValue( it.current()->value() ); | ||
93 | paramList_.append(p); | ||
94 | } | ||
95 | |||
80 | } | 96 | } |
81 | 97 | ||
82 | ContentLine::ContentLine(const QCString & s) | 98 | ContentLine::ContentLine(const QCString & s) |
83 | :Entity(s), | 99 | :Entity(s), |
84 | value_(0) | 100 | value_(0) |
85 | { | 101 | { |
102 | paramList_.setAutoDelete( TRUE ); | ||
86 | } | 103 | } |
87 | 104 | ||
88 | ContentLine & | 105 | ContentLine & |
89 | ContentLine::operator = (ContentLine & x) | 106 | ContentLine::operator = (ContentLine & x) |
90 | { | 107 | { |
91 | if (*this == x) return *this; | 108 | if (*this == x) return *this; |
92 | 109 | ||
93 | paramList_ = x.paramList(); | 110 | ParamListIterator it(x.paramList_); |
111 | for (; it.current(); ++it) | ||
112 | { | ||
113 | Param *p = new Param; | ||
114 | p->setName( it.current()->name() ); | ||
115 | p->setValue( it.current()->value() ); | ||
116 | paramList_.append(p); | ||
117 | } | ||
118 | |||
94 | value_ = x.value_->clone(); | 119 | value_ = x.value_->clone(); |
95 | 120 | ||
96 | Entity::operator = (x); | 121 | Entity::operator = (x); |
97 | return *this; | 122 | return *this; |
98 | } | 123 | } |
99 | 124 | ||
@@ -107,15 +132,15 @@ ContentLine::operator = (const QCString & s) | |||
107 | } | 132 | } |
108 | 133 | ||
109 | bool | 134 | bool |
110 | ContentLine::operator == (ContentLine & x) | 135 | ContentLine::operator == (ContentLine & x) |
111 | { | 136 | { |
112 | x.parse(); | 137 | x.parse(); |
113 | 138 | ||
114 | QPtrListIterator<Param> it(x.paramList()); | 139 | QPtrListIterator<Param> it(x.paramList()); |
115 | 140 | ||
116 | if (!paramList_.find(it.current())) | 141 | if (!paramList_.find(it.current())) |
117 | return false; | 142 | return false; |
118 | 143 | ||
119 | return true; | 144 | return true; |
120 | } | 145 | } |
121 | 146 | ||
@@ -126,99 +151,99 @@ ContentLine::~ContentLine() | |||
126 | } | 151 | } |
127 | 152 | ||
128 | void | 153 | void |
129 | ContentLine::_parse() | 154 | ContentLine::_parse() |
130 | { | 155 | { |
131 | vDebug("parse"); | 156 | vDebug("parse"); |
132 | 157 | ||
133 | // Unqote newlines | 158 | // Unqote newlines |
134 | strRep_ = strRep_.replace( QRegExp( "\\\\n" ), "\n" ); | 159 | strRep_ = strRep_.replace( QRegExp( "\\\\n" ), "\n" ); |
135 | 160 | ||
136 | int split = strRep_.find(':'); | 161 | int split = strRep_.find(':'); |
137 | 162 | ||
138 | if (split == -1) { // invalid content line | 163 | if (split == -1) { // invalid content line |
139 | vDebug("No ':'"); | 164 | vDebug("No ':'"); |
140 | return; | 165 | return; |
141 | } | 166 | } |
142 | 167 | ||
143 | QCString firstPart(strRep_.left(split)); | 168 | QCString firstPart(strRep_.left(split)); |
144 | QCString valuePart(strRep_.mid(split + 1)); | 169 | QCString valuePart(strRep_.mid(split + 1)); |
145 | 170 | ||
146 | split = firstPart.find('.'); | 171 | split = firstPart.find('.'); |
147 | 172 | ||
148 | if (split != -1) { | 173 | if (split != -1) { |
149 | group_ = firstPart.left(split); | 174 | group_ = firstPart.left(split); |
150 | firstPart= firstPart.mid(split + 1); | 175 | firstPart= firstPart.mid(split + 1); |
151 | } | 176 | } |
152 | 177 | ||
153 | vDebug("Group == " + group_); | 178 | vDebug("Group == " + group_); |
154 | vDebug("firstPart == " + firstPart); | 179 | vDebug("firstPart == " + firstPart); |
155 | vDebug("valuePart == " + valuePart); | 180 | vDebug("valuePart == " + valuePart); |
156 | 181 | ||
157 | // Now we have the group, the name and param list together and the value. | 182 | // Now we have the group, the name and param list together and the value. |
158 | 183 | ||
159 | QStrList l; | 184 | QStrList l; |
160 | 185 | ||
161 | RTokenise(firstPart, ";", l); | 186 | RTokenise(firstPart, ";", l); |
162 | 187 | ||
163 | if (l.count() == 0) {// invalid - no name ! | 188 | if (l.count() == 0) {// invalid - no name ! |
164 | vDebug("No name for this content line !"); | 189 | vDebug("No name for this content line !"); |
165 | return; | 190 | return; |
166 | } | 191 | } |
167 | 192 | ||
168 | name_ = l.at(0); | 193 | name_ = l.at(0); |
169 | 194 | ||
170 | // Now we have the name, so the rest of 'l' is the params. | 195 | // Now we have the name, so the rest of 'l' is the params. |
171 | // Remove the name part. | 196 | // Remove the name part. |
172 | l.remove(0u); | 197 | l.remove(0u); |
173 | 198 | ||
174 | entityType_= EntityNameToEntityType(name_); | 199 | entityType_= EntityNameToEntityType(name_); |
175 | paramType_= EntityTypeToParamType(entityType_); | 200 | paramType_= EntityTypeToParamType(entityType_); |
176 | 201 | ||
177 | unsigned int i = 0; | 202 | unsigned int i = 0; |
178 | 203 | ||
179 | // For each parameter, create a new parameter of the correct type. | 204 | // For each parameter, create a new parameter of the correct type. |
180 | 205 | ||
181 | QStrListIterator it(l); | 206 | QStrListIterator it(l); |
182 | 207 | ||
183 | for (; it.current(); ++it, i++) { | 208 | for (; it.current(); ++it, i++) { |
184 | 209 | ||
185 | QCString str = *it; | 210 | QCString str = *it; |
186 | 211 | ||
187 | split = str.find("="); | 212 | split = str.find("="); |
188 | if (split < 0 ) { | 213 | if (split < 0 ) { |
189 | vDebug("No '=' in paramter."); | 214 | vDebug("No '=' in paramter."); |
190 | continue; | 215 | continue; |
191 | } | 216 | } |
192 | 217 | ||
193 | QCString paraName = str.left(split); | 218 | QCString paraName = str.left(split); |
194 | QCString paraValue = str.mid(split + 1); | 219 | QCString paraValue = str.mid(split + 1); |
195 | 220 | ||
196 | QStrList paraValues; | 221 | QStrList paraValues; |
197 | RTokenise(paraValue, ",", paraValues); | 222 | RTokenise(paraValue, ",", paraValues); |
198 | 223 | ||
199 | QStrListIterator it2( paraValues ); | 224 | QStrListIterator it2( paraValues ); |
200 | 225 | ||
201 | for(; it2.current(); ++it2) { | 226 | for(; it2.current(); ++it2) { |
202 | 227 | ||
203 | Param *p = new Param; | 228 | Param *p = new Param; |
204 | p->setName( paraName ); | 229 | p->setName( paraName ); |
205 | p->setValue( *it2 ); | 230 | p->setValue( *it2 ); |
206 | 231 | ||
207 | paramList_.append(p); | 232 | paramList_.append(p); |
208 | } | 233 | } |
209 | } | 234 | } |
210 | 235 | ||
211 | // Create a new value of the correct type. | 236 | // Create a new value of the correct type. |
212 | 237 | ||
213 | valueType_ = EntityTypeToValueType(entityType_); | 238 | valueType_ = EntityTypeToValueType(entityType_); |
214 | 239 | ||
215 | //kdDebug(5710) << "valueType: " << valueType_ << endl; | 240 | //kdDebug(5710) << "valueType: " << valueType_ << endl; |
216 | 241 | ||
217 | switch (valueType_) { | 242 | switch (valueType_) { |
218 | 243 | ||
219 | case ValueSound: value_ = new SoundValue;break; | 244 | case ValueSound: value_ = new SoundValue;break; |
220 | case ValueAgent: value_ = new AgentValue;break; | 245 | case ValueAgent: value_ = new AgentValue;break; |
221 | case ValueAddress: value_ = new AdrValue; break; | 246 | case ValueAddress: value_ = new AdrValue; break; |
222 | case ValueTel: value_ = new TelValue; break; | 247 | case ValueTel: value_ = new TelValue; break; |
223 | case ValueTextBin: value_ = new TextBinValue;break; | 248 | case ValueTextBin: value_ = new TextBinValue;break; |
224 | case ValueOrg: value_ = new OrgValue; break; | 249 | case ValueOrg: value_ = new OrgValue; break; |
@@ -232,44 +257,44 @@ ContentLine::_parse() | |||
232 | case ValueTextList: value_ = new TextListValue;break; | 257 | case ValueTextList: value_ = new TextListValue;break; |
233 | case ValueGeo: value_ = new GeoValue; break; | 258 | case ValueGeo: value_ = new GeoValue; break; |
234 | case ValueText: | 259 | case ValueText: |
235 | case ValueUnknown: | 260 | case ValueUnknown: |
236 | default: value_ = new TextValue; break; | 261 | default: value_ = new TextValue; break; |
237 | } | 262 | } |
238 | 263 | ||
239 | *value_ = valuePart; | 264 | *value_ = valuePart; |
240 | } | 265 | } |
241 | 266 | ||
242 | void | 267 | void |
243 | ContentLine::_assemble() | 268 | ContentLine::_assemble() |
244 | { | 269 | { |
245 | vDebug("Assemble (argl) - my name is \"" + name_ + "\""); | 270 | vDebug("Assemble (argl) - my name is \"" + name_ + "\""); |
246 | strRep_.truncate(0); | 271 | strRep_.truncate(0); |
247 | 272 | ||
248 | QCString line; | 273 | QCString line; |
249 | 274 | ||
250 | if (!group_.isEmpty()) | 275 | if (!group_.isEmpty()) |
251 | line += group_ + '.'; | 276 | line += group_ + '.'; |
252 | 277 | ||
253 | line += name_; | 278 | line += name_; |
254 | 279 | ||
255 | vDebug("Adding parameters"); | 280 | vDebug("Adding parameters"); |
256 | ParamListIterator it(paramList_); | 281 | ParamListIterator it(paramList_); |
257 | 282 | ||
258 | for (; it.current(); ++it) | 283 | for (; it.current(); ++it) |
259 | line += ";" + it.current()->asString(); | 284 | line += ";" + it.current()->asString(); |
260 | 285 | ||
261 | vDebug("Adding value"); | 286 | vDebug("Adding value"); |
262 | if (value_ != 0) | 287 | if (value_ != 0) |
263 | line += ":" + value_->asString(); | 288 | line += ":" + value_->asString(); |
264 | else | 289 | else |
265 | vDebug("No value"); | 290 | vDebug("No value"); |
266 | 291 | ||
267 | // Quote newlines | 292 | // Quote newlines |
268 | line = line.replace( QRegExp( "\n" ), "\\n" ); | 293 | line = line.replace( QRegExp( "\n" ), "\\n" ); |
269 | 294 | ||
270 | // Fold lines longer than 72 chars | 295 | // Fold lines longer than 72 chars |
271 | const int maxLen = 72; | 296 | const int maxLen = 72; |
272 | uint cursor = 0; | 297 | uint cursor = 0; |
273 | while( line.length() > ( cursor + 1 ) * maxLen ) { | 298 | while( line.length() > ( cursor + 1 ) * maxLen ) { |
274 | strRep_ += line.mid( cursor * maxLen, maxLen ); | 299 | strRep_ += line.mid( cursor * maxLen, maxLen ); |
275 | strRep_ += "\r\n "; | 300 | strRep_ += "\r\n "; |
diff --git a/kabc/vcard/VCardEntity.cpp b/kabc/vcard/VCardEntity.cpp index 0c21e2f..0cd2086 100644 --- a/kabc/vcard/VCardEntity.cpp +++ b/kabc/vcard/VCardEntity.cpp | |||
@@ -1,11 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | libvcard - vCard parsing library for vCard version 3.0 | 2 | libvcard - vCard parsing library for vCard version 3.0 |
3 | 3 | ||
4 | Copyright (C) 1998 Rik Hemsley rik@kde.org | 4 | Copyright (C) 1998 Rik Hemsley rik@kde.org |
5 | 5 | ||
6 | Permission is hereby granted, free of charge, to any person obtaining a copy | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy |
7 | of this software and associated documentation files (the "Software"), to | 7 | of this software and associated documentation files (the "Software"), to |
8 | deal in the Software without restriction, including without limitation the | 8 | deal in the Software without restriction, including without limitation the |
9 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | 9 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
10 | sell copies of the Software, and to permit persons to whom the Software is | 10 | sell copies of the Software, and to permit persons to whom the Software is |
11 | furnished to do so, subject to the following conditions: | 11 | furnished to do so, subject to the following conditions: |
@@ -28,22 +28,25 @@ | |||
28 | 28 | ||
29 | using namespace VCARD; | 29 | using namespace VCARD; |
30 | 30 | ||
31 | VCardEntity::VCardEntity() | 31 | VCardEntity::VCardEntity() |
32 | :Entity() | 32 | :Entity() |
33 | { | 33 | { |
34 | cardList_.setAutoDelete( TRUE ); | ||
34 | } | 35 | } |
35 | 36 | ||
36 | VCardEntity::VCardEntity(const VCardEntity & x) | 37 | VCardEntity::VCardEntity(const VCardEntity & x) |
37 | :Entity(x) | 38 | :Entity(x) |
38 | { | 39 | { |
40 | cardList_.setAutoDelete( TRUE ); | ||
39 | } | 41 | } |
40 | 42 | ||
41 | VCardEntity::VCardEntity(const QCString & s) | 43 | VCardEntity::VCardEntity(const QCString & s) |
42 | :Entity(s) | 44 | :Entity(s) |
43 | { | 45 | { |
46 | cardList_.setAutoDelete( TRUE ); | ||
44 | } | 47 | } |
45 | 48 | ||
46 | VCardEntity & | 49 | VCardEntity & |
47 | VCardEntity::operator = (VCardEntity & x) | 50 | VCardEntity::operator = (VCardEntity & x) |
48 | { | 51 | { |
49 | if (*this == x) return *this; | 52 | if (*this == x) return *this; |
@@ -72,36 +75,36 @@ VCardEntity::~VCardEntity() | |||
72 | 75 | ||
73 | void | 76 | void |
74 | VCardEntity::_parse() | 77 | VCardEntity::_parse() |
75 | { | 78 | { |
76 | vDebug("parse"); | 79 | vDebug("parse"); |
77 | QCString s(strRep_); | 80 | QCString s(strRep_); |
78 | 81 | ||
79 | int i = s.find(QRegExp("BEGIN:VCARD", false)); | 82 | int i = s.find(QRegExp("BEGIN:VCARD", false)); |
80 | 83 | ||
81 | while (i != -1) { | 84 | while (i != -1) { |
82 | 85 | ||
83 | i = s.find(QRegExp("BEGIN:VCARD", false), 11); | 86 | i = s.find(QRegExp("BEGIN:VCARD", false), 11); |
84 | 87 | ||
85 | QCString cardStr(s.left(i)); | 88 | QCString cardStr(s.left(i)); |
86 | 89 | ||
87 | VCard * v = new VCard(cardStr); | 90 | VCard * v = new VCard(cardStr); |
88 | 91 | ||
89 | cardList_.append(v); | 92 | cardList_.append(v); |
90 | 93 | ||
91 | v->parse(); | 94 | v->parse(); |
92 | 95 | ||
93 | s.remove(0, i); | 96 | s.remove(0, i); |
94 | } | 97 | } |
95 | } | 98 | } |
96 | 99 | ||
97 | void | 100 | void |
98 | VCardEntity::_assemble() | 101 | VCardEntity::_assemble() |
99 | { | 102 | { |
100 | VCardListIterator it(cardList_); | 103 | VCardListIterator it(cardList_); |
101 | 104 | ||
102 | for (; it.current(); ++it) | 105 | for (; it.current(); ++it) |
103 | strRep_ += it.current()->asString() + "\r\n"; // One CRLF for luck. | 106 | strRep_ += it.current()->asString() + "\r\n"; // One CRLF for luck. |
104 | } | 107 | } |
105 | 108 | ||
106 | VCardList & | 109 | VCardList & |
107 | VCardEntity::cardList() | 110 | VCardEntity::cardList() |
diff --git a/kabc/vcard/VCardv.cpp b/kabc/vcard/VCardv.cpp index 8d271f4..3f0a5e5 100644 --- a/kabc/vcard/VCardv.cpp +++ b/kabc/vcard/VCardv.cpp | |||
@@ -33,33 +33,50 @@ | |||
33 | 33 | ||
34 | using namespace VCARD; | 34 | using namespace VCARD; |
35 | 35 | ||
36 | VCard::VCard() | 36 | VCard::VCard() |
37 | :Entity() | 37 | :Entity() |
38 | { | 38 | { |
39 | contentLineList_.setAutoDelete( TRUE ); | ||
39 | } | 40 | } |
40 | 41 | ||
41 | VCard::VCard(const VCard & x) | 42 | VCard::VCard(const VCard & x) |
42 | :Entity(x), | 43 | :Entity(x), |
43 | group_(x.group_), | 44 | group_(x.group_) |
44 | contentLineList_(x.contentLineList_) | ||
45 | { | 45 | { |
46 | contentLineList_.setAutoDelete( TRUE ); | ||
47 | //US | ||
48 | qDebug("VCard::VCard"); | ||
49 | |||
50 | QPtrListIterator<ContentLine> it(x.contentLineList_); | ||
51 | for (; it.current(); ++it) { | ||
52 | ContentLine * c = new ContentLine(*it.current()); | ||
53 | contentLineList_.append(c); | ||
54 | } | ||
55 | |||
46 | } | 56 | } |
47 | 57 | ||
48 | VCard::VCard(const QCString & s) | 58 | VCard::VCard(const QCString & s) |
49 | :Entity(s) | 59 | :Entity(s) |
50 | { | 60 | { |
61 | contentLineList_.setAutoDelete( TRUE ); | ||
51 | } | 62 | } |
52 | 63 | ||
53 | VCard & | 64 | VCard & |
54 | VCard::operator = (VCard & x) | 65 | VCard::operator = (VCard & x) |
55 | { | 66 | { |
67 | //US | ||
68 | qDebug("VCard::operator ="); | ||
56 | if (*this == x) return *this; | 69 | if (*this == x) return *this; |
57 | 70 | ||
58 | group_ = x.group(); | 71 | group_ = x.group(); |
59 | contentLineList_= x.contentLineList_; | 72 | QPtrListIterator<ContentLine> it(x.contentLineList_); |
73 | for (; it.current(); ++it) { | ||
74 | ContentLine * c = new ContentLine(*it.current()); | ||
75 | contentLineList_.append(c); | ||
76 | } | ||
60 | 77 | ||
61 | Entity::operator = (x); | 78 | Entity::operator = (x); |
62 | return *this; | 79 | return *this; |
63 | } | 80 | } |
64 | 81 | ||
65 | VCard & | 82 | VCard & |