Example #1
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }