private void DoRead(object state)
{
Session session = null;
ReadRequestTransaction transaction = (ReadRequestTransaction)state;
try
{
bool done = false;
while (!done)
{
// check if the transaction is still active.
lock (Lock)
{
if (!m_transactions.ContainsKey(transaction.CancelId))
{
break;
}
session = Session;
}
// check for session error.
if (session == null)
{
for (int ii = 0; ii < transaction.Requests.Count; ii++)
{
transaction.Requests[ii].Error = ResultIds.E_FAIL;
}
SendCallback(transaction.TransactionId, transaction.TransationType, transaction.Requests);
break;
}
// fetch next batch.
if (transaction.TransationType == TransationType.ReadAttribute)
{
done = !ReadAttributes(session, transaction.Details, transaction.Requests, false);
}
else
{
done = !ReadNext(session, transaction.Details, transaction.Requests, false);
}
// send data to client.
SendCallback(transaction.TransactionId, transaction.TransationType, transaction.Requests);
// remove values that were sent.
for (int ii = 0; ii < transaction.Requests.Count; ii++)
{
transaction.Requests[ii].Values.Clear();
if (transaction.Requests[ii].ModificationInfos != null)
{
transaction.Requests[ii].ModificationInfos.Clear();
}
}
}
// release continuation points.
if (!done && session != null)
{
ReadNext(session, transaction.Details, transaction.Requests, true);
}
}
catch (Exception e)
{
Utils.Trace(e, "Unexpected error reading history.");
}
finally
{
// remove transaction.
lock (Lock)
{
m_transactions.Remove(transaction.CancelId);
}
}
}