bool GroupDavGlobals::interpretCalendarDownloadItemsJob( KCal::CalendarAdaptor *adaptor, KIO::Job *job, const QString &jobData ) { kdDebug(5800) << "GroupDavGlobals::interpretCalendarDownloadItemsJob, iCalendar=" << endl; kdDebug(5800) << jobData << endl; if ( !adaptor || !job ) return false; KCal::CalendarLocal calendar( QString::fromLatin1("UTC") ); KCal::ICalFormat ical; calendar.setTimeZoneId( adaptor->resource()->timeZoneId() ); KCal::Incidence::List incidences; if ( ical.fromString( &calendar, jobData ) ) { KCal::Incidence::List raw = calendar.rawIncidences(); KCal::Incidence::List::Iterator it = raw.begin(); if ( raw.count() != 1 ) { kdError() << "Parsed iCalendar does not contain exactly one event." << endl; return false; } KCal::Incidence *inc = (raw.front())->clone(); if ( !inc ) return false; KIO::SimpleJob *sjob = dynamic_cast<KIO::SimpleJob *>(job); KURL remoteId; if ( sjob ) remoteId = sjob->url(); QString fingerprint = extractFingerprint( job, jobData ); adaptor->calendarItemDownloaded( inc, inc->uid(), remoteId, fingerprint, remoteId.prettyURL() ); return true; } else { kdError() << "Unable to parse iCalendar" << endl; } return false; }
KCal::Journal* ResourceKolab::addNote( const QString& data, const QString& subresource, quint32 sernum, const QString &mimetype ) { KCal::Journal* journal = 0; // FIXME: This does not take into account the time zone! KCal::ICalFormat formatter; if ( mimetype == attachmentMimeType ) journal = Note::xmlToJournal( data ); else journal = static_cast<KCal::Journal*>( formatter.fromString( data ) ); Q_ASSERT( journal ); if( journal && !mUidMap.contains( journal->uid() ) ) { if ( addNote( journal, subresource, sernum ) ) return journal; else delete journal; } else if ( journal && mUidMap.contains( journal->uid() ) ) { //For debugging kDebug( 5500 ) << "mUidMap already contains" << journal->uid(); } return 0; }
/** Report a list of calendar incidences (events or to-dos), with the * right objtype and objformat. * * This function exists because the logic for converting the events or to-dos * is the same, only the objtype and format is different. */ bool KCalSharedResource::report_incidence(OSyncDataSource *dsobj, OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, KCal::Incidence *e, OSyncObjFormat *objformat) { /* Build a local calendar for the incidence data */ KCal::CalendarLocal cal(calendar->timeZoneId()); cal.addIncidence(e->clone()); /* Convert the data to vcalendar */ KCal::ICalFormat format; QString data = format.toString(&cal); return dsobj->report_change(sink, info, ctx, e->uid(), data, calc_hash(e), objformat); }
void Groupwise::getCalendar(const KURL &url) { QString u = soapUrl(url); QString user = url.user(); QString pass = url.pass(); debugMessage("URL: " + u); debugMessage("User: "******"Password: "******"UTC")); kdDebug() << "Login" << endl; if(!server.login()) { errorMessage(i18n("Unable to login: "******"Read calendar" << endl; if(!server.readCalendarSynchronous(&calendar)) { errorMessage(i18n("Unable to read calendar data: ") + server.errorText()); } kdDebug() << "Logout" << endl; server.logout(); } KCal::ICalFormat format; QString ical = format.toString(&calendar); data(ical.utf8()); finished(); }
/** Add or change an incidence on the calendar. This function * is used for events and to-dos */ bool KCalSharedResource::commit(OSyncDataSource *dsobj, OSyncContext *ctx, OSyncChange *chg) { OSyncChangeType type = osync_change_get_changetype(chg); switch (type) { case OSYNC_CHANGE_TYPE_DELETED: { KCal::Incidence *e = calendar->incidence(QString::fromUtf8(osync_change_get_uid(chg))); if (!e) { osync_context_report_error(ctx, OSYNC_ERROR_FILE_NOT_FOUND, "Event not found while deleting"); return false; } calendar->deleteIncidence(e); break; } case OSYNC_CHANGE_TYPE_ADDED: case OSYNC_CHANGE_TYPE_MODIFIED: { KCal::ICalFormat format; OSyncData *odata = osync_change_get_data(chg); char *databuf; //size_t databuf_size; // osync_data_get_data requires an unsigned int which is not compatible with size_t on 64bit machines unsigned int databuf_size = 0; osync_data_get_data(odata, &databuf, &databuf_size); /* First, parse to a temporary calendar, because * we should set the uid on the events */ KCal::CalendarLocal cal(QString::fromLatin1( "UTC" )); QString data = QString::fromUtf8(databuf, databuf_size); if (!format.fromString(&cal, data)) { osync_context_report_error(ctx, OSYNC_ERROR_CONVERT, "Couldn't import calendar data"); return false; } KCal::Incidence *oldevt = calendar->incidence(QString::fromUtf8(osync_change_get_uid(chg))); if (oldevt) { calendar->deleteIncidence(oldevt); } /* Add the events from the temporary calendar, setting the UID * * We iterate over the list, but it should have only one event. */ KCal::Incidence::List evts = cal.incidences(); for (KCal::Incidence::List::ConstIterator i = evts.begin(); i != evts.end(); i++) { KCal::Incidence *e = (*i)->clone(); if (type == OSYNC_CHANGE_TYPE_MODIFIED) e->setUid(QString::fromUtf8(osync_change_get_uid(chg))); // if we run with a configured category filter, but the received added incidence does // not contain that category, add the filter-categories so that the incidence will be // found again on the next sync if ( ! dsobj->has_category(e->categories()) ) { QStringList cats = e->categories(); for (QStringList::const_iterator it = dsobj->categories.constBegin(); it != dsobj->categories.constEnd(); ++it ) cats.append(*it); e->setCategories(cats); } osync_change_set_uid(chg, e->uid().utf8()); QString hash = calc_hash(*i); osync_change_set_hash(chg, hash.utf8()); calendar->addIncidence(e); } break; } default: { osync_context_report_error(ctx, OSYNC_ERROR_NOT_SUPPORTED, "Invalid or unsupported change type"); return false; } } return true; }
int main( int argc, char **argv ) { KAboutData aboutData( "soapdebug", 0, ki18n("Groupwise Soap Debug"), "0.1" ); aboutData.addAuthor( ki18n("Cornelius Schumacher"), KLocalizedString(), "*****@*****.**" ); KCmdLineArgs::init( argc, argv, &aboutData ); KCmdLineOptions options; options.add("s"); options.add("server <hostname>", ki18n("Server")); options.add("u"); options.add("user <string>", ki18n("User")); options.add("p"); options.add("password <string>", ki18n("Password")); options.add("f"); options.add("freebusy-user <string>", ki18n("Free/Busy user name")); options.add("addressbook-id <string>", ki18n("Address book identifier")); KCmdLineArgs::addCmdLineOptions( options ); KApplication app; KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); QString user = args->getOption( "user" ); QString pass = args->getOption( "password" ); QString url = args->getOption( "server" ); #if 1 if ( user.isEmpty() ) { kError() <<"Need user."; return 1; } if ( pass.isEmpty() ) { kError() <<"Need password."; return 1; } if ( url.isEmpty() ) { kError() <<"Need server."; return 1; } #endif KDateTime::Spec spec = KDateTime::Spec::LocalZone(); GroupwiseServer server( url, user, pass, spec, 0 ); #if 1 if ( !server.login() ) { kError() <<"Unable to login to server" << url; return 1; } #endif #if 0 server.dumpData(); #endif #if 0 server.getCategoryList(); #endif #if 0 server.dumpFolderList(); #endif #if 0 QString fbUser = args->getOption( "freebusy-user" ); if ( fbUser.isEmpty() ) { kError() <<"Need user for which the freebusy data should be retrieved."; } else { KCal::FreeBusy *fb = new KCal::FreeBusy; server.readFreeBusy( "user1", QDate( 2004, 9, 1 ), QDate( 2004, 10, 31 ), fb ); } #endif #if 0 KTemporaryFile temp; temp.setautoRemove(false); temp.open(); KCal::ResourceLocal resource( temp.fileName() ); resource.setActive( true ); KCal::CalendarResources calendar; calendar.resourceManager()->add( &resource ); kDebug() <<"Login"; if ( !server.login() ) { kDebug() <<"Unable to login."; } else { kDebug() <<"Read calendar"; if ( !server.readCalendarSynchronous( &resource ) ) { kDebug() <<"Unable to read calendar data."; } kDebug() <<"Logout"; server.logout(); } KCal::ICalFormat format; QString ical = format.toString( &calendar ); kDebug() <<"ICALENDAR:" << ical; #endif #if 0 QString id = args->getOption( "addressbook-id" ); kDebug() <<"ADDRESSBOOK ID:" << id; QStringList ids; ids.append( id ); KABC::ResourceMemory resource; kDebug() <<"Login"; if ( !server.login() ) { kError() <<"Unable to login."; } else { kDebug() <<"Read Addressbook"; if ( !server.readAddressBooksSynchronous( ids, &resource ) ) { kError() <<"Unable to read addressbook data."; } kDebug() <<"Logout"; server.logout(); } KABC::Addressee::List addressees; KABC::Resource::Iterator it2; for( it2 = resource.begin(); it2 != resource.end(); ++it2 ) { kDebug() <<"ADDRESSEE:" << (*it2).fullEmail(); addressees.append( *it2 ); } #endif #if 0 server.getDelta(); #endif server.logout(); return 0; }
bool ICalReport::generate() { #if KDE_IS_VERSION(3,4,89) KCal::CalendarLocal cal("UTC"); #else KCal::CalendarLocal cal; #endif if( !open()) { tjWarning(i18n("Can not open ICal File '%1' for writing!") .arg(fileName)); return false; } TaskList filteredList; if (!filterTaskList(filteredList, 0, getHideTask(), getRollUpTask())) return false; // Make sure that parents are in front of childs. We need this later to set // the relation. filteredList.setSorting(CoreAttributesList::TreeMode, 0); filteredList.setSorting(CoreAttributesList::StartUp, 1); sortTaskList(filteredList); ResourceList filteredResourceList; if (!filterResourceList(filteredResourceList, 0, hideResource, rollUpResource)) return false; sortResourceList(filteredResourceList); QPtrDict<KCal::Todo> toDoDict; QPtrDict<KCal::Event> eventDict; for (TaskListIterator tli(filteredList); *tli != 0; ++tli) { // Generate a TODO item for each task. KCal::Todo* todo = generateTODO(*tli, filteredResourceList); // In case we have the parent in the list set the relation pointer. if((*tli)->getParent() && toDoDict.find((*tli)->getParent())) todo->setRelatedTo(toDoDict[(*tli)->getParent()]); // Insert the just created TODO into the calendar. cal.addTodo(todo); // Insert the TODO into the dict. We might need it as a parent. toDoDict.insert(*tli, todo); if ((*tli)->isLeaf() && !(*tli)->isMilestone()) { // Generate an event item for each task. KCal::Event* event = generateEvent(*tli, filteredResourceList); // In case we have the parent in the list set the relation pointer. if((*tli)->getParent() && eventDict.find((*tli)->getParent())) event->setRelatedTo(eventDict[(*tli)->getParent()]); // Insert the just created EVENT into the calendar. cal.addEvent(event); // Insert the EVENT into the dict. We might need it as a parent. eventDict.insert(*tli, event); } } // Dump the calendar in ICal format into a text file. KCal::ICalFormat format; s << format.toString(&cal) << endl; return close(); }
void Groupwise::getFreeBusy(const KURL &url) { QString file = url.filename(); if(file.right(4) != ".ifb") { QString error = i18n("Illegal filename. File has to have '.ifb' suffix."); errorMessage(error); } else { QString email = file.left(file.length() - 4); debugMessage("Email: " + email); // Sanitise local Nuernberg email addresses kdDebug() << "Email before sanitizing: " << email << endl; email = email.replace(QRegExp("\\.EMEA5-1\\.EMEA5"), ""); email = email.replace(QRegExp("\\.Suse.INTERNET"), ""); kdDebug() << "Email after sanitizing: " << email << endl; QString u = soapUrl(url); QString user = url.user(); QString pass = url.pass(); debugMessage("URL: " + u); debugMessage("User: "******"Password: "******"Need username and password to read Free/Busy information.")); } else { GroupwiseServer server(u, user, pass, 0); // FIXME: Read range from configuration or URL parameters. QDate start = QDate::currentDate().addDays(-3); QDate end = QDate::currentDate().addDays(60); fb->setDtStart(start); fb->setDtEnd(end); kdDebug() << "Login" << endl; if(!server.login()) { errorMessage(i18n("Unable to login: "******"Read free/busy" << endl; if(!server.readFreeBusy(email, start, end, fb)) { errorMessage(i18n("Unable to read free/busy data: ") + server.errorText()); } kdDebug() << "Read free/busy" << endl; server.logout(); } } #if 0 QDateTime s = QDateTime(QDate(2004, 9, 27), QTime(10, 0)); QDateTime e = QDateTime(QDate(2004, 9, 27), QTime(11, 0)); fb->addPeriod(s, e); #endif // FIXME: This does not take into account the time zone! KCal::ICalFormat format; QString ical = format.createScheduleMessage(fb, KCal::Scheduler::Publish); data(ical.utf8()); finished(); } }