internal virtual void CopyTo0(SmbFile dest, byte[][] b, int bsize, WriterThread
w, SmbComReadAndX req, SmbComReadAndXResponse resp)
{
int i;
if (_attrExpiration < Runtime.CurrentTimeMillis())
{
_attributes = AttrReadonly | AttrDirectory;
_createTime = 0L;
_lastModified = 0L;
_isExists = false;
IInfo info = QueryPath(GetUncPath0(), Trans2QueryPathInformationResponse.SMB_QUERY_FILE_BASIC_INFO
);
_attributes = info.GetAttributes();
_createTime = info.GetCreateTime();
_lastModified = info.GetLastWriteTime();
_isExists = true;
_attrExpiration = Runtime.CurrentTimeMillis() + AttrExpirationPeriod;
}
if (IsDirectory())
{
SmbFile[] files;
SmbFile ndest;
string path = dest.GetUncPath0();
if (path.Length > 1)
{
try
{
dest.Mkdir();
dest.SetPathInformation(_attributes, _createTime, _lastModified);
}
catch (SmbException se)
{
if (se.GetNtStatus() != NtStatus.NtStatusAccessDenied && se.GetNtStatus() != NtStatus
.NtStatusObjectNameCollision)
{
throw;
}
}
}
files = ListFiles("*", AttrDirectory | AttrHidden | AttrSystem, null, null);
try
{
for (i = 0; i < files.Length; i++)
{
ndest = new SmbFile(dest, files[i].GetName(), files[i].Type, files[i]._attributes,
files[i]._createTime, files[i]._lastModified, files[i]._size);
files[i].CopyTo0(ndest, b, bsize, w, req, resp);
}
}
catch (UnknownHostException uhe)
{
throw new SmbException(Url.ToString(), uhe);
}
catch (UriFormatException mue)
{
throw new SmbException(Url.ToString(), mue);
}
}
else
{
long off;
try
{
Open(ORdonly, 0, AttrNormal, 0);
try
{
dest.Open(OCreat | OWronly | OTrunc, SmbConstants.FileWriteData |
SmbConstants.FileWriteAttributes, _attributes, 0);
}
catch (SmbAuthException sae)
{
if ((dest._attributes & AttrReadonly) != 0)
{
dest.SetPathInformation(dest._attributes & ~AttrReadonly, 0L, 0L);
dest.Open(OCreat | OWronly | OTrunc, SmbConstants.FileWriteData |
SmbConstants.FileWriteAttributes, _attributes, 0);
}
else
{
throw;
}
}
i = 0;
off = 0L;
for (; ; )
{
req.SetParam(Fid, off, bsize);
resp.SetParam(b[i], 0);
Send(req, resp);
lock (w)
{
if (w.E != null)
{
throw w.E;
}
while (!w.Ready)
{
try
{
Runtime.Wait(w);
}
catch (Exception ie)
{
throw new SmbException(dest.Url.ToString(), ie);
}
}
if (w.E != null)
{
throw w.E;
}
if (resp.DataLength <= 0)
{
break;
}
w.Write(b[i], resp.DataLength, dest, off);
}
i = i == 1 ? 0 : 1;
off += resp.DataLength;
}
dest.Send(new Trans2SetFileInformation(dest.Fid, _attributes, _createTime, _lastModified
), new Trans2SetFileInformationResponse());
dest.Close(0L);
}
catch (SmbException se)
{
if (IgnoreCopyToException == false)
{
throw new SmbException("Failed to copy file from [" + ToString() + "] to ["
+ dest + "]", se);
}
if (Log.Level > 1)
{
Runtime.PrintStackTrace(se, Log);
}
}
finally
{
Close();
}
}
}