libpst.h

Go to the documentation of this file.
00001 /***
00002  * libpst.h
00003  * Part of LibPST project
00004  * Written by David Smith
00005  *            dave.s@earthcorp.com
00006  */
00007 // LibPST - Library for Accessing Outlook .pst files
00008 // Dave Smith - davesmith@users.sourceforge.net
00009 
00010 #ifndef __PST_LIBPST_H
00011 #define __PST_LIBPST_H
00012 
00013 #include "common.h"
00014 
00015 
00016 // switch to maximal packing for all structures in the libpst interface
00017 // this is reverted at the end of this file
00018 #ifdef _MSC_VER
00019     #pragma pack(push, 1)
00020 #endif
00021 #if defined(__GNUC__) || defined (__SUNPRO_C) || defined(__SUNPRO_CC)
00022     #pragma pack(1)
00023 #endif
00024 
00025 
00026 #define PST_TYPE_NOTE        1
00027 #define PST_TYPE_SCHEDULE    2
00028 #define PST_TYPE_APPOINTMENT 8
00029 #define PST_TYPE_CONTACT     9
00030 #define PST_TYPE_JOURNAL    10
00031 #define PST_TYPE_STICKYNOTE 11
00032 #define PST_TYPE_TASK       12
00033 #define PST_TYPE_OTHER      13
00034 #define PST_TYPE_REPORT     14
00035 #define PST_TYPE_MAX        15
00036 
00037 // defines types of possible encryption
00038 #define PST_NO_ENCRYPT   0
00039 #define PST_COMP_ENCRYPT 1
00040 #define PST_ENCRYPT      2
00041 
00042 // defines different types of mappings
00043 #define PST_MAP_ATTRIB (uint32_t)1
00044 #define PST_MAP_HEADER (uint32_t)2
00045 
00046 // define my custom email attributes.
00047 #define PST_ATTRIB_HEADER -1
00048 
00049 // defines types of free/busy values for appointment->showas
00050 #define PST_FREEBUSY_FREE          0
00051 #define PST_FREEBUSY_TENTATIVE     1
00052 #define PST_FREEBUSY_BUSY          2
00053 #define PST_FREEBUSY_OUT_OF_OFFICE 3
00054 
00055 // defines labels for appointment->label
00056 #define PST_APP_LABEL_NONE        0
00057 #define PST_APP_LABEL_IMPORTANT   1
00058 #define PST_APP_LABEL_BUSINESS    2
00059 #define PST_APP_LABEL_PERSONAL    3
00060 #define PST_APP_LABEL_VACATION    4
00061 #define PST_APP_LABEL_MUST_ATTEND 5
00062 #define PST_APP_LABEL_TRAVEL_REQ  6
00063 #define PST_APP_LABEL_NEEDS_PREP  7
00064 #define PST_APP_LABEL_BIRTHDAY    8
00065 #define PST_APP_LABEL_ANNIVERSARY 9
00066 #define PST_APP_LABEL_PHONE_CALL  10
00067 
00068 // define type of recuring event
00069 #define PST_APP_RECUR_NONE        0
00070 #define PST_APP_RECUR_DAILY       1
00071 #define PST_APP_RECUR_WEEKLY      2
00072 #define PST_APP_RECUR_MONTHLY     3
00073 #define PST_APP_RECUR_YEARLY      4
00074 
00075 // define attachment types
00076 #define PST_ATTACH_NONE             0
00077 #define PST_ATTACH_BY_VALUE         1
00078 #define PST_ATTACH_BY_REF           2
00079 #define PST_ATTACH_BY_REF_RESOLV    3
00080 #define PST_ATTACH_BY_REF_ONLY      4
00081 #define PST_ATTACH_EMBEDDED         5
00082 #define PST_ATTACH_OLE              6
00083 
00084 // define flags
00085 #define PST_FLAG_READ           0x01
00086 #define PST_FLAG_UNMODIFIED     0x02
00087 #define PST_FLAG_SUBMIT         0x04
00088 #define PST_FLAG_UNSENT         0x08
00089 #define PST_FLAG_HAS_ATTACHMENT 0x10
00090 #define PST_FLAG_FROM_ME        0x20
00091 #define PST_FLAG_ASSOCIATED     0x40
00092 #define PST_FLAG_RESEND         0x80
00093 #define PST_FLAG_RN_PENDING     0x100
00094 #define PST_FLAG_NRN_PENDING    0x200
00095 
00096 
00097 typedef struct pst_entryid {
00098     int32_t u1;
00099     char entryid[16];
00100     uint32_t id;
00101 } pst_entryid;
00102 
00103 
00104 typedef struct pst_index_ll {
00105     uint64_t i_id;
00106     uint64_t offset;
00107     uint64_t size;
00108     uint64_t inflated_size;
00109     int64_t  u1;
00110 } pst_index_ll;
00111 
00112 
00113 typedef struct pst_id2_tree {
00114     uint64_t            id2;
00115     pst_index_ll        *id;
00116     struct pst_id2_tree *child;
00117     struct pst_id2_tree *next;
00118 } pst_id2_tree;
00119 
00120 
00121 typedef struct pst_desc_tree {
00122     uint64_t              d_id;
00123     uint64_t              parent_d_id;
00124     pst_index_ll         *desc;
00125     pst_index_ll         *assoc_tree;
00126     int32_t               no_child;
00127     struct pst_desc_tree *prev;
00128     struct pst_desc_tree *next;
00129     struct pst_desc_tree *parent;
00130     struct pst_desc_tree *child;
00131     struct pst_desc_tree *child_tail;
00132 } pst_desc_tree;
00133 
00134 
00139 typedef struct pst_string {
00142     int     is_utf8;
00143     char   *str;
00144 } pst_string;
00145 
00146 
00148 typedef struct pst_binary {
00149     size_t  size;
00150     char   *data;
00151 } pst_binary;
00152 
00153 
00156 typedef struct pst_item_email {
00158     FILETIME   *arrival_date;
00163     int         autoforward;
00165     pst_string  cc_address;
00167     pst_string  bcc_address;
00169     pst_binary  conversation_index;
00173     int         conversion_prohibited;
00177     int         delete_after_submit;
00181     int         delivery_report;
00183     pst_binary  encrypted_body;
00185     pst_binary  encrypted_htmlbody;
00187     pst_string  header;
00189     pst_string  htmlbody;
00194     int32_t     importance;
00196     pst_string  in_reply_to;
00200     int         message_cc_me;
00204     int         message_recip_me;
00208     int         message_to_me;
00210     pst_string  messageid;
00216     int32_t     original_sensitivity;
00218     pst_string  original_bcc;
00220     pst_string  original_cc;
00222     pst_string  original_to;
00224     pst_string  outlook_recipient;
00226     pst_string  outlook_recipient_name;
00228     pst_string  outlook_recipient2;
00230     pst_string  outlook_sender;
00232     pst_string  outlook_sender_name;
00234     pst_string  outlook_sender2;
00240     int32_t     priority;
00242     pst_string  processed_subject;
00246     int         read_receipt;
00248     pst_string  recip_access;
00250     pst_string  recip_address;
00252     pst_string  recip2_access;
00254     pst_string  recip2_address;
00258     int         reply_requested;
00260     pst_string  reply_to;
00262     pst_string  return_path_address;
00266     int32_t     rtf_body_char_count;
00268     int32_t     rtf_body_crc;
00272     pst_string  rtf_body_tag;
00276     pst_binary  rtf_compressed;
00284     int         rtf_in_sync;
00287     int32_t     rtf_ws_prefix_count;
00290     int32_t     rtf_ws_trailing_count;
00292     pst_string  sender_access;
00294     pst_string  sender_address;
00296     pst_string  sender2_access;
00298     pst_string  sender2_address;
00304     int32_t     sensitivity;
00306     FILETIME    *sent_date;
00308     pst_entryid *sentmail_folder;
00310     pst_string  sentto_address;
00312     pst_string  report_text;
00314     FILETIME   *report_time;
00316     int32_t     ndr_reason_code;
00318     int32_t     ndr_diag_code;
00320     pst_string  supplementary_info;
00322     int32_t     ndr_status_code;
00323 
00324     // elements added for .msg processing
00326     pst_string  outlook_received_name1;
00328     pst_string  outlook_sender_name2;
00330     pst_string  outlook_normalized_subject;
00332     pst_string  outlook_search_key;
00333 } pst_item_email;
00334 
00335 
00338 typedef struct pst_item_folder {
00340     int32_t  item_count;
00342     int32_t  unseen_item_count;
00346     int32_t  assoc_count;
00351     int      subfolder;
00352 } pst_item_folder;
00353 
00354 
00357 typedef struct pst_item_message_store {
00359     pst_entryid *top_of_personal_folder;
00361     pst_entryid *default_outbox_folder;
00363     pst_entryid *deleted_items_folder;
00365     pst_entryid *sent_items_folder;
00367     pst_entryid *user_views_folder;
00369     pst_entryid *common_view_folder;
00371     pst_entryid *search_root_folder;
00373     pst_entryid *top_of_folder;
00384     int32_t valid_mask;
00386     int32_t pwd_chksum;
00387 } pst_item_message_store;
00388 
00389 
00392 typedef struct pst_item_contact {
00394     pst_string  account_name;
00396     pst_string  address1;
00398     pst_string  address1a;
00400     pst_string  address1_desc;
00402     pst_string  address1_transport;
00404     pst_string  address2;
00406     pst_string  address2a;
00408     pst_string  address2_desc;
00410     pst_string  address2_transport;
00412     pst_string  address3;
00414     pst_string  address3a;
00416     pst_string  address3_desc;
00418     pst_string  address3_transport;
00420     pst_string  assistant_name;
00422     pst_string  assistant_phone;
00424     pst_string  billing_information;
00426     FILETIME   *birthday;
00428     pst_string  business_address;
00430     pst_string  business_city;
00432     pst_string  business_country;
00434     pst_string  business_fax;
00436     pst_string  business_homepage;
00438     pst_string  business_phone;
00440     pst_string  business_phone2;
00442     pst_string  business_po_box;
00444     pst_string  business_postal_code;
00446     pst_string  business_state;
00448     pst_string  business_street;
00450     pst_string  callback_phone;
00452     pst_string  car_phone;
00454     pst_string  company_main_phone;
00456     pst_string  company_name;
00458     pst_string  computer_name;
00460     pst_string  customer_id;
00462     pst_string  def_postal_address;
00464     pst_string  department;
00466     pst_string  display_name_prefix;
00468     pst_string  first_name;
00470     pst_string  followup;
00472     pst_string  free_busy_address;
00474     pst_string  ftp_site;
00476     pst_string  fullname;
00481     int16_t     gender;
00483     pst_string  gov_id;
00485     pst_string  hobbies;
00487     pst_string  home_address;
00489     pst_string  home_city;
00491     pst_string  home_country;
00493     pst_string  home_fax;
00495     pst_string  home_phone;
00497     pst_string  home_phone2;
00499     pst_string  home_po_box;
00501     pst_string  home_postal_code;
00503     pst_string  home_state;
00505     pst_string  home_street;
00507     pst_string  initials;
00509     pst_string  isdn_phone;
00511     pst_string  job_title;
00513     pst_string  keyword;
00515     pst_string  language;
00517     pst_string  location;
00521     int         mail_permission;
00523     pst_string  manager_name;
00525     pst_string  middle_name;
00527     pst_string  mileage;
00529     pst_string  mobile_phone;
00531     pst_string  nickname;
00533     pst_string  office_loc;
00535     pst_string  common_name;
00537     pst_string  org_id;
00539     pst_string  other_address;
00541     pst_string  other_city;
00543     pst_string  other_country;
00545     pst_string  other_phone;
00547     pst_string  other_po_box;
00549     pst_string  other_postal_code;
00551     pst_string  other_state;
00553     pst_string  other_street;
00555     pst_string  pager_phone;
00557     pst_string  personal_homepage;
00559     pst_string  pref_name;
00561     pst_string  primary_fax;
00563     pst_string  primary_phone;
00565     pst_string  profession;
00567     pst_string  radio_phone;
00571     int         rich_text;
00573     pst_string  spouse_name;
00575     pst_string  suffix;
00577     pst_string  surname;
00579     pst_string  telex;
00581     pst_string  transmittable_display_name;
00583     pst_string  ttytdd_phone;
00585     FILETIME   *wedding_anniversary;
00587     pst_string  work_address_street;
00589     pst_string  work_address_city;
00591     pst_string  work_address_state;
00593     pst_string  work_address_postalcode;
00595     pst_string  work_address_country;
00597     pst_string  work_address_postofficebox;
00598 } pst_item_contact;
00599 
00600 
00603 typedef struct pst_item_attach {
00605     pst_string      filename1;
00607     pst_string      filename2;
00609     pst_string      mimetype;
00611     pst_string      content_id;
00613     pst_binary      data;
00615     uint64_t        id2_val;
00617     uint64_t        i_id;
00619     pst_id2_tree    *id2_head;
00628     int32_t         method;
00630     int32_t         position;
00632     int32_t         sequence;
00633     struct pst_item_attach *next;
00634 } pst_item_attach;
00635 
00636 
00638 typedef struct pst_item_extra_field {
00639     char   *field_name;
00640     char   *value;
00641     struct pst_item_extra_field *next;
00642 } pst_item_extra_field;
00643 
00644 
00647 typedef struct pst_item_journal {
00649     FILETIME   *start;
00651     FILETIME   *end;
00653     pst_string  type;
00655     pst_string  description;
00656 } pst_item_journal;
00657 
00658 
00662 typedef struct pst_recurrence {
00664     uint32_t    signature;
00669     uint32_t    type;
00676     uint32_t    sub_type;
00678     uint32_t    parm1;
00679     uint32_t    parm2;
00680     uint32_t    parm3;
00681     uint32_t    parm4;
00682     uint32_t    parm5;
00688     uint32_t    termination;
00690     uint32_t    interval;
00692     uint32_t    bydaymask;
00694     uint32_t    dayofmonth;
00696     uint32_t    monthofyear;
00698     uint32_t    position;
00700     uint32_t    count;
00701     // there is more data, including the termination date,
00702     // but we can get that from other mapi elements.
00703 } pst_recurrence;
00704 
00705 
00708 typedef struct pst_item_appointment {
00710     FILETIME   *start;
00712     FILETIME   *end;
00714     pst_string  location;
00718     int         alarm;
00720     FILETIME   *reminder;
00722     int32_t     alarm_minutes;
00724     pst_string  alarm_filename;
00726     pst_string  timezonestring;
00732     int32_t     showas;
00745     int32_t     label;
00749     int         all_day;
00753     int         is_recurring;
00760     int32_t     recurrence_type;
00762     pst_string  recurrence_description;
00764     pst_binary  recurrence_data;
00766     FILETIME   *recurrence_start;
00768     FILETIME   *recurrence_end;
00769 } pst_item_appointment;
00770 
00771 
00775 typedef struct pst_item {
00777     struct pst_file        *pf;
00779     uint64_t               block_id;
00781     pst_item_email         *email;
00783     pst_item_folder        *folder;
00785     pst_item_contact       *contact;
00787     pst_item_attach        *attach;
00789     pst_item_message_store *message_store;
00791     pst_item_extra_field   *extra_fields;
00793     pst_item_journal       *journal;
00795     pst_item_appointment   *appointment;
00806     int         type;
00808     char       *ascii_type;
00820     int32_t     flags;
00822     pst_string  file_as;
00824     pst_string  comment;
00826     pst_string  body_charset;
00828     pst_string  body;
00830     pst_string  subject;
00832     int32_t     internet_cpid;
00834     int32_t     message_codepage;
00836     int32_t     message_size;
00838     pst_string  outlook_version;
00840     pst_binary  record_key;
00842     pst_binary  predecessor_change;
00846     int         response_requested;
00848     FILETIME   *create_date;
00850     FILETIME   *modify_date;
00854     int         private_member;
00855 } pst_item;
00856 
00857 
00866 typedef struct pst_x_attrib_ll {
00870     uint32_t mytype;
00872     uint32_t map;
00874     void     *data;
00876     struct pst_x_attrib_ll *next;
00877 } pst_x_attrib_ll;
00878 
00879 
00881 typedef struct pst_block_recorder {
00882     struct pst_block_recorder  *next;
00883     int64_t                     offset;
00884     size_t                      size;
00885     int                         readcount;
00886 } pst_block_recorder;
00887 
00888 
00889 typedef struct pst_file {
00891     FILE*   fp;
00893     char*   cwd;
00895     char*   fname;
00897     const char*   charset;
00899     pst_index_ll *i_table;
00900     size_t i_count, i_capacity;
00902     pst_desc_tree  *d_head, *d_tail;
00904     pst_x_attrib_ll *x_head;
00908     pst_block_recorder *block_head;
00909 
00913     int do_read64;
00915     uint64_t index1;
00917     uint64_t index1_back;
00919     uint64_t index2;
00921     uint64_t index2_back;
00923     uint64_t size;
00927     unsigned char encryption;
00933     unsigned char ind_type;
00934 } pst_file;
00935 
00936 
00944 int             pst_open(pst_file *pf, const char *name, const char *charset);
00945 
00946 
00951 int             pst_reopen(pst_file *pf);
00952 
00953 
00959 int             pst_load_index (pst_file *pf);
00960 
00961 
00966 int             pst_load_extended_attributes(pst_file *pf);
00967 
00968 
00972 int             pst_close(pst_file *pf);
00973 
00974 
00980 pst_desc_tree*  pst_getTopOfFolders(pst_file *pf, const pst_item *root);
00981 
00982 
00989 pst_binary      pst_attach_to_mem(pst_file *pf, pst_item_attach *attach);
00990 
00991 
00997 size_t          pst_attach_to_file(pst_file *pf, pst_item_attach *attach, FILE* fp);
00998 
00999 
01005 size_t          pst_attach_to_file_base64(pst_file *pf, pst_item_attach *attach, FILE* fp);
01006 
01007 
01012 pst_desc_tree*  pst_getNextDptr(pst_desc_tree* d);
01013 
01014 
01022 pst_item*       pst_parse_item (pst_file *pf, pst_desc_tree *d_ptr, pst_id2_tree *m_head);
01023 
01024 
01028 void            pst_freeItem(pst_item *item);
01029 
01030 
01036 pst_index_ll*   pst_getID(pst_file* pf, uint64_t i_id);
01037 
01038 
01046 size_t          pst_ff_getIDblock_dec(pst_file *pf, uint64_t i_id, char **buf);
01047 
01048 
01052 int pst_stricmp(char *a, char *b);
01053 
01054 
01062 size_t          pst_fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);
01063 
01064 
01073 char*           pst_rfc2426_escape(char* str, char** result, size_t* resultlen);
01074 
01075 
01083 char*           pst_rfc2425_datetime_format(const FILETIME* ft, int buflen, char* result);
01084 
01085 
01092 char*           pst_rfc2445_datetime_format(const FILETIME* ft, int buflen, char* result);
01093 
01094 
01100 char*           pst_rfc2445_datetime_format_now(int buflen, char* result);
01101 
01102 
01110 const char*     pst_default_charset(pst_item *item, int buflen, char* result);
01111 
01112 
01116 void            pst_rfc2231(pst_string *str);
01117 
01118 
01124 void            pst_rfc2047(pst_item *item, pst_string *str, int needs_quote);
01125 
01126 
01131 void            pst_convert_utf8_null(pst_item *item, pst_string *str);
01132 
01133 
01138 void            pst_convert_utf8(pst_item *item, pst_string *str);
01139 
01140 
01145 pst_recurrence* pst_convert_recurrence(pst_item_appointment* appt);
01146 
01147 
01151 void            pst_free_recurrence(pst_recurrence* r);
01152 
01153 
01154 
01155 // switch from maximal packing back to default packing
01156 // undo the packing from the beginning of this file
01157 #ifdef _MSC_VER
01158     #pragma pack(pop)
01159 #endif
01160 #if defined(__GNUC__) || defined (__SUNPRO_C) || defined(__SUNPRO_CC)
01161     #pragma pack()
01162 #endif
01163 
01164 
01165 
01166 #endif

Generated on 21 Jul 2017 for libpst.so.4 by  doxygen 1.6.1