00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "EvolutionCalendarSource.h"
00020 #include "EvolutionMemoSource.h"
00021 #include "SyncEvolutionUtil.h"
00022
00023 #include <boost/algorithm/string.hpp>
00024
00025 static EvolutionSyncSource *createSource(const EvolutionSyncSourceParams ¶ms)
00026 {
00027 pair <string, string> sourceType = EvolutionSyncSource::getSourceType(params.m_nodes);
00028 bool isMe;
00029 bool enabled;
00030
00031 #ifdef ENABLE_ECAL
00032 enabled = e_cal_new && e_source_group_peek_sources;
00033 #else
00034 enabled = false;
00035 #endif
00036
00037 isMe = sourceType.first == "Evolution Task List";
00038 if (isMe || sourceType.first == "todo") {
00039 if (sourceType.second == "" || sourceType.second == "text/calendar") {
00040 return
00041 #ifdef ENABLE_ECAL
00042 enabled ? new EvolutionCalendarSource(E_CAL_SOURCE_TYPE_TODO, params) :
00043 #endif
00044 isMe ? RegisterSyncSource::InactiveSource : NULL;
00045 }
00046 }
00047
00048 isMe = sourceType.first == "Evolution Memos";
00049 if (isMe || sourceType.first == "memo") {
00050 if (sourceType.second == "" || sourceType.second == "text/plain") {
00051 return
00052 #ifdef ENABLE_ECAL
00053 enabled ? new EvolutionMemoSource(params) :
00054 #endif
00055 isMe ? RegisterSyncSource::InactiveSource : NULL;
00056 } else if (sourceType.second == "text/calendar") {
00057 return
00058 #ifdef ENABLE_ECAL
00059 enabled ? new EvolutionCalendarSource(E_CAL_SOURCE_TYPE_JOURNAL, params) :
00060 #endif
00061 isMe ? RegisterSyncSource::InactiveSource : NULL;
00062 } else {
00063 return NULL;
00064 }
00065 }
00066
00067 isMe = sourceType.first == "Evolution Calendar";
00068 if (isMe || sourceType.first == "calendar") {
00069 if (sourceType.second == "" || sourceType.second == "text/calendar" ||
00070 sourceType.second == "text/x-vcalendar" ) {
00071 return
00072 #ifdef ENABLE_ECAL
00073 enabled ? new EvolutionCalendarSource(E_CAL_SOURCE_TYPE_EVENT, params) :
00074 #endif
00075 isMe ? RegisterSyncSource::InactiveSource : NULL;
00076 } else {
00077 return NULL;
00078 }
00079 }
00080
00081 return NULL;
00082 }
00083
00084 static RegisterSyncSource registerMe("Evolution Calendar/Task List/Memos",
00085 #ifdef ENABLE_ECAL
00086 true,
00087 #else
00088 false,
00089 #endif
00090 createSource,
00091 "Evolution Calendar = calendar = events = evolution-events\n"
00092 " always uses iCalendar 2.0\n"
00093 "Evolution Task List = Evolution Tasks = todo = tasks = evolution-tasks\n"
00094 " always uses iCalendar 2.0\n"
00095 "Evolution Memos = memo = memos = evolution-memos\n"
00096 " plain text in UTF-8 (default) = text/plain\n"
00097 " iCalendar 2.0 = text/calendar\n"
00098 " The later format is not tested because none of the\n"
00099 " supported SyncML servers accepts it.\n",
00100 Values() +
00101 (Aliases("Evolution Calendar") + "evolution-calendar") +
00102 (Aliases("Evolution Task List") + "Evolution Tasks" + "evolution-tasks") +
00103 (Aliases("Evolution Memos") + "evolution-memos"));
00104
00105 #ifdef ENABLE_ECAL
00106 #ifdef ENABLE_UNIT_TESTS
00107
00108 class EvolutionCalendarTest : public CppUnit::TestFixture {
00109 CPPUNIT_TEST_SUITE(EvolutionCalendarTest);
00110 CPPUNIT_TEST(testInstantiate);
00111 CPPUNIT_TEST(testOpenDefaultCalendar);
00112 CPPUNIT_TEST(testOpenDefaultTodo);
00113 CPPUNIT_TEST(testOpenDefaultMemo);
00114 CPPUNIT_TEST(testTimezones);
00115 CPPUNIT_TEST_SUITE_END();
00116
00117 protected:
00118 static string addItem(boost::shared_ptr<EvolutionSyncSource> source,
00119 string &data) {
00120 SyncItem item;
00121
00122 item.setData(data.c_str(), data.size());
00123 source->addItemThrow(item);
00124 CPPUNIT_ASSERT(item.getKey());
00125 return item.getKey();
00126 }
00127
00128 void testInstantiate() {
00129 boost::shared_ptr<EvolutionSyncSource> source;
00130 source.reset(EvolutionSyncSource::createTestingSource("calendar", "calendar", true));
00131 source.reset(EvolutionSyncSource::createTestingSource("calendar", "evolution-calendar", true));
00132 source.reset(EvolutionSyncSource::createTestingSource("calendar", "Evolution Calendar:text/calendar", true));
00133
00134 source.reset(EvolutionSyncSource::createTestingSource("calendar", "tasks", true));
00135 source.reset(EvolutionSyncSource::createTestingSource("calendar", "evolution-tasks", true));
00136 source.reset(EvolutionSyncSource::createTestingSource("calendar", "Evolution Tasks", true));
00137 source.reset(EvolutionSyncSource::createTestingSource("calendar", "Evolution Task List:text/calendar", true));
00138
00139 source.reset(EvolutionSyncSource::createTestingSource("calendar", "memos", true));
00140 source.reset(EvolutionSyncSource::createTestingSource("calendar", "evolution-memos", true));
00141 source.reset(EvolutionSyncSource::createTestingSource("calendar", "Evolution Memos:text/plain", true));
00142 source.reset(EvolutionSyncSource::createTestingSource("calendar", "Evolution Memos:text/calendar", true));
00143 }
00144
00145 void testOpenDefaultCalendar() {
00146 boost::shared_ptr<EvolutionSyncSource> source;
00147 source.reset(EvolutionSyncSource::createTestingSource("calendar", "evolution-calendar", true, NULL));
00148 CPPUNIT_ASSERT_NO_THROW(source->open());
00149 }
00150
00151 void testOpenDefaultTodo() {
00152 boost::shared_ptr<EvolutionSyncSource> source;
00153 source.reset(EvolutionSyncSource::createTestingSource("calendar", "evolution-tasks", true, NULL));
00154 CPPUNIT_ASSERT_NO_THROW(source->open());
00155 }
00156
00157 void testOpenDefaultMemo() {
00158 boost::shared_ptr<EvolutionSyncSource> source;
00159 source.reset(EvolutionSyncSource::createTestingSource("calendar", "evolution-memos", true, NULL));
00160 CPPUNIT_ASSERT_NO_THROW(source->open());
00161 }
00162
00163 void testTimezones() {
00164 const char *prefix = getenv("CLIENT_TEST_EVOLUTION_PREFIX");
00165 if (!prefix) {
00166 prefix = "SyncEvolution_Test_";
00167 }
00168
00169 boost::shared_ptr<EvolutionSyncSource> source;
00170 source.reset(EvolutionSyncSource::createTestingSource("ical20", "evolution-calendar", true, prefix));
00171 CPPUNIT_ASSERT_NO_THROW(source->open());
00172
00173 string newyork =
00174 "BEGIN:VCALENDAR\n"
00175 "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
00176 "VERSION:2.0\n"
00177 "BEGIN:VTIMEZONE\n"
00178 "TZID:America/New_York\n"
00179 "BEGIN:STANDARD\n"
00180 "TZOFFSETFROM:-0400\n"
00181 "TZOFFSETTO:-0500\n"
00182 "TZNAME:EST\n"
00183 "DTSTART:19701025T020000\n"
00184 "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n"
00185 "END:STANDARD\n"
00186 "BEGIN:DAYLIGHT\n"
00187 "TZOFFSETFROM:-0500\n"
00188 "TZOFFSETTO:-0400\n"
00189 "TZNAME:EDT\n"
00190 "DTSTART:19700405T020000\n"
00191 "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4\n"
00192 "END:DAYLIGHT\n"
00193 "END:VTIMEZONE\n"
00194 "BEGIN:VEVENT\n"
00195 "UID:artificial\n"
00196 "DTSTAMP:20060416T205224Z\n"
00197 "DTSTART;TZID=America/New_York:20060406T140000\n"
00198 "DTEND;TZID=America/New_York:20060406T143000\n"
00199 "TRANSP:OPAQUE\n"
00200 "SEQUENCE:2\n"
00201 "SUMMARY:timezone New York with custom definition\n"
00202 "DESCRIPTION:timezone New York with custom definition\n"
00203 "CLASS:PUBLIC\n"
00204 "CREATED:20060416T205301Z\n"
00205 "LAST-MODIFIED:20060416T205301Z\n"
00206 "END:VEVENT\n"
00207 "END:VCALENDAR\n";
00208
00209 string luid;
00210 CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, newyork));
00211
00212 string newyork_suffix = newyork;
00213 boost::replace_first(newyork_suffix,
00214 "UID:artificial",
00215 "UID:artificial-2");
00216 boost::replace_all(newyork_suffix,
00217 "TZID:America/New_York",
00218 "TZID://FOOBAR/America/New_York-SUFFIX");
00219 CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, newyork_suffix));
00220
00221
00222 string notimezone =
00223 "BEGIN:VCALENDAR\n"
00224 "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
00225 "VERSION:2.0\n"
00226 "BEGIN:VEVENT\n"
00227 "UID:artificial-3\n"
00228 "DTSTAMP:20060416T205224Z\n"
00229 "DTSTART;TZID=America/New_York:20060406T140000\n"
00230 "DTEND;TZID=America/New_York:20060406T143000\n"
00231 "TRANSP:OPAQUE\n"
00232 "SEQUENCE:2\n"
00233 "SUMMARY:timezone New York without custom definition\n"
00234 "DESCRIPTION:timezone New York without custom definition\n"
00235 "CLASS:PUBLIC\n"
00236 "CREATED:20060416T205301Z\n"
00237 "LAST-MODIFIED:20060416T205301Z\n"
00238 "END:VEVENT\n"
00239 "END:VCALENDAR\n";
00240 CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, notimezone));
00241
00242
00243 string fake_march =
00244 "BEGIN:VCALENDAR\n"
00245 "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
00246 "VERSION:2.0\n"
00247 "BEGIN:VTIMEZONE\n"
00248 "TZID:FAKE\n"
00249 "BEGIN:STANDARD\n"
00250 "TZOFFSETFROM:-0400\n"
00251 "TZOFFSETTO:-0500\n"
00252 "TZNAME:EST MARCH\n"
00253 "DTSTART:19701025T020000\n"
00254 "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n"
00255 "END:STANDARD\n"
00256 "BEGIN:DAYLIGHT\n"
00257 "TZOFFSETFROM:-0500\n"
00258 "TZOFFSETTO:-0400\n"
00259 "TZNAME:EDT\n"
00260 "DTSTART:19700405T020000\n"
00261 "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=3\n"
00262 "END:DAYLIGHT\n"
00263 "END:VTIMEZONE\n"
00264 "BEGIN:VEVENT\n"
00265 "UID:artificial-4\n"
00266 "DTSTAMP:20060416T205224Z\n"
00267 "DTSTART;TZID=FAKE:20060406T140000\n"
00268 "DTEND;TZID=FAKE:20060406T143000\n"
00269 "TRANSP:OPAQUE\n"
00270 "SEQUENCE:2\n"
00271 "SUMMARY:fake timezone with daylight starting in March\n"
00272 "CLASS:PUBLIC\n"
00273 "CREATED:20060416T205301Z\n"
00274 "LAST-MODIFIED:20060416T205301Z\n"
00275 "END:VEVENT\n"
00276 "END:VCALENDAR\n";
00277 CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, fake_march));
00278
00279 string fake_may = fake_march;
00280 boost::replace_first(fake_may,
00281 "UID:artificial-4",
00282 "UID:artificial-5");
00283 boost::replace_first(fake_may,
00284 "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=3",
00285 "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=5");
00286 boost::replace_first(fake_may,
00287 "starting in March",
00288 "starting in May");
00289 boost::replace_first(fake_may,
00290 "TZNAME:EST MARCH",
00291 "TZNAME:EST MAY");
00292 CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, fake_may));
00293
00294
00295 CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, fake_may));
00296 }
00297 };
00298
00299 SYNCEVOLUTION_TEST_SUITE_REGISTRATION(EvolutionCalendarTest);
00300
00301 #endif // ENABLE_UNIT_TESTS
00302
00303 #ifdef ENABLE_INTEGRATION_TESTS
00304
00305 namespace {
00306 #if 0
00307 }
00308 #endif
00309
00310 static class iCal20Test : public RegisterSyncSourceTest {
00311 public:
00312 iCal20Test() : RegisterSyncSourceTest("ical20", "ical20") {}
00313
00314 virtual void updateConfig(ClientTestConfig &config) const
00315 {
00316 config.type = "evolution-calendar";
00317 }
00318 } iCal20Test;
00319
00320 static class iTodo20Test : public RegisterSyncSourceTest {
00321 public:
00322 iTodo20Test() : RegisterSyncSourceTest("itodo20", "itodo20") {}
00323
00324 virtual void updateConfig(ClientTestConfig &config) const
00325 {
00326 config.type = "evolution-tasks";
00327 }
00328 } iTodo20Test;
00329
00330 static class MemoTest : public RegisterSyncSourceTest {
00331 public:
00332 MemoTest() : RegisterSyncSourceTest("text", "") {}
00333
00334 virtual void updateConfig(ClientTestConfig &config) const
00335 {
00336 config.uri = "note";
00337 config.type = "Evolution Memos";
00338 config.insertItem =
00339 "BEGIN:VCALENDAR\n"
00340 "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
00341 "VERSION:2.0\n"
00342 "METHOD:PUBLISH\n"
00343 "BEGIN:VJOURNAL\n"
00344 "SUMMARY:Summary\n"
00345 "DESCRIPTION:Summary\\nBody text\n"
00346 "END:VJOURNAL\n"
00347 "END:VCALENDAR\n";
00348 config.updateItem =
00349 "BEGIN:VCALENDAR\n"
00350 "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
00351 "VERSION:2.0\n"
00352 "METHOD:PUBLISH\n"
00353 "BEGIN:VJOURNAL\n"
00354 "SUMMARY:Summary Modified\n"
00355 "DESCRIPTION:Summary Modified\\nBody text\n"
00356 "END:VJOURNAL\n"
00357 "END:VCALENDAR\n";
00358
00359 config.mergeItem1 = config.updateItem;
00360 config.mergeItem2 =
00361 "BEGIN:VCALENDAR\n"
00362 "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
00363 "VERSION:2.0\n"
00364 "METHOD:PUBLISH\n"
00365 "BEGIN:VJOURNAL\n"
00366 "SUMMARY:Summary\n"
00367 "DESCRIPTION:Summary\\nBody modified\n"
00368 "END:VJOURNAL\n"
00369 "END:VCALENDAR\n";
00370 config.templateItem = config.insertItem;
00371 config.uniqueProperties = "SUMMARY:DESCRIPTION";
00372 config.sizeProperty = "DESCRIPTION";
00373 config.import = ClientTest::import;
00374 config.dump = dump;
00375 config.testcases = "testcases/imemo20.ics";
00376 config.type = "evolution-memos";
00377 }
00378 } memoTest;
00379
00380 }
00381 #endif // ENABLE_INTEGRATION_TESTS
00382
00383 #endif // ENABLE_ECAL