Scribe Specific Node Formats ---------------------------- This document assumes you have read the file 'format.txt' in relation to LGI's flat file storage, as it only describes the node data format that Scribe uses not how to retreive the nodes themselves. The node types that Scribe uses are: MAGIC_BASE = 0xAAFF0000, MAGIC_MAIL = (MAGIC_BASE+1), // Mail item MAGIC_CONTACT = (MAGIC_BASE+2), // Contact item MAGIC_FOLDER = (MAGIC_BASE+3), // Folder of items MAGIC_MAILBOX = (MAGIC_BASE+4), // Root of mail tree (nothing-abstract) MAGIC_ATTACHMENT = (MAGIC_BASE+5), // Mail attachment MAGIC_ANY = (MAGIC_BASE+6), // Trash folder type (accepts any object) MAGIC_FILTER = (MAGIC_BASE+7), // Used to match messages against MAGIC_FOLDER_2 = (MAGIC_BASE+8), // Folder v2 MAGIC_CONDITION = (MAGIC_BASE+9), // Filter condition MAGIC_ACTION = (MAGIC_BASE+10), // Filter action MAGIC_CALENDAR = (MAGIC_BASE+11), // Calendar event MAGIC_ATTENDEE = (MAGIC_BASE+12), // Event attendee MAGIC_GROUP = (MAGIC_BASE+13), // Contact group So the root node is always MAGIC_MAILBOX, which will have children of type MAGIC_FOLDER_2. These MAGIC_FOLDER_2 nodes will have children of a specific type, mail or contacts. i.e. The inbox folder has children of type MAGIC_MAIL. MAGIC_MAIL nodes can have children of type MAGIC_ATTACHMENT. The format of the data stored in various nodes is based around lists of fields. The fields are not typed, in that the field is always stored and retreived as the same type, set by the Id. Also have their size stored with the field to enable old versions to skip newer fields. The structure of a field is like this: struct ScribeField { uint16 Id; // The field's identifier uint32 Size; // The size of the data that follows char Data[Size]; // The data. } Commonly the fields are of the type "string", "numeric" or an object. "string" type field: The data is [usually] utf-8 string data with no NULL terminator. "numeric" type field: The data is a standard C numeric type like a char, short, int, long long or double. Which really depends on the Id of the field. I match the Id with the C var using macros. "object" type field: This is usually a C++ object that knows how to load/save itself into a field. For instance a GDateTime object or a ListAddress object (email To/Cc/Bcc entry). struct StandardNodeFormat { int32 Magic; // = MAGIC_???? value int32 Fields; // number of fields that follow ScribeField Field[Fields]; // list of fields. }; Some objects that are references below: struct GDateTime { int32 Day; int32 Month; int32 Year; int32 Thousands; int32 Second); int32 Minutes; int32 Hours; }; struct FolderColumn { int32 Id; int32 Width; }; struct AddressDescriptor { string Name; string Email; } MAGIC_FOLDER_2 feilds: FIELD_FOLDER_TYPE, int32 FIELD_FOLDER_NAME, string FIELD_UNREAD, int32 FIELD_SORT, int32 // (ColumnIndex + 1) * (Descending ? 1 : -1) FIELD_FOLDER_OPEN, uint8 FIELD_FOLDER_PERM_READ, int32 FIELD_FOLDER_PERM_WRITE, int32 FIELD_COLUMN, object: FolderColumn MAGIC_MAIL fields: FIELD_FROM, object: AddressDescriptor FIELD_REPLY, object: AddressDescriptor FIELD_TO, object: AddressDescriptor FIELD_CC, object: AddressDescriptor FIELD_BCC, object: AddressDescriptor FIELD_DATE, object: GDateTime FIELD_DATE_SENT, object: GDateTime FIELD_SUBJECT, string FIELD_TEXT, string FIELD_MESSAGE_ID, string FIELD_INTERNET_HEADER, string FIELD_FLAGS, int32 FIELD_PRIORITY, int8 // 1-high, 3-normal, 5-low FIELD_CHARSET, string FIELD_MARK_COLOUR, int32 // rgba FIELD_ALTERNATE_HTML, string FIELD_HTML_CHARSET, string FIELD_LABEL, string FIELD_REFERENCES, string // comma separated msg id's FIELD_SERVER_UID, string MAGIC_CONTACT fields: FIELD_TITLE, string FIELD_FIRST_NAME, string FIELD_LAST_NAME, string FIELD_EMAIL_ADDR, string FIELD_NICK, string FIELD_SPOUSE, string FIELD_NOTE, string FIELD_TIMEZONE, string FIELD_HOME_STREET, string FIELD_HOME_SUBURB, string FIELD_HOME_POSTCODE, string FIELD_HOME_STATE, string FIELD_HOME_COUNTRY, string FIELD_HOME_PHONE, string FIELD_HOME_MOBILE, string FIELD_HOME_IM, string FIELD_HOME_FAX, string FIELD_HOME_WEBPAGE, string FIELD_WORK_STREET, string FIELD_WORK_SUBURB, string FIELD_WORK_POSTCODE, string FIELD_WORK_STATE, string FIELD_WORK_COUNTRY, string FIELD_WORK_PHONE, string FIELD_WORK_MOBILE, string FIELD_WORK_IM, string FIELD_WORK_FAX, string FIELD_WORK_WEBPAGE, string FIELD_COMPANY, string FIELD_CONTACT_CUST_FLD1, string FIELD_CONTACT_CUST_VAL1, string FIELD_CONTACT_CUST_FLD2, string FIELD_CONTACT_CUST_VAL2, string FIELD_CONTACT_CUST_FLD3, string FIELD_CONTACT_CUST_VAL3, string FIELD_CONTACT_CUST_FLD4, string FIELD_CONTACT_CUST_VAL4, string The values of all the Id's are: // Mail fields #define FIELD_FLAGS 1 #define FIELD_TO 2 #define FIELD_CC 3 #define FIELD_FROM 4 #define FIELD_REPLY 5 #define FIELD_SUBJECT 6 #define FIELD_TEXT 7 #define FIELD_MESSAGE_ID 8 #define FIELD_DATE 9 // received date #define FIELD_INTERNET_HEADER 10 // Contact fields #define FIELD_FIRST_NAME 11 #define FIELD_LAST_NAME 12 #define FIELD_EMAIL_ADDR 13 #define FIELD_HOME_STREET 14 #define FIELD_HOME_SUBURB 15 #define FIELD_HOME_POSTCODE 16 #define FIELD_HOME_STATE 17 #define FIELD_HOME_COUNTRY 18 #define FIELD_WORK_PHONE 19 // this was already defined #define FIELD_HOME_PHONE 20 #define FIELD_HOME_MOBILE 21 #define FIELD_HOME_IM 22 #define FIELD_HOME_FAX 23 #define FIELD_HOME_WEBPAGE 24 #define FIELD_NICK 25 #define FIELD_SPOUSE 26 #define FIELD_NOTE 27 #define FIELD_PLUGIN_ASSOC 28 // More fields #define FIELD_SIZE 29 #define FIELD_DATE_SENT 30 #define FIELD_COLUMN 31 #define FIELD_BCC 32 #define FIELD_MIME_TYPE 33 #define FIELD_PRIORITY 34 #define FIELD_FOLDER_OPEN 35 #define FIELD_CODE_PAGE 36 #define FIELD_MARK_COLOUR 37 #define FIELD_ALTERNATE_HTML 38 #define FIELD_CONTENT_ID 39 // Filter fields #define FIELD_FILTER_NAME 40 #define FIELD_CONDITION 41 #define FIELD_ACTION 42 #define FIELD_COND_FIELD 43 #define FIELD_COND_OPERATOR 44 #define FIELD_COND_VALUE 45 #define FIELD_ACT_TYPE 46 #define FIELD_ACT_ARG 47 #define FIELD_DIGEST_INDEX 48 #define FIELD_COMBINE_OP 49 #define FIELD_FILTER_INDEX 50 #define FIELD_COND_SOURCE 51 #define FIELD_FILTER_SCRIPT 52 #define FIELD_COND_NOT 53 #define FIELD_STOP_FILTERING 54 // Calendar fields #define FIELD_CAL_START 60 #define FIELD_CAL_END 61 #define FIELD_CAL_SUBJECT 62 #define FIELD_CAL_LOCATION 63 #define FIELD_CAL_REMINDER_TIME 64 #define FIELD_CAL_REMINDER_ACTION 65 #define FIELD_CAL_REMINDER_ARG 66 #define FIELD_CAL_SHOW_TIME_AS 67 #define FIELD_CAL_RECUR_PERIOD 68 #define FIELD_CAL_RECUR_EVERY 69 #define FIELD_CAL_RECUR_FLAGS 70 #define FIELD_CAL_RECUR_START 71 #define FIELD_CAL_RECUR_END 72 #define FIELD_CAL_NOTES 73 // Attendee fields #define FIELD_ATTENDEE_NAME 80 #define FIELD_ATTENDEE_EMAIL 81 #define FIELD_ATTENDEE_ATTENDENCE 82 #define FIELD_ATTENDEE_NOTE 83 #define FIELD_ATTENDEE_RESPONSE 84 // 2nd lot of contact fields #define FIELD_WORK_STREET 90 #define FIELD_WORK_SUBURB 91 #define FIELD_WORK_POSTCODE 92 #define FIELD_WORK_STATE 93 #define FIELD_WORK_COUNTRY 94 // #define FIELD_WORK_PHONE is previously defined #define FIELD_WORK_MOBILE 95 #define FIELD_WORK_IM 96 #define FIELD_WORK_FAX 97 #define FIELD_WORK_WEBPAGE 98 #define FIELD_COMPANY 99 #define FIELD_CONTACT_CUST_FLD1 100 #define FIELD_CONTACT_CUST_VAL1 101 #define FIELD_CONTACT_CUST_FLD2 102 #define FIELD_CONTACT_CUST_VAL2 103 #define FIELD_CONTACT_CUST_FLD3 104 #define FIELD_CONTACT_CUST_VAL3 105 #define FIELD_CONTACT_CUST_FLD4 106 #define FIELD_CONTACT_CUST_VAL4 107 // Misc additional fields #define FIELD_LABEL 110 // Mail label #define FIELD_CHARSET 111 #define FIELD_ALT_EMAIL 112 #define FIELD_UID 113 #define FIELD_TITLE 114 #define FIELD_TIMEZONE 115 #define FIELD_REFERENCES 116 #define FIELD_SERVER_UID 117 // char *Mail::ServerUid #define FIELD_FOLDER_PERM_READ 118 #define FIELD_FOLDER_PERM_WRITE 119 #define FIELD_GROUP_NAME 120 #define FIELD_HTML_CHARSET 121 #define FIELD_MAX 122 // Folder fields... (don't ask why they're not in the same range) #define FIELD_FOLDER_TYPE 1000 #define FIELD_FOLDER_NAME 1001 #define FIELD_UNREAD 1002 #define FIELD_SORT 1003