You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
6.3 KiB
277 lines
6.3 KiB
/*
|
|
* $Id: pilot-install-datebook.c,v 1.37 2007/03/17 19:15:16 desrod Exp $
|
|
*
|
|
* install-datebook.c: Palm datebook installer
|
|
*
|
|
* Copyright 1997, Tero Kivinen
|
|
* Copyright 1996, Robert A. Kaplan (original install-todos.c)
|
|
*
|
|
* 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 St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "pi-source.h"
|
|
#include "pi-dlp.h"
|
|
#include "pi-datebook.h"
|
|
#include "pi-userland.h"
|
|
|
|
extern time_t parsedate(char *p);
|
|
|
|
int main(int argc, const char *argv[])
|
|
{
|
|
int c, /* switch */
|
|
db,
|
|
fieldno,
|
|
filelen,
|
|
sd = -1;
|
|
|
|
char
|
|
*cPtr = NULL,
|
|
*filename = NULL,
|
|
*file_text = NULL,
|
|
*fields[4];
|
|
|
|
pi_buffer_t *Appointment_buf;
|
|
Appointment_buf = pi_buffer_new (0xffff);
|
|
|
|
FILE *f = NULL;
|
|
|
|
struct PilotUser User;
|
|
struct Appointment appointment;
|
|
|
|
poptContext pc;
|
|
|
|
struct poptOption options[] = {
|
|
USERLAND_RESERVED_OPTIONS
|
|
{"read", 'r', POPT_ARG_STRING, &filename, 0, "Read entries from <file>", "file"},
|
|
POPT_TABLEEND
|
|
};
|
|
|
|
pc = poptGetContext("install-datebook", argc, argv, options, 0);
|
|
poptSetOtherOptionHelp(pc,"\n Installs new Datebook entries onto your Palm handheld device.\n"
|
|
" You must specify -r and a single filename.\n\n"
|
|
" Example usage: \n"
|
|
" -p /dev/pilot -r db.txt\n\n");
|
|
|
|
if (argc < 2) {
|
|
poptPrintUsage(pc,stderr,0);
|
|
return 1;
|
|
}
|
|
|
|
while ((c = poptGetNextOpt(pc)) >= 0) {
|
|
fprintf(stderr," ERROR: Unhandled option %d.\n",c);
|
|
return 1;
|
|
}
|
|
|
|
if (c < -1)
|
|
plu_badoption(pc,c);
|
|
|
|
if (filename == NULL) {
|
|
fprintf(stderr," ERROR: No filename given.\n");
|
|
return 1;
|
|
}
|
|
|
|
f = fopen(filename, "r");
|
|
if (f == NULL) {
|
|
perror("fopen");
|
|
return 1;
|
|
}
|
|
|
|
fseek(f, 0, SEEK_END);
|
|
filelen = ftell(f);
|
|
fseek(f, 0, SEEK_SET);
|
|
|
|
file_text = (char *) malloc(filelen + 1);
|
|
if (file_text == NULL) {
|
|
perror("malloc()");
|
|
fclose(f);
|
|
return 1;
|
|
}
|
|
|
|
fread(file_text, filelen, 1, f);
|
|
fclose(f);
|
|
f = NULL;
|
|
|
|
sd = plu_connect();
|
|
if (sd < 0)
|
|
goto error;
|
|
|
|
if (dlp_OpenConduit(sd) < 0)
|
|
goto error_close;
|
|
|
|
dlp_ReadUserInfo(sd, &User);
|
|
dlp_OpenConduit(sd);
|
|
|
|
/* Open the Datebook's database, store access handle in db */
|
|
if (dlp_OpenDB(sd, 0, 0x80 | 0x40, "DatebookDB", &db) < 0) {
|
|
fprintf(stderr," ERROR: Unable to open DatebookDB on Palm\n");
|
|
dlp_AddSyncLogEntry(sd, "Unable to open DatebookDB.\n");
|
|
goto error_close;
|
|
}
|
|
|
|
|
|
|
|
file_text[filelen] = '\0';
|
|
cPtr = file_text;
|
|
fieldno = 0;
|
|
fields[fieldno++] = cPtr;
|
|
|
|
while (cPtr - file_text < filelen) {
|
|
if (*cPtr == '\t') {
|
|
cPtr++;
|
|
if (fieldno < 4) {
|
|
fields[fieldno] = cPtr;
|
|
}
|
|
fieldno++;
|
|
} else if (*cPtr == '\n') {
|
|
/* replace CR with terminator */
|
|
*cPtr++ = '\0';
|
|
|
|
/* ensure right number of fields */
|
|
if (fieldno != 4) {
|
|
printf("Too ");
|
|
printf(fieldno < 4 ? "few" : "many");
|
|
printf(" fields on the line : %s\n", fields[0]);
|
|
|
|
|
|
fieldno = 0;
|
|
fields[fieldno++] = cPtr;
|
|
continue;
|
|
}
|
|
|
|
/* replace tabs with terminators */
|
|
for (fieldno = 1; fieldno < 4; fieldno++) {
|
|
*(fields[fieldno]-1) = '\0';
|
|
}
|
|
|
|
/* woo hoo! */
|
|
fieldno = 0;
|
|
if (fields[0][0] == '\0' || fields[1][0] == '\0') { /* no start time */
|
|
appointment.event = 1;
|
|
} else {
|
|
appointment.event = 0;
|
|
}
|
|
if (fields[0][0] != '\0') {
|
|
time_t t;
|
|
|
|
t = parsedate(fields[0]);
|
|
if (t == -1) {
|
|
printf("Invalid start date or time : %s\n",
|
|
fields[0]);
|
|
continue;
|
|
}
|
|
appointment.begin = *localtime(&t);
|
|
}
|
|
if (fields[1][0] != '\0') {
|
|
time_t t;
|
|
|
|
t = parsedate(fields[1]);
|
|
if (t == -1) {
|
|
printf("Invalid end date or time : %s\n",
|
|
fields[1]);
|
|
continue;
|
|
}
|
|
appointment.end = *localtime(&t);
|
|
}
|
|
if (fields[2][0] != '\0') {
|
|
appointment.alarm = 1;
|
|
appointment.advance =
|
|
atoi(fields[2]);
|
|
if (strchr(fields[2], 'm'))
|
|
appointment.advanceUnits =
|
|
advMinutes;
|
|
else if (strchr(fields[2], 'h'))
|
|
appointment.advanceUnits =
|
|
advHours;
|
|
else if (strchr(fields[2], 'd'))
|
|
appointment.advanceUnits =
|
|
advDays;
|
|
} else {
|
|
appointment.alarm = 0;
|
|
appointment.advance = 0;
|
|
appointment.advanceUnits = 0;
|
|
}
|
|
appointment.repeatType = repeatNone;
|
|
appointment.repeatForever = 0;
|
|
appointment.repeatEnd.tm_mday = 0;
|
|
appointment.repeatEnd.tm_mon = 0;
|
|
appointment.repeatEnd.tm_wday = 0;
|
|
appointment.repeatFrequency = 0;
|
|
appointment.repeatWeekstart = 0;
|
|
appointment.exceptions = 0;
|
|
appointment.exception = NULL;
|
|
appointment.description = fields[3];
|
|
appointment.note = NULL;
|
|
|
|
pack_Appointment(&appointment, Appointment_buf, datebook_v1);
|
|
|
|
printf("Description: %s, %s\n",
|
|
appointment.description, appointment.note);
|
|
|
|
printf("date: %d/%d/%d %d:%02d\n",
|
|
appointment.begin.tm_mon + 1,
|
|
appointment.begin.tm_mday,
|
|
appointment.begin.tm_year + 1900,
|
|
appointment.begin.tm_hour,
|
|
appointment.begin.tm_min);
|
|
|
|
dlp_WriteRecord(sd, db, 0, 0, 0,
|
|
Appointment_buf->data,
|
|
Appointment_buf->used, 0);
|
|
fields[fieldno++] = cPtr;
|
|
} else {
|
|
cPtr++;
|
|
}
|
|
}
|
|
|
|
/* Close the database */
|
|
dlp_CloseDB(sd, db);
|
|
|
|
/* Tell the user who it is, with a different PC id. */
|
|
User.lastSyncPC = 0x00010000;
|
|
User.successfulSyncDate = time(NULL);
|
|
User.lastSyncDate = User.successfulSyncDate;
|
|
dlp_WriteUserInfo(sd, &User);
|
|
|
|
if (dlp_AddSyncLogEntry(sd, "Successfully wrote Appointment to Palm.\n"
|
|
"Thank you for using pilot-link.\n") < 0);
|
|
goto error_close;
|
|
|
|
if(dlp_EndOfSync(sd, 0) < 0);
|
|
goto error_close;
|
|
|
|
if(pi_close(sd) < 0)
|
|
goto error;
|
|
|
|
error_close:
|
|
pi_close(sd);
|
|
|
|
error:
|
|
return -1;
|
|
}
|
|
|
|
/* vi: set ts=8 sw=4 sts=4 noexpandtab: cin */
|
|
/* ex: set tabstop=4 expandtab: */
|
|
/* Local Variables: */
|
|
/* indent-tabs-mode: t */
|
|
/* c-basic-offset: 8 */
|
|
/* End: */
|