aboutsummaryrefslogtreecommitdiff
path: root/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbRandomAccessFile.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Common.Implementations/IO/SharpCifs/Smb/SmbRandomAccessFile.cs')
-rw-r--r--Emby.Common.Implementations/IO/SharpCifs/Smb/SmbRandomAccessFile.cs975
1 files changed, 481 insertions, 494 deletions
diff --git a/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbRandomAccessFile.cs b/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbRandomAccessFile.cs
index 2fa49d8f9..445a0656c 100644
--- a/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbRandomAccessFile.cs
+++ b/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbRandomAccessFile.cs
@@ -22,498 +22,485 @@ using SharpCifs.Util.Sharpen;
namespace SharpCifs.Smb
{
- public class SmbRandomAccessFile //: DataOutput, DataInput
- {
- private const int WriteOptions = unchecked(0x0842);
-
- private SmbFile _file;
-
- private long _fp;
-
- private int _openFlags;
-
- private int _access;
-
- private int _readSize;
-
- private int _writeSize;
-
- private int _ch;
-
- private int _options;
-
- private byte[] _tmp = new byte[8];
-
- private SmbComWriteAndXResponse _writeAndxResp;
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- /// <exception cref="System.UriFormatException"></exception>
- /// <exception cref="UnknownHostException"></exception>
- public SmbRandomAccessFile(string url, string mode, int shareAccess)
- : this(new SmbFile(url, string.Empty, null, shareAccess), mode)
- {
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- /// <exception cref="System.UriFormatException"></exception>
- /// <exception cref="UnknownHostException"></exception>
- public SmbRandomAccessFile(SmbFile file, string mode)
- {
- this._file = file;
- if (mode.Equals("r"))
- {
- _openFlags = SmbFile.OCreat | SmbFile.ORdonly;
- }
- else
- {
- if (mode.Equals("rw"))
- {
- _openFlags = SmbFile.OCreat | SmbFile.ORdwr | SmbFile.OAppend;
- _writeAndxResp = new SmbComWriteAndXResponse();
- _options = WriteOptions;
- _access = SmbConstants.FileReadData | SmbConstants.FileWriteData;
- }
- else
- {
- throw new ArgumentException("Invalid mode");
- }
- }
- file.Open(_openFlags, _access, SmbFile.AttrNormal, _options);
- _readSize = file.Tree.Session.transport.RcvBufSize - 70;
- _writeSize = file.Tree.Session.transport.SndBufSize - 70;
- _fp = 0L;
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual int Read()
- {
- if (Read(_tmp, 0, 1) == -1)
- {
- return -1;
- }
- return _tmp[0] & unchecked(0xFF);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual int Read(byte[] b)
- {
- return Read(b, 0, b.Length);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual int Read(byte[] b, int off, int len)
- {
- if (len <= 0)
- {
- return 0;
- }
- long start = _fp;
- // ensure file is open
- if (_file.IsOpen() == false)
- {
- _file.Open(_openFlags, 0, SmbFile.AttrNormal, _options);
- }
- int r;
- int n;
- SmbComReadAndXResponse response = new SmbComReadAndXResponse(b, off);
- do
- {
- r = len > _readSize ? _readSize : len;
- _file.Send(new SmbComReadAndX(_file.Fid, _fp, r, null), response);
- if ((n = response.DataLength) <= 0)
- {
- return (int)((_fp - start) > 0L ? _fp - start : -1);
- }
- _fp += n;
- len -= n;
- response.Off += n;
- }
- while (len > 0 && n == r);
- return (int)(_fp - start);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void ReadFully(byte[] b)
- {
- ReadFully(b, 0, b.Length);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void ReadFully(byte[] b, int off, int len)
- {
- int n = 0;
- int count;
- do
- {
- count = Read(b, off + n, len - n);
- if (count < 0)
- {
- throw new SmbException("EOF");
- }
- n += count;
- _fp += count;
- }
- while (n < len);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual int SkipBytes(int n)
- {
- if (n > 0)
- {
- _fp += n;
- return n;
- }
- return 0;
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual void Write(int b)
- {
- _tmp[0] = unchecked((byte)b);
- Write(_tmp, 0, 1);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual void Write(byte[] b)
- {
- Write(b, 0, b.Length);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual void Write(byte[] b, int off, int len)
- {
- if (len <= 0)
- {
- return;
- }
- // ensure file is open
- if (_file.IsOpen() == false)
- {
- _file.Open(_openFlags, 0, SmbFile.AttrNormal, _options);
- }
- int w;
- do
- {
- w = len > _writeSize ? _writeSize : len;
- _file.Send(new SmbComWriteAndX(_file.Fid, _fp, len - w, b, off, w, null),
- _writeAndxResp);
- _fp += _writeAndxResp.Count;
- len -= (int)_writeAndxResp.Count;
- off += (int)_writeAndxResp.Count;
- }
- while (len > 0);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual long GetFilePointer()
- {
- return _fp;
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual void Seek(long pos)
- {
- _fp = pos;
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual long Length()
- {
- return _file.Length();
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual void SetLength(long newLength)
- {
- // ensure file is open
- if (_file.IsOpen() == false)
- {
- _file.Open(_openFlags, 0, SmbFile.AttrNormal, _options);
- }
- SmbComWriteResponse rsp = new SmbComWriteResponse();
- _file.Send(new SmbComWrite(_file.Fid,
- (int)(newLength & unchecked(0xFFFFFFFFL)),
- 0,
- _tmp,
- 0,
- 0),
- rsp);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public virtual void Close()
- {
- _file.Close();
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public bool ReadBoolean()
- {
- if ((Read(_tmp, 0, 1)) < 0)
- {
- throw new SmbException("EOF");
- }
- return _tmp[0] != unchecked(unchecked(0x00));
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public byte ReadByte()
- {
- if ((Read(_tmp, 0, 1)) < 0)
- {
- throw new SmbException("EOF");
- }
- return _tmp[0];
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public int ReadUnsignedByte()
- {
- if ((Read(_tmp, 0, 1)) < 0)
- {
- throw new SmbException("EOF");
- }
- return _tmp[0] & unchecked(0xFF);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public short ReadShort()
- {
- if ((Read(_tmp, 0, 2)) < 0)
- {
- throw new SmbException("EOF");
- }
- return Encdec.Dec_uint16be(_tmp, 0);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public int ReadUnsignedShort()
- {
- if ((Read(_tmp, 0, 2)) < 0)
- {
- throw new SmbException("EOF");
- }
- return Encdec.Dec_uint16be(_tmp, 0) & unchecked(0xFFFF);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public char ReadChar()
- {
- if ((Read(_tmp, 0, 2)) < 0)
- {
- throw new SmbException("EOF");
- }
- return (char)Encdec.Dec_uint16be(_tmp, 0);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public int ReadInt()
- {
- if ((Read(_tmp, 0, 4)) < 0)
- {
- throw new SmbException("EOF");
- }
- return Encdec.Dec_uint32be(_tmp, 0);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public long ReadLong()
- {
- if ((Read(_tmp, 0, 8)) < 0)
- {
- throw new SmbException("EOF");
- }
- return Encdec.Dec_uint64be(_tmp, 0);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public float ReadFloat()
- {
- if ((Read(_tmp, 0, 4)) < 0)
- {
- throw new SmbException("EOF");
- }
- return Encdec.Dec_floatbe(_tmp, 0);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public double ReadDouble()
- {
- if ((Read(_tmp, 0, 8)) < 0)
- {
- throw new SmbException("EOF");
- }
- return Encdec.Dec_doublebe(_tmp, 0);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public string ReadLine()
- {
- StringBuilder input = new StringBuilder();
- int c = -1;
- bool eol = false;
- while (!eol)
- {
- switch (c = Read())
- {
- case -1:
- case '\n':
- {
- eol = true;
- break;
- }
-
- case '\r':
- {
- eol = true;
- long cur = _fp;
- if (Read() != '\n')
- {
- _fp = cur;
- }
- break;
- }
-
- default:
- {
- input.Append((char)c);
- break;
- }
- }
- }
- if ((c == -1) && (input.Length == 0))
- {
- return null;
- }
- return input.ToString();
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public string ReadUtf()
- {
- int size = ReadUnsignedShort();
- byte[] b = new byte[size];
- Read(b, 0, size);
- try
- {
- return Encdec.Dec_utf8(b, 0, size);
- }
- catch (IOException ioe)
- {
- throw new SmbException(string.Empty, ioe);
- }
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteBoolean(bool v)
- {
- _tmp[0] = unchecked((byte)(v ? 1 : 0));
- Write(_tmp, 0, 1);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteByte(int v)
- {
- _tmp[0] = unchecked((byte)v);
- Write(_tmp, 0, 1);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteShort(int v)
- {
- Encdec.Enc_uint16be((short)v, _tmp, 0);
- Write(_tmp, 0, 2);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteChar(int v)
- {
- Encdec.Enc_uint16be((short)v, _tmp, 0);
- Write(_tmp, 0, 2);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteInt(int v)
- {
- Encdec.Enc_uint32be(v, _tmp, 0);
- Write(_tmp, 0, 4);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteLong(long v)
- {
- Encdec.Enc_uint64be(v, _tmp, 0);
- Write(_tmp, 0, 8);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteFloat(float v)
- {
- Encdec.Enc_floatbe(v, _tmp, 0);
- Write(_tmp, 0, 4);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteDouble(double v)
- {
- Encdec.Enc_doublebe(v, _tmp, 0);
- Write(_tmp, 0, 8);
- }
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteBytes(string s)
- {
- byte[] b = Runtime.GetBytesForString(s);
- Write(b, 0, b.Length);
- }
-
-
- /*
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteChars(string s)
- {
- int clen = s.Length;
- int blen = 2 * clen;
- byte[] b = new byte[blen];
- char[] c = new char[clen];
- Sharpen.Runtime.GetCharsForString(s, 0, clen, c, 0);
- for (int i = 0, j = 0; i < clen; i++)
- {
- b[j++] = unchecked((byte)((char)(((uchar)c[i]) >> 8)));
- b[j++] = unchecked((byte)((char)(((uchar)c[i]) >> 0)));
- }
- Write(b, 0, blen);
- }
- */
-
- /// <exception cref="SharpCifs.Smb.SmbException"></exception>
- public void WriteUtf(string str)
- {
- int len = str.Length;
- int ch;
- int size = 0;
- byte[] dst;
- for (int i = 0; i < len; i++)
- {
- ch = str[i];
- size += ch > unchecked(0x07F)
- ? (ch > unchecked(0x7FF)
- ? 3
- : 2)
- : 1;
- }
- dst = new byte[size];
- WriteShort(size);
- try
- {
- Encdec.Enc_utf8(str, dst, 0, size);
- }
- catch (IOException ioe)
- {
- throw new SmbException(string.Empty, ioe);
- }
- Write(dst, 0, size);
- }
- }
+ public class SmbRandomAccessFile //: DataOutput, DataInput
+ {
+ private const int WriteOptions = unchecked(0x0842);
+
+ private SmbFile _file;
+
+ private long _fp;
+
+ private int _openFlags;
+
+ private int _access;
+
+ private int _readSize;
+
+ private int _writeSize;
+
+ private int _ch;
+
+ private int _options;
+
+ private byte[] _tmp = new byte[8];
+
+ private SmbComWriteAndXResponse _writeAndxResp;
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ /// <exception cref="System.UriFormatException"></exception>
+ /// <exception cref="UnknownHostException"></exception>
+ public SmbRandomAccessFile(string url, string mode, int shareAccess) : this(new SmbFile
+ (url, string.Empty, null, shareAccess), mode)
+ {
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ /// <exception cref="System.UriFormatException"></exception>
+ /// <exception cref="UnknownHostException"></exception>
+ public SmbRandomAccessFile(SmbFile file, string mode)
+ {
+ this._file = file;
+ if (mode.Equals("r"))
+ {
+ _openFlags = SmbFile.OCreat | SmbFile.ORdonly;
+ }
+ else
+ {
+ if (mode.Equals("rw"))
+ {
+ _openFlags = SmbFile.OCreat | SmbFile.ORdwr | SmbFile.OAppend;
+ _writeAndxResp = new SmbComWriteAndXResponse();
+ _options = WriteOptions;
+ _access = SmbConstants.FileReadData | SmbConstants.FileWriteData;
+ }
+ else
+ {
+ throw new ArgumentException("Invalid mode");
+ }
+ }
+ file.Open(_openFlags, _access, SmbFile.AttrNormal, _options);
+ _readSize = file.Tree.Session.transport.RcvBufSize - 70;
+ _writeSize = file.Tree.Session.transport.SndBufSize - 70;
+ _fp = 0L;
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual int Read()
+ {
+ if (Read(_tmp, 0, 1) == -1)
+ {
+ return -1;
+ }
+ return _tmp[0] & unchecked(0xFF);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual int Read(byte[] b)
+ {
+ return Read(b, 0, b.Length);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual int Read(byte[] b, int off, int len)
+ {
+ if (len <= 0)
+ {
+ return 0;
+ }
+ long start = _fp;
+ // ensure file is open
+ if (_file.IsOpen() == false)
+ {
+ _file.Open(_openFlags, 0, SmbFile.AttrNormal, _options);
+ }
+ int r;
+ int n;
+ SmbComReadAndXResponse response = new SmbComReadAndXResponse(b, off);
+ do
+ {
+ r = len > _readSize ? _readSize : len;
+ _file.Send(new SmbComReadAndX(_file.Fid, _fp, r, null), response);
+ if ((n = response.DataLength) <= 0)
+ {
+ return (int)((_fp - start) > 0L ? _fp - start : -1);
+ }
+ _fp += n;
+ len -= n;
+ response.Off += n;
+ }
+ while (len > 0 && n == r);
+ return (int)(_fp - start);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void ReadFully(byte[] b)
+ {
+ ReadFully(b, 0, b.Length);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void ReadFully(byte[] b, int off, int len)
+ {
+ int n = 0;
+ int count;
+ do
+ {
+ count = Read(b, off + n, len - n);
+ if (count < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ n += count;
+ _fp += count;
+ }
+ while (n < len);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual int SkipBytes(int n)
+ {
+ if (n > 0)
+ {
+ _fp += n;
+ return n;
+ }
+ return 0;
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual void Write(int b)
+ {
+ _tmp[0] = unchecked((byte)b);
+ Write(_tmp, 0, 1);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual void Write(byte[] b)
+ {
+ Write(b, 0, b.Length);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual void Write(byte[] b, int off, int len)
+ {
+ if (len <= 0)
+ {
+ return;
+ }
+ // ensure file is open
+ if (_file.IsOpen() == false)
+ {
+ _file.Open(_openFlags, 0, SmbFile.AttrNormal, _options);
+ }
+ int w;
+ do
+ {
+ w = len > _writeSize ? _writeSize : len;
+ _file.Send(new SmbComWriteAndX(_file.Fid, _fp, len - w, b, off, w, null), _writeAndxResp
+ );
+ _fp += _writeAndxResp.Count;
+ len -= (int)_writeAndxResp.Count;
+ off += (int)_writeAndxResp.Count;
+ }
+ while (len > 0);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual long GetFilePointer()
+ {
+ return _fp;
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual void Seek(long pos)
+ {
+ _fp = pos;
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual long Length()
+ {
+ return _file.Length();
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual void SetLength(long newLength)
+ {
+ // ensure file is open
+ if (_file.IsOpen() == false)
+ {
+ _file.Open(_openFlags, 0, SmbFile.AttrNormal, _options);
+ }
+ SmbComWriteResponse rsp = new SmbComWriteResponse();
+ _file.Send(new SmbComWrite(_file.Fid, (int)(newLength & unchecked(0xFFFFFFFFL)), 0, _tmp, 0, 0), rsp);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public virtual void Close()
+ {
+ _file.Close();
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public bool ReadBoolean()
+ {
+ if ((Read(_tmp, 0, 1)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return _tmp[0] != unchecked(unchecked(0x00));
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public byte ReadByte()
+ {
+ if ((Read(_tmp, 0, 1)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return _tmp[0];
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public int ReadUnsignedByte()
+ {
+ if ((Read(_tmp, 0, 1)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return _tmp[0] & unchecked(0xFF);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public short ReadShort()
+ {
+ if ((Read(_tmp, 0, 2)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return Encdec.Dec_uint16be(_tmp, 0);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public int ReadUnsignedShort()
+ {
+ if ((Read(_tmp, 0, 2)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return Encdec.Dec_uint16be(_tmp, 0) & unchecked(0xFFFF);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public char ReadChar()
+ {
+ if ((Read(_tmp, 0, 2)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return (char)Encdec.Dec_uint16be(_tmp, 0);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public int ReadInt()
+ {
+ if ((Read(_tmp, 0, 4)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return Encdec.Dec_uint32be(_tmp, 0);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public long ReadLong()
+ {
+ if ((Read(_tmp, 0, 8)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return Encdec.Dec_uint64be(_tmp, 0);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public float ReadFloat()
+ {
+ if ((Read(_tmp, 0, 4)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return Encdec.Dec_floatbe(_tmp, 0);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public double ReadDouble()
+ {
+ if ((Read(_tmp, 0, 8)) < 0)
+ {
+ throw new SmbException("EOF");
+ }
+ return Encdec.Dec_doublebe(_tmp, 0);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public string ReadLine()
+ {
+ StringBuilder input = new StringBuilder();
+ int c = -1;
+ bool eol = false;
+ while (!eol)
+ {
+ switch (c = Read())
+ {
+ case -1:
+ case '\n':
+ {
+ eol = true;
+ break;
+ }
+
+ case '\r':
+ {
+ eol = true;
+ long cur = _fp;
+ if (Read() != '\n')
+ {
+ _fp = cur;
+ }
+ break;
+ }
+
+ default:
+ {
+ input.Append((char)c);
+ break;
+ }
+ }
+ }
+ if ((c == -1) && (input.Length == 0))
+ {
+ return null;
+ }
+ return input.ToString();
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public string ReadUtf()
+ {
+ int size = ReadUnsignedShort();
+ byte[] b = new byte[size];
+ Read(b, 0, size);
+ try
+ {
+ return Encdec.Dec_utf8(b, 0, size);
+ }
+ catch (IOException ioe)
+ {
+ throw new SmbException(string.Empty, ioe);
+ }
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteBoolean(bool v)
+ {
+ _tmp[0] = unchecked((byte)(v ? 1 : 0));
+ Write(_tmp, 0, 1);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteByte(int v)
+ {
+ _tmp[0] = unchecked((byte)v);
+ Write(_tmp, 0, 1);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteShort(int v)
+ {
+ Encdec.Enc_uint16be((short)v, _tmp, 0);
+ Write(_tmp, 0, 2);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteChar(int v)
+ {
+ Encdec.Enc_uint16be((short)v, _tmp, 0);
+ Write(_tmp, 0, 2);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteInt(int v)
+ {
+ Encdec.Enc_uint32be(v, _tmp, 0);
+ Write(_tmp, 0, 4);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteLong(long v)
+ {
+ Encdec.Enc_uint64be(v, _tmp, 0);
+ Write(_tmp, 0, 8);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteFloat(float v)
+ {
+ Encdec.Enc_floatbe(v, _tmp, 0);
+ Write(_tmp, 0, 4);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteDouble(double v)
+ {
+ Encdec.Enc_doublebe(v, _tmp, 0);
+ Write(_tmp, 0, 8);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteBytes(string s)
+ {
+ byte[] b = Runtime.GetBytesForString(s);
+ Write(b, 0, b.Length);
+ }
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ /* public void WriteChars(string s)
+ {
+ int clen = s.Length;
+ int blen = 2 * clen;
+ byte[] b = new byte[blen];
+ char[] c = new char[clen];
+ Sharpen.Runtime.GetCharsForString(s, 0, clen, c, 0);
+ for (int i = 0, j = 0; i < clen; i++)
+ {
+ b[j++] = unchecked((byte)((char)(((uchar)c[i]) >> 8)));
+ b[j++] = unchecked((byte)((char)(((uchar)c[i]) >> 0)));
+ }
+ Write(b, 0, blen);
+ }*/
+
+ /// <exception cref="SharpCifs.Smb.SmbException"></exception>
+ public void WriteUtf(string str)
+ {
+ int len = str.Length;
+ int ch;
+ int size = 0;
+ byte[] dst;
+ for (int i = 0; i < len; i++)
+ {
+ ch = str[i];
+ size += ch > unchecked(0x07F) ? (ch > unchecked(0x7FF) ? 3 : 2) : 1;
+ }
+ dst = new byte[size];
+ WriteShort(size);
+ try
+ {
+ Encdec.Enc_utf8(str, dst, 0, size);
+ }
+ catch (IOException ioe)
+ {
+ throw new SmbException(string.Empty, ioe);
+ }
+ Write(dst, 0, size);
+ }
+ }
}