/// <exception cref="SharpCifs.Smb.SmbException"></exception> 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); }