public override int SendRequest(SafeHandle handle, DirectoryRequest request, ref int messageId) { if (request is ModifyRequest modifyRequest) { if (string.IsNullOrWhiteSpace(modifyRequest.DistinguishedName)) { throw new ArgumentNullException(nameof(modifyRequest.DistinguishedName)); } var attrs = modifyRequest.Attributes.Select(ToLdapMod).ToList(); var ptr = Marshal.AllocHGlobal(IntPtr.Size * (attrs.Count + 1)); // alloc memory for list with last element null MarshalUtils.StructureArrayToPtr(attrs, ptr, true); var result = Native.ldap_modify_ext(handle, modifyRequest.DistinguishedName, ptr, IntPtr.Zero, IntPtr.Zero, ref messageId ); attrs.ForEach(_ => { MarshalUtils.BerValuesFree(_.mod_vals_u.modv_bvals); Marshal.FreeHGlobal(_.mod_vals_u.modv_bvals); Marshal.FreeHGlobal(_.mod_type); }); Marshal.FreeHGlobal(ptr); return(result); } return(0); }
protected override int SendRequest(SafeHandle handle, DirectoryRequest request, IntPtr serverControlArray, IntPtr clientControlArray, ref int messageId) { if (request is AddRequest addRequest) { if (string.IsNullOrWhiteSpace(addRequest.DistinguishedName)) { throw new ArgumentNullException(nameof(addRequest.DistinguishedName)); } var attrs = addRequest.Attributes.Select(ToLdapMod).ToList(); var ptr = MarshalUtils.AllocHGlobalIntPtrArray(addRequest.Attributes.Count + 1); MarshalUtils.StructureArrayToPtr(attrs, ptr, true); var result = Native.ldap_add_ext(handle, addRequest.DistinguishedName, ptr, serverControlArray, clientControlArray, ref messageId ); attrs.ForEach(_ => { MarshalUtils.BerValuesFree(_.mod_vals_u.modv_bvals); Marshal.FreeHGlobal(_.mod_vals_u.modv_bvals); Marshal.FreeHGlobal(_.mod_type); }); Marshal.FreeHGlobal(ptr); return(result); } return(0); }
public override int SendRequest(SafeHandle handle, DirectoryRequest request, ref int messageId) { if (request is AddRequest addRequest) { var entry = addRequest.LdapEntry; if (string.IsNullOrWhiteSpace(entry.Dn)) { throw new ArgumentNullException(nameof(entry.Dn)); } if (entry.Attributes == null) { entry.Attributes = new Dictionary <string, List <string> >(); } var attrs = entry.Attributes.Select(ToLdapMod).ToList(); var ptr = MarshalUtils.AllocHGlobalIntPtrArray(entry.Attributes.Count + 1); MarshalUtils.StructureArrayToPtr(attrs, ptr, true); var result = Native.ldap_add_ext(handle, addRequest.LdapEntry.Dn, ptr, IntPtr.Zero, IntPtr.Zero, ref messageId ); attrs.ForEach(_ => { MarshalUtils.BerValuesFree(_.mod_vals_u.modv_bvals); Marshal.FreeHGlobal(_.mod_vals_u.modv_bvals); Marshal.FreeHGlobal(_.mod_type); }); Marshal.FreeHGlobal(ptr); return(result); } return(0); }