aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/IO/SharpCifs/Smb/Trans2FindFirst2Response.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/IO/SharpCifs/Smb/Trans2FindFirst2Response.cs')
-rw-r--r--Emby.Server.Implementations/IO/SharpCifs/Smb/Trans2FindFirst2Response.cs262
1 files changed, 262 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/IO/SharpCifs/Smb/Trans2FindFirst2Response.cs b/Emby.Server.Implementations/IO/SharpCifs/Smb/Trans2FindFirst2Response.cs
new file mode 100644
index 000000000..71f780ff3
--- /dev/null
+++ b/Emby.Server.Implementations/IO/SharpCifs/Smb/Trans2FindFirst2Response.cs
@@ -0,0 +1,262 @@
+// This code is derived from jcifs smb client library <jcifs at samba dot org>
+// Ported by J. Arturo <webmaster at komodosoft dot net>
+//
+// 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 SharpCifs.Util.Sharpen;
+
+namespace SharpCifs.Smb
+{
+ internal class Trans2FindFirst2Response : SmbComTransactionResponse
+ {
+ internal const int SmbInfoStandard = 1;
+
+ internal const int SmbInfoQueryEaSize = 2;
+
+ internal const int SmbInfoQueryEasFromList = 3;
+
+ internal const int SmbFindFileDirectoryInfo = unchecked(0x101);
+
+ internal const int SmbFindFileFullDirectoryInfo = unchecked(0x102);
+
+ internal const int SmbFileNamesInfo = unchecked(0x103);
+
+ internal const int SmbFileBothDirectoryInfo = unchecked(0x104);
+
+ internal class SmbFindFileBothDirectoryInfo : IFileEntry
+ {
+ internal int NextEntryOffset;
+
+ internal int FileIndex;
+
+ internal long CreationTime;
+
+ internal long LastAccessTime;
+
+ internal long LastWriteTime;
+
+ internal long ChangeTime;
+
+ internal long EndOfFile;
+
+ internal long AllocationSize;
+
+ internal int ExtFileAttributes;
+
+ internal int FileNameLength;
+
+ internal int EaSize;
+
+ internal int ShortNameLength;
+
+ internal string ShortName;
+
+ internal string Filename;
+
+ // information levels
+ public virtual string GetName()
+ {
+ return Filename;
+ }
+
+ public virtual int GetType()
+ {
+ return SmbFile.TypeFilesystem;
+ }
+
+ public virtual int GetAttributes()
+ {
+ return ExtFileAttributes;
+ }
+
+ public virtual long CreateTime()
+ {
+ return CreationTime;
+ }
+
+ public virtual long LastModified()
+ {
+ return LastWriteTime;
+ }
+
+ public virtual long Length()
+ {
+ return EndOfFile;
+ }
+
+ public override string ToString()
+ {
+ return "SmbFindFileBothDirectoryInfo[" + "nextEntryOffset=" + NextEntryOffset
+ + ",fileIndex=" + FileIndex + ",creationTime=" + Extensions.CreateDate
+ (CreationTime) + ",lastAccessTime=" + Extensions.CreateDate(LastAccessTime
+ ) + ",lastWriteTime=" + Extensions.CreateDate(LastWriteTime) + ",changeTime="
+ + Extensions.CreateDate(ChangeTime) + ",endOfFile=" + EndOfFile
+ + ",allocationSize=" + AllocationSize + ",extFileAttributes=" + ExtFileAttributes
+ + ",fileNameLength=" + FileNameLength + ",eaSize=" + EaSize + ",shortNameLength="
+ + ShortNameLength + ",shortName=" + ShortName + ",filename=" + Filename
+ + "]";
+ }
+
+ internal SmbFindFileBothDirectoryInfo(Trans2FindFirst2Response enclosing)
+ {
+ this._enclosing = enclosing;
+ }
+
+ private readonly Trans2FindFirst2Response _enclosing;
+ }
+
+ internal int Sid;
+
+ internal bool IsEndOfSearch;
+
+ internal int EaErrorOffset;
+
+ internal int LastNameOffset;
+
+ internal int LastNameBufferIndex;
+
+ internal string LastName;
+
+ internal int ResumeKey;
+
+ public Trans2FindFirst2Response()
+ {
+ Command = SmbComTransaction2;
+ SubCommand = Smb.SmbComTransaction.Trans2FindFirst2;
+ }
+
+ internal virtual string ReadString(byte[] src, int srcIndex, int len)
+ {
+ string str = null;
+ try
+ {
+ if (UseUnicode)
+ {
+ // should Unicode alignment be corrected for here?
+ str = Runtime.GetStringForBytes(src, srcIndex, len, SmbConstants.UniEncoding);
+ }
+ else
+ {
+ if (len > 0 && src[srcIndex + len - 1] == '\0')
+ {
+ len--;
+ }
+ str = Runtime.GetStringForBytes(src, srcIndex, len, SmbConstants.OemEncoding
+ );
+ }
+ }
+ catch (UnsupportedEncodingException uee)
+ {
+ if (Log.Level > 1)
+ {
+ Runtime.PrintStackTrace(uee, Log);
+ }
+ }
+ return str;
+ }
+
+ internal override int WriteSetupWireFormat(byte[] dst, int dstIndex)
+ {
+ return 0;
+ }
+
+ internal override int WriteParametersWireFormat(byte[] dst, int dstIndex)
+ {
+ return 0;
+ }
+
+ internal override int WriteDataWireFormat(byte[] dst, int dstIndex)
+ {
+ return 0;
+ }
+
+ internal override int ReadSetupWireFormat(byte[] buffer, int bufferIndex, int len
+ )
+ {
+ return 0;
+ }
+
+ internal override int ReadParametersWireFormat(byte[] buffer, int bufferIndex, int
+ len)
+ {
+ int start = bufferIndex;
+ if (SubCommand == Smb.SmbComTransaction.Trans2FindFirst2)
+ {
+ Sid = ReadInt2(buffer, bufferIndex);
+ bufferIndex += 2;
+ }
+ NumEntries = ReadInt2(buffer, bufferIndex);
+ bufferIndex += 2;
+ IsEndOfSearch = (buffer[bufferIndex] & unchecked(0x01)) == unchecked(0x01) ? true : false;
+ bufferIndex += 2;
+ EaErrorOffset = ReadInt2(buffer, bufferIndex);
+ bufferIndex += 2;
+ LastNameOffset = ReadInt2(buffer, bufferIndex);
+ bufferIndex += 2;
+ return bufferIndex - start;
+ }
+
+ internal override int ReadDataWireFormat(byte[] buffer, int bufferIndex, int len)
+ {
+ int start = bufferIndex;
+ SmbFindFileBothDirectoryInfo e;
+ LastNameBufferIndex = bufferIndex + LastNameOffset;
+ Results = new SmbFindFileBothDirectoryInfo[NumEntries];
+ for (int i = 0; i < NumEntries; i++)
+ {
+ Results[i] = e = new SmbFindFileBothDirectoryInfo(this);
+ e.NextEntryOffset = ReadInt4(buffer, bufferIndex);
+ e.FileIndex = ReadInt4(buffer, bufferIndex + 4);
+ e.CreationTime = ReadTime(buffer, bufferIndex + 8);
+ // e.lastAccessTime = readTime( buffer, bufferIndex + 16 );
+ e.LastWriteTime = ReadTime(buffer, bufferIndex + 24);
+ // e.changeTime = readTime( buffer, bufferIndex + 32 );
+ e.EndOfFile = ReadInt8(buffer, bufferIndex + 40);
+ // e.allocationSize = readInt8( buffer, bufferIndex + 48 );
+ e.ExtFileAttributes = ReadInt4(buffer, bufferIndex + 56);
+ e.FileNameLength = ReadInt4(buffer, bufferIndex + 60);
+ // e.eaSize = readInt4( buffer, bufferIndex + 64 );
+ // e.shortNameLength = buffer[bufferIndex + 68] & 0xFF;
+ // e.shortName = readString( buffer, bufferIndex + 70, e.shortNameLength );
+ e.Filename = ReadString(buffer, bufferIndex + 94, e.FileNameLength);
+ if (LastNameBufferIndex >= bufferIndex && (e.NextEntryOffset == 0 || LastNameBufferIndex
+ < (bufferIndex + e.NextEntryOffset)))
+ {
+ LastName = e.Filename;
+ ResumeKey = e.FileIndex;
+ }
+ bufferIndex += e.NextEntryOffset;
+ }
+ //return bufferIndex - start;
+ return DataCount;
+ }
+
+ public override string ToString()
+ {
+ string c;
+ if (SubCommand == Smb.SmbComTransaction.Trans2FindFirst2)
+ {
+ c = "Trans2FindFirst2Response[";
+ }
+ else
+ {
+ c = "Trans2FindNext2Response[";
+ }
+ return c + base.ToString() + ",sid=" + Sid + ",searchCount=" + NumEntries
+ + ",isEndOfSearch=" + IsEndOfSearch + ",eaErrorOffset=" + EaErrorOffset + ",lastNameOffset="
+ + LastNameOffset + ",lastName=" + LastName + "]";
+ }
+ }
+}