Example #1
0
        /// <summary>
        /// Envía el mensaje al usuario remoto de petición de archivo y marca el estado del manejador como abierto
        /// </summary>
        public override void open()
        {
            createFile();
            FileRequestMessage fileRequestMessage = new FileRequestMessage(RemoteNetUser, FileInformation.Id, Id);

            sendMessage(fileRequestMessage);
        }
Example #2
0
        protected IMessage ProcessData(Connection connection, BinaryReader reader)
        {
            IMessage result         = new NullMessage();
            IMessage currentMessage = MessageFactory.FromStream(reader);

            switch (currentMessage.MessageId)
            {
            case MessageIdentifier.FileChanged:
            {
                if (ClientHasBeenValidated == true)
                {
                    FileChangedMessage message   = currentMessage as FileChangedMessage;
                    string             filePath  = Path.Join(connection.LocalSyncPath, message.FileData.Path);
                    FileInfo           localFile = new FileInfo(filePath);

                    //we only need the file data when a file on the client was changed and that file is newer than our local copy
                    if (message.FileData.OperationType == WatcherChangeTypes.Changed || message.FileData.OperationType == WatcherChangeTypes.Created)
                    {
                        if (localFile.Exists == false || localFile.LastWriteTimeUtc < message.FileData.LastWriteTimeUtc)
                        {
                            FileMetaData = message.FileData;
                            result       = new FileRequestMessage(message.FileData);
                        }
                        else
                        {
                            result = new NullMessage();
                        }
                    }
                    else
                    {
                        if (message.FileData.OperationType == WatcherChangeTypes.Renamed)
                        {
                            string oldFilePath = Path.Join(connection.LocalSyncPath, message.FileData.OldPath);
                            if (File.Exists(oldFilePath))
                            {
                                File.Move(oldFilePath, filePath);
                            }
                        }
                        if (message.FileData.OperationType == WatcherChangeTypes.Deleted)
                        {
                            if (File.Exists(filePath))
                            {
                                File.Delete(filePath);
                            }
                        }
                        result = new NullMessage();
                    }
                }
                break;
            }

            case MessageIdentifier.FileData:
            {
                if (ClientHasBeenValidated == true && FileMetaData != null)
                {
                    FileDataMessage message = currentMessage as FileDataMessage;
                    message.FilePath = Path.Join(connection.LocalSyncPath, FileMetaData.Path);
                    ReceiveBegin(this, new ServerEventArgs()
                        {
                            FileData = FileMetaData, FullLocalPath = message.FilePath
                        });

                    try
                    {
                        message.FromBinaryStream(reader);

                        //change last write to match client file
                        File.SetLastWriteTimeUtc(message.FilePath, FileMetaData.LastWriteTimeUtc);
                        File.SetLastAccessTimeUtc(message.FilePath, FileMetaData.LastAccessTimeUtc);
                        File.SetCreationTimeUtc(message.FilePath, FileMetaData.CreateTimeUtc);
                        ReceiveEnd(this, new ServerEventArgs()
                            {
                                FileData = FileMetaData, FullLocalPath = message.FilePath, Success = true
                            });
                    }
                    catch (Exception ex)
                    {
                        Logger.Log(LogPriority.High, "Server #{0} error writing file: {1}", ServerId, message.FilePath);
                        ReceiveEnd(this, new ServerEventArgs()
                            {
                                FileData = FileMetaData, FullLocalPath = message.FilePath, Success = false
                            });
                    }
                }
                break;
            }


            case MessageIdentifier.Verification:
            {
                VerificationMessage message = currentMessage as VerificationMessage;
                if (message != null)
                {
                    if (message.Key == connection.LocalAccessKey)
                    {
                        result = new VerificationMessage(connection.RemoteAccessKey, NetworkResponse.Valid);

                        //store validation result for later use
                        ClientHasBeenValidated = true;
                    }
                }
                break;
            }
            }


            return(result);
        }
Example #3
0
        /// <summary>
        /// Se gatilla cuando no es posible entregar un mensaje
        /// </summary>
        /// <param name="message">El mensaje no entregado</param>
        public void errorMessage(Message message)
        {
            switch (message.Type)
            {
            case SubProtocol.FileTransfer.Types.FILEREQUESTMESSAGE:
            {
                FileRequestMessage fileRequestMessage = (FileRequestMessage)message;
                lock (fileMessageHandlerLock)
                {
                    if (activeDownloads.Contains(fileRequestMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[fileRequestMessage.FileHandlerId];
                        controlFileHandler.downloadFileFailed(fileMessageHandler.Id.ToString());
                        fileMessageHandler.close();
                        activeDownloads.Remove(fileMessageHandler.Id);
                    }
                }
                break;
            }

            case SubProtocol.FileTransfer.Types.FILEERRORMESSAGES:
            {
                break;
            }

            case SubProtocol.FileTransfer.Types.FILEPARTMESSAGE:
            {
                FilePartMessage filePartMessage = (FilePartMessage)message;
                lock (fileMessageHandlerLock)
                {
                    if (activeUploads.Contains(filePartMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[filePartMessage.FileHandlerId];
                        controlFileHandler.uploadFileFailed(fileMessageHandler.Id.ToString());
                        fileMessageHandler.close();
                        activeUploads.Remove(fileMessageHandler.Id);
                    }
                }
                break;
            }

            case SubProtocol.FileTransfer.Types.FILEWAITMESSAGE:
            {
                FileWaitMessage fileWaitMessage = (FileWaitMessage)message;
                lock (fileMessageHandlerLock)
                {
                    if (activeDownloads.Contains(fileWaitMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[fileWaitMessage.FileHandlerId];
                        controlFileHandler.downloadFileFailed(fileMessageHandler.Id.ToString());
                        fileMessageHandler.close();
                        activeDownloads.Remove(fileMessageHandler.Id);
                    }
                    else if (activeUploads.Contains(fileWaitMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[fileWaitMessage.FileHandlerId];
                        controlFileHandler.uploadFileFailed(fileMessageHandler.Id.ToString());
                        fileMessageHandler.close();
                        activeUploads.Remove(fileMessageHandler.Id);
                    }
                }
                break;
            }

            case SubProtocol.FileTransfer.Types.FILECOMPLETEMESSAGE:
            {
                break;
            }

            case SubProtocol.FileTransfer.Types.FILELISTREQUESTMESSAGE:
            {
                break;
            }

            case SubProtocol.FileTransfer.Types.FILELISTMESSAGE:
            {
                break;
            }
            }
        }
        //Negotiator Id only required (currently) in ReadyToReceive, so Protocol -> Factory -> Service knows where to send received chunks to
        private void InternalSendFileRequestResponse(FileDescriptor file, FileRequestMode response, string negotiatorId, long chunkIndex)
        {
            FileRequestHeader header = new FileRequestHeader();

            header.Response = response;
            header.Id = negotiatorId;
            header.ChunkIndex = chunkIndex;

            using (FileRequestMessage message = new FileRequestMessage(header))
            {
                AddValueToMessage(message, file);

                SendMessage(message);
            }
        }
Example #5
0
        /// <summary>
        /// Se gatilla cuando se recibe un mensaje
        /// </summary>
        /// <param name="message">El mensaje recibido</param>
        public void proccessMessage(Message message)
        {
            switch (message.Type)
            {
            case SubProtocol.FileTransfer.Types.FILEREQUESTMESSAGE:
            {
                FileRequestMessage fileRequestMessage = (FileRequestMessage)message;
                FileInformation    fileInformation    = fileData.FileList.getFileInformation(fileRequestMessage.FileId);
                if (fileInformation != null)
                {
                    FileMessageSender fileMessageSender = new FileMessageSender(fileRequestMessage.SenderNetUser, fileRequestMessage.FileHandlerId, sendMessageDelegate, fileInformation, fileData);
                    lock (fileMessageHandlerLock)
                    {
                        if (!activeUploads.Contains(fileMessageSender.Id))
                        {
                            if (fileMessageUploadQueue.put(fileMessageSender))
                            {
                                controlFileHandler.uploadFileQueued(fileRequestMessage.SenderNetUser, fileMessageSender.Id.ToString(), fileInformation.Name);
                            }
                        }
                    }
                }
                else
                {
                    FileErrorMessage fileErrorMessage = new FileErrorMessage(fileRequestMessage.SenderNetUser, fileRequestMessage.FileHandlerId);
                    sendMessageEvent(fileErrorMessage);
                }
                break;
            }

            case SubProtocol.FileTransfer.Types.FILEERRORMESSAGES:
            {
                FileErrorMessage fileErrorMessage = (FileErrorMessage)message;
                lock (fileMessageHandlerLock)
                {
                    if (activeUploads.Contains(fileErrorMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[fileErrorMessage.FileHandlerId];
                        controlFileHandler.uploadFileFailed(fileMessageHandler.Id.ToString());
                        fileMessageHandler.close();
                        activeUploads.Remove(fileMessageHandler.Id);
                    }
                    else if (activeDownloads.Contains(fileErrorMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[fileErrorMessage.FileHandlerId];
                        controlFileHandler.downloadFileFailed(fileMessageHandler.Id.ToString());
                        fileMessageHandler.close();
                        activeDownloads.Remove(fileMessageHandler.Id);
                    }
                }
                break;
            }

            case SubProtocol.FileTransfer.Types.FILEPARTMESSAGE:
            {
                FilePartMessage filePartMessage = (FilePartMessage)message;
                lock (fileMessageHandlerLock)
                {
                    if (activeDownloads.Contains(filePartMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[filePartMessage.FileHandlerId];
                        fileMessageHandler.attendMessage(filePartMessage);
                        fileMessageHandler.waitUp(fileData.FileRiseUp);
                    }
                    else
                    {
                        FileErrorMessage fileErrorMessage = new FileErrorMessage(filePartMessage.SenderNetUser, filePartMessage.FileHandlerId);
                        sendMessageEvent(fileErrorMessage);
                    }
                }
                break;
            }

            case SubProtocol.FileTransfer.Types.FILEWAITMESSAGE:
            {
                FileWaitMessage fileWaitMessage = (FileWaitMessage)message;
                lock (fileMessageHandlerLock)
                {
                    if (activeDownloads.Contains(fileWaitMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[fileWaitMessage.FileHandlerId];
                        fileMessageHandler.waitUp(fileData.FileRiseUp);
                    }
                    else if (activeUploads.Contains(fileWaitMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[fileWaitMessage.FileHandlerId];
                        fileMessageHandler.waitUp(fileData.FileRiseUp);
                    }
                    else
                    {
                        if (!fileMessageDownloadQueue.contains(fileWaitMessage.FileHandlerId) && !fileMessageUploadQueue.contains(fileWaitMessage.FileHandlerId))
                        {
                            FileErrorMessage fileErrorMessage = new FileErrorMessage(fileWaitMessage.SenderNetUser, fileWaitMessage.FileHandlerId);
                            sendMessageEvent(fileErrorMessage);
                        }
                    }
                }
                break;
            }

            case SubProtocol.FileTransfer.Types.FILECOMPLETEMESSAGE:
            {
                FileCompleteMessage fileCompleteMessage = (FileCompleteMessage)message;
                lock (fileMessageHandlerLock)
                {
                    if (activeUploads.Contains(fileCompleteMessage.FileHandlerId))
                    {
                        FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[fileCompleteMessage.FileHandlerId];
                        fileMessageHandler.State = FileMessageHandlerState.COMPLETED;
                    }
                }
                break;
            }

            case SubProtocol.FileTransfer.Types.FILELISTREQUESTMESSAGE:
            {
                FileListRequestMessage fileListRequestMessage = (FileListRequestMessage)message;
                FileListMessage        fileListMessage        = new FileListMessage(fileListRequestMessage.SenderNetUser, fileData.FileList);
                sendMessageEvent(fileListMessage);
                break;
            }

            case SubProtocol.FileTransfer.Types.FILELISTMESSAGE:
            {
                FileListMessage fileListMessage = (FileListMessage)message;
                controlFileListHandler.addFileList(fileListMessage.SenderNetUser, fileListMessage.FileList);
                break;
            }
            }
        }
        private void HandleRequestedFileMessage(FileRequestMessage requestMessage)
        {
            FileRequestEventArgs e = new FileRequestEventArgs(requestMessage.RequestedFile);

            if (FileRequestReceived != null)
            {
                FileRequestReceived(this, e);
            }

            ClientProtocol.SendFileRequestResponse(requestMessage.RequestedFile, e.Allow);
        }
        private void HandleFileSend(FileRequestMessage requestMessage)
        {
            if (!requestMessage.RequestedFile.Exists)
            {
                ClientProtocol.SendFileTransferFailure(requestMessage.RequestedFile);
                return;
            }

            long chunkIndex = requestMessage.Header.ChunkIndex;

            using (FileStream file = requestMessage.RequestedFile.OpenForRead())
            {
                FileChunkHeader header = new FileChunkHeader();

                header.ChunkCount = (int)Math.Ceiling((double)file.Length / Settings.FileChunkSize);
                header.ChunkIndex = chunkIndex;
                header.Id = requestMessage.Header.Id;
                header.Hash = requestMessage.RequestedFile.Hash;

                using (FileChunkMessage message = new FileChunkMessage(header))
                {
                    long offset = chunkIndex * Settings.FileChunkSize;
                    int length = (int) (offset + Settings.FileChunkSize > file.Length ? file.Length - offset : Settings.FileChunkSize);

                    byte[] chunk = new byte[length];

                    file.Seek(offset, SeekOrigin.Begin);

                    file.Read(chunk, 0, chunk.Length);

                    try
                    {
                        ClientProtocol.AddDataToMessage(message, chunk);

                        ClientProtocol.SendMessage(message);
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }
            }
        }
        private void HandleFileRequestResponse(FileRequestMessage requestMessage)
        {
            if (FileRequestResponseReceived != null)
            {
                FileRequestResponseReceived(this, new FileRequestResponseEventArgs(requestMessage.RequestedFile, requestMessage.Header.Response));
            }

            if (requestMessage.Header.Response == FileRequestMode.Available)
            {
                PrepareForPendingFile(requestMessage.RequestedFile);
            }
            else
            {
                _requestedFiles.Remove(requestMessage.RequestedFile.Hash);
            }
        }
        internal void SendFileRequest(FileDescriptor file, long requestedChunkIndex)
        {
            using (FileRequestMessage message = new FileRequestMessage())
            {
                message.Header.ChunkIndex = requestedChunkIndex;

                ClientProtocol.AddValueToMessage(message, file);

                ClientProtocol.SendMessage(message);
            }
        }