internal override void PerformReadWrite(ref ReadWriteRequest[] values, string parentID,
                                                bool suppressEthernetHeader)
        {
            SplitAndJoin            splitAndJoin      = new SplitAndJoin(m_BufferSize);
            List <ReadWriteRequest> splitRequestsList = new List <ReadWriteRequest>();

            for (int iter = 0; iter < values.Length; iter++)
            {
                switch (values[iter].GetType().ToString().Substring(42))
                {
                case "ReadOperands":
                case "WriteOperands":
                    splitAndJoin.AddNewRequest(values[iter], iter, false);
                    break;

                default:
                    throw new ComDriveExceptions(
                              "Unexpected error. Actual request type doesn't match the expected type",
                              ComDriveExceptions.ComDriveException.UnexpectedError);
                }
            }

            if (splitAndJoin.FinishSpliting())
            {
                ExecuteRequests(ref values, parentID, splitAndJoin);
            }
        }
        private void ExecuteRequests(ref ReadWriteRequest[] values, string parentID, SplitAndJoin splitAndJoin)
        {
            try
            {
                List <object>[] resposeValuesList = new List <object> [values.Length];
                byte            messageEnumerator = (byte)splitAndJoin.allRequestsList.Count;
                for (int i = 0; i < splitAndJoin.allRequestsList.Count; i++)
                {
                    ReadWriteRequest[] requestToExec = splitAndJoin.allRequestsList[i].ToArray();
                    ReadWriteOperandsCommand(ref requestToExec, parentID, messageEnumerator);
                    messageEnumerator--;
                }

                if (this.BreakFlag)
                {
                    throw new ComDriveExceptions("Request aborted by user",
                                                 ComDriveExceptions.ComDriveException.AbortedByUser);
                }

                for (int i = 0; i < values.Length; i++)
                {
                    if (values[i] is ReadOperands)
                    {
                        if (values[i].ResponseValues != null)
                        {
                            resposeValuesList[i] = new List <object>();
                            resposeValuesList[i].AddRange(values[i].ResponseValues as object[]);
                        }
                    }
                }

                for (int i = 0; i < splitAndJoin.splitDetailsList.Count; i++)
                {
                    int userReqPos  = splitAndJoin.splitDetailsList[i].userRequestPosition;
                    int allReqPos   = splitAndJoin.splitDetailsList[i].allRequestsPosition;
                    int splitReqPos = splitAndJoin.splitDetailsList[i].splitRequestPosition;

                    if (values[userReqPos] is WriteOperands)
                    {
                        values[userReqPos].ResponseValues = String.Empty;
                    }
                    else
                    {
                        if (resposeValuesList[userReqPos] == null)
                        {
                            resposeValuesList[userReqPos] = new List <object>();
                            resposeValuesList[userReqPos]
                            .AddRange(
                                splitAndJoin.allRequestsList[allReqPos][splitReqPos].ResponseValues as object[]);
                        }
                        else
                        {
                            object[] responseValues =
                                splitAndJoin.allRequestsList[allReqPos][splitReqPos].ResponseValues as object[];
                            resposeValuesList[userReqPos].AddRange(responseValues);
                        }
                    }
                }


                for (int i = 0; i < splitAndJoin.splitDetailsList.Count; i++)
                {
                    int userReqPos  = splitAndJoin.splitDetailsList[i].userRequestPosition;
                    int allReqPos   = splitAndJoin.splitDetailsList[i].allRequestsPosition;
                    int splitReqPos = splitAndJoin.splitDetailsList[i].splitRequestPosition;

                    if (values[userReqPos] is ReadOperands)
                    {
                        values[userReqPos].ResponseValues = resposeValuesList[userReqPos].ToArray();
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                splitAndJoin.ClearLists();
            }
        }