internal virtual void Send(ServerMessageBlock request, ServerMessageBlock response
)
{
Connect();
request.Flags2 |= Flags2;
request.UseUnicode = UseUnicode;
request.Response = response;
if (request.Digest == null)
{
request.Digest = Digest;
}
try
{
if (response == null)
{
DoSend0(request);
return;
}
if (request is SmbComTransaction)
{
response.Command = request.Command;
SmbComTransaction req = (SmbComTransaction)request;
SmbComTransactionResponse resp = (SmbComTransactionResponse)response;
req.MaxBufferSize = SndBufSize;
resp.Reset();
try
{
BufferCache.GetBuffers(req, resp);
req.Current();
if (req.MoveNext())
{
SmbComBlankResponse interim = new SmbComBlankResponse();
Sendrecv(req, interim, SmbConstants.ResponseTimeout);
if (interim.ErrorCode != 0)
{
CheckStatus(req, interim);
}
req.Current();
}
else
{
MakeKey(req);
}
lock (this)
{
response.Received = false;
resp.IsReceived = false;
try
{
ResponseMap.Put(req, resp);
do
{
DoSend0(req);
}
while (req.MoveNext() && req.Current() != null);
long timeout = SmbConstants.ResponseTimeout;
resp.Expiration = Runtime.CurrentTimeMillis() + timeout;
while (resp.MoveNext())
{
Runtime.Wait(this, timeout);
timeout = resp.Expiration - Runtime.CurrentTimeMillis();
if (timeout <= 0)
{
throw new TransportException(this + " timedout waiting for response to " + req);
}
}
if (response.ErrorCode != 0)
{
CheckStatus(req, resp);
}
}
catch (Exception ie)
{
if (ie is SmbException)
{
throw;
}
else
{
throw new TransportException(ie);
}
}
finally
{
//Sharpen.Collections.Remove<Hashtable, SmbComTransaction>(response_map, req);
ResponseMap.Remove(req);
}
}
}
finally
{
BufferCache.ReleaseBuffer(req.TxnBuf);
BufferCache.ReleaseBuffer(resp.TxnBuf);
}
}
else
{
response.Command = request.Command;
Sendrecv(request, response, SmbConstants.ResponseTimeout);
}
}
catch (SmbException se)
{
throw;
}
catch (IOException ioe)
{
throw new SmbException(ioe.Message, ioe);
}
CheckStatus(request, response);
}