konsolekalendar Library API Documentation

main.cpp

00001 /******************************************************************************* 00002 * main.cpp * 00003 * * 00004 * KonsoleKalendar is a command line interface to KDE calendars * 00005 * Copyright (C) 2002-2004 Tuukka Pasanen <illuusio@mailcity.com> * 00006 * Copyright (C) 2003-2004 Allen Winter <awinterz@users.sourceforge.net> * 00007 * * 00008 * This program is free software; you can redistribute it and/or modify * 00009 * it under the terms of the GNU General Public License as published by * 00010 * the Free Software Foundation; either version 2 of the License, or * 00011 * (at your option) any later version. * 00012 * * 00013 * This program is distributed in the hope that it will be useful, * 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00016 * GNU General Public License for more details. * 00017 * * 00018 * You should have received a copy of the GNU General Public License * 00019 * along with this program; if not, write to the Free Software * 00020 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 00021 * * 00022 * As a special exception, permission is given to link this program * 00023 * with any edition of Qt, and distribute the resulting executable, * 00024 * without including the source code for Qt in the source distribution. * 00025 * * 00026 ******************************************************************************/ 00027 00028 #ifdef HAVE_CONFIG_H 00029 #include "config.h" 00030 #endif 00031 00032 #if TIME_WITH_SYS_TIME 00033 # include <sys/time.h> 00034 # include <time.h> 00035 #else 00036 # if HAVE_SYS_TIME_H 00037 # include <sys/time.h> 00038 # else 00039 # include <time.h> 00040 # endif 00041 #endif 00042 00043 #include <kcmdlineargs.h> 00044 #include <kaboutdata.h> 00045 #include <klocale.h> 00046 #include <kglobal.h> 00047 #include <kconfig.h> 00048 #include <kstandarddirs.h> 00049 #include <kdebug.h> 00050 00051 #include <libkcal/calformat.h> 00052 #include <libkcal/calendarresources.h> 00053 #include <libkcal/resourcelocal.h> 00054 00055 #include <qdatetime.h> 00056 #include <qfile.h> 00057 00058 #include <stdlib.h> 00059 #include <iostream> 00060 00061 #include "konsolekalendar.h" 00062 #include "konsolekalendarepoch.h" 00063 00064 #include "konsolekalendarvariables.h" 00065 00066 using namespace KCal; 00067 using namespace std; 00068 00069 static const char progName[] = "konsolekalendar"; 00070 static const char progDisplay[] = "KonsoleKalendar"; 00071 static const char progVersion[] = "1.2.0"; 00072 static const char progDesc[] = "A command line interface to KDE calendars"; 00073 static const char progURL[] = "pim.kde.org/components/konsolekalendar.php"; 00074 00075 00076 static KCmdLineOptions options[] = 00077 { 00078 { "help", 00079 I18N_NOOP( "Print this help and exit" ), 0 }, 00080 { "verbose", 00081 I18N_NOOP( "Print helpful runtime messages" ), 0 }, 00082 { "dry-run", 00083 I18N_NOOP( "Print what would have been done, but do not execute" ), 0 }, 00084 { "file <calendar-file>", 00085 I18N_NOOP( "Specify which calendar you want to use" ), 0 }, 00086 00087 { ":", 00088 I18N_NOOP( "Major operation modes:" ), 0 }, 00089 { "view", 00090 I18N_NOOP( " Print calendar events in specified export format" ), 0 }, 00091 { "add", 00092 I18N_NOOP( " Insert an event into the calendar" ), 0 }, 00093 { "change", 00094 I18N_NOOP( " Modify an existing calendar event" ), 0 }, 00095 { "delete", 00096 I18N_NOOP( " Remove an existing calendar event" ), 0 }, 00097 { "create", 00098 I18N_NOOP( " Create new calendar file if one does not exist" ), 0 }, 00099 { "import <import-file>", 00100 I18N_NOOP( " Import this calendar to main calendar" ), 0 }, 00101 00102 { ":", 00103 I18N_NOOP( "Operation modifiers:" ), 0 }, 00104 { "all", 00105 I18N_NOOP( " View all calendar entries" ), 0 }, 00106 { "next", 00107 I18N_NOOP( " View next activity in calendar" ), 0 }, 00108 { "show-next <days>", 00109 I18N_NOOP( " From start date show next # days' activities" ), 0 }, 00110 { "uid <uid>", 00111 I18N_NOOP( " Event Unique-string identifier" ), 0 }, 00112 { "date <start-date>", 00113 I18N_NOOP( " Start from this day [YYYY-MM-DD]" ), 0 }, 00114 { "time <start-time>", 00115 I18N_NOOP( " Start from this time [HH:MM:SS]" ), 0 }, 00116 { "end-date <end-date>", 00117 I18N_NOOP( " End at this day [YYYY-MM-DD]" ), 0 }, 00118 { "end-time <end-time>", 00119 I18N_NOOP( " End at this time [HH:MM:SS]" ), 0 }, 00120 { "epoch-start <epoch-time>", 00121 I18N_NOOP( " Start from this time [secs since epoch]" ), 0 }, 00122 { "epoch-end <epoch-time>", 00123 I18N_NOOP( " End at this time [secs since epoch]" ), 0 }, 00124 { "summary <summary>", 00125 I18N_NOOP( " Add summary to event (for add/change modes)" ), 0 }, 00126 { "description <description>", 00127 I18N_NOOP( "Add description to event (for add/change modes)" ), 0 }, 00128 { "location <location>", 00129 I18N_NOOP( " Add location to event (for add/change modes)" ), 0 }, 00130 00131 { ":", I18N_NOOP( "Export options:" ), 0 }, 00132 { "export-type <export-type>", 00133 I18N_NOOP( "Export file type (Default: text)" ), 0 }, 00134 { "export-file <export-file>", 00135 I18N_NOOP( "Export to file (Default: stdout)" ), 0 }, 00136 { "export-list", 00137 I18N_NOOP( " Print list of export types supported and exit" ), 0 }, 00138 00139 { "", 00140 I18N_NOOP( "Examples:\n" 00141 " konsolekalendar --view\n" 00142 " konsolekalendar --add --date 2003-06-04 " 00143 "--time 10:00 --end-time 12:00 \\\n" 00144 " --summary \"Doctor Visit\" " 00145 "--description \"Get My Head Examined\"\n" 00146 " konsolekalendar --delete --uid KOrganizer-1740326.803" ), 0 }, 00147 00148 { "", 00149 I18N_NOOP( "For more information visit the program home page at:\n" 00150 " http://pim.kde.org/components/konsolekalendar.php" ), 0 }, 00151 00152 KCmdLineLastOption 00153 }; 00154 00155 int main( int argc, char *argv[] ) 00156 { 00157 KAboutData aboutData( 00158 progName, // internal program name 00159 I18N_NOOP( progDisplay ), // displayable program name. 00160 progVersion, // version string 00161 I18N_NOOP( progDesc ), // short porgram description 00162 KAboutData::License_GPL, // license type 00163 "(c) 2002-2004, Tuukka Pasanen and Allen Winter", // copyright statement 00164 0, // any free form text 00165 progURL, // program home page address 00166 "bugs.kde.org" // bug report email address 00167 ); 00168 00169 aboutData.addAuthor( 00170 "Tuukka Pasanen", // developer's name 00171 I18N_NOOP( "Primary Author" ), // task or role 00172 "illuusio@mailcity.com", // email address 00173 0 // home page or relevant link 00174 ); 00175 aboutData.addAuthor( 00176 "Allen Winter", // developer's name 00177 I18N_NOOP( "Author" ), // task or role 00178 "awinterz@users.sourceforge.net",// email address 00179 0 // home page or relevant link 00180 ); 00181 00182 00183 00184 // KCmdLineArgs::init() final 'true' argument indicates no commandline options 00185 // for QApplication/KApplication (no KDE or Qt options) 00186 KCmdLineArgs::init( argc, argv, &aboutData, true ); 00187 KCmdLineArgs::addCmdLineOptions( options ); // Add our own options. 00188 00189 KInstance ins( progName ); 00190 00191 // Replace the KApplication call below with the three lines above 00192 // will make this a pure non-GUI application 00193 // -- thanks for the info Stephan Kulow. 00194 00195 // KApplication app( 00196 // false, //do not allowstyles - disable the loading on plugin based styles 00197 // false //GUI is not enabled - disable all GUI stuff 00198 // ); 00199 00200 KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); 00201 00202 // Default values for start date/time (today at 07:00) 00203 QDate startdate = QDate::currentDate(); 00204 QTime starttime( 7 ,0 ); 00205 00206 // Default values for end date/time (today at 17:00) 00207 QDate enddate = QDate::currentDate(); 00208 QTime endtime( 17, 0 ); 00209 00210 // Default values for switches 00211 bool view = true; 00212 bool add = false; 00213 bool change = false; 00214 bool del = false; 00215 bool create = false; 00216 bool calendarFile = false; 00217 bool importFile = false; 00218 00219 QString option; 00220 00221 KonsoleKalendarVariables variables; 00222 KonsoleKalendarEpoch epochs; 00223 00224 variables.setExportType( NONE ); 00225 variables.setFloating( false ); // by default, new events do NOT float 00226 00227 if ( args->isSet( "verbose" ) ) { 00228 variables.setVerbose( true ); 00229 } 00230 00231 if ( args->isSet( "dry-run" ) ) { 00232 variables.setDryRun( true ); 00233 } 00234 00235 /* 00236 * Switch on export list 00237 * 00238 */ 00239 if ( args->isSet( "export-list" ) ) { 00240 cout << i18n( 00241 "\nKonsoleKalendar supports these export formats:\n" 00242 " Text [Default]\n" 00243 " Short (like Text, but more compact)\n" 00244 " HTML\n" 00245 " CSV (Comma-Separated Values)\n" 00246 ).local8Bit() 00247 << endl; 00248 return 0; 00249 } 00250 00251 /* 00252 * Switch on exporting 00253 * 00254 */ 00255 if ( args->isSet( "export-type" ) ) { 00256 option = args->getOption( "export-type" ); 00257 00258 if ( option.upper() == "HTML" ) { 00259 kdDebug() << "main | export-type | Export to HTML" << endl; 00260 variables.setExportType( HTML ); 00261 } else if ( option.upper() == "CSV" ) { 00262 kdDebug() << "main | export-type | Export to CSV" << endl; 00263 variables.setExportType( CSV ); 00264 } else if ( option.upper() == "TEXT" ) { 00265 kdDebug() << "main | export-type | Export to TEXT (default)" << endl; 00266 variables.setExportType( TEXT_KONSOLEKALENDAR ); 00267 } else if ( option.upper() == "SHORT" ) { 00268 kdDebug() << "main | export-type | Export to TEXT-SHORT" << endl; 00269 variables.setExportType( TEXT_SHORT ); 00270 } else { 00271 cout << i18n( "Invalid Export Type Specified: %1" ). 00272 arg( option ).local8Bit() 00273 << endl; 00274 return 1; 00275 } 00276 } 00277 00278 /* 00279 * Switch on export file name 00280 * 00281 */ 00282 if ( args->isSet( "export-file" ) ) { 00283 option = args->getOption( "export-file" ); 00284 00285 kdDebug() << "main | parse options | " 00286 << "Export File: " 00287 << "(" << option << ")" 00288 << endl; 00289 00290 variables.setExportFile( option ); 00291 } 00292 00293 /* 00294 * Switch on View (Print Entries). This is the default mode of operation. 00295 * 00296 */ 00297 if ( args->isSet( "view" ) ) { 00298 view=true; 00299 00300 kdDebug() << "main | parse options | " 00301 << "Mode: (Print events)" 00302 << endl; 00303 } 00304 00305 /* 00306 * Switch on Add (Insert Entry) 00307 * 00308 */ 00309 if ( args->isSet( "add" ) ) { 00310 view=false; 00311 add=true; 00312 00313 kdDebug() << "main | parse options | " 00314 << "Mode: (Add event)" 00315 << endl; 00316 } 00317 00318 /* 00319 * Switch on Change (Modify Entry) 00320 * 00321 */ 00322 if ( args->isSet( "change" ) ) { 00323 view=false; 00324 change=true; 00325 00326 kdDebug() << "main | parse options | " 00327 << "Mode: (Change event)" 00328 << endl; 00329 } 00330 00331 /* 00332 * Switch on Delete (Remove Entry) 00333 * 00334 */ 00335 if ( args->isSet( "delete" ) ) { 00336 view=false; 00337 del=true; 00338 00339 kdDebug() << "main | parse options | " 00340 << "Mode: (Delete event)" 00341 << endl; 00342 } 00343 00344 /* 00345 * Switch on Create 00346 * 00347 */ 00348 if ( args->isSet( "create" ) ) { 00349 view=false; 00350 create=true; 00351 00352 kdDebug() << "main | parse options | " 00353 << "Calendar File: (Create)" 00354 << endl; 00355 } 00356 00357 00358 /* 00359 * If there is summary attached. 00360 * 00361 */ 00362 if ( args->isSet( "summary" ) ) { 00363 option = args->getOption( "summary" ); 00364 00365 kdDebug() << "main | parse options | " 00366 << "Summary: " 00367 << "(" << option << ")" 00368 << endl; 00369 00370 variables.setSummary( option ); 00371 } 00372 00373 /* 00374 * If there is description attached. 00375 * 00376 */ 00377 if ( args->isSet( "description" ) ) { 00378 option = args->getOption( "description" ); 00379 00380 kdDebug() << "main | parse options | " 00381 << "Description: " 00382 << "(" << option << ")" 00383 << endl; 00384 00385 variables.setDescription( option ); 00386 } 00387 00388 /* 00389 * If there is location information 00390 * 00391 */ 00392 if ( args->isSet( "location" ) ) { 00393 option = args->getOption( "location" ); 00394 00395 kdDebug() << "main | parse options | " 00396 << "Location: " 00397 << "(" << option << ")" 00398 << endl; 00399 00400 variables.setLocation( option ); 00401 } 00402 00403 /* 00404 * Show next happening and exit 00405 * 00406 */ 00407 if ( args->isSet( "next" ) ) 00408 { 00409 kdDebug() << "main | parse options | " 00410 << "Show next event only" 00411 << endl; 00412 00413 variables.setNext( true ); 00414 } 00415 00416 00417 /* 00418 * Set event unique string identifier 00419 * 00420 */ 00421 if (args->isSet( "uid" ) ) { 00422 option = args->getOption( "uid" ); 00423 00424 kdDebug() << "main | parse options | " 00425 << "Event UID: " 00426 << "(" << option << ")" 00427 << endl; 00428 00429 variables.setUID( option ); 00430 } 00431 00432 /* 00433 * Set starting date for calendar 00434 * 00435 */ 00436 if ( args->isSet( "date" ) ) { 00437 option = args->getOption( "date" ); 00438 00439 kdDebug() << "main | parse options | " 00440 << "Start date before conversion: " 00441 << "(" << option << ")" 00442 << endl; 00443 00444 startdate = QDate::fromString( option, Qt::ISODate ); 00445 if ( ! startdate.isValid() ) { 00446 cout << i18n( "Invalid Start Date Specified: %1" ). 00447 arg( option ).local8Bit() 00448 << endl; 00449 return 1; 00450 } 00451 kdDebug() << "main | parse options | " 00452 << "Start date after conversion: " 00453 << "(" << startdate.toString() << ")" 00454 << endl; 00455 } 00456 00457 /* 00458 * Set starting time 00459 * 00460 */ 00461 if ( args->isSet( "time" ) ) { 00462 option = args->getOption( "time" ); 00463 00464 kdDebug() << "main | parse options | " 00465 << "Start time before conversion : " 00466 << "(" << option << ")" 00467 << endl; 00468 00469 if ( option.upper() != "FLOAT" ) { 00470 starttime = QTime::fromString( option, Qt::ISODate ); 00471 if ( ! starttime.isValid() ) { 00472 cout << i18n( "Invalid Start Time Specified: %1" ). 00473 arg( option ).local8Bit() 00474 << endl; 00475 return 1; 00476 } 00477 kdDebug() << "main | parse options | " 00478 << "Start time after conversion: " 00479 << "(" << starttime.toString() << ")" 00480 << endl; 00481 } else { 00482 variables.setFloating( true ); 00483 kdDebug() << "main | parse options | " 00484 << "Floating event time specified" 00485 << endl; 00486 } 00487 } 00488 00489 /* 00490 * Set end date for calendar 00491 * 00492 */ 00493 if ( args->isSet( "end-date" ) ) { 00494 QString option = args->getOption( "end-date" ); 00495 00496 kdDebug() << "main | parse options | " 00497 << "End date before conversion: " 00498 << "(" << option << ")" 00499 << endl; 00500 00501 enddate = QDate::fromString( option, Qt::ISODate ); 00502 if ( ! enddate.isValid() ) { 00503 cout << i18n( "Invalid End Date Specified: %1" ). 00504 arg( option ).local8Bit() 00505 << endl; 00506 return 1; 00507 } 00508 kdDebug() << "main | parse options | " 00509 << "End date after conversion: " 00510 << "(" << enddate.toString() << ")" 00511 << endl; 00512 } 00513 00514 /* 00515 * Show next # days and exit 00516 * 00517 */ 00518 if ( args->isSet( "show-next" ) ) 00519 { 00520 bool ok; 00521 00522 option = args->getOption( "show-next" ); 00523 kdDebug() << "main | parse options | " 00524 << "Show " << option << " days ahead" 00525 << endl; 00526 variables.setDaysCount( option.toInt( &ok, 10 ) ); 00527 00528 if ( ! ok ) { 00529 cout << i18n( "Invalid Date Count Specified: %1" ). 00530 arg( option ).local8Bit() 00531 << endl; 00532 return 1; 00533 } 00534 00535 enddate = startdate; 00536 enddate = enddate.addDays( variables.getDaysCount() ); 00537 kdDebug() << "main | parse options | " 00538 << "End date after conversion: " 00539 << "(" << enddate.toString() << ")" 00540 << endl; 00541 } 00542 00543 /* 00544 * Set ending time 00545 * 00546 */ 00547 if ( args->isSet( "end-time" ) ) { 00548 option = args->getOption( "end-time" ); 00549 00550 kdDebug() << "main | parse options | " 00551 << "End time before conversion: " 00552 << "(" << option << ")" 00553 << endl; 00554 00555 if ( option.upper() != "FLOAT" ) { 00556 endtime = QTime::fromString( option, Qt::ISODate ); 00557 if ( ! endtime.isValid() ) { 00558 cout << i18n( "Invalid End Time Specified: %1" ). 00559 arg( option ).local8Bit() 00560 << endl; 00561 return 1; 00562 } 00563 00564 kdDebug() << "main | parse options | " 00565 << "End time after conversion: " 00566 << "(" << endtime.toString() << ")" 00567 << endl; 00568 } else { 00569 variables.setFloating( true ); 00570 kdDebug() << "main | parse options | " 00571 << "Floating event time specified" 00572 << endl; 00573 } 00574 } 00575 00576 /* 00577 * Set start date/time from epoch 00578 * 00579 */ 00580 time_t epochstart=0; 00581 if ( args->isSet( "epoch-start" ) ) { 00582 option = args->getOption( "epoch-start" ); 00583 00584 kdDebug() << "main | parse options | " 00585 << "Epoch start: " 00586 << "(" << option << ")" 00587 << endl; 00588 00589 epochstart = (time_t) option.toULong( 0, 10 ); 00590 } 00591 00592 /* 00593 * Set end date/time from epoch 00594 * 00595 */ 00596 time_t epochend=0; 00597 if ( args->isSet( "epoch-end" ) ) { 00598 option = args->getOption( "epoch-end" ); 00599 00600 kdDebug() << "main | parse options | " 00601 << "Epoch end: " 00602 << "(" << option << ")" 00603 << endl; 00604 00605 epochend = (time_t) option.toULong( 0, 10 ); 00606 } 00607 00608 if ( args->isSet( "all" ) ) { 00609 variables.setAll( true ); 00610 } else { 00611 variables.setAll( false ); 00612 } 00613 00614 if ( args->isSet( "import" ) ) { 00615 view = false; 00616 importFile = true; 00617 option = args->getOption( "import" ); 00618 variables.setImportFile( option ); 00619 00620 kdDebug() << "main | parse options | " 00621 << "importing file from: " 00622 << "(" << option << ")" 00623 << endl; 00624 } 00625 00626 KonsoleKalendar *konsolekalendar = new KonsoleKalendar( &variables ); 00627 00628 if ( args->isSet( "file" ) ) { 00629 calendarFile = true; 00630 option = args->getOption( "file" ); 00631 variables.setCalendarFile( option ); 00632 00633 /* 00634 * All modes need to know if the calendar file exists 00635 * This must be done before we get to opening biz 00636 */ 00637 bool exists = QFile::exists( variables.getCalendarFile() ); 00638 00639 if ( create ) { 00640 00641 kdDebug() << "main | createcalendar | " 00642 << "check if calendar file already exists" 00643 << endl; 00644 00645 if ( exists ) { 00646 cout << i18n( "Calendar %1 already exists" ). 00647 arg( variables.getCalendarFile() ).local8Bit() 00648 << endl; 00649 return 1; 00650 } 00651 if ( konsolekalendar->createCalendar() ) { 00652 cout << i18n( "Calendar %1 successfully created" ). 00653 arg( variables.getCalendarFile() ).local8Bit() 00654 << endl; 00655 return 0; 00656 } else { 00657 cout << i18n( "Unable to create calendar: %1" ). 00658 arg( variables.getCalendarFile() ).local8Bit() 00659 << endl; 00660 return 1; 00661 } 00662 } 00663 00664 if ( ! exists ) { 00665 cout << i18n( "Calendar file not found %1" ). 00666 arg( option ).local8Bit() 00667 << endl; 00668 cout << i18n( "Try --create to create new calendar file" ).local8Bit() 00669 << endl; 00670 return 1; 00671 } 00672 } 00673 00674 CalendarResources *calendarResource = NULL; 00675 CalendarLocal *localCalendar = NULL; 00676 00677 /* 00678 * Should we use local calendar or resource? 00679 */ 00680 variables.setTimeZoneId(); 00681 if ( args->isSet( "file" ) ) { 00682 localCalendar = new CalendarLocal( variables.getTimeZoneId() ); 00683 localCalendar->load( variables.getCalendarFile() ); 00684 variables.setCalendar( localCalendar ); 00685 } else { 00686 calendarResource = new CalendarResources( variables.getTimeZoneId() ); 00687 calendarResource->readConfig(); 00688 calendarResource->load(); 00689 variables.setCalendarResources( calendarResource ); 00690 } 00691 00692 /*************************************************************************** 00693 * Glorious date/time checking and setting code * 00694 ***************************************************************************/ 00695 QDateTime startdatetime, enddatetime; 00696 00697 // Handle case with either date or end-date unspecified 00698 if ( ! args->isSet( "end-date" ) && args->isSet( "date" ) ) { 00699 enddate = startdate; 00700 kdDebug() << "main | datetimestamp | " 00701 << "setting enddate to startdate" 00702 << endl; 00703 } else if ( args->isSet( "end-date" ) && ! args->isSet( "date" ) ) { 00704 startdate = enddate; 00705 kdDebug() << "main | datetimestamp | " 00706 << "setting startdate to enddate" 00707 << endl; 00708 } 00709 00710 // NOTE: If neither date nor end-date specified, then event will be today. 00711 00712 // Case: 00713 // End time (or epoch) unspecified, and start time (or epoch) IS specified. 00714 // In this case, set the ending to 1 hour after starting. 00715 if ( ! args->isSet( "end-time" ) && ! args->isSet( "epoch-end" ) ) { 00716 if ( args->isSet( "time" ) ) { 00717 endtime = starttime.addSecs( 60*60 ); // end is 1 hour after start 00718 kdDebug() << "main | datetimestamp | " 00719 << "setting endtime 1 hour after starttime" 00720 << endl; 00721 } else if ( args->isSet( "epoch-start" ) ) { 00722 startdatetime = epochs.epoch2QDateTime( epochstart ); 00723 enddatetime = startdatetime.addSecs( 60*60 ); 00724 kdDebug() << "main | datetimestamp | " 00725 << "setting endtime 1 hour after epochstart" 00726 << endl; 00727 } 00728 } 00729 00730 // Case: 00731 // Time (or epoch) unspecified, and end-time (or epoch) IS specified. 00732 // In this case, set the starting to 1 hour before ending. 00733 if ( ! args->isSet( "time" ) && ! args->isSet( "epoch-start" ) ) { 00734 if ( args->isSet( "end-time" ) ) { 00735 starttime = endtime.addSecs( -60*60 ); // start is 1 hour before end 00736 kdDebug() << "main | datetimestamp | " 00737 << "setting starttime 1 hour before endtime" 00738 << endl; 00739 } else if ( args->isSet( "epoch-end" ) ) { 00740 enddatetime = epochs.epoch2QDateTime( epochend ); 00741 startdatetime = enddatetime.addSecs( -60*60 ); 00742 kdDebug() << "main | datetimestamp | " 00743 << "setting starttime 1 before after epochend" 00744 << endl; 00745 } 00746 } 00747 00748 // Case: 00749 // Time (or epoch) unspecified, and end-time (or epoch) unspecified. 00750 if ( ! args->isSet( "time" ) && ! args->isSet( "epoch-start" ) && 00751 ! args->isSet( "end-time" ) && ! args->isSet( "epoch-end" ) ) { 00752 // set default start date/time 00753 startdatetime = QDateTime::QDateTime( startdate, starttime ); 00754 kdDebug() << "main | datetimestamp | " 00755 << "setting startdatetime from " 00756 << "default startdate (today) and starttime" 00757 << endl; 00758 // set default end date/time 00759 enddatetime = QDateTime::QDateTime( enddate, endtime ); 00760 kdDebug() << "main | datetimestamp | " 00761 << "setting enddatetime from " 00762 << "default enddate (today) and endtime" 00763 << endl; 00764 } 00765 00766 // Set startdatetime, enddatetime if still necessary 00767 if ( startdatetime.isNull() ) { 00768 startdatetime = QDateTime::QDateTime( startdate, starttime ); 00769 kdDebug() << "main | datetimestamp | " 00770 << "setting startdatetime from startdate and starttime" 00771 << endl; 00772 } 00773 if ( enddatetime.isNull() ) { 00774 enddatetime = QDateTime::QDateTime( enddate, endtime ); 00775 kdDebug() << "main | datetimestamp | " 00776 << "setting enddatetime from enddate and endtime" 00777 << endl; 00778 } 00779 00780 // Float check for add mode: 00781 // Events float if time AND end-time AND epoch times are UNspecified 00782 if ( add ) { 00783 if ( ! args->isSet( "time" ) && ! args->isSet( "end-time" ) && 00784 ! args->isSet( "epoch-start" ) && ! args->isSet( "epoch-end" ) ) { 00785 variables.setFloating( true ); 00786 kdDebug() << "main | floatingcheck | " 00787 << "turn-on floating event" 00788 << endl; 00789 } 00790 } 00791 00792 // Finally! Set the start/end date times 00793 if ( ! change ) { 00794 variables.setStartDateTime( startdatetime ); 00795 variables.setEndDateTime( enddatetime ); 00796 } else { 00797 // Do NOT set start/end datetimes in change mode, 00798 // unless they were specified on commandline 00799 if ( args->isSet( "time" ) || args->isSet( "epoch-start" ) || 00800 args->isSet( "end-time" ) || args->isSet( "epoch-end" ) ) { 00801 variables.setStartDateTime( startdatetime ); 00802 variables.setEndDateTime( enddatetime ); 00803 } 00804 } 00805 00806 // Some more debug prints 00807 kdDebug() << "main | datetimestamp | StartDate=" 00808 << startdatetime.toString( Qt::TextDate ) 00809 << endl; 00810 kdDebug() << "main | datetimestamp | EndDate=" 00811 << enddatetime.toString( Qt::TextDate ) 00812 << endl; 00813 00814 /*************************************************************************** 00815 * Sanity checks * 00816 ***************************************************************************/ 00817 00818 // Cannot combine modes 00819 if ( create + view + add + change + del > 1 ) { 00820 cout << i18n( 00821 "Only 1 operation mode " 00822 "(view, add, change, delete, create) " 00823 "permitted at any one time" 00824 ).local8Bit() << endl; 00825 return 1; 00826 } 00827 00828 // Cannot have a ending before starting 00829 if ( startdatetime > enddatetime ) { 00830 cout << i18n( 00831 "Ending Date/Time occurs before the Starting Date/Time" 00832 ).local8Bit() << endl; 00833 return 1; 00834 } 00835 00836 /*************************************************************************** 00837 * And away we go with the real work... * 00838 ***************************************************************************/ 00839 00840 args->clear(); // Free up some memory. 00841 00842 /* 00843 * Set our application name for use in unique IDs and error messages, 00844 * and product ID for incidence PRODID property 00845 */ 00846 QString prodId = "-//K Desktop Environment//NONSGML %1 %2//EN"; 00847 CalFormat::setApplication( progDisplay, 00848 prodId.arg( progDisplay).arg( progVersion ) ); 00849 00850 if ( importFile ) { 00851 if ( konsolekalendar->importCalendar() ) { 00852 cout << i18n( "Calendar %1 successfully imported" ). 00853 arg( variables.getImportFile() ).local8Bit() 00854 << endl; 00855 return 0; 00856 } else { 00857 cout << i18n( "Unable to import calendar: %1" ). 00858 arg( variables.getImportFile() ).local8Bit() 00859 << endl; 00860 return 1; 00861 } 00862 } 00863 00864 if ( add ) { 00865 if ( ! konsolekalendar->isEvent( startdatetime, enddatetime, 00866 variables.getSummary() ) ) { 00867 kdDebug() << "main | modework | " 00868 << "calling addEvent()" 00869 << endl; 00870 konsolekalendar->addEvent(); 00871 } else { 00872 cout << i18n( 00873 "Attempting to insert an event that already exists" 00874 ).local8Bit() << endl; 00875 return 1; 00876 } 00877 } 00878 00879 if ( change ) { 00880 kdDebug() << "main | modework | " 00881 << "calling changeEvent()" 00882 << endl; 00883 if ( ! variables.isUID() ) { 00884 cout << i18n( "Missing event UID: " 00885 "use --uid command line option" ).local8Bit() 00886 << endl; 00887 return 1; 00888 } 00889 if ( konsolekalendar->changeEvent() != true ) { 00890 cout << i18n( "No such event UID: change event failed" ).local8Bit() 00891 << endl; 00892 return 1; 00893 } 00894 kdDebug() << "main | modework | " 00895 << "successful changeEvent()" 00896 << endl; 00897 } 00898 00899 if ( del ) { 00900 kdDebug() << "main | modework | " 00901 << "calling deleteEvent()" 00902 << endl; 00903 if ( ! variables.isUID() ) { 00904 cout << i18n( "Missing event UID: " 00905 "use --uid command line option" ).local8Bit() 00906 << endl; 00907 return 1; 00908 } 00909 if ( konsolekalendar->deleteEvent() != true ) { 00910 cout << i18n( "No such event UID: delete event failed").local8Bit() 00911 << endl; 00912 return 1; 00913 } 00914 kdDebug() << "main | modework | " 00915 << "successful deleteEvent()" 00916 << endl; 00917 } 00918 00919 if ( view ) { 00920 kdDebug() << "main | modework | " 00921 << "calling showInstance() to view events" 00922 << endl; 00923 if ( ! konsolekalendar->showInstance() ) { 00924 cout << i18n( "Cannot open specified export file: %1" ). 00925 arg( variables.getExportFile() ).local8Bit() 00926 << endl; 00927 return 1; 00928 } 00929 } 00930 00931 delete konsolekalendar; 00932 00933 if ( calendarFile ) { 00934 localCalendar->close(); 00935 delete localCalendar; 00936 } else { 00937 calendarResource->close(); 00938 delete calendarResource; 00939 } 00940 00941 kdDebug() << "main | exiting" 00942 << endl; 00943 00944 return 0; 00945 }
KDE Logo
This file is part of the documentation for konsolekalendar Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Aug 27 12:53:40 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003