示例#1
0
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (firstClose)
            {
                this.Visibility = System.Windows.Visibility.Hidden;
                firstClose      = false;

                e.Cancel = true;

                TrueMessage trueMessageToServer = new TrueMessage {
                    Command = Command.Disconnect, Login = login
                };

                byte[]     dataDisconnectRequest;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToServer);
                    dataDisconnectRequest = stream.ToArray();
                }

                IAsyncResult asyncResult = networkStream.BeginWrite(dataDisconnectRequest, 0, dataDisconnectRequest.Length, new AsyncCallback(DisconnectRequest), null);
                asyncResult.AsyncWaitHandle.WaitOne();

                Environment.Exit(0);
            }
        }
示例#2
0
        private void AddButton_Click(object sender, RoutedEventArgs e)
        {
            AddTestWindow addTestWindow = new AddTestWindow();

            addTestWindow.ShowDialog();

            if (addTestWindow.Test == null)
            {
                return;
            }

            Test test = addTestWindow.Test;

            TrueMessage trueMessageToServer = new TrueMessage {
                Command = Command.AddTest, Login = login, Message = test
            };

            byte[]     dataAddTestRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataAddTestRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataAddTestRequest, 0, dataAddTestRequest.Length, new AsyncCallback(AddTestRequest), null);
        }
示例#3
0
        private void DeleteButton_Click(object sender, RoutedEventArgs e)
        {
            int idx = UsersListView.SelectedIndex;

            if (idx == -1)
            {
                return;
            }

            string userLoginToDelete = UserList[idx].Login;

            UserList.Remove(UserList[idx]);
            DeleteButton.IsEnabled = false;

            TrueMessage trueMessageToServer = new TrueMessage {
                Command = Command.DeleteUser, Login = login, Message = userLoginToDelete
            };

            byte[]     dataDeleteUserRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataDeleteUserRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataDeleteUserRequest, 0, dataDeleteUserRequest.Length, new AsyncCallback(DeleteUserRequest), null);
        }
示例#4
0
        private void ConnectAnswer(IAsyncResult ar)
        {
            networkStream.EndRead(ar);

            byte[] dataConnectAnswer = (byte[])ar.AsyncState;

            IFormatter  formatter             = new BinaryFormatter();
            TrueMessage trueMessageFromServer = new TrueMessage();

            using (MemoryStream memoryStream = new MemoryStream(dataConnectAnswer))
            {
                trueMessageFromServer = (TrueMessage)formatter.Deserialize(memoryStream);
            }

            if (trueMessageFromServer.Command == Command.Approve)
            {
                Array array = (Array)trueMessageFromServer.Message;
                UserList = new ObservableCollection <UserLW>((IEnumerable <UserLW>)array);

                this.Dispatcher.Invoke(() =>
                {
                    UsersListView.ItemsSource = UserList;
                });
            }
            else if (trueMessageFromServer.Command == Command.Reject)
            {
            }
            else
            {
                MessageBox.Show("Received message from server is incorrect.", "Error");
            }
        }
示例#5
0
        private void AddButton_Click(object sender, RoutedEventArgs e)
        {
            UserAddWindow userAddWindow = new UserAddWindow();

            Application.Current.Dispatcher.Invoke((Action) delegate
            {
                userAddWindow.ShowDialog();

                if (userAddWindow.UserLW != null)
                {
                    UserList.Add(userAddWindow.UserLW);
                }

                lastAddedUser = userAddWindow.UserLW;
            });

            TrueMessage trueMessageToServer = new TrueMessage {
                Command = Command.AddUser, Login = login, Message = userAddWindow.UserLW
            };

            byte[]     dataAddUserRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataAddUserRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataAddUserRequest, 0, dataAddUserRequest.Length, new AsyncCallback(AddUserRequest), null);
        }
示例#6
0
        private void AddUserAnswer(IAsyncResult ar)
        {
            networkStream.EndRead(ar);

            byte[] dataAddUserAnswer = (byte[])ar.AsyncState;

            IFormatter  formatter             = new BinaryFormatter();
            TrueMessage trueMessageFromServer = new TrueMessage();

            using (MemoryStream memoryStream = new MemoryStream(dataAddUserAnswer))
            {
                trueMessageFromServer = (TrueMessage)formatter.Deserialize(memoryStream);
            }

            if (trueMessageFromServer.Command == Command.Approve)
            {
                MessageBox.Show("User successfully added");
            }
            else if (trueMessageFromServer.Command == Command.Reject)
            {
                Application.Current.Dispatcher.Invoke((Action) delegate
                {
                    UserList.Remove(lastAddedUser);
                });
                MessageBox.Show($"User cannot be added: {trueMessageFromServer.Message}");
            }
            else
            {
                MessageBox.Show("Received message from server is incorrect.", "Error");
            }
        }
示例#7
0
        private void ConnectFunction(IAsyncResult ar)
        {
            client.EndConnect(ar);
            networkStream = client.GetStream();

            string login    = null;
            string password = null;

            this.Dispatcher.Invoke(() =>
            {
                login    = UsernameTextBox.Text;
                password = PasswordTextBox.Password;
            });

            TrueMessage trueMessageToServer = new TrueMessage {
                Command = Command.LogIn, Login = login, Message = password
            };

            byte[]     dataLogInRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataLogInRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataLogInRequest, 0, dataLogInRequest.Length, new AsyncCallback(LogInRequest), null);
        }
示例#8
0
        private void SendMarkAnswer(IAsyncResult ar)
        {
            networkStream.EndRead(ar);

            byte[] dataSendMarkAnswer = (byte[])ar.AsyncState;

            IFormatter  formatter             = new BinaryFormatter();
            TrueMessage trueMessageFromServer = new TrueMessage();

            using (MemoryStream memoryStream = new MemoryStream(dataSendMarkAnswer))
            {
                trueMessageFromServer = (TrueMessage)formatter.Deserialize(memoryStream);
            }

            if (trueMessageFromServer.Command == Command.Approve)
            {
                MessageBox.Show("Test ended");
            }
            else if (trueMessageFromServer.Command == Command.Reject)
            {
            }
            else
            {
                MessageBox.Show("Received message from server is incorrect.", "Error");
            }
        }
示例#9
0
        private void DeleteTestAnswer(IAsyncResult ar)
        {
            networkStream.EndRead(ar);

            byte[] dataDeleteTestAnswer = (byte[])ar.AsyncState;

            IFormatter  formatter             = new BinaryFormatter();
            TrueMessage trueMessageFromServer = new TrueMessage();

            using (MemoryStream memoryStream = new MemoryStream(dataDeleteTestAnswer))
            {
                trueMessageFromServer = (TrueMessage)formatter.Deserialize(memoryStream);
            }

            if (trueMessageFromServer.Command == Command.Approve)
            {
                this.Dispatcher.Invoke(() =>
                {
                    TestNames.Remove((string)trueMessageFromServer.Message);
                });

                MessageBox.Show("Test successfully deleted");
            }
            else if (trueMessageFromServer.Command == Command.Reject)
            {
                MessageBox.Show("Test was not deleted");
            }
            else
            {
                MessageBox.Show("Received message from server is incorrect.", "Error");
            }
        }
示例#10
0
        private void DeleteButton_Click(object sender, RoutedEventArgs e)
        {
            int idx = TestListView.SelectedIndex;

            if (idx == -1)
            {
                return;
            }

            string testToDelete = TestNames[idx];

            TrueMessage trueMessageToServer = new TrueMessage {
                Command = Command.DeleteTest, Login = login, Message = testToDelete
            };

            byte[]     dataDeleteTestRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataDeleteTestRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataDeleteTestRequest, 0, dataDeleteTestRequest.Length, new AsyncCallback(DeleteTestRequest), null);
        }
示例#11
0
        private void EndTest()
        {
            QuestionNumberTextBlock.Visibility = Visibility.Hidden;
            QuestionFrame.Visibility           = Visibility.Hidden;

            double baseScore     = 0;
            double modifierSum   = 0;
            double totalScore    = 0;
            int    totalAnswered = 0;

            foreach (Question question in Test.Questions)
            {
                question.IsAnsweredCorrectly = true;
                foreach (Answer answer in question.Answers)
                {
                    if (answer.IsChecked != answer.IsRight)
                    {
                        question.IsAnsweredCorrectly = false;
                        break;
                    }
                }
                modifierSum += question.ScoreModifier;
            }

            baseScore = 100 / modifierSum;

            foreach (Question question in Test.Questions)
            {
                if (question.IsAnsweredCorrectly)
                {
                    totalScore += baseScore * question.ScoreModifier;
                    totalAnswered++;
                }
            }

            totalScore = Math.Round(totalScore, 0, MidpointRounding.AwayFromZero);

            ScoreTextBlock.Text             = $"{totalScore}";
            QuestionsAnsweredTextBlock.Text = $"{totalAnswered}";

            TestEndedGrid.Visibility = Visibility.Visible;

            KeyValuePair <string, int> markPair = new KeyValuePair <string, int>(Test.Name, (int)totalScore);
            TrueMessage trueMessageToServer     = new TrueMessage {
                Command = Command.SendMark, Login = login, Message = markPair
            };

            byte[]     dataSendMarkRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataSendMarkRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataSendMarkRequest, 0, dataSendMarkRequest.Length, new AsyncCallback(SendMarkRequest), null);
        }
示例#12
0
        private void StudentConnect(TcpClient tcpClient, TrueMessage trueMessage)
        {
            string     login    = trueMessage.Login;
            IPEndPoint clientEP = (IPEndPoint)tcpClient.Client.RemoteEndPoint;

            clients.Add(login, clientEP);

            Console.WriteLine($"Student {login} connected");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                TrueMessage trueMessageToClient = new TrueMessage();

                if (currentTest == null)
                {
                    trueMessageToClient.Command = Command.Reject;
                }
                else
                {
                    trueMessageToClient.Command = Command.Approve;
                    KeyValuePair <TestDLL.Test, string> testPair = new KeyValuePair <TestDLL.Test, string>(currentTest, testTime);
                    trueMessageToClient.Message = testPair;
                }

                byte[]     dataStudentConnectAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataStudentConnectAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataStudentConnectAnswer, 0, dataStudentConnectAnswer.Length, new AsyncCallback(StudentConnectAnswer), tcpClient);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#13
0
        private void DeleteUser(TcpClient tcpClient, TrueMessage trueMessage)
        {
            Console.WriteLine("DeleteUser");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                string userLoginToDelete = (string)trueMessage.Message;

                SqlCommand sqlCommand = new SqlCommand("Proc_DeleteUser", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Login", userLoginToDelete);
                int count = sqlCommand.ExecuteNonQuery();

                TrueMessage trueMessageToClient = new TrueMessage();

                if (count == 0)
                {
                    trueMessageToClient.Command = Command.Reject;
                }
                else
                {
                    trueMessageToClient.Command = Command.Approve;
                }

                byte[]     dataDeleteUserAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataDeleteUserAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataDeleteUserAnswer, 0, dataDeleteUserAnswer.Length, new AsyncCallback(DeleteUserAnswer), tcpClient);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#14
0
        private void LoadCurrentTestAnswer(IAsyncResult ar)
        {
            networkStream.EndRead(ar);

            byte[] dataLoadCurrentTestAnswer = (byte[])ar.AsyncState;

            IFormatter  formatter             = new BinaryFormatter();
            TrueMessage trueMessageFromServer = new TrueMessage();

            using (MemoryStream memoryStream = new MemoryStream(dataLoadCurrentTestAnswer))
            {
                trueMessageFromServer = (TrueMessage)formatter.Deserialize(memoryStream);
            }

            if (trueMessageFromServer.Command == Command.Approve)
            {
                if (trueMessageFromServer.Message == null)
                {
                    MessageBox.Show("Message was null");
                    return;
                }
                KeyValuePair <Test, string> testPair = (KeyValuePair <Test, string>)trueMessageFromServer.Message;
                if (testPair.Key != null)
                {
                    this.Dispatcher.Invoke(() =>
                    {
                        RetryLoadButton.Content    = "Loaded";
                        RetryLoadButton.IsEnabled  = false;
                        RetryLoadButton.Foreground = new SolidColorBrush(Colors.Black);

                        TestNameTextBlock.Text       = testPair.Key.Name;
                        TestNameTextBlock.Visibility = Visibility.Visible;
                    });

                    Test     = testPair.Key;
                    testTime = Convert.ToInt32(testPair.Value);
                }
            }
            else if (trueMessageFromServer.Command == Command.Reject)
            {
                MessageBox.Show("There no test to load");
            }
            else
            {
                MessageBox.Show("Received message from server is incorrect.", "Error");
            }
        }
示例#15
0
        private void RetryLoadButton_Click(object sender, RoutedEventArgs e)
        {
            TrueMessage trueMessageToServer = new TrueMessage {
                Command = Command.LoadCurrentTest, Login = login
            };

            byte[]     dataLoadCurrentTestRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataLoadCurrentTestRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataLoadCurrentTestRequest, 0, dataLoadCurrentTestRequest.Length, new AsyncCallback(LoadCurrentTestRequest), null);
        }
示例#16
0
        private void ConnectFunction(IAsyncResult ar)
        {
            client.EndConnect(ar);
            networkStream = client.GetStream();

            TrueMessage trueMessageToServer = new TrueMessage {
                Command = Command.StudentConnect, Login = login
            };

            byte[]     dataConnectRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataConnectRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataConnectRequest, 0, dataConnectRequest.Length, new AsyncCallback(ConnectRequest), null);
        }
示例#17
0
        private void UpdateMarksButton_Click(object sender, RoutedEventArgs e)
        {
            int    idx          = TestListView.SelectedIndex;
            string selectedTest = TestNames[idx];

            TrueMessage trueMessageToServer = new TrueMessage {
                Command = Command.UpdateMarks, Login = login, Message = selectedTest
            };

            byte[]     dataUpdateMarksRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataUpdateMarksRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataUpdateMarksRequest, 0, dataUpdateMarksRequest.Length, new AsyncCallback(UpdateMarksRequest), null);
        }
示例#18
0
        private void DeleteTest(TcpClient tcpClient, TrueMessage trueMessage)
        {
            Console.WriteLine($"DeleteTest");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                string testNameToDelete = (string)trueMessage.Message;

                SqlCommand sqlCommand = new SqlCommand("Proc_GetTestPathByName", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Name", testNameToDelete);
                string path = Convert.ToString(sqlCommand.ExecuteScalar());

                if (File.Exists(path))
                {
                    File.Delete(path);
                } //else return file already deleted??

                sqlCommand             = new SqlCommand("Proc_DeleteTestByName", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Name", testNameToDelete);
                int nonQ = sqlCommand.ExecuteNonQuery();

                TrueMessage trueMessageToClient = new TrueMessage();

                if (nonQ == 0)
                {
                    trueMessageToClient.Command = Command.Reject;
                }
                else
                {
                    trueMessageToClient.Command = Command.Approve;
                    trueMessageToClient.Message = testNameToDelete;
                }

                byte[]     dataDeleteTestAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataDeleteTestAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataDeleteTestAnswer, 0, dataDeleteTestAnswer.Length, new AsyncCallback(DeleteTestAnswer), tcpClient);

                Console.WriteLine($"DeleteTest ended");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#19
0
        private void LogInAnswer(IAsyncResult ar)
        {
            networkStream.EndRead(ar);

            byte[] dataLogInAnswer = (byte[])ar.AsyncState;

            IFormatter  formatter             = new BinaryFormatter();
            TrueMessage trueMessageFromServer = new TrueMessage();

            using (MemoryStream memoryStream = new MemoryStream(dataLogInAnswer))
            {
                trueMessageFromServer = (TrueMessage)formatter.Deserialize(memoryStream);
            }

            if (trueMessageFromServer.Command == Command.Approve)
            {
                Disconnect();

                if ((string)trueMessageFromServer.Message == "Student")
                {
                    Application.Current.Dispatcher.Invoke((Action) delegate
                    {
                        string login            = UsernameTextBox.Text;
                        StudentWindow dashBoard = new StudentWindow(login);
                        dashBoard.Show();
                        this.Close();
                    });
                }
                else if ((string)trueMessageFromServer.Message == "Teacher")
                {
                    Application.Current.Dispatcher.Invoke((Action) delegate
                    {
                        string login            = UsernameTextBox.Text;
                        TeacherWindow dashBoard = new TeacherWindow(login);
                        dashBoard.Show();
                        this.Close();
                    });
                }
                else if ((string)trueMessageFromServer.Message == "Admin")
                {
                    Application.Current.Dispatcher.Invoke((Action) delegate
                    {
                        string login          = UsernameTextBox.Text;
                        AdminWindow dashBoard = new AdminWindow(login);
                        dashBoard.Show();
                        this.Close();
                    });
                }
                else
                {
                    MessageBox.Show($"Error message from server. Message: {(string)trueMessageFromServer.Message}", "Error");
                }
            }
            else if (trueMessageFromServer.Command == Command.Reject)
            {
                MessageBox.Show((string)trueMessageFromServer.Message);
            }
            else
            {
                MessageBox.Show("Received message from server is incorrect.", "Error");
            }
        }
示例#20
0
        private void SetCurrentButton_Click(object sender, RoutedEventArgs e)
        {
            if ((TextBlock)TimeComboBox.SelectedItem == null)
            {
                MessageBox.Show("You must set Time", "Error");
                return;
            }

            TextBlock selectedItem = (TextBlock)TimeComboBox.SelectedItem;
            string    time         = selectedItem.Text;

            switch (time)
            {
            case "10 min":
                time = "10";
                break;

            case "20 min":
                time = "20";
                break;

            case "30 min":
                time = "30";
                break;

            case "45 min":
                time = "45";
                break;

            case "60 min":
                time = "60";
                break;

            default:
                break;
            }

            int idx = TestListView.SelectedIndex;

            if (idx == -1)
            {
                MessageBox.Show("You must select test first", "Error");
                return;
            }

            string testToChoose = TestNames[idx];

            KeyValuePair <string, string> choosePair = new KeyValuePair <string, string>(testToChoose, time);

            TrueMessage trueMessageToServer = new TrueMessage {
                Command = Command.ChooseCurrentTest, Login = login, Message = choosePair
            };

            byte[]     dataChooseCurrentTestRequest;
            IFormatter formatter = new BinaryFormatter();

            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, trueMessageToServer);
                dataChooseCurrentTestRequest = stream.ToArray();
            }

            networkStream.BeginWrite(dataChooseCurrentTestRequest, 0, dataChooseCurrentTestRequest.Length, new AsyncCallback(ChooseCurrentTestRequest), null);
        }
示例#21
0
        private void ChooseCurrentTest(TcpClient tcpClient, TrueMessage trueMessage)
        {
            Console.WriteLine($"ChooseCurrentTest");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                KeyValuePair <string, string> choosePair = (KeyValuePair <string, string>)trueMessage.Message;

                string testNameToChoose = choosePair.Key;

                SqlCommand sqlCommand = new SqlCommand("Proc_GetTestPathByName", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Name", testNameToChoose);
                string path = Convert.ToString(sqlCommand.ExecuteScalar());

                TrueMessage trueMessageToClient = new TrueMessage();

                if (File.Exists(path))
                {
                    currentTest = TrueXmlSerializer.Load <TestDLL.Test>(path);
                    testTime    = choosePair.Value;

                    trueMessageToClient.Command = Command.Approve;
                }
                else
                {
                    trueMessageToClient.Command = Command.Reject;
                    trueMessageToClient.Message = "Test not found";
                }

                byte[]     dataChooseCurrentTestAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataChooseCurrentTestAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataChooseCurrentTestAnswer, 0, dataChooseCurrentTestAnswer.Length, new AsyncCallback(ChooseCurrentTestAnswer), tcpClient);

                Console.WriteLine($"ChooseCurrentTest ended");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#22
0
        private void SendMark(TcpClient tcpClient, TrueMessage trueMessage)
        {
            Console.WriteLine($"LoadCurrentTest");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                //////////////////////////////////////////////////////////////////////////////////////////
                KeyValuePair <string, int> markPair = (KeyValuePair <string, int>)trueMessage.Message;
                string testName = markPair.Key;
                int    mark     = markPair.Value;

                SqlCommand sqlCommand = new SqlCommand("Proc_SelectUserIdByName", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Login", trueMessage.Login);
                int userId = Convert.ToInt32(sqlCommand.ExecuteScalar());

                sqlCommand             = new SqlCommand("Proc_SelectTestIdByName", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Name", testName);
                int testId = Convert.ToInt32(sqlCommand.ExecuteScalar());

                sqlCommand             = new SqlCommand("Proc_AddMark", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Mark", mark);
                sqlCommand.Parameters.AddWithValue("@StudentId", userId);
                sqlCommand.Parameters.AddWithValue("@TestId", testId);
                int execNonQ = sqlCommand.ExecuteNonQuery();

                TrueMessage trueMessageToClient = new TrueMessage();

                if (execNonQ == 0)
                {
                    trueMessageToClient.Command = Command.Reject;
                }
                else
                {
                    trueMessageToClient.Command = Command.Approve;
                }

                byte[]     dataSendMarkAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataSendMarkAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataSendMarkAnswer, 0, dataSendMarkAnswer.Length, new AsyncCallback(SendMarkAnswer), tcpClient);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#23
0
        private void LogIn(TcpClient tcpClient, TrueMessage trueMessage)
        {
            Console.WriteLine("LogIn");

            string login    = trueMessage.Login;
            string password = (string)trueMessage.Message;

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                SqlCommand sqlCommand = new SqlCommand("Proc_SelectUserType", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Login", login);
                sqlCommand.Parameters.AddWithValue("@Password", password);
                string userType = Convert.ToString(sqlCommand.ExecuteScalar());

                TrueMessage trueMessageToClient = new TrueMessage();

                Console.WriteLine($"UserType: {userType}. Length: {userType.Length}");
                if (userType.Length == 0)
                {
                    trueMessageToClient.Command = Command.Reject;
                    trueMessageToClient.Message = "Username or password is incorrect.";
                }
                else
                {
                    if (clients.Keys.Contains(login))
                    {
                        trueMessageToClient.Message = "This user is already logged in!";
                    }
                    else
                    {
                        trueMessageToClient.Command = Command.Approve;
                        trueMessageToClient.Message = userType;
                    }
                }


                byte[]     dataLogInAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataLogInAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataLogInAnswer, 0, dataLogInAnswer.Length, new AsyncCallback(LogInAnswer), tcpClient);

                Console.WriteLine("LogInEnd");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                sqlConnection.Close();
            }
        }
示例#24
0
        private void AddTest(TcpClient tcpClient, TrueMessage trueMessage)
        {
            Console.WriteLine($"AddTest");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                TestDLL.Test test = (TestDLL.Test)trueMessage.Message;

                string path    = test.Name;
                string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());

                foreach (char c in invalid)
                {
                    path = path.Replace(c.ToString(), "");
                }

                path = "..\\..\\..\\Tests\\" + path + ".xml";

                TrueMessage trueMessageToClient = new TrueMessage();

                Random random = new Random();
                while (File.Exists(path))
                {
                    path += random.Next(1, 100);
                }

                TrueXmlSerializer.Save(test, path);

                SqlCommand sqlCommand = new SqlCommand("Proc_AddTest", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Name", test.Name);
                sqlCommand.Parameters.AddWithValue("@Description", test.Description);
                sqlCommand.Parameters.AddWithValue("@Path", path);
                sqlCommand.ExecuteNonQuery();

                trueMessageToClient.Command = Command.Approve;
                trueMessageToClient.Message = test.Name;

                byte[]     dataAddTestAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataAddTestAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataAddTestAnswer, 0, dataAddTestAnswer.Length, new AsyncCallback(AddTestAnswer), tcpClient);

                Console.WriteLine($"AddTest ended");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#25
0
        private void AdminConnect(TcpClient tcpClient, TrueMessage trueMessage)
        {
            string     login    = trueMessage.Login;
            IPEndPoint clientEP = (IPEndPoint)tcpClient.Client.RemoteEndPoint;

            clients.Add(login, clientEP);

            Console.WriteLine($"Admin {login} connected");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                SqlCommand sqlCommand = new SqlCommand("Proc_LoadUsers", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                List <UserLW> users = new List <UserLW>();

                using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
                {
                    while (sqlReader.Read())
                    {
                        users.Add(new UserLW
                        {
                            Login    = Convert.ToString(sqlReader["Login"]),
                            Password = Convert.ToString(sqlReader["Password"]),
                            FullName = Convert.ToString(sqlReader["FullName"]),
                            UserType = Convert.ToString(sqlReader["Type"])
                        });
                    }
                }

                TrueMessage trueMessageToClient = new TrueMessage();

                if (users.Count <= 0)
                {
                    trueMessageToClient.Command = Command.Reject;
                }
                else
                {
                    trueMessageToClient.Command = Command.Approve;
                    trueMessageToClient.Message = users.ToArray();
                }

                byte[]     dataAdminConnectAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataAdminConnectAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataAdminConnectAnswer, 0, dataAdminConnectAnswer.Length, new AsyncCallback(AdminConnectAnswer), tcpClient);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#26
0
        private void AddUser(TcpClient tcpClient, TrueMessage trueMessage)
        {
            Console.WriteLine("AddUser");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                UserLW newUser = (UserLW)trueMessage.Message;

                SqlCommand sqlCommand = new SqlCommand("Proc_LoginAvailabilityCheck", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Login", newUser.Login);
                int count = Convert.ToInt32(sqlCommand.ExecuteScalar());

                TrueMessage trueMessageToClient = new TrueMessage();

                if (count == 1)
                {
                    Console.WriteLine("AddUserReject Login exists");

                    trueMessageToClient.Command = Command.Reject;
                    trueMessageToClient.Message = "User with that login already exists";
                }
                else
                {
                    sqlCommand             = new SqlCommand("Proc_GetUserTypeId", sqlConnection);
                    sqlCommand.CommandType = CommandType.StoredProcedure;
                    sqlCommand.Parameters.AddWithValue("@UserType", newUser.UserType);
                    int userTypeId = Convert.ToInt32(sqlCommand.ExecuteScalar());

                    if (userTypeId == 0)
                    {
                        Console.WriteLine("AddUserReject wrong UserType");

                        trueMessageToClient.Command = Command.Reject;
                        trueMessageToClient.Message = "Wrong UserType";
                    }
                    else
                    {
                        Console.WriteLine("AddUserApprove");

                        sqlCommand             = new SqlCommand("Proc_AddUser", sqlConnection);
                        sqlCommand.CommandType = CommandType.StoredProcedure;
                        sqlCommand.Parameters.AddWithValue("@Login", newUser.Login);
                        sqlCommand.Parameters.AddWithValue("@Password", newUser.Password);
                        sqlCommand.Parameters.AddWithValue("@FullName", newUser.FullName);
                        sqlCommand.Parameters.AddWithValue("@UserTypeId", userTypeId);
                        sqlCommand.ExecuteNonQuery();

                        trueMessageToClient.Command = Command.Approve;
                    }
                }

                byte[]     dataAddUserAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataAddUserAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataAddUserAnswer, 0, dataAddUserAnswer.Length, new AsyncCallback(AddUserAnswer), tcpClient);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#27
0
        private void UpdateMarks(TcpClient tcpClient, TrueMessage trueMessage)
        {
            Console.WriteLine($"UpdateMarks");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                string testName = (string)trueMessage.Message;

                List <MarkLW> marks = new List <MarkLW>();

                SqlCommand sqlCommand = new SqlCommand("Proc_GetMarksByTestName", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@Name", testName);

                using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
                {
                    while (sqlReader.Read())
                    {
                        marks.Add(new MarkLW
                        {
                            FullName = Convert.ToString(sqlReader["FullName"]),
                            Mark     = Convert.ToInt32(sqlReader["Mark"])
                        });
                    }
                }

                TrueMessage trueMessageToClient = new TrueMessage();

                if (marks.Count <= 0)
                {
                    trueMessageToClient.Command = Command.Reject;
                }
                else
                {
                    trueMessageToClient.Command = Command.Approve;
                    trueMessageToClient.Message = marks.ToArray();
                }

                byte[]     dataUpdateMarksAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataUpdateMarksAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataUpdateMarksAnswer, 0, dataUpdateMarksAnswer.Length, new AsyncCallback(UpdateMarksAnswer), tcpClient);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#28
0
        private void TeacherConnect(TcpClient tcpClient, TrueMessage trueMessage)
        {
            string     login    = trueMessage.Login;
            IPEndPoint clientEP = (IPEndPoint)tcpClient.Client.RemoteEndPoint;

            clients.Add(login, clientEP);

            Console.WriteLine($"Teacher {login} connected");

            SqlConnection sqlConnection = new SqlConnection(connectionString);

            try
            {
                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }

                List <string> testNames = new List <string>();

                SqlCommand sqlCommand = new SqlCommand("Proc_GetTestNames", sqlConnection);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
                {
                    while (sqlReader.Read())
                    {
                        testNames.Add(Convert.ToString(sqlReader["Name"]));
                    }
                }

                TrueMessage trueMessageToClient = new TrueMessage();

                if (testNames.Count <= 0)
                {
                    trueMessageToClient.Command = Command.Reject;
                }
                else
                {
                    trueMessageToClient.Command = Command.Approve;
                    trueMessageToClient.Message = testNames.ToArray();
                }

                byte[]     dataTeacherConnectAnswer;
                IFormatter formatter = new BinaryFormatter();

                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, trueMessageToClient);
                    dataTeacherConnectAnswer = stream.ToArray();
                }

                NetworkStream networkStream = tcpClient.GetStream();

                networkStream.BeginWrite(dataTeacherConnectAnswer, 0, dataTeacherConnectAnswer.Length, new AsyncCallback(TeacherConnectAnswer), tcpClient);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (sqlConnection.State != ConnectionState.Closed)
                {
                    sqlConnection.Close();
                }
            }
        }
示例#29
0
        private void ReadMessage(IAsyncResult ar)
        {
            Console.WriteLine("123 ReadMessage");

            (TcpClient tcpClient, byte[] dataReadMessage)stateReadMessage = ((TcpClient tcpClient, byte[] dataReadMessage))ar.AsyncState;

            TcpClient tcpClient = stateReadMessage.tcpClient;

            byte[]        dataReadMessage = stateReadMessage.dataReadMessage;
            NetworkStream stream          = tcpClient.GetStream();

            int byteLenght = stream.EndRead(ar);

            if (byteLenght > 0)
            {
                IFormatter  formatter   = new BinaryFormatter();
                TrueMessage trueMessage = new TrueMessage();
                using (MemoryStream memoryStream = new MemoryStream(dataReadMessage))
                {
                    trueMessage = (TrueMessage)formatter.Deserialize(memoryStream);
                }

                if (trueMessage.Command == Command.LogIn)
                {
                    LogIn(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.AdminConnect)
                {
                    AdminConnect(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.AddUser)
                {
                    AddUser(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.DeleteUser)
                {
                    DeleteUser(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.Disconnect)
                {
                    string login = trueMessage.Login;

                    clients.Remove(login);

                    Console.WriteLine($"User {login} disconnected");
                }
                else if (trueMessage.Command == Command.TeacherConnect)
                {
                    TeacherConnect(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.UpdateMarks)
                {
                    UpdateMarks(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.AddTest)
                {
                    AddTest(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.DeleteTest)
                {
                    DeleteTest(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.ChooseCurrentTest)
                {
                    ChooseCurrentTest(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.StudentConnect)
                {
                    StudentConnect(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.LoadCurrentTest)
                {
                    LoadCurrentTest(tcpClient, trueMessage);
                }
                else if (trueMessage.Command == Command.SendMark)
                {
                    SendMark(tcpClient, trueMessage);
                }

                Console.WriteLine("456 COMMAND: " + trueMessage.Command.ToString());

                byte[] dataReadMessageNew = new byte[64000];
                (TcpClient tcpClient, byte[] dataReadMessageNew)stateReadMessageNew = (tcpClient, dataReadMessageNew);
                stream.BeginRead(dataReadMessageNew, 0, dataReadMessageNew.Length, new AsyncCallback(ReadMessage), stateReadMessageNew);
            }
        }