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.
275 lines
6.3 KiB
275 lines
6.3 KiB
/*
|
|
* $Id: pilot-read-todos.c,v 1.60 2009/06/04 13:32:32 desrod Exp $
|
|
*
|
|
* pilot-read-todos.c: Translate Palm ToDo database into generic format
|
|
*
|
|
* Copyright (c) 1996, Kenneth Albanowski
|
|
*
|
|
* 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
|
|
*
|
|
*/
|
|
|
|
/* 12-27-2003:
|
|
FIXME: Add "Private" and "Delete" flags */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
|
|
#include "pi-socket.h"
|
|
#include "pi-todo.h"
|
|
#include "pi-file.h"
|
|
#include "pi-header.h"
|
|
#include "pi-userland.h"
|
|
|
|
void print_unarchived(struct ToDoAppInfo *tai, struct ToDo *todo, int category)
|
|
{
|
|
printf("Category: %s\n", tai->category.name[category]);
|
|
printf("Priority: %d\n", todo->priority);
|
|
printf("Completed: %s\n", todo->complete ? "Yes" : "No");
|
|
if (todo->indefinite) {
|
|
printf("Due: No Date\n");
|
|
} else {
|
|
printf("Due: %s\n", asctime(&todo->due));
|
|
}
|
|
if (todo->description)
|
|
printf("Description: %s\n", todo->description);
|
|
if (todo->note)
|
|
printf("Note: %s\n", todo->note);
|
|
printf("\n");
|
|
}
|
|
|
|
void print_archived(struct ToDoAppInfo *tai, struct ToDo *todo, int category)
|
|
{
|
|
printf("\"Category\", ");
|
|
printf("\"%s\", ", tai->category.name[category]);
|
|
printf("\"Priority\", ");
|
|
printf("\"%d\", ", todo->priority);
|
|
printf("\"Completed\", ");
|
|
printf("\"%s\", ", todo->complete ? "Yes" : "No");
|
|
|
|
if (todo->indefinite) {
|
|
printf("\"Due\", \"No Date\", ");
|
|
} else {
|
|
printf("\"Due\", ");
|
|
printf("\"%s\", ", asctime(&todo->due));
|
|
}
|
|
|
|
if (todo->description) {
|
|
printf("\"Description\", ");
|
|
printf("\"%s\", ", todo->description);
|
|
}
|
|
|
|
if (todo->note) {
|
|
printf("\"Note\", ");
|
|
printf("\"%s\", ", todo->note);
|
|
}
|
|
|
|
printf("\n\n");
|
|
}
|
|
|
|
int main(int argc, const char *argv[])
|
|
{
|
|
int c, /* switch */
|
|
db,
|
|
i,
|
|
sd = -1;
|
|
|
|
enum { mode_none, mode_write=257 } run_mode = mode_none;
|
|
int archived = 0;
|
|
|
|
char
|
|
*filename = NULL,
|
|
*ptr;
|
|
|
|
struct PilotUser User;
|
|
struct pi_file *pif = NULL;
|
|
struct ToDoAppInfo tai;
|
|
|
|
pi_buffer_t *recbuf,
|
|
*appblock;
|
|
|
|
poptContext po;
|
|
|
|
struct poptOption options[] = {
|
|
USERLAND_RESERVED_OPTIONS
|
|
{"write", 'w', POPT_ARG_NONE,NULL,mode_write, "Write output" },
|
|
{"file", 'f', POPT_ARG_STRING, &filename, 0, "Save ToDO entries in <filename> instead of STDOUT"},
|
|
{"archived", 'A', POPT_ARG_NONE, &archived, 0, "Write archived entries only, in human-readable format"},
|
|
POPT_TABLEEND
|
|
};
|
|
|
|
po = poptGetContext("read-todos", argc, argv, options, 0);
|
|
poptSetOtherOptionHelp(po,"\n\n"
|
|
" Synchronize your ToDo database with your desktop machine.\n"
|
|
" If you use --port, the contents of your Palm's ToDo database will be written to\n"
|
|
" standard output in a generic text format/ Otherwise, use --file to read a todo\n"
|
|
" database file from disk for printing.\n\n"
|
|
" Example arguments:\n"
|
|
" -w -A -p /dev/pilot \n"
|
|
" -w -f ToDoDB.pdb\n");
|
|
|
|
|
|
if (argc<2) {
|
|
poptPrintUsage(po,stderr,0);
|
|
return 1;
|
|
}
|
|
|
|
while ((c = poptGetNextOpt(po)) >= 0) {
|
|
switch(c) {
|
|
case mode_write :
|
|
if (run_mode == mode_none) {
|
|
run_mode = c;
|
|
} else {
|
|
if (c!=run_mode) {
|
|
fprintf(stderr," ERROR: Specify exactly one of -w.\n");
|
|
return 1;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
fprintf(stderr," ERROR: Unhandled option %d.\n",c);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if (c < -1) {
|
|
plu_badoption(po,c);
|
|
}
|
|
|
|
if (mode_none == run_mode) {
|
|
fprintf(stderr," ERROR: Specify exactly one of -w.\n");
|
|
return 1;
|
|
}
|
|
if (!plu_port && !filename) {
|
|
fprintf(stderr," ERROR: Specify either --port or --file.\n");
|
|
return 1;
|
|
}
|
|
|
|
/* Read ToDoDB.pdb from the Palm directly */
|
|
appblock = pi_buffer_new(0xffff);
|
|
if (!filename) {
|
|
sd = plu_connect();
|
|
if (sd < 0)
|
|
goto error;
|
|
|
|
if (dlp_ReadUserInfo(sd, &User) < 0)
|
|
goto error_close;
|
|
|
|
/* Open the ToDo database, store access handle in db */
|
|
if (dlp_OpenDB(sd, 0, 0x80 | 0x40, "ToDoDB", &db) < 0) {
|
|
puts(" Unable to open ToDoDB");
|
|
dlp_AddSyncLogEntry(sd,
|
|
" Unable to open ToDoDB.\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
dlp_ReadAppBlock(sd, db, 0, appblock->allocated, appblock);
|
|
|
|
/* Read ToDoDB.pdb from disk */
|
|
} else {
|
|
size_t len;
|
|
|
|
pif = pi_file_open(filename);
|
|
|
|
if (!pif) {
|
|
fprintf(stderr, " ERROR: %s\n", strerror(errno));
|
|
fprintf(stderr, " Does %s exist?\n\n", filename);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
pi_file_get_app_info(pif, (void *) &ptr, &len);
|
|
pi_buffer_append(appblock, ptr, len);
|
|
}
|
|
|
|
unpack_ToDoAppInfo(&tai, appblock->data, appblock->used);
|
|
pi_buffer_free(appblock);
|
|
|
|
recbuf = pi_buffer_new (0xffff);
|
|
|
|
for (i = 0;; i++) {
|
|
int attr,
|
|
category,
|
|
len;
|
|
|
|
struct ToDo todo;
|
|
|
|
if (!filename) {
|
|
len =
|
|
dlp_ReadRecordByIndex(sd, db, i, recbuf, 0,
|
|
&attr, &category);
|
|
|
|
if (len < 0)
|
|
break;
|
|
}
|
|
else {
|
|
if (pi_file_read_record
|
|
(pif, i, (void *) &ptr, &len, &attr, &category,
|
|
0))
|
|
break;
|
|
|
|
pi_buffer_clear(recbuf);
|
|
pi_buffer_append(recbuf, ptr, len);
|
|
}
|
|
|
|
/* Skip deleted records */
|
|
if (attr & dlpRecAttrArchived) {
|
|
if (archived) {
|
|
unpack_ToDo(&todo, recbuf, todo_v1);
|
|
print_archived(&tai,&todo,category);
|
|
free_ToDo(&todo);
|
|
}
|
|
continue;
|
|
}
|
|
if (attr & dlpRecAttrDeleted)
|
|
continue;
|
|
|
|
if (!archived) {
|
|
unpack_ToDo(&todo, recbuf, todo_v1);
|
|
print_unarchived(&tai,&todo,category);
|
|
free_ToDo(&todo);
|
|
}
|
|
}
|
|
|
|
pi_buffer_free (recbuf);
|
|
|
|
if (!filename) {
|
|
/* Close the database */
|
|
dlp_CloseDB(sd, db);
|
|
dlp_AddSyncLogEntry(sd, "Successfully read ToDos from Palm.\n"
|
|
"Thank you for using pilot-link.");
|
|
dlp_EndOfSync(sd, 0);
|
|
pi_close(sd);
|
|
|
|
} else {
|
|
pi_file_close(pif);
|
|
}
|
|
return 0;
|
|
|
|
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: */
|