Hi, I'm working on updating openchange to reflect the MS-OXCPERM specification. So far I've updated the IDL (see below), and also done some changes in libmapi (mostly to rename GetTable to be GetPermissionsTable and ModifyTable to be ModifyPermissions (so it matches the ROP name, and is a bit more descriptive).
I've got a mapitest covering GetPermissionsTable, and some early work on testing ModifyPermissions. This is the diffstat: Makefile | 2 exchange.idl | 58 ++++++----- libmapi/IMAPIContainer.c | 89 +++++++++-------- libmapi/simple_mapi.c | 144 +++++++++++++-------------- torture/mapi_permissions.c | 4 utils/mapitest/module.c | 22 ++++ utils/mapitest/modules/module_oxcperm.c | 165 ++++++++++++++++++++++++++++++++ 7 files changed, 343 insertions(+), 141 deletions(-) Thoughts on such a change? Index: exchange.idl =================================================================== --- exchange.idl (revision 1730) +++ exchange.idl (working copy) @@ -838,9 +838,9 @@ op_MAPI_CopyTo = 0x39, op_MAPI_CopyToStream = 0x3a, op_MAPI_CloneStream = 0x3b, - op_MAPI_GetTable = 0x3e, + op_MAPI_GetPermissionsTable = 0x3e, op_MAPI_GetRulesTable = 0x3f, - op_MAPI_ModifyTable = 0x40, + op_MAPI_ModifyPermissions = 0x40, op_MAPI_ModifyRules = 0x41, op_MAPI_GetOwningServers = 0x42, op_MAPI_LongTermIdFromId = 0x43, @@ -1074,17 +1074,6 @@ ROW_REMOVE = 0x4 } ulRowFlags; - typedef [flag(NDR_NOALIGN)] struct { - ulRowFlags ulRowFlags; - mapi_SPropValue_array lpProps; - } mapi_SRow; - - typedef [flag(NDR_NOALIGN)] struct { - uint8 padding; - uint16 cEntries; - mapi_SRow aEntries[cEntries]; - } mapi_SRowList; - /**************************/ /* EcDoRpc Function 0x1 */ typedef [nopush,nopull,flag(NDR_NOALIGN)] struct { @@ -2525,13 +2514,17 @@ /*************************/ /* EcDoRpc Function 0x3e */ + typedef [bitmap8bit] bitmap { + IncludeFreeBusy = 0x02 + } PermissionsTableFlags; + typedef [flag(NDR_NOALIGN)] struct { - uint8 handle_idx; - uint8 padding; - } GetTable_req; + uint8 handle_idx; + PermissionsTableFlags TableFlags; + } GetPermissionsTable_req; typedef [flag(NDR_NOALIGN)] struct { - } GetTable_repl; + } GetPermissionsTable_repl; /*************************/ /* EcDoRpc Function 0x3f */ @@ -2549,14 +2542,29 @@ /*************************/ /* EcDoRpc Function 0x40 */ + typedef [bitmap8bit] bitmap { + ModifyPerms_IncludeFreeBusy = 0x02, + ModifyPerms_ReplaceRows = 0x01 + } ModifyPermissionsFlags; + typedef [flag(NDR_NOALIGN)] struct { - mapi_SRowList rowList; - } ModifyTable_req; + ulRowFlags PermissionDataFlags; + mapi_SPropValue_array lpProps; + } PermissionData; typedef [flag(NDR_NOALIGN)] struct { - [flag(NDR_REMAINING)] DATA_BLOB remaining; - } ModifyTable_repl; + ModifyPermissionsFlags ModifyFlags; + uint16 ModifyCount; + PermissionData PermissionsData[ModifyCount]; + } mapi_PermissionsData; + typedef [flag(NDR_NOALIGN)] struct { + mapi_PermissionsData rowList; + } ModifyPermissions_req; + + typedef [flag(NDR_NOALIGN)] struct { + } ModifyPermissions_repl; + /*************************/ /* EcDoRpc Function 0x41 */ typedef [flag(NDR_NOALIGN)] struct { @@ -3518,9 +3526,9 @@ [case(op_MAPI_CopyTo)] CopyTo_req mapi_CopyTo; [case(op_MAPI_CopyToStream)] CopyToStream_req mapi_CopyToStream; [case(op_MAPI_CloneStream)] CloneStream_req mapi_CloneStream; - [case(op_MAPI_GetTable)] GetTable_req mapi_GetTable; + [case(op_MAPI_GetPermissionsTable)] GetPermissionsTable_req mapi_GetPermissionsTable; [case(op_MAPI_GetRulesTable)] GetRulesTable_req mapi_GetRulesTable; - [case(op_MAPI_ModifyTable)] ModifyTable_req mapi_ModifyTable; + [case(op_MAPI_ModifyPermissions)] ModifyPermissions_req mapi_ModifyPermissions; [case(op_MAPI_ModifyRules)] ModifyRules_req mapi_ModifyRules; [case(op_MAPI_GetOwningServers)] GetOwningServers_req mapi_GetOwningServers; [case(op_MAPI_LongTermIdFromId)] LongTermIdFromId_req mapi_LongTermIdFromId; @@ -3641,9 +3649,9 @@ [case(op_MAPI_CopyTo)] CopyTo_repl mapi_CopyTo; [case(op_MAPI_CopyToStream)] CopyToStream_repl mapi_CopyToStream; [case(op_MAPI_CloneStream)] CloneStream_repl mapi_CloneStream; - [case(op_MAPI_GetTable)] GetTable_repl mapi_GetTable; + [case(op_MAPI_GetPermissionsTable)] GetPermissionsTable_repl mapi_GetPermissionsTable; [case(op_MAPI_GetRulesTable)] GetRulesTable_repl mapi_GetRulesTable; - [case(op_MAPI_ModifyTable)] ModifyTable_repl mapi_ModifyTable; + [case(op_MAPI_ModifyPermissions)] ModifyPermissions_repl mapi_ModifyPermissions; [case(op_MAPI_ModifyRules)] ModifyRules_repl mapi_ModifyRules; [case(op_MAPI_GetOwningServers)] GetOwningServers_repl mapi_GetOwningServers; [case(op_MAPI_LongTermIdFromId)] LongTermIdFromId_repl mapi_LongTermIdFromId; _______________________________________________ devel mailing list devel@lists.openchange.org http://mailman.openchange.org/listinfo/devel