emsmdbp_object.c File Reference

Server-side specific objects init/release routines. More...

#include <ctype.h>
#include "mapiproxy/dcesrv_mapiproxy.h"
#include "mapiproxy/libmapiproxy/libmapiproxy.h"
#include "mapiproxy/libmapiproxy/fault_util.h"
#include "mapiproxy/libmapiserver/libmapiserver.h"
#include "mapiproxy/libmapistore/mapistore_nameid.h"
#include "libmapi/property_tags.h"
#include "libmapi/property_altnames.h"
#include "dcesrv_exchange_emsmdb.h"

Functions

static char * emsmdbp_compute_parent_uri (TALLOC_CTX *mem_ctx, char *uri)
 
static enum mapistore_context_role emsmdbp_container_class_to_role (const char *container_class)
 
static int emsmdbp_copy_message_attachments_mapistore (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *source_object, struct emsmdbp_object *dest_object)
 
static int emsmdbp_copy_message_recipients_mapistore (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *source_object, struct emsmdbp_object *dest_object)
 
static int emsmdbp_copy_properties (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *source_object, struct emsmdbp_object *dest_object, struct SPropTagArray *excluded_tags)
 
static enum MAPISTATUS emsmdbp_fetch_freebusy (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, const char *username, struct tm *start_tm, struct tm *end_tm, struct mapistore_freebusy_properties **fb_props_p)
 
_PUBLIC_ void emsmdbp_fill_row_blob (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, uint8_t *layout, DATA_BLOB *property_row, struct SPropTagArray *properties, void **data_pointers, enum MAPISTATUS *retvals, bool *untyped_status)
 
_PUBLIC_ void emsmdbp_fill_table_row_blob (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, DATA_BLOB *table_row, uint16_t num_props, enum MAPITAGS *properties, void **data_pointers, enum MAPISTATUS *retvals)
 
_PUBLIC_ enum mapistore_error emsmdbp_folder_delete (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_folder, uint64_t fid, uint8_t flags)
 
_PUBLIC_ enum mapistore_error emsmdbp_folder_delete_indexing_records (struct mapistore_context *mstore_ctx, uint32_t context_id, char *username, uint64_t fid, uint64_t *deleted_fmids, uint32_t deleted_fmids_count, uint8_t flags)
 
enum MAPISTATUS emsmdbp_folder_get_folder_count (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *folder, uint32_t *row_countp)
 
enum MAPISTATUS emsmdbp_folder_get_recursive_folder_count (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *folder, uint32_t *row_countp)
 
_PUBLIC_ enum mapistore_error emsmdbp_folder_move_folder (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *move_folder, struct emsmdbp_object *target_folder, TALLOC_CTX *mem_ctx, const char *new_name)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_folder_open_table (TALLOC_CTX *mem_ctx, struct emsmdbp_object *parent_object, uint32_t table_type, uint32_t handle_id)
 
_PUBLIC_ uint32_t emsmdbp_get_contextID (struct emsmdbp_object *object)
 
_PUBLIC_ int emsmdbp_get_fid_from_uri (struct emsmdbp_context *emsmdbp_ctx, const char *uri, uint64_t *fidp)
 
static struct emsmdbp_objectemsmdbp_get_mailbox (struct emsmdbp_object *object)
 
char * emsmdbp_get_owner (struct emsmdbp_object *object)
 
static enum MAPISTATUS emsmdbp_get_parent_fid (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *mailbox_object, uint64_t fid, uint64_t *parent_fidp)
 
_PUBLIC_ int emsmdbp_get_uri_from_fid (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, uint64_t fid, char **urip)
 
const char * emsmdbp_getstr_type (struct emsmdbp_object *object)
 
bool emsmdbp_is_mailboxstore (struct emsmdbp_object *object)
 
bool emsmdbp_is_mapistore (struct emsmdbp_object *object)
 
_PUBLIC_ enum MAPISTATUS emsmdbp_object_attach_sharing_metadata_XML_file (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *sharing_object)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_attachment_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, uint64_t messageID, struct emsmdbp_object *parent)
 
_PUBLIC_ int emsmdbp_object_copy_properties (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *source_object, struct emsmdbp_object *target_object, struct SPropTagArray *excluded_properties, bool deep_copy)
 
_PUBLIC_ enum MAPISTATUS emsmdbp_object_create_folder (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_folder, TALLOC_CTX *mem_ctx, uint64_t fid, struct SRow *rowp, bool force_container_class, struct emsmdbp_object **new_folderp)
 
static int emsmdbp_object_destructor (void *data)
 
static enum mapistore_error emsmdbp_object_folder_commit_creation (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *new_folder, bool force_container_class)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_folder_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, uint64_t folderID, struct emsmdbp_object *parent_object)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_ftcontext_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent)
 
_PUBLIC_ int emsmdbp_object_get_available_properties (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *object, struct SPropTagArray **propertiesp)
 
_PUBLIC_ enum mapistore_error emsmdbp_object_get_fid_by_name (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_folder, const char *name, uint64_t *fidp)
 
_PUBLIC_ void ** emsmdbp_object_get_properties (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *object, struct SPropTagArray *properties, enum MAPISTATUS **retvalsp)
 
static int emsmdbp_object_get_properties_mailbox (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *object, struct SPropTagArray *properties, void **data_pointers, enum MAPISTATUS *retvals)
 
static int emsmdbp_object_get_properties_mapistore (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *object, struct SPropTagArray *properties, void **data_pointers, enum MAPISTATUS *retvals)
 
static int emsmdbp_object_get_properties_mapistore_root (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *object, struct SPropTagArray *properties, void **data_pointers, enum MAPISTATUS *retvals)
 
static int emsmdbp_object_get_properties_message (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *object, struct SPropTagArray *properties, void **data_pointers, enum MAPISTATUS *retvals)
 
static int emsmdbp_object_get_properties_systemspecialfolder (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *object, struct SPropTagArray *properties, void **data_pointers, enum MAPISTATUS *retvals)
 
_PUBLIC_ struct
emsmdbp_stream_data
emsmdbp_object_get_stream_data (struct emsmdbp_object *object, enum MAPITAGS prop_tag)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_object)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_mailbox_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, const char *essDN, bool mailboxstore)
 
static enum MAPISTATUS emsmdbp_object_message_fill_freebusy_properties (struct emsmdbp_object *message_object)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_message_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, uint64_t messageID, struct emsmdbp_object *parent)
 
_PUBLIC_ enum mapistore_error emsmdbp_object_message_open (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_object, uint64_t folderID, uint64_t messageID, bool read_write, struct emsmdbp_object **messageP, struct mapistore_message **msgp)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_message_open_attachment_table (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *message_object)
 
static enum MAPISTATUS emsmdbp_object_move_folder_to_mapistore_root (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *folder, struct emsmdbp_object *parent_folder, const char *new_name)
 
_PUBLIC_ enum mapistore_error emsmdbp_object_open_folder (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent, uint64_t fid, struct emsmdbp_object **folder_object_p)
 
_PUBLIC_ enum MAPISTATUS emsmdbp_object_open_folder_by_fid (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *context_object, uint64_t fid, struct emsmdbp_object **folder_object_p)
 
static enum mapistore_error emsmdbp_object_root_mapistore_folder_set (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *folder, struct SRow *rowp, const char *container_class)
 
_PUBLIC_ int emsmdbp_object_set_properties (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *object, struct SRow *rowp)
 
static enum MAPISTATUS emsmdbp_object_sharing_metadata_property (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *sharing_object, struct Binary_r **attach_bin, TALLOC_CTX *mem_ctx)
 
static enum MAPISTATUS emsmdbp_object_sharing_metadata_providers_node (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *sharing_object, char *remote_uid, char *remote_store_uid, char *target_recipients, char **providers_node, TALLOC_CTX *mem_ctx)
 
static enum MAPISTATUS emsmdbp_object_sharing_metadata_recipients_attr (struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *sharing_object, char **target_recipients_attr, TALLOC_CTX *mem_ctx)
 
_PUBLIC_ int emsmdbp_object_stream_commit (struct emsmdbp_object *stream_object)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_stream_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_subscription_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_synccontext_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent_object)
 
_PUBLIC_ int emsmdbp_object_table_get_available_properties (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *table_object, struct SPropTagArray **propertiesp)
 
_PUBLIC_ enum MAPISTATUS emsmdbp_object_table_get_recursive_row_props (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *context_object, DATA_BLOB *datablob, struct SPropTagArray *properties, uint64_t current_fid, int64_t *remaining, uint32_t *count)
 
_PUBLIC_ void ** emsmdbp_object_table_get_row_props (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *table_object, uint32_t row_id, enum mapistore_query_type query_type, enum MAPISTATUS **retvalsp)
 
_PUBLIC_ struct emsmdbp_objectemsmdbp_object_table_init (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct emsmdbp_object *parent)
 
_PUBLIC_ struct
emsmdbp_stream_data
emsmdbp_stream_data_from_value (TALLOC_CTX *mem_ctx, enum MAPITAGS prop_tag, void *value, bool read_write)
 
_PUBLIC_ DATA_BLOB emsmdbp_stream_read_buffer (struct emsmdbp_stream *stream, uint32_t length)
 
_PUBLIC_ void emsmdbp_stream_write_buffer (TALLOC_CTX *mem_ctx, struct emsmdbp_stream *stream, DATA_BLOB new_buffer)
 
static void * get_emsmdbp_data (enum MAPITAGS ul_prop_tag, struct SPropTagArray *s_prop_tag_array, void **data_pointers, enum MAPISTATUS *retvals)
 
static enum MAPISTATUS mapiserver_get_administrative_group_legacyexchangedn (TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, char **legacyexchangedn)
 

Detailed Description

Server-side specific objects init/release routines.

Function Documentation

static char* emsmdbp_compute_parent_uri ( TALLOC_CTX *  mem_ctx,
char *  uri 
)
static

Referenced by emsmdbp_get_parent_fid().

static enum mapistore_context_role emsmdbp_container_class_to_role ( const char *  container_class)
static
static int emsmdbp_copy_message_recipients_mapistore ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object source_object,
struct emsmdbp_object dest_object 
)
inlinestatic
static int emsmdbp_copy_properties ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object source_object,
struct emsmdbp_object dest_object,
struct SPropTagArray *  excluded_tags 
)
static
static enum MAPISTATUS emsmdbp_fetch_freebusy ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
const char *  username,
struct tm *  start_tm,
struct tm *  end_tm,
struct mapistore_freebusy_properties **  fb_props_p 
)
static
_PUBLIC_ void emsmdbp_fill_row_blob ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
uint8_t *  layout,
DATA_BLOB *  property_row,
struct SPropTagArray *  properties,
void **  data_pointers,
enum MAPISTATUS *  retvals,
bool *  untyped_status 
)
_PUBLIC_ void emsmdbp_fill_table_row_blob ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
DATA_BLOB *  table_row,
uint16_t  num_props,
enum MAPITAGS *  properties,
void **  data_pointers,
enum MAPISTATUS *  retvals 
)
_PUBLIC_ enum mapistore_error emsmdbp_folder_delete ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object parent_folder,
uint64_t  fid,
uint8_t  flags 
)

Delete a folder.

Parameters
emsmdbp_ctxpointer to the emsmdbp context
parent_folderthe parent folder
fidthe folder identifier to delete from parent_folder
flagsthe delete flags.

Possible values for flags are:

  1. DEL_MESSAGES Delete all the messages in the folder
  2. DEL_FOLDERS Delete the subfolder and all of its subfolders
  3. DELETE_HARD_DELETE Hard delete the folder
Returns
MAPISTORE_SUCCESS on success, otherwise MAPISTORE error.

References emsmdbp_object::backend_object, emsmdbp_folder_delete_indexing_records(), emsmdbp_get_contextID(), emsmdbp_get_owner(), emsmdbp_is_mailboxstore(), emsmdbp_is_mapistore(), emsmdbp_context::mstore_ctx, emsmdbp_context::oc_ctx, openchangedb_delete_folder(), openchangedb_get_mapistoreURI(), oxosfld_is_special_folder(), and emsmdbp_context::username.

Referenced by EcDoRpc_RopDeleteFolder(), and EcDoRpc_RopSyncImportDeletes().

_PUBLIC_ enum mapistore_error emsmdbp_folder_delete_indexing_records ( struct mapistore_context *  mstore_ctx,
uint32_t  context_id,
char *  username,
uint64_t  fid,
uint64_t *  deleted_fmids,
uint32_t  deleted_fmids_count,
uint8_t  flags 
)

Delete the fmids from a folder in the indexing database.

Parameters
mstore_ctxpointer to the mapistore context
context_idthe context identifier
usernamethe owner of the folder to delete its entries
fidthe folder identifier
deleted_fmidthe array of child fmids from the folder
deleted_fmid_countthe number of deleted_fmids
flagsthe delete flags. See emsmdbp_folder_delete for details.
Returns
MAPISTORE_SUCCESS on success, otherwise MAPISTORE error.

Referenced by emsmdbp_folder_delete(), and RopEmptyFolder_GenericFolder().

enum MAPISTATUS emsmdbp_folder_get_recursive_folder_count ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object folder,
uint32_t *  row_countp 
)

Return the full number of folders within specified folder's hierarchy

Parameters
emsmdbp_ctxpointer to the emsmdbp context
folderpointer to the emsmdb folder to start the count from
row_countppointer on the number of folders to return
Returns
MAPI_E_SUCCESS on success, otherwise MAPI_ERROR

References emsmdbp_object::backend_object, emsmdbp_folder_get_folder_count(), emsmdbp_folder_get_recursive_folder_count(), emsmdbp_folder_open_table(), emsmdbp_get_contextID(), emsmdbp_object_open_folder_by_fid(), emsmdbp_object_table_get_row_props(), mapi_handles::handle, emsmdbp_context::handles_ctx, mapi_handles_add(), mapi_handles_delete(), emsmdbp_context::mstore_ctx, emsmdbp_object::object, emsmdbp_object_table::prop_count, emsmdbp_object_table::properties, and emsmdbp_objects::table.

Referenced by EcDoRpc_RopGetHierarchyTable(), and emsmdbp_folder_get_recursive_folder_count().

_PUBLIC_ uint32_t emsmdbp_get_contextID ( struct emsmdbp_object object)

Return the contextID associated to a handle

Parameters
objectpointer to the emsmdp object
Returns
contextID value on success, otherwise -1

References emsmdbp_get_contextID(), EMSMDBP_OBJECT_FOLDER, EMSMDBP_OBJECT_MAILBOX, emsmdbp_objects::folder, emsmdbp_object_folder::mapistore_root, emsmdbp_object::object, emsmdbp_object::parent_object, and emsmdbp_object::type.

Referenced by EcDoRpc_RopCopyFolder(), EcDoRpc_RopCreateAttach(), EcDoRpc_RopCreateMessage(), EcDoRpc_RopDeleteMessages(), EcDoRpc_RopFindRow(), EcDoRpc_RopModifyPermissions(), EcDoRpc_RopModifyRecipients(), EcDoRpc_RopMoveCopyMessages(), EcDoRpc_RopOpenAttach(), EcDoRpc_RopOpenEmbeddedMessage(), EcDoRpc_RopReloadCachedInformation(), EcDoRpc_RopRemoveAllRecipients(), EcDoRpc_RopResetTable(), EcDoRpc_RopRestrict(), EcDoRpc_RopSaveChangesMessage(), EcDoRpc_RopSetColumns(), EcDoRpc_RopSetMessageReadFlag(), EcDoRpc_RopSortTable(), EcDoRpc_RopSubmitMessage(), EcDoRpc_RopSyncImportDeletes(), EcDoRpc_RopSyncImportMessageChange(), EcDoRpc_RopSyncImportMessageMove(), EcDoRpc_RopSyncImportReadStateChanges(), EcDoRpc_RopTransportSend(), emsmdbp_copy_message_attachments_mapistore(), emsmdbp_copy_message_recipients_mapistore(), emsmdbp_fetch_freebusy(), emsmdbp_folder_delete(), emsmdbp_folder_get_folder_count(), emsmdbp_folder_get_recursive_folder_count(), emsmdbp_folder_move_folder(), emsmdbp_folder_open_table(), emsmdbp_get_contextID(), emsmdbp_object_attach_sharing_metadata_XML_file(), emsmdbp_object_create_folder(), emsmdbp_object_destructor(), emsmdbp_object_get_available_properties(), emsmdbp_object_get_fid_by_name(), emsmdbp_object_get_properties_mapistore(), emsmdbp_object_get_properties_mapistore_root(), emsmdbp_object_message_open(), emsmdbp_object_message_open_attachment_table(), emsmdbp_object_open_folder(), emsmdbp_object_root_mapistore_folder_set(), emsmdbp_object_set_properties(), emsmdbp_object_sharing_metadata_recipients_attr(), emsmdbp_object_table_get_available_properties(), emsmdbp_object_table_get_recursive_row_props(), emsmdbp_object_table_get_row_props(), oxcfxics_fill_transfer_state_arrays(), oxcfxics_push_folderChange(), oxcfxics_push_messageChange(), oxcfxics_push_messageChange_attachments(), oxcfxics_table_set_cn_restriction(), oxomsg_mapistore_handle_message_relocation(), and RopEmptyFolder_GenericFolder().

_PUBLIC_ int emsmdbp_get_fid_from_uri ( struct emsmdbp_context emsmdbp_ctx,
const char *  uri,
uint64_t *  fidp 
)
static enum MAPISTATUS emsmdbp_get_parent_fid ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object mailbox_object,
uint64_t  fid,
uint64_t *  parent_fidp 
)
static
_PUBLIC_ int emsmdbp_get_uri_from_fid ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
uint64_t  fid,
char **  urip 
)
bool emsmdbp_is_mailboxstore ( struct emsmdbp_object object)

Convenient function to determine whether specified mapi_handles refers to object within mailbox or public folders store.

Parameters
objectpointer to the emsmdp object
Returns
true if parent is within mailbox store, otherwise false

References emsmdbp_get_mailbox(), emsmdbp_objects::mailbox, emsmdbp_object_mailbox::mailboxstore, and emsmdbp_object::object.

Referenced by emsmdbp_folder_delete().

bool emsmdbp_is_mapistore ( struct emsmdbp_object object)

Convenient function to determine whether specified object is using mapistore or not

Parameters
objectpointer to the emsmdp object
Returns
true if parent is using mapistore, otherwise false

References emsmdbp_is_mapistore(), EMSMDBP_OBJECT_FOLDER, EMSMDBP_OBJECT_MAILBOX, emsmdbp_objects::folder, emsmdbp_object_folder::mapistore_root, emsmdbp_object::object, emsmdbp_object::parent_object, and emsmdbp_object::type.

Referenced by EcDoRpc_RopCopyFolder(), EcDoRpc_RopCreateAttach(), EcDoRpc_RopCreateFolder(), EcDoRpc_RopCreateMessage(), EcDoRpc_RopDeleteMessages(), EcDoRpc_RopEmptyFolder(), EcDoRpc_RopFindRow(), EcDoRpc_RopGetMessageStatus(), EcDoRpc_RopGetPermissionsTable(), EcDoRpc_RopModifyPermissions(), EcDoRpc_RopModifyRecipients(), EcDoRpc_RopMoveCopyMessages(), EcDoRpc_RopOpenAttach(), EcDoRpc_RopOpenEmbeddedMessage(), EcDoRpc_RopReloadCachedInformation(), EcDoRpc_RopRemoveAllRecipients(), EcDoRpc_RopResetTable(), EcDoRpc_RopRestrict(), EcDoRpc_RopSaveChangesMessage(), EcDoRpc_RopSetColumns(), EcDoRpc_RopSetMessageReadFlag(), EcDoRpc_RopSortTable(), EcDoRpc_RopSubmitMessage(), EcDoRpc_RopSyncImportDeletes(), EcDoRpc_RopSyncImportMessageChange(), EcDoRpc_RopSyncImportMessageMove(), EcDoRpc_RopSyncImportReadStateChanges(), EcDoRpc_RopTransportSend(), emsmdbp_copy_message_attachments_mapistore(), emsmdbp_copy_message_recipients_mapistore(), emsmdbp_fetch_freebusy(), emsmdbp_folder_delete(), emsmdbp_folder_get_folder_count(), emsmdbp_folder_move_folder(), emsmdbp_folder_open_table(), emsmdbp_is_mapistore(), emsmdbp_object_attach_sharing_metadata_XML_file(), emsmdbp_object_copy_properties(), emsmdbp_object_create_folder(), emsmdbp_object_destructor(), emsmdbp_object_get_available_properties(), emsmdbp_object_get_fid_by_name(), emsmdbp_object_get_properties(), emsmdbp_object_message_open(), emsmdbp_object_message_open_attachment_table(), emsmdbp_object_open_folder(), emsmdbp_object_set_properties(), emsmdbp_object_table_get_available_properties(), emsmdbp_object_table_get_row_props(), oxcfxics_fill_transfer_state_arrays(), oxcfxics_push_folderChange(), oxcfxics_push_messageChange(), oxcfxics_push_messageChange_attachments(), and oxcfxics_table_set_cn_restriction().

_PUBLIC_ enum MAPISTATUS emsmdbp_object_attach_sharing_metadata_XML_file ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object sharing_object 
)

Create a sharing metadata XML file for folder sharing invitation, request and response and store it as attachment in the sharing object. See [MS-OXSHARE] for this kind of messages and [MS-OXSHRMSG] for the XML format.

Parameters
emsmdbp_ctxpointer to the emsmdb provider context
sharing_objectthe original sharing message object to dump the XML data from
Returns
MAPI_E_SUCCESS on success, a MAPI error code otherwise

References emsmdbp_object::backend_object, emsmdbp_get_contextID(), emsmdbp_is_mapistore(), emsmdbp_object_attachment_init(), emsmdbp_object_get_properties(), emsmdbp_object_set_properties(), emsmdbp_object_sharing_metadata_property(), emsmdbp_objects::message, emsmdbp_object_message::messageID, emsmdbp_context::mstore_ctx, and emsmdbp_object::object.

Referenced by EcDoRpc_RopTransportSend().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_attachment_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
uint64_t  messageID,
struct emsmdbp_object parent 
)

Initialize a attachment object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider cotnext
folderIDthe folder identifier
messageIDthe message identifier
parentemsmdbp object of the parent

References emsmdbp_objects::attachment, EMSMDBP_OBJECT_ATTACHMENT, emsmdbp_object_init(), and emsmdbp_object::object.

Referenced by EcDoRpc_RopCreateAttach(), EcDoRpc_RopOpenAttach(), emsmdbp_copy_message_attachments_mapistore(), and emsmdbp_object_attach_sharing_metadata_XML_file().

_PUBLIC_ int emsmdbp_object_copy_properties ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object source_object,
struct emsmdbp_object target_object,
struct SPropTagArray *  excluded_properties,
bool  deep_copy 
)

Copy properties from an object to another object

Parameters
emsmdbp_ctxpointer to the emsmdb provider context
source_objectpointer to the source object
target_objectpointer to the target object
excluded_propertiespointer to a SPropTagArray listing properties that must not be copied
deep_copyindicates whether subobjects must be copied
Returns
Allocated emsmdbp object on success, otherwise NULL

References emsmdbp_copy_message_attachments_mapistore(), emsmdbp_copy_message_recipients_mapistore(), emsmdbp_copy_properties(), emsmdbp_is_mapistore(), EMSMDBP_OBJECT_ATTACHMENT, EMSMDBP_OBJECT_FOLDER, EMSMDBP_OBJECT_MAILBOX, EMSMDBP_OBJECT_MESSAGE, and emsmdbp_object::type.

Referenced by EcDoRpc_RopCopyTo(), and oxomsg_mapistore_handle_message_relocation().

_PUBLIC_ enum MAPISTATUS emsmdbp_object_create_folder ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object parent_folder,
TALLOC_CTX *  mem_ctx,
uint64_t  fid,
struct SRow *  rowp,
bool  force_container_class,
struct emsmdbp_object **  new_folderp 
)

Create a folder

Parameters
emsmdbp_ctxpointer to the emsmdbp context
parent_folderpointer to parent folder where to create the new folder
mem_ctxpointer to the memory context
fidFolder Identifier to assign the new folder object
rowpthe properties to set to the new folder
force_container_classforce the usage of Fallback role if we are creating a mapistore root folder and the container class is not available at rowp parameter
[out]new_folderplocation to store new emsmdbp object on success
Returns
MAPISTATUS error code

References emsmdbp_object::backend_object, emsmdbp_get_contextID(), emsmdbp_is_mapistore(), emsmdbp_object_folder_commit_creation(), emsmdbp_object_folder_init(), emsmdbp_objects::folder, emsmdbp_object_folder::folderID, emsmdbp_object_folder::mapistore_root, emsmdbp_context::mstore_ctx, emsmdbp_object::object, emsmdbp_context::oc_ctx, OC_PANIC, openchangedb_get_fid_by_name(), emsmdbp_object_folder::postponed_props, and emsmdbp_context::username.

Referenced by EcDoRpc_RopCreateFolder(), and EcDoRpc_RopSyncImportHierarchyChange().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_folder_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
uint64_t  folderID,
struct emsmdbp_object parent_object 
)

Initialize a folder object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider context
folderIDthe folder identifier
parentemsmdbp object of the parent folder for this folder
Returns
Allocated emsmdbp object on success, otherwise NULL

References EMSMDBP_OBJECT_FOLDER, emsmdbp_object_init(), emsmdbp_objects::folder, and emsmdbp_object::object.

Referenced by emsmdbp_object_create_folder(), emsmdbp_object_open_folder(), and emsmdbp_object_open_folder_by_fid().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_ftcontext_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object parent 
)

Initialize a ftcontext object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider cotnext
whole_storewhether the subscription applies to the specified change on the entire store or stricly on the specified folder/message
folderIDthe folder identifier
messageIDthe message identifier
parentemsmdbp object of the parent

References EMSMDBP_OBJECT_FTCONTEXT, emsmdbp_object_init(), emsmdbp_objects::ftcontext, and emsmdbp_object::object.

Referenced by EcDoRpc_RopFastTransferSourceCopyTo(), and EcDoRpc_RopSyncGetTransferState().

static int emsmdbp_object_get_properties_mailbox ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object object,
struct SPropTagArray *  properties,
void **  data_pointers,
enum MAPISTATUS *  retvals 
)
static
static int emsmdbp_object_get_properties_mapistore ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object object,
struct SPropTagArray *  properties,
void **  data_pointers,
enum MAPISTATUS *  retvals 
)
static
static int emsmdbp_object_get_properties_message ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object object,
struct SPropTagArray *  properties,
void **  data_pointers,
enum MAPISTATUS *  retvals 
)
static
static int emsmdbp_object_get_properties_systemspecialfolder ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object object,
struct SPropTagArray *  properties,
void **  data_pointers,
enum MAPISTATUS *  retvals 
)
static
_PUBLIC_ struct emsmdbp_stream_data* emsmdbp_object_get_stream_data ( struct emsmdbp_object object,
enum MAPITAGS  prop_tag 
)
_PUBLIC_ struct emsmdbp_object* emsmdbp_object_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object parent_object 
)
_PUBLIC_ struct emsmdbp_object* emsmdbp_object_mailbox_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
const char *  essDN,
bool  mailboxstore 
)

Initialize a mailbox object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider context
requestpointer to the Logon MAPI request
mailboxstoreboolean which specifies whether the mailbox object is a PF store or a private mailbox store
Returns
Allocated emsmdbp object on success, otherwise NULL

References emsmdbp_object_init(), EMSMDBP_OBJECT_MAILBOX, EMSMDBP_PF_ROOT, emsmdbp_object_mailbox::folderID, emsmdbp_objects::mailbox, emsmdbp_object::object, emsmdbp_context::oc_ctx, openchangedb_get_PublicFolderID(), openchangedb_get_SystemFolderID(), emsmdbp_object_mailbox::owner_EssDN, emsmdbp_object_mailbox::owner_username, emsmdbp_context::samdb_ctx, emsmdbp_context::szUserDN, and emsmdbp_context::username.

Referenced by EcDoRpc_RopLogon(), and emsmdbp_fetch_freebusy().

static enum MAPISTATUS emsmdbp_object_message_fill_freebusy_properties ( struct emsmdbp_object message_object)
static
_PUBLIC_ struct emsmdbp_object* emsmdbp_object_message_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
uint64_t  messageID,
struct emsmdbp_object parent 
)

Initialize a message object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider context
messageIDthe message identifier
parentemsmdbp object of the parent
Returns
Allocated emsmdbp object on success, otherwise NULL

References EMSMDBP_OBJECT_ATTACHMENT, EMSMDBP_OBJECT_FOLDER, emsmdbp_object_init(), EMSMDBP_OBJECT_MAILBOX, EMSMDBP_OBJECT_MESSAGE, emsmdbp_objects::message, emsmdbp_object::object, and emsmdbp_object::type.

Referenced by EcDoRpc_RopCreateMessage(), EcDoRpc_RopOpenEmbeddedMessage(), EcDoRpc_RopSyncImportMessageChange(), emsmdbp_object_message_open(), and oxomsg_mapistore_handle_message_relocation().

_PUBLIC_ enum MAPISTATUS emsmdbp_object_open_folder_by_fid ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object context_object,
uint64_t  fid,
struct emsmdbp_object **  folder_object_p 
)
static enum MAPISTATUS emsmdbp_object_sharing_metadata_property ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object sharing_object,
struct Binary_r **  attach_bin,
TALLOC_CTX *  mem_ctx 
)
static

Create the XML file from the sharing message object and store it as binary property in attach_bin out parameter.

Parameters
emsmdbp_ctxpointer to the emsmdb provider cotnext
sharing_objectthe sharing message object to get the XML data from
[out]attach_binpointer to Binary_r property value pointer where the XML data is stored
mem_ctxpointer to memory context where the attach_bin is created
Note
On success attach_bin is allocated in mem_ctx. It is up to the developer to free that memory context when it is not needed anymore.
Returns
MAPI_E_SUCCESS on success, a mapi error code otherwise

References emsmdbp_object_get_properties(), emsmdbp_object_sharing_metadata_providers_node(), emsmdbp_object_sharing_metadata_recipients_attr(), and get_emsmdbp_data().

Referenced by emsmdbp_object_attach_sharing_metadata_XML_file().

static enum MAPISTATUS emsmdbp_object_sharing_metadata_providers_node ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object sharing_object,
char *  remote_uid,
char *  remote_store_uid,
char *  target_recipients,
char **  providers_node,
TALLOC_CTX *  mem_ctx 
)
static

Store the Providers node into providers_node out parameter.

Parameters
emsmdbp_ctxpointer to the emsmdb provider cotnext
sharing_objectthe sharing message object to get the XML data from
remote_uidstring with the folder id to share, NULL when no required
remote_store_uidstring with the mailbox id where the folder belongs to, NULL when non-required
target_recipientsthe string where the recipients' email addresses separated by semi colons are stored
[out]providers_nodepointer to string where the Providers XML node is stored
mem_ctxpointer to memory context where the providers_node is created
Note
On success providers_node string is allocated in mem_ctx. It is up to the developer to free that memory context when it is not needed anymore.
Returns
MAPI_E_SUCCESS on success, a mapi error code otherwise

Referenced by emsmdbp_object_sharing_metadata_property().

static enum MAPISTATUS emsmdbp_object_sharing_metadata_recipients_attr ( struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object sharing_object,
char **  target_recipients_attr,
TALLOC_CTX *  mem_ctx 
)
static

Store the target recipients attribute in out parameter.

Parameters
emsmdbp_ctxpointer to the emsmdb provider cotnext
sharing_objectthe sharing message object to get the XML data from
[out]pointerto string where the TargetRecipients XML attribute is stored
mem_ctxpointer to memory context where the target_recipients_attr is created
Note
On success target_recipients_attr string is allocated in mem_ctx. It is up to the developer to free that memory context when it is not needed anymore.
Returns
MAPI_E_SUCCESS on success, a mapi error code otherwise

References emsmdbp_object::backend_object, emsmdbp_get_contextID(), and emsmdbp_context::mstore_ctx.

Referenced by emsmdbp_object_sharing_metadata_property().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_stream_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object parent 
)

Initialize a stream object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider cotnext
propertythe stream property identifier
parentemsmdbp object of the parent

References emsmdbp_object_init(), EMSMDBP_OBJECT_STREAM, emsmdbp_object::object, and emsmdbp_objects::stream.

Referenced by EcDoRpc_RopOpenStream().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_subscription_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object parent 
)
_PUBLIC_ struct emsmdbp_object* emsmdbp_object_synccontext_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object parent_object 
)

Initialize a synccontext object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider cotnext
whole_storewhether the subscription applies to the specified change on the entire store or stricly on the specified folder/message
folderIDthe folder identifier
messageIDthe message identifier
parentemsmdbp object of the parent

References emsmdbp_stream::buffer, emsmdbp_object_synccontext::cnset_seen, EMSMDBP_OBJECT_FOLDER, emsmdbp_object_init(), EMSMDBP_OBJECT_MAILBOX, EMSMDBP_OBJECT_SYNCCONTEXT, emsmdbp_object::object, emsmdbp_context::oc_ctx, openchangedb_get_MailboxReplica(), emsmdbp_object_synccontext::state_property, emsmdbp_object_synccontext::state_stream, emsmdbp_object_synccontext::stream, emsmdbp_objects::synccontext, emsmdbp_object::type, and emsmdbp_context::username.

Referenced by EcDoRpc_RopSyncConfigure(), and EcDoRpc_RopSyncOpenCollector().

_PUBLIC_ int emsmdbp_object_table_get_available_properties ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object table_object,
struct SPropTagArray **  propertiesp 
)
_PUBLIC_ enum MAPISTATUS emsmdbp_object_table_get_recursive_row_props ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object context_object,
DATA_BLOB *  datablob,
struct SPropTagArray *  properties,
uint64_t  current_fid,
int64_t *  remaining,
uint32_t *  count 
)

This function process the hierarchy of folders recursively and fill requested rows.

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb context
context_objectpointer to the context object
datablobpointer to the DATA blob to fill
propertiespointer to the array of properties used to fill a row of the table
current_fidthe FolderID of the folder to open and process
remainingpointer on the remaining rows to process
countpointer on the number of rows processed to return
Note
This implementation is very preliminary and lacks several use cases:
  1. It does not handle backward read
  2. It does not handle positioning of the folder object and rewind of the hierarchy when position != 0

We currently rely on Outlook asking for 4096 rows to fill this buffer in one operation.

Returns
MAPI_E_SUCCESS on success, otherwise MAPI error.

References emsmdbp_object::backend_object, emsmdbp_object_table::denominator, emsmdbp_fill_table_row_blob(), emsmdbp_folder_open_table(), emsmdbp_get_contextID(), emsmdbp_object_open_folder_by_fid(), emsmdbp_object_table_get_recursive_row_props(), emsmdbp_object_table_get_row_props(), mapi_handles::handle, emsmdbp_context::handles_ctx, mapi_handles_add(), mapi_handles_delete(), emsmdbp_context::mstore_ctx, emsmdbp_object::object, emsmdbp_object::parent_object, emsmdbp_object_table::prop_count, emsmdbp_object_table::properties, and emsmdbp_objects::table.

Referenced by EcDoRpc_RopQueryRows(), and emsmdbp_object_table_get_recursive_row_props().

_PUBLIC_ struct emsmdbp_object* emsmdbp_object_table_init ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
struct emsmdbp_object parent 
)

Initialize a table object

Parameters
mem_ctxpointer to the memory context
emsmdbp_ctxpointer to the emsmdb provider context
parentemsmdbp object of the parent
Returns
Allocated emsmdbp object on success, otherwise NULL

References EMSMDBP_OBJECT_FOLDER, emsmdbp_object_init(), EMSMDBP_OBJECT_MAILBOX, EMSMDBP_OBJECT_MESSAGE, EMSMDBP_OBJECT_TABLE, emsmdbp_object::object, emsmdbp_objects::table, and emsmdbp_object::type.

Referenced by EcDoRpc_RopGetPermissionsTable(), EcDoRpc_RopGetRulesTable(), emsmdbp_folder_open_table(), and emsmdbp_object_message_open_attachment_table().

_PUBLIC_ struct emsmdbp_stream_data* emsmdbp_stream_data_from_value ( TALLOC_CTX *  mem_ctx,
enum MAPITAGS  prop_tag,
void *  value,
bool  read_write 
)
_PUBLIC_ DATA_BLOB emsmdbp_stream_read_buffer ( struct emsmdbp_stream stream,
uint32_t  length 
)
_PUBLIC_ void emsmdbp_stream_write_buffer ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_stream stream,
DATA_BLOB  new_buffer 
)
static void* get_emsmdbp_data ( enum MAPITAGS  ul_prop_tag,
struct SPropTagArray *  s_prop_tag_array,
void **  data_pointers,
enum MAPISTATUS *  retvals 
)
static

Convenience function to extract values from data_pointers safely.

Parameters
ulPropTagMAPI property tag
SPropTagArrayarray of property tags
data_pointersarray with the property values that matches the previous SPropTagArray
retvalsarray of returned value result of getting the property
Returns
pointer to the property value, NULL otherwise

Referenced by emsmdbp_object_sharing_metadata_property().

static enum MAPISTATUS mapiserver_get_administrative_group_legacyexchangedn ( TALLOC_CTX *  mem_ctx,
struct emsmdbp_context emsmdbp_ctx,
char **  legacyexchangedn 
)
static

Creative Commons License
Creative Commons Attribution icon Creative Commons Share Alike icon
This content is licensed under the Creative Commons
Attribution ShareAlike License v. 3.0:
http://creativecommons.org/licenses/by-sa/3.0/