예제 #1
0
        public void StartTransfer(TransferQueue queue)
        {
            PacketWriter pw = new PacketWriter();

            pw.Write((byte)Headers.Start);
            pw.Write(queue.ID);
            Send(pw.GetBytes());
        }
예제 #2
0
 void transferClient_Queued(object sender, TransferQueue queue)
 {
     Recebendo?.Invoke(sender, queue);
     if (queue.Type == QueueType.Download)
     {
         transferClient.StartTransfer(queue);
     }
 }
예제 #3
0
        public void PauseTransfer(TransferQueue queue)
        {
            queue.Pause();

            PacketWriter pw = new PacketWriter();

            pw.Write((byte)Headers.Pause);
            pw.Write(queue.ID);
            Send(pw.GetBytes());
        }
예제 #4
0
        void transferClient_Queued(object sender, TransferQueue queue)
        {
            Recebendo?.Invoke(sender, queue);
            TransferClient transferClient = (TransferClient)sender;

            if (queue.Type == QueueType.Download)
            {
                transferClients[transferClient.EndPoint].StartTransfer(queue);
            }
        }
예제 #5
0
        public void StopTransfer(TransferQueue queue)
        {
            if (queue.Type == QueueType.Upload)
            {
                queue.Stop();
            }

            PacketWriter pw = new PacketWriter();

            pw.Write((byte)Headers.Stop);
            pw.Write(queue.ID);
            Send(pw.GetBytes());
            queue.Close();
        }
예제 #6
0
 public static TransferQueue CreateDownloadQueue(TransferClient client, int id, string saveName, long length)
 {
     try
     {
         var queue = new TransferQueue();
         queue.Filename = Path.GetFileName(saveName);
         if (saveName.Contains(@"\"))
         {
             String[] pastas = saveName.Split('\\');
             for (int i = 0; i < pastas.Length - 1; i++)
             {
                 String pastaAux = pastas[i];
                 if (i > 0)
                 {
                     pastaAux = "";
                     for (int z = 0; z <= i; z++)
                     {
                         if (z > 0)
                         {
                             pastaAux += @"\";
                         }
                         pastaAux += pastas[z];
                     }
                 }
                 if (!Directory.Exists(pastaAux))
                 {
                     Directory.CreateDirectory(pastaAux);
                 }
             }
         }
         queue.Client = client;
         queue.Type   = QueueType.Download;
         queue.FS     = new FileStream(saveName, FileMode.Create);
         queue.FS.SetLength(length);
         queue.Length = length;
         queue.ID     = id;
         queue.MS     = new MemoryStream();
         queue.MS.SetLength(length);
         return(queue);
     }
     catch
     {
         return(null);
     }
 }
예제 #7
0
        public void QueueTransfer(string fileName, string pasta = null)
        {
            try
            {
                TransferQueue queue = TransferQueue.CreateUploadQueue(this, fileName, pasta);
                _transfers.Add(queue.ID, queue);
                PacketWriter pw = new PacketWriter();
                pw.Write((byte)Headers.Queue);
                pw.Write(queue.ID);
                pw.Write(queue.Filename);
                pw.Write(queue.Length);
                Send(pw.GetBytes());

                //Call queued
                if (Queued != null)
                {
                    Queued(this, queue);
                }
            }
            catch (Exception ex) { throw ex; }
        }
예제 #8
0
 public static TransferQueue CreateUploadQueue(TransferClient client, string fileName, string pasta = null)
 {
     try
     {
         var    queue     = new TransferQueue();
         String nomeFinal = (pasta == null) ? "" : pasta + @"\";
         nomeFinal                += Path.GetFileName(fileName);
         queue.Filename            = nomeFinal;
         queue.Client              = client;
         queue.Type                = QueueType.Upload;
         queue.FS                  = new FileStream(fileName, FileMode.Open, FileAccess.Read);
         queue.Thread              = new Thread(new ParameterizedThreadStart(transferProc));
         queue.Thread.IsBackground = true;
         queue.ID                  = ManterRandom.proximo();
         queue.Length              = queue.FS.Length;
         return(queue);
     }
     catch (Exception e)
     {
         throw e;
     }
 }
예제 #9
0
        private static void transferProc(object o)
        {
            TransferQueue queue = (TransferQueue)o;

            while (queue.Running && queue.Index < queue.Length)
            {
                queue.pauseEvent.WaitOne();
                if (!queue.Running)
                {
                    break;
                }
                lock (file_buffer)
                {
                    queue.FS.Position = queue.Index;
                    int          read = queue.FS.Read(file_buffer, 0, file_buffer.Length);
                    PacketWriter pw   = new PacketWriter();

                    pw.Write((byte)Headers.Chunk);
                    pw.Write(queue.ID);
                    pw.Write(queue.Index);
                    pw.Write(read);
                    pw.Write(file_buffer, 0, read);
                    queue.Transferred += read;
                    queue.Index       += read;
                    queue.Client.Send(pw.GetBytes());
                    queue.Progress = (int)((queue.Transferred * 100) / queue.Length);
                    if (queue.LastProgress < queue.Progress)
                    {
                        queue.LastProgress = queue.Progress;
                        queue.Client.callProgressChanged(queue);
                    }
                    Thread.Sleep(1);
                }
            }
            queue.Close();
        }
예제 #10
0
        private void process()
        {
            PacketReader pr = new PacketReader(_buffer);

            Headers header = (Headers)pr.ReadByte();

            switch (header)
            {
            case Headers.Queue:
            {
                int           id       = pr.ReadInt32();
                string        fileName = pr.ReadString();
                long          length   = pr.ReadInt64();
                TransferQueue queue    = TransferQueue.CreateDownloadQueue(this, id, Path.Combine(OutputFolder, fileName), length);
                _transfers.Add(id, queue);
                if (Queued != null)
                {
                    Queued(this, queue);
                }
            }
            break;

            case Headers.Start:
            {
                int id = pr.ReadInt32();
                if (_transfers.ContainsKey(id))
                {
                    _transfers[id].Start();
                }
            }
            break;

            case Headers.Stop:
            {
                int id = pr.ReadInt32();

                if (_transfers.ContainsKey(id))
                {
                    TransferQueue queue = _transfers[id];
                    queue.Stop();
                    queue.Close();
                    if (Stopped != null)
                    {
                        Stopped(this, queue);
                    }
                    _transfers.Remove(id);
                }
            }
            break;

            case Headers.Pause:
            {
                int id = pr.ReadInt32();
                if (_transfers.ContainsKey(id))
                {
                    _transfers[id].Pause();
                }
            }
            break;

            case Headers.Chunk:
            {
                int           id     = pr.ReadInt32();
                long          index  = pr.ReadInt64();
                int           size   = pr.ReadInt32();
                byte[]        buffer = pr.ReadBytes(size);
                TransferQueue queue  = _transfers[id];

                queue.Write(buffer, index);
                queue.Progress = (int)((queue.Transferred * 100) / queue.Length);
                if (queue.LastProgress < queue.Progress)
                {
                    queue.LastProgress = queue.Progress;

                    if (ProgressChanged != null)
                    {
                        ProgressChanged(this, queue);
                    }
                    if (queue.Progress == 100)
                    {
                        queue.Close();

                        if (Complete != null)
                        {
                            Complete(this, queue);
                        }
                    }
                }
            }
            break;
            }
            pr.Dispose();
        }
예제 #11
0
 void transferClient_Complete(object sender, TransferQueue queue)
 {
     Completo?.Invoke(sender, queue);
 }
예제 #12
0
 void transferClient_ProgressChanged(object sender, TransferQueue queue)
 {
     ProgressoAlterado?.Invoke(sender, queue);
 }
예제 #13
0
 void transferClient_Stopped(object sender, TransferQueue queue)
 {
     Interrompido?.Invoke(sender, queue);
 }