SharpCifs.Smb.SmbFile.CopyTo0 C# (CSharp) Method

CopyTo0() private method

private CopyTo0 ( SmbFile dest, byte b, int bsize, WriterThread w, SmbComReadAndX req, SmbComReadAndXResponse resp ) : void
dest SmbFile
b byte
bsize int
w WriterThread
req SmbComReadAndX
resp SmbComReadAndXResponse
return void
        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();
                }
            }
        }