mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-03-23 18:50:26 +00:00
merge common implementations and server implementations
This commit is contained in:
@@ -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 + "]";
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user