예제 #1
0
 /// <summary>
 /// send upd data to server
 /// </summary>
 /// <param name="bytes"></param>
 public void SendUdpData(byte[] bytes)
 {
     if (!BytesToSend.TryAdd(bytes))
     {
         AutoLogger.LogText("cannot add udp block");
     }
 }
            /// <summary>
            /// Called to send a specific length of bytes to a server identified by serverKey.  The transfer
            /// is a blocking call and returns on success or raises an exception.  If Abort() is called durring
            /// the transfer, or if a ProgressChanged event handler raises the OperationCanceledException, the
            /// transfer is silently terminated and the method will return false.
            /// </summary>
            /// <param name="location">A string of up to 1024 bytes in length</param>
            /// <param name="length">The length in bytes to send from the stream</param>
            /// <param name="rawInput">The stream to read the data from</param>
            /// <returns>True if the file was successfully received by the server</returns>
            public bool Upload(string location, long length, Stream rawInput)
            {
                Guid transferId = Guid.NewGuid();
                int  maxMessageLength;
                // STEP 1: Send a NonceRequest, Create
                Salt sessionKey = BeginUpload(transferId, location, length, out maxMessageLength);

                // STEP 2: Send the data
                Hash fullHash;

                bool[] failed = new bool[1];

                using (HashStream input = new HashStream(new SHA256Managed(), rawInput))
                    using (WorkQueue queue = new WorkQueue(LimitThreads))
                    {
                        queue.OnError += (o, e) => { failed[0] = true; };
                        long pos = 0;
                        while (pos < length && !failed[0] && !_abort.WaitOne(0, false))
                        {
                            int    len    = (int)Math.Min(length - pos, maxMessageLength);
                            byte[] buffer = new byte[len];
                            IOStream.Read(input, buffer, len);
                            BytesToSend task = new BytesToSend(this, LimitThreads, transferId, sessionKey, location, pos, buffer);
                            queue.Enqueue(task.Send);
                            OnProgressChanged(location, pos, length);
                            pos += len;
                        }

                        queue.Complete(true, failed[0] ? 5000 : 300000);
                        fullHash = input.FinalizeHash();//hash of all data transferred
                    }
                if (_abort.WaitOne(0, false))
                {
                    return(false);
                }
                Check.Assert <InvalidDataException>(failed[0] == false);

                // STEP 4: Complete the transfer
                CompleteUpload(transferId, sessionKey, location, fullHash);
                OnProgressChanged(location, length, length);
                return(true);
            }
            /// <summary>
            /// Called to send a specific length of bytes to a server identified by serverKey.  The transfer
            /// is a blocking call and returns on success or raises an exception.  If Abort() is called durring
            /// the transfer, or if a ProgressChanged event handler raises the OperationCanceledException, the
            /// transfer is silently terminated and the method will return false.
            /// </summary>
            /// <param name="location">A string of up to 1024 bytes in length</param>
            /// <param name="length">The length in bytes to send from the stream</param>
            /// <param name="rawInput">The stream to read the data from</param>
            /// <returns>True if the file was successfully received by the server</returns>
            public bool Upload(string location, long length, Stream rawInput)
            {
                Guid transferId = Guid.NewGuid();
                int maxMessageLength;
                // STEP 1: Send a NonceRequest, Create
                Salt sessionKey = BeginUpload(transferId, location, length, out maxMessageLength);

                // STEP 2: Send the data
                Hash fullHash;
                bool[] failed = new bool[1];

                using (HashStream input = new HashStream(new SHA256Managed(), rawInput))
                using (WorkQueue queue = new WorkQueue(LimitThreads))
                {
                    queue.OnError += (o, e) => { failed[0] = true; };
                    long pos = 0;
                    while (pos < length && !failed[0] && !_abort.WaitOne(0, false))
                    {
                        int len = (int)Math.Min(length - pos, maxMessageLength);
                        byte[] buffer = new byte[len];
                        IOStream.Read(input, buffer, len);
                        BytesToSend task = new BytesToSend(this, LimitThreads, transferId, sessionKey, location, pos, buffer);
                        queue.Enqueue(task.Send);
                        OnProgressChanged(location, pos, length);
                        pos += len;
                    }

                    queue.Complete(true, failed[0] ? 5000 : 300000);
                    fullHash = input.FinalizeHash();//hash of all data transferred
                }
                if (_abort.WaitOne(0, false))
                    return false;
                Check.Assert<InvalidDataException>(failed[0] == false);

                // STEP 4: Complete the transfer
                CompleteUpload(transferId, sessionKey, location, fullHash);
                OnProgressChanged(location, length, length);
                return true;
            }