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(); } }