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.
223 lines
5.3 KiB
223 lines
5.3 KiB
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
|
|
#include "pi-file.h"
|
|
#include "pi-versamail.h"
|
|
|
|
size_t palm_strftime(char *s, size_t max, const char *fmt, const struct tm *tm);
|
|
|
|
void hex_dump(unsigned char *buf, int size)
|
|
{
|
|
char text[18];
|
|
int i;
|
|
|
|
bzero(text, 17);
|
|
|
|
for (i = 0; i < size; i++) {
|
|
printf("%02x ", buf[i]);
|
|
text[i % 16] = (isprint(buf[i]) ? buf[i] : '.');
|
|
if ((i + 1) % 16 == 0) {
|
|
printf("%s\n", text);
|
|
bzero(text, 17);
|
|
}
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
int print_cat_info(struct CategoryAppInfo *ai)
|
|
{
|
|
int i;
|
|
|
|
printf("Category Info Start\n");
|
|
printf("renamed=");
|
|
for (i = 0; i < 16; i++) {
|
|
printf("%d", ai->renamed[i]);
|
|
}
|
|
printf("\n");
|
|
for (i = 0; i < 16; i++) {
|
|
printf("Index %02d ID %03d %s\n", i, ai->ID[i],
|
|
ai->name[i]);
|
|
}
|
|
printf("lastUniqueID = %d\n", ai->lastUniqueID);
|
|
printf("Category Info End\n");
|
|
return 0;
|
|
}
|
|
|
|
int print_versamail_app_info(int db, void *record, int size)
|
|
{
|
|
struct VersaMailAppInfo ai;
|
|
|
|
printf("Category app info\n"); //undo
|
|
//hex_dump(record, size);//undo
|
|
unpack_VersaMailAppInfo(&ai, record, size);
|
|
print_cat_info(&(ai.category));
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void print_versamail_record(void *record, int size, int attr, int idx)
|
|
{
|
|
struct VersaMail mail;
|
|
char datestr[255];
|
|
|
|
unpack_VersaMail(&mail, record, size);
|
|
|
|
printf("----\n");
|
|
printf("version: %lu\n", mail.imapuid);
|
|
palm_strftime(datestr, 254, "%c", &(mail.date));
|
|
//printf("date: %s\n", datestr);
|
|
//printf("category: %d\n", mail.category);
|
|
//printf("account: %d\n", mail.accountNo);
|
|
printf("unknown1: %d\n", mail.unknown1);
|
|
printf("unknown2: %d\n", mail.unknown2);
|
|
printf("reserved1: %d\n", mail.reserved1);
|
|
printf("reserved2: %d\n", mail.reserved2);
|
|
printf("download: %d\n", mail.download);
|
|
printf("mark: %d\n", mail.mark);
|
|
printf("read: %d\n", mail.read);
|
|
printf("body: %s\n", mail.body);
|
|
//printf("to: %s\n", mail.to);
|
|
//printf("from: %s\n", mail.from);
|
|
//printf("cc: %s\n", mail.cc);
|
|
//printf("bcc: %s\n", mail.bcc);
|
|
printf("subject: %s\n", mail.subject);
|
|
//printf("dateString: %s\n", mail.dateString);
|
|
//printf("replyTo: %s\n", mail.replyTo);
|
|
|
|
free_VersaMail(&mail);
|
|
}
|
|
|
|
void validate_versamail_packer(void *record, int size, int attr, int idx)
|
|
{
|
|
struct VersaMail mail;
|
|
char *buffer;
|
|
int len;
|
|
int i;
|
|
|
|
unpack_VersaMail(&mail, record, size);
|
|
len = pack_VersaMail(&mail, NULL, 0);
|
|
buffer = malloc(len);
|
|
pack_VersaMail(&mail, buffer, len);
|
|
|
|
/* printf("-------------\n"); */
|
|
if (size - len != 0) {
|
|
printf
|
|
("on-disk size is %d, pack asked for %d to repack, wrong by %d.\n",
|
|
size, len, size - len);
|
|
}
|
|
printf("subject: %s\n", mail.subject);
|
|
printf(" attachment count: %d\n", mail.attachmentCount);
|
|
|
|
if (0) {
|
|
printf("uid: %d\n", (int) mail.imapuid);
|
|
printf("size: %d\n", mail.msgSize);
|
|
printf("unknown1: %d\n", mail.unknown1);
|
|
printf("unknown2: %d\n", mail.unknown2);
|
|
printf("reserved1: %d\n", mail.reserved1);
|
|
printf("reserved2: %d\n", mail.reserved2);
|
|
printf("download: %d\n", mail.download);
|
|
printf("mark: %d\n", mail.mark);
|
|
/*
|
|
printf("body: %s\n", mail.body);
|
|
printf("dateString: %s\n", mail.dateString);
|
|
printf("replyTo: %s\n", mail.replyTo);
|
|
*/
|
|
}
|
|
|
|
if (0) {
|
|
if (mail.unknown3length > 0) {
|
|
for (i = 0; i < mail.unknown3length; i++) {
|
|
printf
|
|
("unknown attachment system Byte %3d: 0x%10x | %c | %6d\n",
|
|
i, ((char *) mail.unknown3)[i],
|
|
(isprint(((char *) mail.unknown3)[i])
|
|
? ((char *) mail.unknown3)[i] : '.'),
|
|
((char *) mail.unknown3)[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
for (i = 0; i < ((size) > (len) ? (size) : (len)); i++) {
|
|
if ((i < len) && (i < size)) {
|
|
if (!((char *) record)[i] == buffer[i]) {
|
|
printf
|
|
("WRONG Byte %3d: 0x%10x (%c) vs. 0x%10x (%c)\n",
|
|
i, ((char *) record)[i],
|
|
(isprint(((char *) record)[i])
|
|
? ((char *) record)[i] : '.'),
|
|
buffer[i],
|
|
(isprint(buffer[i]) ? buffer[i] :
|
|
'.'));
|
|
} else {
|
|
if (0) {
|
|
printf
|
|
(" OK Byte %3d: 0x%10x (%c) vs. 0x%10x (%c)\n",
|
|
i, ((char *) record)[i],
|
|
(isprint(((char *) record)[i])
|
|
? ((char *) record)[i] :
|
|
'.'), buffer[i],
|
|
(isprint(buffer[i]) ?
|
|
buffer[i] : '.'));
|
|
}
|
|
}
|
|
} else if (i < len) {
|
|
printf
|
|
("WRONG Byte %3d: ----------- vs. 0x%10x (%c)\n",
|
|
i, buffer[i],
|
|
(isprint(buffer[i]) ? buffer[i] : '.'));
|
|
} else if (i < size) {
|
|
printf
|
|
("WRONG Byte %3d: 0x%10x (%c) vs. -----------\n",
|
|
i + 1, ((char *) record)[i],
|
|
(isprint(((char *) record)[i])
|
|
? ((char *) record)[i] : '.'));
|
|
}
|
|
}
|
|
free(buffer);
|
|
free_VersaMail(&mail);
|
|
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
struct pi_file *pi_fp;
|
|
char *DBname;
|
|
int r;
|
|
int idx;
|
|
size_t size;
|
|
int attr;
|
|
int cat;
|
|
recordid_t uid;
|
|
void *record;
|
|
|
|
DBname = "MultiMail Messages.pdb";
|
|
|
|
pi_fp = pi_file_open(DBname);
|
|
if (pi_fp == 0) {
|
|
printf("Unable to open '%s'!\n", DBname);
|
|
return -1;
|
|
}
|
|
|
|
pi_file_get_app_info PI_ARGS((pi_fp, &record, &size));
|
|
|
|
print_versamail_app_info(r, record, size);
|
|
printf("----------\n");
|
|
|
|
for (idx = 0;; idx++) {
|
|
r = pi_file_read_record(pi_fp, idx, &record, &size, &attr,
|
|
&cat, &uid);
|
|
if (r < 0)
|
|
break;
|
|
//print_versamail_record(record, size, attr, idx);
|
|
validate_versamail_packer(record, size, attr, idx);
|
|
}
|
|
|
|
pi_file_close(pi_fp);
|
|
|
|
return 0;
|
|
}
|