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.

234 lines
6.3 KiB

/*
* $Id: pilot-read-expenses.c,v 1.47 2007/02/04 23:06:02 desrod Exp $
*
* pilot-read-expenses.c: Sample code to translate Palm Expense database
* into generic format
*
* Copyright (c) 1997, 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
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pi-source.h"
#include "pi-expense.h"
#include "pi-dlp.h"
#include "pi-header.h"
#include "pi-userland.h"
int main(int argc, const char *argv[])
{
int db,
i,
ret,
c = -1,
sd = -1;
enum { mode_none, mode_write = 257 } run_mode = mode_none;
char buffer[0xffff];
char buffer2[0xffff];
pi_buffer_t *recbuf,
*appblock;
struct PilotUser User;
struct ExpenseAppInfo tai;
struct ExpensePref tp;
poptContext po;
struct poptOption options[] = {
USERLAND_RESERVED_OPTIONS
{"write",'w', POPT_ARG_NONE,NULL,mode_write,"Write data"},
POPT_TABLEEND
};
po = poptGetContext("read-expenses", argc, argv, options, 0);
poptSetOtherOptionHelp(po,"\n\n"
" Export Palm Expense application database data into text format\n\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 --write (-w) to output data.\n");
return 1;
}
sd = plu_connect();
if (sd < 0)
goto error;
if (dlp_ReadUserInfo(sd, &User) < 0) {
goto error_close;
}
/* Note that under PalmOS 1.x, you can only read preferences before
the DB is opened
*/
ret = dlp_ReadAppPreference(sd, Expense_Creator, Expense_Pref, 1,
0xffff, buffer, 0, 0);
/* Open the Expense database, store access handle in db */
if (dlp_OpenDB(sd, 0, 0x80 | 0x40, "ExpenseDB", &db) < 0) {
fprintf(stderr," ERROR: Unable to open ExpenseDB on Palm.\n");
dlp_AddSyncLogEntry(sd, "Unable to open ExpenseDB.\n");
goto error_close;
}
if (ret >= 0) {
unpack_ExpensePref(&tp, buffer, 0xffff);
i = pack_ExpensePref(&tp, buffer2, 0xffff);
#ifdef DEBUG
fprintf(stderr, "Orig prefs, %d bytes:\n", ret);
pi_dumpdata(buffer, ret);
fprintf(stderr, "New prefs, %d bytes:\n", i);
pi_dumpdata(buffer2, i);
#endif
printf("Expense prefs, current category %d, default currency %d\n",
tp.currentCategory, tp.defaultCurrency);
printf(" Attendee font %d, Note font %d, Show all categories %d, Show currency %d, Save backup %d\n",
tp.attendeeFont, tp.noteFont, tp.showAllCategories, tp.showCurrency,
tp.saveBackup);
printf(" Allow quickfill %d, Distance unit %d\n\n",
tp.allowQuickFill, tp.unitOfDistance);
printf("Currencies:\n");
for (i = 0; i < 5; i++) {
fprintf(stderr, " %d", tp.currencies[i]);
}
printf("\n\n");
}
appblock = pi_buffer_new(0xffff);
ret = dlp_ReadAppBlock(sd, db, 0, 0xffff, appblock);
unpack_ExpenseAppInfo(&tai, appblock->data, appblock->used);
pi_buffer_free(appblock);
#ifdef DEBUG
i = pack_ExpenseAppInfo(&tai, buffer2, 0xffff);
printf("Orig length %d, new length %d, orig data:\n", ret, i);
pi_dumpdata(buffer, ret);
printf("New data:\n");
pi_dumpdata(buffer2, i);
#endif
printf("Expense app info, sort order %d\n", tai.sortOrder);
printf(" Currency 1, name '%s', symbol '%s', rate '%s'\n",
tai.currencies[0].name, tai.currencies[0].symbol,
tai.currencies[0].rate);
printf(" Currency 2, name '%s', symbol '%s', rate '%s'\n",
tai.currencies[1].name, tai.currencies[1].symbol,
tai.currencies[1].rate);
printf(" Currency 3, name '%s', symbol '%s', rate '%s'\n",
tai.currencies[2].name, tai.currencies[2].symbol,
tai.currencies[2].rate);
printf(" Currency 4, name '%s', symbol '%s', rate '%s'\n\n",
tai.currencies[3].name, tai.currencies[3].symbol,
tai.currencies[3].rate);
recbuf = pi_buffer_new (0xffff);
for (i = 0;; i++) {
int attr,
category;
struct Expense t;
int len =
dlp_ReadRecordByIndex(sd, db, i, recbuf, 0, &attr,
&category);
if (len < 0)
break;
/* Skip deleted records */
if ((attr & dlpRecAttrDeleted)
|| (attr & dlpRecAttrArchived))
continue;
unpack_Expense(&t, recbuf->data, recbuf->used);
ret = pack_Expense(&t, buffer2, 0xffff);
#ifdef DEBUG
fprintf(stderr, "Orig length %d, data:\n", len);
pi_dumpdata(buffer, len);
fprintf(stderr, "New length %d, data:\n", ret);
pi_dumpdata(buffer2, ret);
#endif
printf("Category: %s\n", tai.category.name[category]);
printf(" Type: %s (%3d)\n Payment: %s (%3d)\n Currency: %3d\n",
ExpenseTypeNames[t.type],t.type,
ExpensePaymentNames[t.payment],t.payment,
t.currency);
printf(" Amount: %s\n Vendor: %s\n City: %s\n",
t.amount ? t.amount : "<None>",
t.vendor ? t.vendor : "<None>",
t.city ? t.city : "<None>");
printf(" Attendees: %s\n Note: %s\n",
t.attendees ? t.attendees : "<None>",
t.note ? t.note : "<None>");
printf(" Date: %s", asctime(&t.date));
printf("\n");
free_Expense(&t);
}
pi_buffer_free(recbuf);
/* Close the database */
dlp_CloseDB(sd, db);
dlp_AddSyncLogEntry(sd, "Successfully read Expenses from Palm.\n"
"Thank you for using pilot-link\n");
pi_close(sd);
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: */