|
|
|
/*******************************************************************************
|
|
|
|
* main.cpp *
|
|
|
|
* *
|
|
|
|
* KonsoleKalendar is a command line interface to KDE calendars *
|
|
|
|
* Copyright (C) 2002-2004 Tuukka Pasanen <illuusio@mailcity.com> *
|
|
|
|
* Copyright (C) 2003-2005 Allen Winter <winter@kde.org> *
|
|
|
|
* *
|
|
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
|
|
* (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
* This program is distributed in the hope that it will be useful, *
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
|
|
* GNU General Public License for more details. *
|
|
|
|
* *
|
|
|
|
* You should have received a copy of the GNU General Public License *
|
|
|
|
* along with this program; if not, write to the Free Software *
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
|
|
|
|
* *
|
|
|
|
* As a special exception, permission is given to link this program *
|
|
|
|
* with any edition of TQt, and distribute the resulting executable, *
|
|
|
|
* without including the source code for TQt in the source distribution. *
|
|
|
|
* *
|
|
|
|
******************************************************************************/
|
|
|
|
/**
|
|
|
|
* @file main.cpp
|
|
|
|
* KonsoleKalendar main program.
|
|
|
|
* @author Tuukka Pasanen
|
|
|
|
* @author Allen Winter
|
|
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if TIME_WITH_SYS_TIME
|
|
|
|
# include <sys/time.h>
|
|
|
|
# include <time.h>
|
|
|
|
#else
|
|
|
|
# if HAVE_SYS_TIME_H
|
|
|
|
# include <sys/time.h>
|
|
|
|
# else
|
|
|
|
# include <time.h>
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <kcmdlineargs.h>
|
|
|
|
#include <kaboutdata.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kglobal.h>
|
|
|
|
#include <kconfig.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
|
|
#include <kdebug.h>
|
|
|
|
|
|
|
|
#include <libkcal/calformat.h>
|
|
|
|
#include <libkcal/calendarresources.h>
|
|
|
|
#include <libkcal/resourcelocal.h>
|
|
|
|
|
|
|
|
#include <tqdatetime.h>
|
|
|
|
#include <tqfile.h>
|
|
|
|
#include <tqfileinfo.h>
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
#include "stdcalendar.h"
|
|
|
|
#include "konsolekalendar.h"
|
|
|
|
#include "konsolekalendarepoch.h"
|
|
|
|
|
|
|
|
#include "konsolekalendarvariables.h"
|
|
|
|
|
|
|
|
using namespace KCal;
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
static const char progName[] = "konsolekalendar";
|
|
|
|
static const char progDisplay[] = "KonsoleKalendar";
|
|
|
|
static const char progVersion[] = "1.3.5";
|
|
|
|
static const char progDesc[] = "A command line interface to KDE calendars";
|
|
|
|
static const char progURL[] = "pim.kde.org/components/konsolekalendar.php";
|
|
|
|
|
|
|
|
|
|
|
|
static KCmdLineOptions options[] =
|
|
|
|
{
|
|
|
|
{ "verbose",
|
|
|
|
I18N_NOOP( "Print helpful runtime messages" ), 0 },
|
|
|
|
{ "dry-run",
|
|
|
|
I18N_NOOP( "Print what would have been done, but do not execute" ), 0 },
|
|
|
|
{ "file <calendar-file>",
|
|
|
|
I18N_NOOP( "Specify which calendar you want to use" ), 0 },
|
|
|
|
|
|
|
|
{ ":",
|
|
|
|
I18N_NOOP( "Incidence types (these options can be combined):" ), 0 },
|
|
|
|
{ "event",
|
|
|
|
I18N_NOOP( " Operate for Events only (Default)" ), 0 },
|
|
|
|
{ "todo",
|
|
|
|
I18N_NOOP( " Operate for To-dos only [NOT WORKING YET]" ), 0 },
|
|
|
|
{ "journal",
|
|
|
|
I18N_NOOP( " Operate for Journals only [NOT WORKING YET]" ), 0 },
|
|
|
|
|
|
|
|
{ ":",
|
|
|
|
I18N_NOOP( "Major operation modes:" ), 0 },
|
|
|
|
{ "view",
|
|
|
|
I18N_NOOP( " Print incidences in specified export format" ), 0 },
|
|
|
|
{ "add",
|
|
|
|
I18N_NOOP( " Insert an incidence into the calendar" ), 0 },
|
|
|
|
{ "change",
|
|
|
|
I18N_NOOP( " Modify an existing incidence" ), 0 },
|
|
|
|
{ "delete",
|
|
|
|
I18N_NOOP( " Remove an existing incidence" ), 0 },
|
|
|
|
{ "create",
|
|
|
|
I18N_NOOP( " Create new calendar file if one does not exist" ), 0 },
|
|
|
|
{ "import <import-file>",
|
|
|
|
I18N_NOOP( " Import this calendar to main calendar" ), 0 },
|
|
|
|
{ ":",
|
|
|
|
I18N_NOOP( "Operation modifiers:" ), 0 },
|
|
|
|
{ "all",
|
|
|
|
I18N_NOOP( " View all calendar entries" ), 0 },
|
|
|
|
{ "next",
|
|
|
|
I18N_NOOP( " View next activity in calendar" ), 0 },
|
|
|
|
{ "show-next <days>",
|
|
|
|
I18N_NOOP( " From start date show next # days' activities" ), 0 },
|
|
|
|
{ "uid <uid>",
|
|
|
|
I18N_NOOP( " Incidence Unique-string identifier" ), 0 },
|
|
|
|
{ "date <start-date>",
|
|
|
|
I18N_NOOP( " Start from this day [YYYY-MM-DD]" ), 0 },
|
|
|
|
{ "time <start-time>",
|
|
|
|
I18N_NOOP( " Start from this time [HH:MM:SS]" ), 0 },
|
|
|
|
{ "end-date <end-date>",
|
|
|
|
I18N_NOOP( " End at this day [YYYY-MM-DD]" ), 0 },
|
|
|
|
{ "end-time <end-time>",
|
|
|
|
I18N_NOOP( " End at this time [HH:MM:SS]" ), 0 },
|
|
|
|
{ "epoch-start <epoch-time>",
|
|
|
|
I18N_NOOP( " Start from this time [secs since epoch]" ), 0 },
|
|
|
|
{ "epoch-end <epoch-time>",
|
|
|
|
I18N_NOOP( " End at this time [secs since epoch]" ), 0 },
|
|
|
|
{ "summary <summary>",
|
|
|
|
I18N_NOOP( " Add summary to incidence (for add/change modes)" ), 0 },
|
|
|
|
{ "description <description>",
|
|
|
|
I18N_NOOP( "Add description to incidence (for add/change modes)" ), 0 },
|
|
|
|
{ "location <location>",
|
|
|
|
I18N_NOOP( " Add location to incidence (for add/change modes)" ), 0 },
|
|
|
|
|
|
|
|
{ ":", I18N_NOOP( "Export options:" ), 0 },
|
|
|
|
{ "export-type <export-type>",
|
|
|
|
I18N_NOOP( "Export file type (Default: text)" ), 0 },
|
|
|
|
{ "export-file <export-file>",
|
|
|
|
I18N_NOOP( "Export to file (Default: stdout)" ), 0 },
|
|
|
|
{ "export-list",
|
|
|
|
I18N_NOOP( " Print list of export types supported and exit" ), 0 },
|
|
|
|
|
|
|
|
{ "",
|
|
|
|
I18N_NOOP( "Examples:\n"
|
|
|
|
" konsolekalendar --view\n"
|
|
|
|
" konsolekalendar --add --date 2003-06-04 "
|
|
|
|
"--time 10:00 --end-time 12:00 \\\n"
|
|
|
|
" --summary \"Doctor Visit\" "
|
|
|
|
"--description \"Get My Head Examined\"\n"
|
|
|
|
" konsolekalendar --delete --uid KOrganizer-1740326.803" ), 0 },
|
|
|
|
|
|
|
|
{ "",
|
|
|
|
I18N_NOOP( "For more information visit the program home page at:\n"
|
|
|
|
" http://pim.kde.org/components/konsolekalendar.php" ), 0 },
|
|
|
|
|
|
|
|
KCmdLineLastOption
|
|
|
|
};
|
|
|
|
|
|
|
|
int main( int argc, char *argv[] )
|
|
|
|
{
|
|
|
|
KAboutData aboutData(
|
|
|
|
progName, // internal program name
|
|
|
|
I18N_NOOP( progDisplay ), // displayable program name.
|
|
|
|
progVersion, // version string
|
|
|
|
I18N_NOOP( progDesc ), // short porgram description
|
|
|
|
KAboutData::License_GPL, // license type
|
|
|
|
"(c) 2002-2005, Tuukka Pasanen and Allen Winter", // copyright statement
|
|
|
|
0, // any free form text
|
|
|
|
progURL, // program home page address
|
|
|
|
"bugs.kde.org" // bug report email address
|
|
|
|
);
|
|
|
|
|
|
|
|
aboutData.addAuthor(
|
|
|
|
"Tuukka Pasanen", // developer's name
|
|
|
|
I18N_NOOP( "Primary Author" ), // task or role
|
|
|
|
"illuusio@mailcity.com", // email address
|
|
|
|
0 // home page or relevant link
|
|
|
|
);
|
|
|
|
aboutData.addAuthor(
|
|
|
|
"Allen Winter", // developer's name
|
|
|
|
I18N_NOOP( "Author" ), // task or role
|
|
|
|
"winter@kde.org", // email address
|
|
|
|
0 // home page or relevant link
|
|
|
|
);
|
|
|
|
|
|
|
|
//TODO: KDE 4.0, add the StdCmdLineArgs option to init()
|
|
|
|
KCmdLineArgs::init( argc, argv, &aboutData );
|
|
|
|
KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
|
|
|
|
|
|
|
|
KApplication app(
|
|
|
|
false, //do not allowstyles - disable the loading on plugin based styles
|
|
|
|
false //GUI is not enabled - disable all GUI stuff
|
|
|
|
);
|
|
|
|
|
|
|
|
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
|
|
|
|
|
|
|
|
// Default values for start date/time (today at 07:00)
|
|
|
|
TQDate startdate = TQDate::currentDate();
|
|
|
|
TQTime starttime( 7, 0 );
|
|
|
|
|
|
|
|
// Default values for end date/time (today at 17:00)
|
|
|
|
TQDate enddate = TQDate::currentDate();
|
|
|
|
TQTime endtime( 17, 0 );
|
|
|
|
|
|
|
|
// Default values for switches
|
|
|
|
bool view = true;
|
|
|
|
bool add = false;
|
|
|
|
bool change = false;
|
|
|
|
bool del = false;
|
|
|
|
bool create = false;
|
|
|
|
bool calendarFile = false;
|
|
|
|
bool importFile = false;
|
|
|
|
|
|
|
|
TQString option;
|
|
|
|
|
|
|
|
KonsoleKalendarVariables variables;
|
|
|
|
KonsoleKalendarEpoch epochs;
|
|
|
|
|
|
|
|
variables.setFloating( false ); // by default, new events do NOT float
|
|
|
|
|
|
|
|
if ( args->isSet( "verbose" ) ) {
|
|
|
|
variables.setVerbose( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( args->isSet( "dry-run" ) ) {
|
|
|
|
variables.setDryRun( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Switch on export list
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "export-list" ) ) {
|
|
|
|
cout << endl;
|
|
|
|
cout << i18n( "%1 supports these export formats:" ).
|
|
|
|
tqarg( progDisplay ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
cout << i18n( " %1 [Default]" ).
|
|
|
|
tqarg( "Text" ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
cout << i18n( " %1 (like %2, but more compact)" ).
|
|
|
|
tqarg( "Short", "Text" ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
cout << i18n( " %1" ).
|
|
|
|
tqarg( "HTML" ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
cout << i18n( " %1 (like %2, but in a month view)" ).
|
|
|
|
tqarg( "HTMLmonth", "HTML" ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
cout << i18n( " %1 (Comma-Separated Values)" ).
|
|
|
|
tqarg( "CSV" ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
cout << endl;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set incidence type(s)
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "event" ) ) {
|
|
|
|
variables.setUseEvents( true );
|
|
|
|
kdDebug() << "main | parse options | use Events" << endl;
|
|
|
|
}
|
|
|
|
if ( args->isSet( "todo" ) ) {
|
|
|
|
variables.setUseTodos( true );
|
|
|
|
kdDebug() << "main | parse options | use To-dos" << endl;
|
|
|
|
cout << i18n( "Sorry, To-dos are not working yet." ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if ( args->isSet( "journal" ) ) {
|
|
|
|
variables.setUseJournals( true );
|
|
|
|
kdDebug() << "main | parse options | use Journals" << endl;
|
|
|
|
cout << i18n( "Sorry, Journals are not working yet." ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
// Use Events if no incidence type is specified on the command line
|
|
|
|
if ( !args->isSet( "event" ) &&
|
|
|
|
!args->isSet( "todo" ) &&
|
|
|
|
!args->isSet( "journal" ) ) {
|
|
|
|
variables.setUseEvents( true );
|
|
|
|
kdDebug() << "main | parse options | use Events (Default)" << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Switch on exporting
|
|
|
|
*/
|
|
|
|
variables.setExportType( ExportTypeText );
|
|
|
|
if ( args->isSet( "export-type" ) ) {
|
|
|
|
option = args->getOption( "export-type" );
|
|
|
|
|
|
|
|
if ( option.upper() == "HTML" ) {
|
|
|
|
kdDebug() << "main | export-type | Export to HTML" << endl;
|
|
|
|
variables.setExportType( ExportTypeHTML );
|
|
|
|
} else if ( option.upper() == "HTMLMONTH" ) {
|
|
|
|
kdDebug() << "main | export-type | Export to HTML by Month" << endl;
|
|
|
|
variables.setExportType( ExportTypeMonthHTML );
|
|
|
|
} else if ( option.upper() == "CSV" ) {
|
|
|
|
kdDebug() << "main | export-type | Export to CSV" << endl;
|
|
|
|
variables.setExportType( ExportTypeCSV );
|
|
|
|
} else if ( option.upper() == "TEXT" ) {
|
|
|
|
kdDebug() << "main | export-type | Export to TEXT (default)" << endl;
|
|
|
|
variables.setExportType( ExportTypeText );
|
|
|
|
} else if ( option.upper() == "SHORT" ) {
|
|
|
|
kdDebug() << "main | export-type | Export to TEXT-SHORT" << endl;
|
|
|
|
variables.setExportType( ExportTypeTextShort );
|
|
|
|
} else {
|
|
|
|
cout << i18n( "Invalid Export Type Specified: %1" ).
|
|
|
|
tqarg( option ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Switch on export file name
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "export-file" ) ) {
|
|
|
|
option = args->getOption( "export-file" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Export File: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
variables.setExportFile( option );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Switch on View (Print Entries). This is the default mode of operation.
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "view" ) ) {
|
|
|
|
view = true;
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Mode: (Print incidences)"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Switch on Add (Insert Entry)
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "add" ) ) {
|
|
|
|
view = false;
|
|
|
|
add = true;
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Mode: (Add incidence)"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Switch on Change (Modify Entry)
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "change" ) ) {
|
|
|
|
view = false;
|
|
|
|
change = true;
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Mode: (Change incidence)"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Switch on Delete (Remove Entry)
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "delete" ) ) {
|
|
|
|
view = false;
|
|
|
|
del = true;
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Mode: (Delete incidence)"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Switch on Create
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "create" ) ) {
|
|
|
|
view = false;
|
|
|
|
create = true;
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Calendar File: (Create)"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If there is summary attached.
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "summary" ) ) {
|
|
|
|
option = args->getOption( "summary" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Summary: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
variables.setSummary( option );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If there is description attached.
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "description" ) ) {
|
|
|
|
option = args->getOption( "description" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Description: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
variables.setDescription( option );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If there is location information
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "location" ) ) {
|
|
|
|
option = args->getOption( "location" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Location: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
variables.setLocation( option );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Show next happening and exit
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "next" ) ) {
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Show next incidence only"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
variables.setNext( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set incidence unique string identifier
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "uid" ) ) {
|
|
|
|
option = args->getOption( "uid" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "incidence UID: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
variables.setUID( option );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set starting date for calendar
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "date" ) ) {
|
|
|
|
option = args->getOption( "date" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Start date before conversion: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
startdate = TQDate::fromString( option, Qt::ISODate );
|
|
|
|
if ( !startdate.isValid() ) {
|
|
|
|
cout << i18n( "Invalid Start Date Specified: %1" ).
|
|
|
|
tqarg( option ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Start date after conversion: "
|
|
|
|
<< "(" << TQString(startdate.toString()) << ")"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set starting time
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "time" ) ) {
|
|
|
|
option = args->getOption( "time" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Start time before conversion : "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
if ( option.upper() != "FLOAT" ) {
|
|
|
|
starttime = TQTime::fromString( option, Qt::ISODate );
|
|
|
|
if ( !starttime.isValid() ) {
|
|
|
|
cout << i18n( "Invalid Start Time Specified: %1" ).
|
|
|
|
tqarg( option ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Start time after conversion: "
|
|
|
|
<< "(" << TQString(starttime.toString()) << ")"
|
|
|
|
<< endl;
|
|
|
|
} else {
|
|
|
|
variables.setFloating( true );
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Floating event time specified"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set end date for calendar
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "end-date" ) ) {
|
|
|
|
option = args->getOption( "end-date" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "End date before conversion: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
enddate = TQDate::fromString( option, Qt::ISODate );
|
|
|
|
if ( !enddate.isValid() ) {
|
|
|
|
cout << i18n( "Invalid End Date Specified: %1" ).
|
|
|
|
tqarg( option ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "End date after conversion: "
|
|
|
|
<< "(" << TQString(enddate.toString()) << ")"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Show next # days and exit
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "show-next" ) ) {
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
option = args->getOption( "show-next" );
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Show " << option << " days ahead"
|
|
|
|
<< endl;
|
|
|
|
variables.setDaysCount( option.toInt( &ok, 10 ) );
|
|
|
|
|
|
|
|
if ( !ok ) {
|
|
|
|
cout << i18n( "Invalid Date Count Specified: %1" ).
|
|
|
|
tqarg( option ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
enddate = startdate;
|
|
|
|
enddate = enddate.addDays( variables.getDaysCount() );
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "End date after conversion: "
|
|
|
|
<< "(" << TQString(enddate.toString()) << ")"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set ending time
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "end-time" ) ) {
|
|
|
|
option = args->getOption( "end-time" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "End time before conversion: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
if ( option.upper() != "FLOAT" ) {
|
|
|
|
endtime = TQTime::fromString( option, Qt::ISODate );
|
|
|
|
if ( !endtime.isValid() ) {
|
|
|
|
cout << i18n( "Invalid End Time Specified: %1" ).
|
|
|
|
tqarg( option ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "End time after conversion: "
|
|
|
|
<< "(" << TQString(endtime.toString()) << ")"
|
|
|
|
<< endl;
|
|
|
|
} else {
|
|
|
|
variables.setFloating( true );
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Floating event time specified"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set start date/time from epoch
|
|
|
|
*/
|
|
|
|
time_t epochstart = 0;
|
|
|
|
if ( args->isSet( "epoch-start" ) ) {
|
|
|
|
option = args->getOption( "epoch-start" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Epoch start: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
epochstart = ( time_t ) option.toULong( 0, 10 );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set end date/time from epoch
|
|
|
|
*/
|
|
|
|
time_t epochend = 0;
|
|
|
|
if ( args->isSet( "epoch-end" ) ) {
|
|
|
|
option = args->getOption( "epoch-end" );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "Epoch end: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
epochend = ( time_t ) option.toULong( 0, 10 );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( args->isSet( "all" ) ) {
|
|
|
|
variables.setAll( true );
|
|
|
|
} else {
|
|
|
|
variables.setAll( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( args->isSet( "import" ) ) {
|
|
|
|
view = false;
|
|
|
|
importFile = true;
|
|
|
|
option = args->getOption( "import" );
|
|
|
|
variables.setImportFile( option );
|
|
|
|
|
|
|
|
kdDebug() << "main | parse options | "
|
|
|
|
<< "importing file from: "
|
|
|
|
<< "(" << option << ")"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
KonsoleKalendar *konsolekalendar = new KonsoleKalendar( &variables );
|
|
|
|
|
|
|
|
if ( args->isSet( "file" ) ) {
|
|
|
|
calendarFile = true;
|
|
|
|
option = args->getOption( "file" );
|
|
|
|
variables.setCalendarFile( option );
|
|
|
|
|
|
|
|
/*
|
|
|
|
* All modes need to know if the calendar file exists
|
|
|
|
* This must be done before we get to opening biz
|
|
|
|
*/
|
|
|
|
bool exists, remote;
|
|
|
|
KURL url = KURL::fromPathOrURL( variables.getCalendarFile() );
|
|
|
|
if ( url.isLocalFile() ) {
|
|
|
|
variables.setCalendarFile( url.path() );
|
|
|
|
exists = TQFile::exists( variables.getCalendarFile() );
|
|
|
|
remote = false;
|
|
|
|
} else if ( url.protocol().isEmpty() ) {
|
|
|
|
TQFileInfo info( variables.getCalendarFile() );
|
|
|
|
variables.setCalendarFile( info.absFilePath() );
|
|
|
|
exists = TQFile::exists( variables.getCalendarFile() );
|
|
|
|
remote = false;
|
|
|
|
} else {
|
|
|
|
exists = true; // really have no idea if the remote file exists
|
|
|
|
remote = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( create ) {
|
|
|
|
|
|
|
|
kdDebug() << "main | createcalendar | "
|
|
|
|
<< "check if calendar file already exists"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
if ( remote ) {
|
|
|
|
cout << i18n( "Attempting to create a remote file %1" ).
|
|
|
|
tqarg( variables.getCalendarFile() ).local8Bit().data() << endl;
|
|
|
|
return 1;
|
|
|
|
} else {
|
|
|
|
if ( exists ) {
|
|
|
|
cout << i18n( "Calendar %1 already exists" ).
|
|
|
|
tqarg( variables.getCalendarFile() ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( konsolekalendar->createCalendar() ) {
|
|
|
|
cout << i18n( "Calendar %1 successfully created" ).
|
|
|
|
tqarg( variables.getCalendarFile() ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 0;
|
|
|
|
} else {
|
|
|
|
cout << i18n( "Unable to create calendar: %1" ).
|
|
|
|
tqarg( variables.getCalendarFile() ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !exists ) {
|
|
|
|
cout << i18n( "Calendar file not found %1" ).
|
|
|
|
tqarg( variables.getCalendarFile() ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
cout << i18n( "Try --create to create new calendar file" ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
CalendarResources *calendarResource = NULL;
|
|
|
|
/*
|
|
|
|
* Should we use local calendar or resource?
|
|
|
|
*/
|
|
|
|
if ( args->isSet( "file" ) ) {
|
|
|
|
calendarResource = new StdCalendar( variables.getCalendarFile(),
|
|
|
|
i18n( "Active Calendar" ) );
|
|
|
|
} else {
|
|
|
|
// TODO: when certain resources (kolab) don't try to gain access to
|
|
|
|
// an X server, or dcopserver, then put back the following line which
|
|
|
|
// supports all resources, not just the standard resource.
|
|
|
|
// calendarResource = new StdCalendar();
|
|
|
|
calendarResource = new StdCalendar( locateLocal( "data",
|
|
|
|
"korganizer/std.ics" ),
|
|
|
|
i18n( "Default Calendar" ) );
|
|
|
|
}
|
|
|
|
if ( !args->isSet( "import" ) ) {
|
|
|
|
variables.setCalendar( calendarResource );
|
|
|
|
calendarResource->load();
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* Glorious date/time checking and setting code *
|
|
|
|
***************************************************************************/
|
|
|
|
TQDateTime startdatetime, enddatetime;
|
|
|
|
|
|
|
|
// Handle case with either date or end-date unspecified
|
|
|
|
if ( !args->isSet( "end-date" ) && !args->isSet( "show-next" ) &&
|
|
|
|
args->isSet( "date" ) ) {
|
|
|
|
enddate = startdate;
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting enddate to startdate"
|
|
|
|
<< endl;
|
|
|
|
} else if ( args->isSet( "end-date" ) && !args->isSet( "date" ) ) {
|
|
|
|
startdate = enddate;
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting startdate to enddate"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
// NOTE: If neither date nor end-date specified, then event will be today.
|
|
|
|
|
|
|
|
// Case:
|
|
|
|
// End time (or epoch) unspecified, and start time (or epoch) IS specified.
|
|
|
|
// In this case, set the ending to 1 hour after starting.
|
|
|
|
if ( !args->isSet( "end-time" ) && !args->isSet( "epoch-end" ) ) {
|
|
|
|
if ( args->isSet( "time" ) ) {
|
|
|
|
endtime = starttime.addSecs( 60 * 60 ); // end is 1 hour after start
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting endtime 1 hour after starttime"
|
|
|
|
<< endl;
|
|
|
|
} else if ( args->isSet( "epoch-start" ) ) {
|
|
|
|
startdatetime = epochs.epoch2TQDateTime( epochstart );
|
|
|
|
enddatetime = startdatetime.addSecs( 60 * 60 );
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting endtime 1 hour after epochstart"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Case:
|
|
|
|
// Time (or epoch) unspecified, and end-time (or epoch) IS specified.
|
|
|
|
// In this case, set the starting to 1 hour before ending.
|
|
|
|
if ( !args->isSet( "time" ) && !args->isSet( "epoch-start" ) ) {
|
|
|
|
if ( args->isSet( "end-time" ) ) {
|
|
|
|
starttime = endtime.addSecs( -60 * 60 ); // start is 1 hour before end
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting starttime 1 hour before endtime"
|
|
|
|
<< endl;
|
|
|
|
} else if ( args->isSet( "epoch-end" ) ) {
|
|
|
|
enddatetime = epochs.epoch2TQDateTime( epochend );
|
|
|
|
startdatetime = enddatetime.addSecs( -60 * 60 );
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting starttime 1 before after epochend"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Case:
|
|
|
|
// Time (or epoch) unspecified, and end-time (or epoch) unspecified.
|
|
|
|
if ( !args->isSet( "time" ) && !args->isSet( "epoch-start" ) &&
|
|
|
|
!args->isSet( "end-time" ) && !args->isSet( "epoch-end" ) ) {
|
|
|
|
// set default start date/time
|
|
|
|
startdatetime = TQDateTime( startdate, starttime );
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting startdatetime from "
|
|
|
|
<< "default startdate (today) and starttime"
|
|
|
|
<< endl;
|
|
|
|
// set default end date/time
|
|
|
|
enddatetime = TQDateTime( enddate, endtime );
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting enddatetime from "
|
|
|
|
<< "default enddate (today) and endtime"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set startdatetime, enddatetime if still necessary
|
|
|
|
if ( startdatetime.isNull() ) {
|
|
|
|
startdatetime = TQDateTime( startdate, starttime );
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting startdatetime from startdate and starttime"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
if ( enddatetime.isNull() ) {
|
|
|
|
enddatetime = TQDateTime( enddate, endtime );
|
|
|
|
kdDebug() << "main | datetimestamp | "
|
|
|
|
<< "setting enddatetime from enddate and endtime"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Float check for add mode:
|
|
|
|
// Events float if time AND end-time AND epoch times are UNspecified
|
|
|
|
if ( add ) {
|
|
|
|
if ( !args->isSet( "time" ) && !args->isSet( "end-time" ) &&
|
|
|
|
!args->isSet( "epoch-start" ) && !args->isSet( "epoch-end" ) ) {
|
|
|
|
variables.setFloating( true );
|
|
|
|
kdDebug() << "main | floatingcheck | "
|
|
|
|
<< "turn-on floating event"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Finally! Set the start/end date times
|
|
|
|
if ( !change ) {
|
|
|
|
variables.setStartDateTime( startdatetime );
|
|
|
|
variables.setEndDateTime( enddatetime );
|
|
|
|
} else {
|
|
|
|
// Do NOT set start/end datetimes in change mode,
|
|
|
|
// unless they were specified on commandline
|
|
|
|
if ( args->isSet( "time" ) || args->isSet( "epoch-start" ) ||
|
|
|
|
args->isSet( "end-time" ) || args->isSet( "epoch-end" ) ) {
|
|
|
|
variables.setStartDateTime( startdatetime );
|
|
|
|
variables.setEndDateTime( enddatetime );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Some more debug prints
|
|
|
|
kdDebug() << "main | datetimestamp | StartDate="
|
|
|
|
<< startdatetime.toString( Qt::TextDate )
|
|
|
|
<< endl;
|
|
|
|
kdDebug() << "main | datetimestamp | EndDate="
|
|
|
|
<< enddatetime.toString( Qt::TextDate )
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* Sanity checks *
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
// Cannot combine modes
|
|
|
|
if ( create + view + add + change + del > 1 ) {
|
|
|
|
cout << i18n(
|
|
|
|
"Only 1 operation mode "
|
|
|
|
"(view, add, change, delete, create) "
|
|
|
|
"permitted at any one time"
|
|
|
|
).local8Bit().data() << endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Cannot have a ending before starting
|
|
|
|
if ( startdatetime > enddatetime ) {
|
|
|
|
cout << i18n(
|
|
|
|
"Ending Date/Time occurs before the Starting Date/Time"
|
|
|
|
).local8Bit().data() << endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* And away we go with the real work... *
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
args->clear(); // Free up some memory.
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set our application name for use in unique IDs and error messages,
|
|
|
|
* and product ID for incidence PRODID property
|
|
|
|
*/
|
|
|
|
TQString prodId = "-//K Desktop Environment//NONSGML %1 %2//EN";
|
|
|
|
CalFormat::setApplication( progDisplay,
|
|
|
|
prodId.tqarg( progDisplay ).tqarg( progVersion ) );
|
|
|
|
|
|
|
|
if ( importFile ) {
|
|
|
|
if ( konsolekalendar->importCalendar() ) {
|
|
|
|
cout << i18n( "Calendar %1 successfully imported" ).
|
|
|
|
tqarg( variables.getImportFile() ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 0;
|
|
|
|
} else {
|
|
|
|
cout << i18n( "Unable to import calendar: %1" ).
|
|
|
|
tqarg( variables.getImportFile() ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( add ) {
|
|
|
|
if ( !konsolekalendar->isEvent( startdatetime, enddatetime,
|
|
|
|
variables.getSummary() ) ) {
|
|
|
|
kdDebug() << "main | modework | "
|
|
|
|
<< "calling addEvent()"
|
|
|
|
<< endl;
|
|
|
|
konsolekalendar->addEvent();
|
|
|
|
} else {
|
|
|
|
cout << i18n(
|
|
|
|
"Attempting to insert an event that already exists"
|
|
|
|
).local8Bit().data() << endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( change ) {
|
|
|
|
kdDebug() << "main | modework | "
|
|
|
|
<< "calling changeEvent()"
|
|
|
|
<< endl;
|
|
|
|
if ( !variables.isUID() ) {
|
|
|
|
cout << i18n( "Missing event UID: "
|
|
|
|
"use --uid command line option" ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if ( konsolekalendar->changeEvent() != true ) {
|
|
|
|
cout << i18n( "No such event UID: change event failed" ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
kdDebug() << "main | modework | "
|
|
|
|
<< "successful changeEvent()"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( del ) {
|
|
|
|
kdDebug() << "main | modework | "
|
|
|
|
<< "calling deleteEvent()"
|
|
|
|
<< endl;
|
|
|
|
if ( !variables.isUID() ) {
|
|
|
|
cout << i18n( "Missing event UID: "
|
|
|
|
"use --uid command line option" ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if ( konsolekalendar->deleteEvent() != true ) {
|
|
|
|
cout << i18n( "No such event UID: delete event failed").local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
kdDebug() << "main | modework | "
|
|
|
|
<< "successful deleteEvent()"
|
|
|
|
<< endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( view ) {
|
|
|
|
kdDebug() << "main | modework | "
|
|
|
|
<< "calling showInstance() to view events"
|
|
|
|
<< endl;
|
|
|
|
if ( !konsolekalendar->showInstance() ) {
|
|
|
|
cout << i18n( "Cannot open specified export file: %1" ).
|
|
|
|
tqarg( variables.getExportFile() ).local8Bit().data()
|
|
|
|
<< endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
delete konsolekalendar;
|
|
|
|
|
|
|
|
calendarResource->close();
|
|
|
|
delete calendarResource;
|
|
|
|
|
|
|
|
kdDebug() << "main | exiting"
|
|
|
|
<< endl;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|