Ejemplo n.º 1
0
        private void HandleAssincConnection(IAsyncResult result)
        {
            StreamReader reader;
            StreamWriter writer;
            string user, password, mime, uriFile;

            // accepted connection
            var listener = (TcpListener) result.AsyncState;
            var client = listener.EndAcceptTcpClient(result);
            _connectionHandler.Set();

            var clientId = Guid.NewGuid();
            Trace.Write("Accepted connection with ID " + clientId, "Information");

            try {
                reader = new StreamReader(client.GetStream());
                writer = new StreamWriter(client.GetStream()) {AutoFlush = true};
            } catch (Exception) {
                Trace.WriteLine(
                    "An error during initialization of reader and writer of connection: " + clientId +
                    ". Closing comunication.", "Information");
                client.Close();
                return;
            }

            try {
                user = reader.ReadLine();
                password = reader.ReadLine();
                mime = reader.ReadLine();
                uriFile = reader.ReadLine();
            } catch (Exception) {
                Trace.WriteLine(
                    "An error reading user, password, mime and uro file of connection: " + clientId +
                    ". Closing comunication.", "Information");
                client.Close();
                return;
            }

            if (user == null || password == null || mime == null || uriFile == null) {
                Trace.WriteLine(
                    "User or password or mime or uri file are null (connection: " + clientId +
                    "). Closing comunication.", "Information");
                client.Close();
                return;
            }

            //            Trace.WriteLine("user: "******"Information");
            //            Trace.WriteLine("password: "******"Information");
            //            Trace.WriteLine("mime: " + mime, "Information");
            //            Trace.WriteLine("uri file: " + uriFile, "Information");

            var datasource = new ServerDataSource();

            if (!datasource.UserExists(user, password))
            {
                writer.WriteLine("KO");
                client.Close();
                return;
            }

            writer.WriteLine("OK");

            IList<BaseTool> processingTools = null;
            var numberOfTools = 0;
            try {
                processingTools = ToolsManifest.GetAvailableTools(mime);
                numberOfTools = processingTools.Count;
            } catch {
                Trace.WriteLine("Error getting available tools (connection: " + clientId + ")", "Information");
            }

            try {
                //communicating the number of tools
                writer.WriteLine(numberOfTools);
            } catch (Exception) {
                Trace.WriteLine(
                    "Error sending the number of tools to processed file (connection: " + clientId +
                    "). Closing comunication.", "Information");
                client.Close();
                return;
            }

            try {
                for (var i = 0; i < numberOfTools; ++i)
                    writer.WriteLine(processingTools[i].ToString());
            } catch (Exception) {
                Trace.WriteLine(
                    "Error sending the tools to processed file (connection: " + clientId + "). Closing comunication.",
                    "Information");
                client.Close();
                return;
            }

            string operation;
            try {
                operation = reader.ReadLine();
            } catch (Exception) {
                Trace.WriteLine("Error reading the operation (connection: " + clientId + "). Closing comunication.",
                                "Information");
                client.Close();
                return;
            }

            if (operation == null) {
                Trace.WriteLine("Error reading the operation (connection: " + clientId + "). Closing comunication.",
                                "Information");
                client.Close();
                return;
            }

            Trace.WriteLine("operazione da compiere: " + operation, "Information");

            datasource.EnqueueProcessingRequest(new ProcessingMessage(uriFile, mime, operation));
            var returnMessage = datasource.DequeueProcessingCompletion();

            Trace.WriteLine("File uri: " + returnMessage.FileUri, "Information");

            try {
                writer.WriteLine(returnMessage.FileUri);
            } catch (Exception) {
                Trace.WriteLine(
                    "Error sending the uri of processed file (connection: " + clientId + "). Closing comunication.",
                    "Information");
                client.Close();
                return;
            }

            client.Close();
        }