コード例 #1
0
 /// <summary>
 /// Cierra posibles conexiones a disco que puedan quedar abiertos
 /// </summary>
 public override void close()
 {
     try
     {
         FileHandlerStream.Close();
     }
     catch (ThreadAbortException e)
     {
         throw e;
     }
     catch (Exception)
     {
     }
 }
コード例 #2
0
 /// <summary>
 /// Atiende una solicitud de envío de parte
 /// </summary>
 public void sendPartMessage( )
 {
     try
     {
         long pointer = currentPart * PartSize;
         if (pointer < FileHandlerStream.Length)
         {
             int dataSize;
             if (currentPart == PartsNumber - 1)
             {
                 dataSize = (int)(FileHandlerStream.Length - PartSize * (PartsNumber - 1));
             }
             else
             {
                 dataSize = PartSize;
             }
             byte[] fileData = new byte[dataSize];
             FileHandlerStream.Seek(pointer, SeekOrigin.Begin);
             int n = FileHandlerStream.Read(fileData, 0, fileData.Length);
             while (n < fileData.Length && n != 0)
             {
                 int m = FileHandlerStream.Read(fileData, n, fileData.Length - n);
                 if (m == 0)
                 {
                     break;
                 }
                 else
                 {
                     n += m;
                 }
             }
             sendMessage(new FilePartMessage(RemoteNetUser, Id, currentPart, fileData));
             currentPart++;
             this.State = FileMessageHandlerState.ACTIVE;
         }
     }
     catch (ThreadAbortException e)
     {
         throw e;
     }
     catch (Exception e)
     {
         sendMessage(new FileErrorMessage(RemoteNetUser, Id));
         this.State = FileMessageHandlerState.ERROR;
         this.Error = e.Message;
         close();
     }
 }
コード例 #3
0
        /// <summary>
        /// Atiende un mensaje que contiene una parte del archivo y escribe dicha parte a disco
        /// </summary>
        /// <param name="message">El mensaje con la parte del archivo</param>
        private void receivePartMessage(FilePartMessage message)
        {
            lock (thisLock)
            {
                try
                {
                    long pointer = message.PartId * PartSize;
                    if (pointer < FileInformation.Size && parts[message.PartId].Status == FilePartStatus.NOTRECEIVED)
                    {
                        FileHandlerStream.Seek(pointer, SeekOrigin.Begin);
                        FileHandlerStream.Write(message.FilePart, 0, message.FilePart.Length);
                        parts[message.PartId].Status = FilePartStatus.RECEIVED;
                        partsLoaded++;
                    }

                    bool completed = true;
                    for (long i = 0; i < parts.Length; i++)
                    {
                        if (parts[i].Status == FilePartStatus.NOTRECEIVED)
                        {
                            completed = false;
                            break;
                        }
                    }
                    if (completed)
                    {
                        sendMessage(new FileCompleteMessage(RemoteNetUser, Id));
                        this.State = FileMessageHandlerState.COMPLETED;
                    }
                    else
                    {
                        State = FileMessageHandlerState.ACTIVE;
                    }
                }
                catch (ThreadAbortException e)
                {
                    throw e;
                }
                catch (Exception e)
                {
                    sendMessage(new FileErrorMessage(RemoteNetUser, Id));
                    this.State = FileMessageHandlerState.ERROR;
                    this.Error = e.Message;
                    close();
                }
            }
        }