AntTweakBar.Tw.DefineStruct C# (CSharp) Method

DefineStruct() public static method

This function creates a new AntTweakBar.Tw.VariableType corresponding to a structure.
public static DefineStruct ( String name, StructMemberInfo>.IDictionary structMembers, int structSize, Tw callback, IntPtr clientData ) : VariableType
name String
structMembers StructMemberInfo>.IDictionary
structSize int
callback Tw
clientData System.IntPtr
return VariableType
        public static VariableType DefineStruct(String name, IDictionary<String, StructMemberInfo> structMembers, int structSize, Tw.SummaryCallback callback, IntPtr clientData)
        {
            if (name == null) {
                throw new ArgumentNullException("name");
            } else if (structMembers == null) {
                throw new ArgumentNullException("structMembers");
            } else if (structSize == 0) {
                throw new ArgumentOutOfRangeException("structSize");
            }

            var structData = new List<NativeMethods.StructMember>();

            try
            {
                foreach (var kv in structMembers) {
                    IntPtr namePtr = IntPtr.Zero;
                    IntPtr defPtr = IntPtr.Zero;

                    if (kv.Key == null) {
                        throw new ArgumentNullException("", "Member name cannot be null.");
                    }

                    if (kv.Value.Def == null) {
                        throw new ArgumentNullException("", "Member definition string cannot be null.");
                    }

                    try
                    {
                        namePtr = Helpers.PtrFromStr(kv.Key);
                        defPtr = Helpers.PtrFromStr(kv.Value.Def);

                        structData.Add(new NativeMethods.StructMember(
                            namePtr,
                            kv.Value.Type,
                            new UIntPtr((uint)kv.Value.Offset),
                            defPtr
                            ));
                    }
                    catch (Exception)
                    {
                        if (namePtr != IntPtr.Zero) {
                            Marshal.FreeCoTaskMem(namePtr);
                        }

                        if (defPtr != IntPtr.Zero) {
                            Marshal.FreeCoTaskMem(defPtr);
                        }

                        throw;
                    }
                }

                Tw.VariableType structType = NativeMethods.TwDefineStruct(name, structData.ToArray(),
                                                                          (uint)structData.Count,
                                                                          new UIntPtr((uint)structSize),
                                                                          callback, clientData);

                if (structType == VariableType.Undefined) {
                    throw new AntTweakBarException("TwDefineStruct failed.");
                }

                return structType;
            }
            finally
            {
                foreach (var member in structData) {
                    Marshal.FreeCoTaskMem(member.Name);
                    Marshal.FreeCoTaskMem(member.DefString);
                }
            }
        }