The following header files are released under (C) 2007 GPL by Huidae Cho. The pilot-link project helped me better understand the schemas of old PIM databases.
This analysis is not yet complete.
/* DB schemas for Palm OS 5 PIM software * (C) 2007 GPL by Huidae Cho */ #ifndef _DATE_H_ #define _DATE_H_ #define alarmFlag(a) ((a)[6] & 0x40) #define repeatFlag(a) ((a)[6] & 0x20) #define noteFlag(a) ((a)[6] & 0x10) #define exceptionsFlag(a) ((a)[6] & 0x08) #define descriptionFlag(a) ((a)[6] & 0x04) #define locationFlag(a) ((a)[6] & 0x02) #define setAlarmFlag(a) (a)[6] |= 0x40 #define setRepeatFlag(a) (a)[6] |= 0x20 #define setNoteFlag(a) (a)[6] |= 0x10 #define setExceptionsFlag(a) (a)[6] |= 0x08 #define setDescriptionFlag(a) (a)[6] |= 0x04 #define setLocationFlag(a) (a)[6] |= 0x02 #define headerSize1(a) (8+(alarmFlag(a)?2:0)+(repeatFlag(a)?8:0)) #define exceptionsCount(a) (exceptionsFlag(a)? \ UInt8sToUInt16((a)[headerSize1(a)], (a)[headerSize1(a)+1]):0) #define headerSize(a) (headerSize1(a)+exceptionsCount(a)*2) #ifdef _DEFINE_VARS_ /* old/new pim header: variable length */ UInt8 hdr[] = { /* 8 + 2 * exceptions <= size <= 18 + 2 * exceptions */ 0xff, /* 0: start time hours */ 0xff, /* 1: start time minutes */ 0xff, /* 2: end time hours */ 0xff, /* 3: end time minutes */ /* packed = ((year-1904)<<9)|(month<<5)|day; */ 0x00, /* 4: packed>>8 */ 0x00, /* 5: packed&0xff */ 0x04, /* 6: when alarm repeat note exceptions description location ? */ 0x00, /* 7: gap fill */ }; /* if(alarm){ 2 bytes * alarm: 1 byte * earlier units: 1 byte: 0 minutes, 1 hours, 2 days * } * if(repeat){ 8 bytes * type: 1 byte, 0 none, 1 daily, 2 weekly, 3 monthly by day, * 4 monthly by date, 5 yearly * 0x00 * end date: 2 bytes, 0xffff forever * frequency: 1 byte * day of week bits: 1 byte * repeat week start: 1 byte * 0x00 * } * if(exceptions){ 2 + 2 * count bytes * count: 2 bytes * count * exception date: 2 * count bytes * } ******************************************************************************* * if(description) * description * if(note) * note * if(location) * location */ /* new pim footer for untimed events: fixed length */ UInt8 ftrNew[] = { 0x42, 0x64, 0x30, 0x31, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, }; #endif #endif
/* DB schemas for Palm OS 5 PIM software * (C) 2007 GPL by Huidae Cho */ #ifndef _ADDR_H_ #define _ADDR_H_ #define oldLastNameFlag(a) ((a)[7] & 0x1) #define oldFirstNameFlag(a) ((a)[7] & 0x2) #define oldCompanyFlag(a) ((a)[7] & 0x4) #define setOldLastNameFlag(a) (a)[7] |= 0x1 #define setOldFirstNameFlag(a) (a)[7] |= 0x2 #define setOldCompanyFlag(a) (a)[7] |= 0x4 #define lastNameFlag(a) ((a)[11] & 0x1) #define firstNameFlag(a) ((a)[11] & 0x2) #define companyFlag(a) ((a)[11] & 0x4) #define setLastNameFlag(a) (a)[11] |= 0x1 #define setFirstNameFlag(a) (a)[11] |= 0x2 #define setCompanyFlag(a) (a)[11] |= 0x4 #ifdef _DEFINE_VARS_ /* old pim header: fixed length */ UInt8 hdrOld[] = { 0x00, /* 0: reserved */ 0x05, /* 1: displayPhoneForList, phone5 */ 0x47, /* 2: phone4, phone3 */ 0x10, /* 3: phone2, phone1 */ 0x00, /* 4: reserved */ 0x00, /* 5: reserved[5], note ... custom3 */ 0x00, /* 6: custom2 ... address */ 0x01, /* 7: phone5 ... name */ 0x00, /* 8: companyFieldOffset */ }; /* new pim header: fixed length */ UInt8 hdrNew[] = { 0x03, /* 0 */ 0x65, /* 1: messanger, phone5 */ 0x47, /* 2: phone4, phone3 */ 0x10, /* 3: phone2, phone1 */ 0x02, /* 4 */ 0x10, /* 5 */ 0x00, /* 6 */ 0x21, /* 7: b0-3: 0 IM, 1 AIM, 2 MSN, 3 Yahoo, 4 AOL ICQ */ 0x00, /* 8 */ 0x00, /* 9 */ 0x00, /* 10 */ 0x01, /* 11: b0 last name, 1 first name, 2 company, 3 title */ 0x00, /* 12 */ 0x00, /* 13 */ 0x00, /* 14 */ 0x00, /* 15 */ 0x00, /* 16 */ }; /* field records */ #endif #endif
String terminated with '\0'.
/* DB schemas for Palm OS 5 PIM software * (C) 2007 GPL by Huidae Cho */ #ifndef _TODO_H_ #define _TODO_H_ #ifdef _DEFINE_VARS_ /* old pim header: fixed length */ UInt8 hdrOld[] = { /* packed = ((year-1904)<<9)|(month<<5)|day; */ /* 0xffff: no date */ 0xff, /* packed>>8 */ 0xff, /* packed&0xff */ 0x01, /* 7: complete flag, 3-0: priority */ }; #endif #define dueDateFlag(a) ((a)[0] & 0x80) #define completionDateFlag(a) ((a)[0] & 0x40) #define alarmFlag(a) ((a)[0] & 0x20) #define repeatFlag(a) ((a)[0] & 0x10) #define completedFlag(a) ((a)[3] & 0x01) #define priorityFlag(a) ((a)[5] & 0x0f) #define setDueDateFlag(a) (a)[0] |= 0x80 #define setCompletionDateFlag(a) (a)[0] |= 0x40 #define setAlarmFlag(a) (a)[0] |= 0x20 #define setRepeatFlag(a) (a)[0] |= 0x10 #define setCompletedFlag(a) (a)[3] |= 0x01 #define setPriorityFlag(a) (a)[5] |= 0x0f #define headerSize(a) (6+(dueDateFlag(a)?2:0)+(completionDateFlag(a)?2:0)+ \ (alarmFlag(a)?4:0)+(repeatFlag(a)?10:0)) #ifdef _DEFINE_VARS_ /* new pim header: variable length */ UInt8 hdrNew[] = { /* 6 <= size <= 24 */ 0x08, /* 0: b7 due date, b6 completion date: if(repeat) always set after completion, b5 alarm, b4 repeat */ 0x00, /* 1 */ 0x00, /* 2 */ 0x00, /* 3: b0: completed */ 0x00, /* 4 */ 0x01, /* 5: b0-2: priority */ /* optional: * if(due date){ 2 <= size <= 18 * due date: 2 bytes * if(completion date) 2 bytes * completion date: 2 bytes * if(alarm){ 4 bytes * hour: 1 byte * min: 1 byte * 0x00 * days earlier: 1 byte * } * if(repeat){ 10 bytes * TODO * repeat start date: 2 bytes * 0x01 0x00 * repeat end date: 2 bytes * 0x01 0x00 * 0x00 0x00 * } * }else * if(completion date) 2 bytes * completion date: 2 bytes */ }; /* description * note */ #endif #endif
/* DB schemas for Palm OS 5 PIM software * (C) 2007 GPL by Huidae Cho */ #ifndef _NOTE_H_ #define _NOTE_H_ #define alarmFlag(a) ((a)[29] & 0x04) #define descriptionFlag(a) ((a)[29] & 0x02) #define noteFlag(a) ((a)[29] & 0x01) #define setAlarmFlag(a) (a)[29] |= 0x04 #define setDescriptionFlag(a) (a)[29] |= 0x02 #define setNoteFlag(a) (a)[29] |= 0x01 #define headerSize(a) (30+(alarmFlag(a)?14:0)) #ifdef _DEFINE_VARS_ /* header: variable length */ UInt8 hdr[] = { /* 8 + 2 * exceptions <= size <= 18 + 2 * exceptions */ 0x00, /* 0 */ 0x00, /* 1: created time second */ 0x00, /* 2 */ 0x00, /* 3: created time minute */ 0x00, /* 4 */ 0x00, /* 5: created time hour */ 0x00, /* 6 */ 0x00, /* 7: created time day */ 0x00, /* 8 */ 0x00, /* 9: created time month */ 0x00, /* 10: created time year (hi byte) */ 0x00, /* 11: created time year (low byte) */ 0x00, /* 12 */ 0x06, /* 13 */ 0x00, /* 14 */ 0x00, /* 15: modified time seconds */ 0x00, /* 16 */ 0x00, /* 17: modified time minutes */ 0x00, /* 18 */ 0x00, /* 19: modified time hours */ 0x00, /* 20 */ 0x00, /* 21: modified time day */ 0x00, /* 22 */ 0x00, /* 23: modified time month */ 0x00, /* 24: modified time year(1) */ 0x00, /* 25: modified time year(2) */ 0x00, /* 26 */ 0x06, /* 27 */ 0x00, /* 28 */ 0x02, /* 29: ? ? ? ? ? alarm description note */ }; /* if(alarm){ 14 bytes * 0 * 1: created time seconds * 2 * 3: created time minutes * 4 * 5: created time hours * 6 * 7: created time day * 8 * 9: created time month * 10: created time year(1) * 11: created time year(2) * 12 * 13 * } * if(description) * description * if(note) * note */ #endif #endif