private static int DecodingBerValMultiByteArrayHelper(BerSafeHandle berElement, char fmt, out byte[][] result) { int rc; var ptrResult = IntPtr.Zero; result = null; try { rc = LdapNative.Instance.ber_scanf_ptr(berElement, new string(fmt, 1), ref ptrResult); if (rc != -1 && ptrResult != IntPtr.Zero) { result = MarshalUtils.BerValArrayToByteArrays(ptrResult).ToArray(); } } finally { if (ptrResult != IntPtr.Zero) { LdapNative.Instance.ber_bvecfree(ptrResult); } } return(rc); }
private SearchResultAttributeCollection GetLdapAttributes(SafeHandle ld, IntPtr entry, ref IntPtr ber) { var attributes = new SearchResultAttributeCollection(); for (var attr = Native.ldap_first_attribute(ld, entry, ref ber); attr != IntPtr.Zero; attr = Native.ldap_next_attribute(ld, entry, ber)) { var vals = Native.ldap_get_values_len(ld, entry, attr); if (vals != IntPtr.Zero) { var attrName = Encoder.Instance.PtrToString(attr); if (attrName != null) { var directoryAttribute = new DirectoryAttribute { Name = attrName }; directoryAttribute.AddValues(MarshalUtils.BerValArrayToByteArrays(vals)); attributes.Add(directoryAttribute); } Native.ldap_value_free_len(vals); } Native.ldap_memfree(attr); } return(attributes); }
public void MarshalUtils_ByteArraysToBerValueArray_Returns_Ptr_To_BerValueArrays(params byte[][] sourceData) { var ptr = Marshal.AllocCoTaskMem((sourceData.Length + 1) * IntPtr.Size); MarshalUtils.ByteArraysToBerValueArray(sourceData, ptr); var actual = MarshalUtils.BerValArrayToByteArrays(ptr); Assert.Equal(sourceData, actual); Marshal.FreeCoTaskMem(ptr); }
public void MarshalUtils_BerValArrayToByteArray_Returns_List_Of_ByteArray(params byte[][] sourceData) { var sourceDataPointers = sourceData.Select(_ => Marshal.AllocCoTaskMem(_.Length + 1)).ToArray(); for (var i = 0; i < sourceData.Length; i++) { Marshal.Copy(sourceData[i].Union(new byte[] { 0 }).ToArray(), 0, sourceDataPointers[i], sourceData[i].Length + 1); } var ptr = Marshal.AllocCoTaskMem((sourceData.Length + 1) * IntPtr.Size); for (var i = 0; i < sourceDataPointers.Length; i++) { var berPtr = Marshal.AllocHGlobal(Marshal.SizeOf <Native.berval>()); Marshal.StructureToPtr(new Native.berval { bv_val = sourceDataPointers[i], bv_len = sourceData[i].Length }, berPtr, true); Marshal.WriteIntPtr(ptr, i * IntPtr.Size, berPtr); } Marshal.WriteIntPtr(ptr, sourceDataPointers.Length * IntPtr.Size, IntPtr.Zero); var actual = MarshalUtils.BerValArrayToByteArrays(ptr); for (var i = 0; i < sourceDataPointers.Length; i++) { var sourceDataPtr = sourceDataPointers[i]; var tempPtr = Marshal.ReadIntPtr(ptr, i * IntPtr.Size); Marshal.FreeHGlobal(tempPtr); Marshal.FreeCoTaskMem(sourceDataPtr); } Marshal.FreeCoTaskMem(ptr); Assert.Equal(sourceData.Length, actual.Count); Assert.Equal(sourceData, actual); }