public int[] SetDatatypes(int[] serverIds, VarEnum[] types)
        {
            if (@group == null)
            {
                throw new ObjectDisposedException("Group");
            }
            serverIds.ArgumentNotNull("serverIds");
            if (serverIds.Length == 0)
            {
                return(new int[0]);
            }

            var typesAsShort = new short[types.Length];

            for (var i = 0; i < types.Length; i++)
            {
                typesAsShort[i] = (short)types[i];
            }

            IntPtr errorsPtr;

            @group.SetDatatypes((uint)serverIds.Length, serverIds, typesAsShort, out errorsPtr);

            return(ItemResultReader.Read(serverIds.Length, errorsPtr));
        }
        public int[] AsyncWriteItems(int[] serverIds, object[] values, int transactionId, out int cancelId)
        {
            cancelId = 0;
            if (@group == null)
            {
                throw new ObjectDisposedException("Group");
            }
            if (asyncIO == null)
            {
                throw new NotSupportedException();
            }
            serverIds.ArgumentNotNull("serverIds");
            if (serverIds.Length == 0)
            {
                return(new int[0]);
            }

            using (var writer = new ItemValueWriter(values))
            {
                int    tmp;
                IntPtr errorsPtr;
                asyncIO.Write((uint)serverIds.Length, serverIds, writer.Values, transactionId, out tmp, out errorsPtr);

                cancelId = tmp;
                return(ItemResultReader.Read(serverIds.Length, errorsPtr));
            }
        }
        public int[] SetClientHandles(int[] serverIds, int[] clientIds)
        {
            if (@group == null)
            {
                throw new ObjectDisposedException("Group");
            }
            serverIds.ArgumentNotNull("serverIds");
            if (serverIds.Length == 0)
            {
                return(new int[0]);
            }

            IntPtr errorsPtr;

            @group.SetClientHandles((uint)serverIds.Length, serverIds, clientIds, out errorsPtr);

            return(ItemResultReader.Read(serverIds.Length, errorsPtr));
        }
        public int[] SetActiveState(int[] serverIds, bool active)
        {
            if (@group == null)
            {
                throw new ObjectDisposedException("Group");
            }
            serverIds.ArgumentNotNull("serverIds");
            if (serverIds.Length == 0)
            {
                return(new int[0]);
            }

            IntPtr errorsPtr;

            @group.SetActiveState((uint)serverIds.Length, serverIds, active ? 1 : 0, out errorsPtr);

            return(ItemResultReader.Read(serverIds.Length, errorsPtr));
        }
        public ItemResult[] ValidateItems(Item[] items)
        {
            if (@group == null)
            {
                throw new ObjectDisposedException("Group");
            }
            items.ArgumentNotNull("items");
            if (items.Length == 0)
            {
                return(new ItemResult[0]);
            }

            using (var reader = new ItemResultReader(items))
            {
                IntPtr dataPtr;
                IntPtr errorsPtr;
                @group.ValidateItems((uint)items.Length, reader.Items, 0, out dataPtr, out errorsPtr);
                return(reader.Read(dataPtr, errorsPtr));
            }
        }
        public int[] SyncWriteItems(int[] serverIds, object[] values)
        {
            if (@group == null)
            {
                throw new ObjectDisposedException("Group");
            }
            serverIds.ArgumentNotNull("serverIds");
            values.ArgumentNotNull("values");
            if (serverIds.Length == 0)
            {
                return(new int[0]);
            }

            using (var writer = new ItemValueWriter(values))
            {
                IntPtr errorsPtr;
                syncIO.Write((uint)serverIds.Length, serverIds, writer.Values, out errorsPtr);

                return(ItemResultReader.Read(serverIds.Length, errorsPtr));
            }
        }
		public ItemResult[] ValidateItems(Item[] items)
		{
			if(@group == null)
				throw new ObjectDisposedException("Group");
			items.ArgumentNotNull("items");
			if(items.Length == 0)
				return new ItemResult[0];

			using(var reader = new ItemResultReader(items))
			{
				IntPtr dataPtr;
                IntPtr errorsPtr;
                @group.ValidateItems((uint)items.Length, reader.Items, 0, out dataPtr, out errorsPtr);
                return reader.Read(dataPtr, errorsPtr);
			}				
		}