/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="status">Overall status of batch processing</param>
		/// <param name="opCount">Number of operations performed on the batch</param>
		/// <param name="operationStatus">Array of statuses for each opearation</param>
		/// <param name="callbackCookie">Callback cookie</param>
		public TpBatchStatus(	int status, 
								short opCount, 
								BTBatchOperationStatus[] operationStatus, 
								object callbackCookie )
		{
			this.status = status;
			this.opCount = opCount;
			this.operationStatus = operationStatus;
			this.callbackCookie = callbackCookie;
		}
		/// <summary>
		/// Process the results of batch submission
		/// </summary>
		/// <param name="status">Overall status for the batch</param>
		/// <param name="opCount">Count of batch operations</param>
		/// <param name="operationStatus">Status for each operation on the batch</param>
		/// <param name="callbackCookie">Callback cookie</param>
		public void BatchComplete(	int status, short opCount, BTBatchOperationStatus[] operationStatus, object callbackCookie)
		{
			try
			{
				_batchStatus = new TpBatchStatus(status, opCount, operationStatus, callbackCookie);

				_isCompleted = true;
				_evt.Set();

				// If client registered for a call back...
				if ( null != _asyncCallBack )
				{
					_asyncCallBack( _ar );
				}
			}
			finally
			{
				if ( null != _responseCallback )
					_responseCallback.SubmitComplete(_batchStatus);
			}
		}
        // IBTBatchCallBack
        public void BatchComplete(Int32 hrStatus, Int16 nOpCount, BTBatchOperationStatus[] pOperationStatus, System.Object vCallbackCookie)
        {
            //BT.Trace.Tracer.TraceMessage(BT.TraceLevel.SegmentLifeTime, "CoreAdapter: Entering Batch.BatchComplete");

            if (0 != hrStatus)
            {
                //BT.Trace.Tracer.TraceMessage(BT.TraceLevel.Error, "CoreAdapter: Batch.BatchComplete hrStatus: {0}", hrStatus);
            }

            this.hrStatus = hrStatus;

            StartBatchComplete(hrStatus);

            //  nothing at all failed in this batch so we are done
            if (hrStatus < 0 || this.makeSuccessCall)
            {
                //BT.Trace.Tracer.TraceMessage(BT.TraceLevel.Info, "CoreAdapter: Batch.BatchComplete (hrStatus < 0 || this.makeSuccessCall)");

                StartProcessFailures();

                foreach (BTBatchOperationStatus status in pOperationStatus)
                {
                    //  is this the correct behavior?
                    if (status.Status >= 0 && !this.makeSuccessCall)
                        continue;

                    switch (status.OperationType)
                    {
                        case BatchOperationType.Submit:
                            {
                                for (int i = 0; i < status.MessageCount; i++)
                                {
                                    BatchMessage batchMessage = null;
                                    if (submitIsForSubmitResponse)
                                    {
                                        batchMessage = (BatchMessage)this.submitResponseMessageArray[i];
                                    }
                                    else
                                    {
                                        batchMessage = (BatchMessage)this.submitArray[i];
                                    }

                                    if (status.MessageStatus[i] < 0)
                                        SubmitFailure(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                    else if (this.makeSuccessCall)
                                        SubmitSuccess(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                }
                                break;
                            }
                        case BatchOperationType.Delete:
                            {
                                for (int i = 0; i < status.MessageCount; i++)
                                {
                                    BatchMessage batchMessage = (BatchMessage)this.deleteArray[i];
                                    if (status.MessageStatus[i] < 0)
                                        DeleteFailure(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                    else if (this.makeSuccessCall)
                                        DeleteSuccess(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                }
                                break;
                            }
                        case BatchOperationType.Resubmit:
                            {
                                for (int i = 0; i < status.MessageCount; i++)
                                {
                                    BatchMessage batchMessage = (BatchMessage)this.resubmitArray[i];
                                    if (status.MessageStatus[i] < 0)
                                        ResubmitFailure(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                    else if (this.makeSuccessCall)
                                        ResubmitSuccess(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                }
                                break;
                            }
                        case BatchOperationType.MoveToSuspendQ:
                            {
                                for (int i = 0; i < status.MessageCount; i++)
                                {
                                    BatchMessage batchMessage = (BatchMessage)this.moveToSuspendQArray[i];
                                    if (status.MessageStatus[i] < 0)
                                        MoveToSuspendQFailure(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                    else if (this.makeSuccessCall)
                                        MoveToSuspendQSuccess(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                }
                                break;
                            }
                        case BatchOperationType.MoveToNextTransport:
                            {
                                for (int i = 0; i < status.MessageCount; i++)
                                {
                                    BatchMessage batchMessage = (BatchMessage)this.moveToNextTransportArray[i];
                                    if (status.MessageStatus[i] < 0)
                                        MoveToNextTransportFailure(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                    else if (this.makeSuccessCall)
                                        MoveToNextTransportSuccess(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                }
                                break;
                            }
                        case BatchOperationType.SubmitRequest:
                            {
                                for (int i = 0; i < status.MessageCount; i++)
                                {
                                    BatchMessage batchMessage = (BatchMessage)this.submitRequestArray[i];
                                    if (status.MessageStatus[i] < 0)
                                        SubmitRequestFailure(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                    else if (this.makeSuccessCall)
                                        SubmitRequestSuccess(batchMessage.message, status.MessageStatus[i], batchMessage.userData);
                                }
                                break;
                            }
                        case BatchOperationType.CancelRequestForResponse:
                            {
                                for (int i = 0; i < status.MessageCount; i++)
                                {
                                    BatchMessage batchMessage = (BatchMessage)this.cancelResponseMessageArray[i];
                                    if (status.MessageStatus[i] < 0)
                                        CancelResponseMessageFailure(batchMessage.correlationToken, status.MessageStatus[i], batchMessage.userData);
                                    else if (this.makeSuccessCall)
                                        CancelResponseMessageSuccess(batchMessage.correlationToken, status.MessageStatus[i], batchMessage.userData);
                                }
                                break;
                            }
                    } // end switch
                } // end foreach

                EndProcessFailures();
            } // end if

            EndBatchComplete();

            //BT.Trace.Tracer.TraceMessage(BT.TraceLevel.SegmentLifeTime, "CoreAdapter: Leaving Batch.BatchComplete");
        }
 public void BatchComplete(int status, short opCount, BTBatchOperationStatus[] operationStatus, object callbackCookie)
 {
     //Ignoring BatchComplete for sample adapter. Ideally, the logic for status check and acting correspondingly should be present.
     _resetEvent.Set();
 }