Пример #1
0
        internal async Task <WsItem> CopyItem(WsItem sourceItem, WsFolder targetFolder, CancellationToken cancellationToken, IProgress <int> progress)
        {
            if (sourceItem == null)
            {
                throw new ArgumentNullException(nameof(sourceItem));
            }
            if (targetFolder == null)
            {
                throw new ArgumentNullException(nameof(targetFolder));
            }
            if (cancellationToken == null)
            {
                throw new ArgumentNullException(nameof(cancellationToken));
            }

            progress?.Report(0);

            if (sourceItem is WsFile sourceFile)
            {
                using (HttpResponseMessage response = await DownloadFile(sourceFile, cancellationToken))
                {
                    long       fileSize       = response.Content.Headers.ContentLength ?? sourceFile.Size;
                    int        bufferSize     = CalculateBuffer(fileSize);
                    WsFilePath targetFilePath = new WsFilePath(targetFolder.PathInfo, sourceItem.PathInfoGeneric.Name);
                    using (TransportStream sourceTrasportStream = new TransportStream(await response.Content.ReadAsStreamAsync(), fileSize, null))
                    {
                        return(await UploadFile(sourceTrasportStream, fileSize, targetFilePath, cancellationToken, progress));
                    }
                }
            }
            else
            {
                throw new NotSupportedException("Copy folder not supported.");
            }
        }
Пример #2
0
        internal async Task DownloadFile(WsFile sourceFile, Stream targetStream, CancellationToken cancellationToken, IProgress <int> progress)
        {
            if (sourceFile == null)
            {
                throw new ArgumentNullException(nameof(sourceFile));
            }
            if (targetStream == null)
            {
                throw new ArgumentNullException(nameof(targetStream));
            }
            if (targetStream.CanWrite == false)
            {
                throw new NotSupportedException("The target stream does not support writing.");
            }
            if (cancellationToken == null)
            {
                throw new ArgumentNullException(nameof(cancellationToken));
            }

            progress?.Report(0);

            using (HttpResponseMessage response = await DownloadFile(sourceFile, cancellationToken))
            {
                long fileSize = response.Content.Headers.ContentLength ?? sourceFile.Size;
                using (TransportStream sourceTrasportStream = new TransportStream(await response.Content.ReadAsStreamAsync(), fileSize, progress))
                {
                    await sourceTrasportStream.CopyToAsync(targetStream, CalculateBuffer(fileSize), cancellationToken);

                    progress?.Report(100);
                }
            }
        }
Пример #3
0
        static SecurityContext AuthenticateClient(TransportClient client)
        {
            TransportStream stream = client.GetStream();

            byte[] clientToken;
            byte[] serverToken;

            // create client context
            SecurityContext clientContext = authModule.CreateSecurityContext(clientCredentials, SecurityContextAttributes.Identify, null, out clientToken);

            while (true)
            {
                if (clientToken != null)
                {
                    // send client token to server
                    SendBuffer(stream, clientToken);
                }

                if (clientContext.State == SecurityContextState.Completed)
                {
                    // authentication completed
                    break;
                }

                // receive server token
                serverToken = ReceiveBuffer(stream);

                // update security context
                authModule.UpdateSecurityContext(clientContext, SecurityContextAttributes.Identify, serverToken, out clientToken);
            }

            return(clientContext);
        }
Пример #4
0
        internal async Task <WsFile> UploadFile(Stream sourceStream, long sourceSize, WsFilePath targetFilePath, bool ensureDeleteIfNeed, CancellationToken cancellationToken, IProgress <int> progress)
        {
            if (sourceStream == null)
            {
                throw new ArgumentNullException(nameof(sourceStream));
            }
            if (sourceStream.CanRead == false)
            {
                throw new NotSupportedException("The source stream does not support reading.");
            }
            if (cancellationToken == null)
            {
                throw new ArgumentNullException(nameof(cancellationToken));
            }
            CheckConnected();
            progress?.Report(0);

            if (ensureDeleteIfNeed)
            {
                WsFile file = await FindFile(targetFilePath);

                if (file != null)
                {
                    await file.Delete();
                }
            }

            MultipartFormDataContent form = new MultipartFormDataContent();

            form.Add(new StringContent(WebUtility.UrlEncode(targetFilePath.Name)), "name");
            form.Add(new StringContent(_loginInfo.LoginToken), "wst");
            form.Add(new StringContent(WebUtility.UrlEncode(targetFilePath.Folder.FullPath)), "folder");
            form.Add(new StringContent(targetFilePath.IsPrivate ? "1" : "0"), "private");
            form.Add(new StringContent("0"), "adult");
            form.Add(new StringContent(sourceSize.ToString()), "total");
            //form.Add(new StringContent(""), "offset");

            TransportStream        sourceTransportStream = new TransportStream(sourceStream, sourceSize, progress);
            TransportStreamContent fileContent           = new TransportStreamContent(sourceTransportStream, targetFilePath.Name, CalculateBuffer(sourceSize));

            form.Add(fileContent);

            UploadResult uploadResult = await _httpClient.PostFormData <UploadResult>(await GetUploadFileUrl(), form, cancellationToken, false, TimeSpan.FromHours(24));

            if (string.IsNullOrWhiteSpace(uploadResult?.Ident))
            {
                throw new IOException($"Server upload error: result={uploadResult.Result}");
            }

            return(_createdFileResolver.Add(targetFilePath.Folder, targetFilePath.Name, uploadResult.Ident, sourceSize));
        }
Пример #5
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public bool CloseConnection()
        {
            bool close;

            try
            {
                TransportStream.Close();
                TcpClient.Close();

                close = true;
            }
            catch (Exception)
            {
                throw;
            }

            return(close);
        }
Пример #6
0
        static void SendBuffer(TransportStream stream, byte[] buffer)
        {
            BinaryWriter writer = new BinaryWriter(stream);

            if ((buffer != null) && (buffer.Length > 0))
            {
                // send buffer size
                writer.Write((Int32)buffer.Length);

                // send buffer data
                writer.Write(buffer);
            }
            else
            {
                // send NULL size
                writer.Write((Int32)0);
            }
        }
Пример #7
0
        static byte[] ReceiveBuffer(TransportStream stream)
        {
            BinaryReader reader = new BinaryReader(stream);

            // receive buffer size
            int size = reader.ReadInt32();

            if (size > 0)
            {
                // receive buffer data
                byte[] buffer = new byte[size];
                reader.Read(buffer, 0, size);
                return(buffer);
            }
            else
            {
                return(null);
            }
        }
Пример #8
0
        public async Task CompleteAsync()
        {
            Output.Writer.Complete();
            Input.Reader.Complete();

            if (_outputTask == null)
            {
                return;
            }

            // Wait for the output task to complete, this ensures that we've copied
            // the application data to the underlying stream
            await _outputTask;

            // Cancel the underlying stream so that the input task yields
            TransportStream.CancelPendingRead();

            // The input task should yield now that we've cancelled it
            await _inputTask;
        }
Пример #9
0
 /// <summary>
 /// Ermittelt einen Kürzel zu dieser Kennung.
 /// </summary>
 /// <returns>Ein Kürzel, zusammengesesetzt aus den einzelnen Fragmenten
 /// der Kennung.</returns>
 public override int GetHashCode()
 {
     // Create
     return(Network.GetHashCode() ^ TransportStream.GetHashCode() ^ Service.GetHashCode());
 }