You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
6.5 KiB
C
248 lines
6.5 KiB
C
/*
|
|
* $Id: pilot-install-expenses.c,v 1.36 2006/10/12 14:21:21 desrod Exp $
|
|
*
|
|
* pilot-install-expense.c: Palm expense installer
|
|
*
|
|
* Copyright (C) Boisy G. Pitre, year unknown - 2001 probably.
|
|
*
|
|
* 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 "pi-source.h"
|
|
#include "pi-dlp.h"
|
|
#include "pi-expense.h"
|
|
#include "pi-userland.h"
|
|
|
|
int main(int argc, const char *argv[])
|
|
{
|
|
int db,
|
|
sd = -1,
|
|
i,
|
|
l,
|
|
category,
|
|
po_err = -1,
|
|
replace_category = 0;
|
|
|
|
char
|
|
*category_name = NULL,
|
|
*expenseType = NULL,
|
|
*paymentType = NULL;
|
|
size_t size;
|
|
int found;
|
|
|
|
unsigned char buf[0xffff];
|
|
unsigned char *b;
|
|
pi_buffer_t *appblock;
|
|
|
|
struct PilotUser User;
|
|
struct ExpenseAppInfo eai;
|
|
struct Expense theExpense;
|
|
|
|
poptContext po;
|
|
|
|
struct poptOption options[] = {
|
|
USERLAND_RESERVED_OPTIONS
|
|
{"ptype", 't', POPT_ARG_STRING, &paymentType, 0,"Payment type (Cash, Check, etc.)"},
|
|
{"etype", 'e', POPT_ARG_STRING, &expenseType, 0, "Expense type (Airfare, Hotel, etc.)"},
|
|
{"amount", 'a', POPT_ARG_STRING, &theExpense.amount, 0, "Payment amount"},
|
|
{"vendor", 'V', POPT_ARG_STRING, &theExpense.vendor, 0, "Expense vendor name (Joe's Restaurant)"},
|
|
{"city", 'i', POPT_ARG_STRING, &theExpense.city, 0, "Location/city for this expense entry"},
|
|
{"guests", 'g', POPT_ARG_STRING, &theExpense.attendees, 0, "Number of guests for this expense entry","NUMBER"},
|
|
{"note", 'n', POPT_ARG_STRING, &theExpense.note, 0, "Notes for this expense entry"},
|
|
{"category", 'c', POPT_ARG_STRING, &category_name, 0, "Install entry into this category", "CATEGORY" },
|
|
{"replace", 0, POPT_ARG_VAL, &replace_category, 1, "Replace all entries in category by this one"},
|
|
POPT_TABLEEND
|
|
};
|
|
|
|
/* Zero 'em out to be sure. */
|
|
theExpense.amount=theExpense.vendor=theExpense.city=
|
|
theExpense.attendees=theExpense.note = NULL ;
|
|
|
|
po = poptGetContext("pilot-install-expenses", argc, argv, options, 0);
|
|
poptSetOtherOptionHelp(po,"\n\n"
|
|
" Install Expense application entries to your Palm device\n\n"
|
|
" Example arguments:\n"
|
|
" %s -p /dev/pilot -c Unfiled -t Cash -e Meals -a 10.00 -V McDonalds \n"
|
|
" -g 21 -l \"San Francisco\" -N \"This is a note\"\n\n");
|
|
|
|
if (argc < 2) {
|
|
poptPrintUsage(po,stderr,0);
|
|
return 1;
|
|
}
|
|
|
|
while ((po_err = poptGetNextOpt(po)) >= 0) {
|
|
fprintf(stderr," ERROR: Unhandled option %d.\n",po_err);
|
|
return 1;
|
|
}
|
|
|
|
theExpense.type = etBus;
|
|
found = 0;
|
|
for (i = 0; expenseType && ExpenseTypeNames[i] != NULL; i++)
|
|
{
|
|
if (strcasecmp(expenseType, ExpenseTypeNames[i]) == 0)
|
|
{
|
|
theExpense.type = i;
|
|
found = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
fprintf(stderr," WARNING: Expense type '%s' not recognized, using 'Bus Fare'.\n",expenseType);
|
|
}
|
|
|
|
theExpense.payment = epCash;
|
|
found = 0;
|
|
for (i = 0; paymentType && ExpensePaymentNames[i] != NULL; i++)
|
|
{
|
|
if (strcasecmp(paymentType, ExpensePaymentNames[i]) == 0)
|
|
{
|
|
theExpense.payment = i;
|
|
found = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
fprintf(stderr," WARNING: Payment type '%s' not recognized, using 'Cash'.\n", paymentType);
|
|
}
|
|
|
|
if (replace_category && (!category_name)) {
|
|
fprintf(stderr,
|
|
" ERROR: category required when specifying replace\n");
|
|
return 1;
|
|
}
|
|
|
|
|
|
if (!(theExpense.amount || theExpense.vendor || theExpense.city ||
|
|
theExpense.attendees ||theExpense.note)) {
|
|
fprintf(stderr," ERROR: Must specify at least one of amount, vendor, city, attendees or note.\n");
|
|
return 1;
|
|
}
|
|
|
|
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 Expense's database, store access handle in db */
|
|
if (dlp_OpenDB(sd, 0, 0x80 | 0x40, Expense_DB, &db) < 0) {
|
|
fprintf(stderr," ERROR: Unable to open ExpenseDB on Palm.");
|
|
dlp_AddSyncLogEntry(sd, "Unable to open ExpenseDB.\n");
|
|
goto error_close;
|
|
}
|
|
|
|
appblock = pi_buffer_new(0xffff);
|
|
l = dlp_ReadAppBlock(sd, db, 0, 0xffff, appblock);
|
|
unpack_ExpenseAppInfo(&eai, appblock->data, l);
|
|
pi_buffer_free(appblock);
|
|
|
|
category = 0; /* unfiled */
|
|
if (category_name) {
|
|
category = plu_findcategory(&eai.category,category_name,
|
|
PLU_CAT_CASE_INSENSITIVE | PLU_CAT_WARN_UNKNOWN);
|
|
if (category < 0) {
|
|
goto error_close;
|
|
}
|
|
|
|
if (replace_category) {
|
|
dlp_DeleteCategory(sd, db, category);
|
|
}
|
|
|
|
}
|
|
|
|
theExpense.currency = 0;
|
|
|
|
if (!theExpense.amount) {
|
|
theExpense.amount = "";
|
|
}
|
|
if (!theExpense.vendor) {
|
|
theExpense.vendor = "";
|
|
}
|
|
if (!theExpense.city) {
|
|
theExpense.city = "";
|
|
}
|
|
if (!theExpense.attendees) {
|
|
theExpense.attendees = "";
|
|
}
|
|
if (!theExpense.note) {
|
|
theExpense.note = "";
|
|
}
|
|
|
|
b = buf;
|
|
|
|
/* Date */
|
|
*(b++) = 0xc3;
|
|
*(b++) = 0x45;
|
|
|
|
*(b++) = theExpense.type;
|
|
*(b++) = theExpense.payment;
|
|
*(b++) = theExpense.currency;
|
|
*(b++) = 0x00;
|
|
|
|
strcpy(b, theExpense.amount);
|
|
b += strlen(theExpense.amount) + 1;
|
|
|
|
strcpy(b, theExpense.vendor);
|
|
b += strlen(theExpense.vendor) + 1;
|
|
|
|
strcpy(b, theExpense.city);
|
|
b += strlen(theExpense.city) + 1;
|
|
|
|
strcpy(b, theExpense.attendees);
|
|
b += strlen(theExpense.attendees) + 1;
|
|
|
|
strcpy(b, theExpense.note);
|
|
b += strlen(theExpense.note) + 1;
|
|
|
|
size = b - buf;
|
|
dlp_WriteRecord(sd, (unsigned char)db, 0, 0, category,
|
|
(unsigned char *)buf, size, 0);
|
|
|
|
/* 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);
|
|
|
|
dlp_AddSyncLogEntry(sd, "Wrote expense entry to Palm.\n");
|
|
dlp_EndOfSync(sd, 0);
|
|
pi_close(sd);
|
|
poptFreeContext(po);
|
|
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: */
|