/// <exception cref="WinrtCifs.Smb.SmbException"></exception> internal virtual void TreeConnect(ServerMessageBlock andx, ServerMessageBlock andxResponse ) { lock (Session.Transport()) { string unc; while (ConnectionState != 0) { if (ConnectionState == 2 || ConnectionState == 3) { // connected or disconnecting return; } try { Runtime.Wait(Session.transport); } catch (Exception ie) { throw new SmbException(ie.Message, ie); } } ConnectionState = 1; // trying ... try { Session.transport.Connect(); unc = "\\\\" + Session.transport.TconHostName + '\\' + Share; Service = Service0; if (Session.transport.Log.Level >= 4) { Session.transport.Log.WriteLine("treeConnect: unc=" + unc + ",service=" + Service ); } SmbComTreeConnectAndXResponse response = new SmbComTreeConnectAndXResponse(andxResponse ); SmbComTreeConnectAndX request = new SmbComTreeConnectAndX(Session, unc, Service, andx); Session.Send(request, response); Tid = response.Tid; Service = response.Service; InDfs = response.ShareIsInDfs; TreeNum = _treeConnCounter++; ConnectionState = 2; } catch (SmbException e) { // connected TreeDisconnect(true); ConnectionState = 0; throw e; } } }
/// <exception cref="WinrtCifs.Smb.SmbException"></exception> internal void Send(ServerMessageBlock request, ServerMessageBlock response) { lock (Transport()) { if (response != null) { response.Received = false; } Expiration = Runtime.CurrentTimeMillis() + SmbConstants.SoTimeout; SessionSetup(request, response); if (response != null && response.Received) { return; } if (request is SmbComTreeConnectAndX) { SmbComTreeConnectAndX tcax = (SmbComTreeConnectAndX)request; if (NetbiosName != null && tcax.path.EndsWith("\\IPC$")) { tcax.path = "\\\\" + NetbiosName + "\\IPC$"; } } request.Uid = Uid; request.Auth = Auth; try { transport.Send(request, response); } catch (SmbException) { if (request is SmbComTreeConnectAndX) { Logoff(true); } request.Digest = null; throw; } } }