// This code is derived from jcifs smb client library // Ported by J. Arturo // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; using SharpCifs.Util.Sharpen; namespace SharpCifs.Smb { /// /// This class will allow a Java program to read and write data to Named /// Pipes and Transact NamedPipes. /// /// /// This class will allow a Java program to read and write data to Named /// Pipes and Transact NamedPipes. ///

There are three Win32 function calls provided by the Windows SDK /// that are important in the context of using jCIFS. They are: ///

    ///
  • CallNamedPipe A message-type pipe call that opens, /// writes to, reads from, and closes the pipe in a single operation. ///
  • TransactNamedPipe A message-type pipe call that /// writes to and reads from an existing pipe descriptor in one operation. ///
  • CreateFile, ReadFile, /// WriteFile, and CloseFile A byte-type pipe can /// be opened, written to, read from and closed using the standard Win32 /// file operations. ///
///

The jCIFS API maps all of these operations into the standard Java /// XxxputStream interface. A special PIPE_TYPE /// flags is necessary to distinguish which type of Named Pipe behavior /// is desired. ///

/// /// /// /// /// /// ///
SmbNamedPipe Constructor Examples
Code SampleDescription
    /// new SmbNamedPipe( "smb://server/IPC$/PIPE/foo",
    /// SmbNamedPipe.PIPE_TYPE_RDWR |
    /// SmbNamedPipe.PIPE_TYPE_CALL );
    /// 
/// Open the Named Pipe foo for reading and writing. The pipe will behave like the CallNamedPipe interface. ///
    /// new SmbNamedPipe( "smb://server/IPC$/foo",
    /// SmbNamedPipe.PIPE_TYPE_RDWR |
    /// SmbNamedPipe.PIPE_TYPE_TRANSACT );
    /// 
/// Open the Named Pipe foo for reading and writing. The pipe will behave like the TransactNamedPipe interface. ///
    /// new SmbNamedPipe( "smb://server/IPC$/foo",
    /// SmbNamedPipe.PIPE_TYPE_RDWR );
    /// 
/// Open the Named Pipe foo for reading and writing. The pipe will /// behave as though the CreateFile, ReadFile, /// WriteFile, and CloseFile interface was /// being used. ///
///

See Using jCIFS to Connect to Win32 /// Named Pipes for a detailed description of how to use jCIFS with /// Win32 Named Pipe server processes. /// public class SmbNamedPipe : SmbFile { ///

The pipe should be opened read-only. /// The pipe should be opened read-only. public const int PipeTypeRdonly = ORdonly; /// The pipe should be opened only for writing. /// The pipe should be opened only for writing. public const int PipeTypeWronly = OWronly; /// The pipe should be opened for both reading and writing. /// The pipe should be opened for both reading and writing. public const int PipeTypeRdwr = ORdwr; /// Pipe operations should behave like the CallNamedPipe Win32 Named Pipe function. /// /// Pipe operations should behave like the CallNamedPipe Win32 Named Pipe function. /// public const int PipeTypeCall = unchecked(0x0100); /// Pipe operations should behave like the TransactNamedPipe Win32 Named Pipe function. /// /// Pipe operations should behave like the TransactNamedPipe Win32 Named Pipe function. /// public const int PipeTypeTransact = unchecked(0x0200); public const int PipeTypeDceTransact = unchecked(0x0200) | unchecked(0x0400); internal InputStream PipeIn; internal OutputStream PipeOut; internal int PipeType; /// /// Open the Named Pipe resource specified by the url /// parameter. /// /// /// Open the Named Pipe resource specified by the url /// parameter. The pipeType parameter should be at least one of /// the PIPE_TYPE flags combined with the bitwise OR /// operator |. See the examples listed above. /// /// /// public SmbNamedPipe(string url, int pipeType) : base(url) { this.PipeType = pipeType; Type = TypeNamedPipe; } /// /// public SmbNamedPipe(string url, int pipeType, NtlmPasswordAuthentication auth) : base(url, auth) { this.PipeType = pipeType; Type = TypeNamedPipe; } /// /// public SmbNamedPipe(Uri url, int pipeType, NtlmPasswordAuthentication auth) : base(url, auth) { this.PipeType = pipeType; Type = TypeNamedPipe; } /// /// Return the InputStream used to read information /// from this pipe instance. /// /// /// Return the InputStream used to read information /// from this pipe instance. Presumably data would first be written /// to the OutputStream associated with this Named /// Pipe instance although this is not a requirement (e.g. a /// read-only named pipe would write data to this stream on /// connection). Reading from this stream may block. Therefore it /// may be necessary that an addition thread be used to read and /// write to a Named Pipe. /// /// public virtual InputStream GetNamedPipeInputStream() { if (PipeIn == null) { if ((PipeType & PipeTypeCall) == PipeTypeCall || (PipeType & PipeTypeTransact) == PipeTypeTransact) { PipeIn = new TransactNamedPipeInputStream(this); } else { PipeIn = new SmbFileInputStream(this, (PipeType & unchecked((int)(0xFFFF00FF))) | OExcl); } } return PipeIn; } /// /// Return the OutputStream used to write /// information to this pipe instance. /// /// /// Return the OutputStream used to write /// information to this pipe instance. The act of writing data /// to this stream will result in response data recieved in the /// InputStream associated with this Named Pipe /// instance (unless of course it does not elicite a response or the pipe is write-only). /// /// public virtual OutputStream GetNamedPipeOutputStream() { if (PipeOut == null) { if ((PipeType & PipeTypeCall) == PipeTypeCall || (PipeType & PipeTypeTransact) == PipeTypeTransact) { PipeOut = new TransactNamedPipeOutputStream(this); } else { PipeOut = new SmbFileOutputStream(this, false, (PipeType & unchecked((int)(0xFFFF00FF))) | OExcl); } } return PipeOut; } } }