private void ReciveFile(long fileSize, string fileName, Socket socket, ref bool fullRecived)
        {
            var segments = (fileSize / FileSenderHandler.FileSegmentSize);

            segments = segments * FileSenderHandler.FileSegmentSize == fileSize ? segments : segments + 1;

            long offset          = 0;
            long currentSegments = 1;

            IFileSenderHandler senderHandler = new FileSenderHandler();

            while (fileSize > offset)
            {
                ByteDataTransfer   transfer = new ByteDataTransfer();
                DataTransferResult result   = transfer.RecieveData(socket);
                if (result.Header.GetCommand() == 31)
                {
                    byte[] fileDataRecived = (byte[])result.objectResult;
                    int    size            = 0;
                    if (currentSegments == segments)
                    {
                        size = (int)(fileSize - offset);
                    }
                    else
                    {
                        size = (int)FileSenderHandler.FileSegmentSize;
                    }

                    senderHandler.Write(fileName, fileDataRecived);
                    offset += size;
                    currentSegments++;
                }
            }
            Console.WriteLine(Directory.GetCurrentDirectory());
            fullRecived = true;
        }
        public async Task HandleClient(Socket socket)
        {
            DataTransferSuper transfer = new StringDataTransfer();
            Response          response = new StringResponse();
            User   user;
            string fileName = "";

            while (true)
            {
                DataTransferResult result = transfer.RecieveData(socket);

                int    command    = result.Header.GetCommand();
                int    dataLength = result.Header.GetDataLength();
                string direction  = result.Header.GetDirection();
                string word       = "";

                if (command != 31)
                {
                    word = (string)result.objectResult;
                }
                ;
                Log log = new Log()
                {
                    Command = command,
                    Message = word,
                    Date    = DateTime.Now,
                };

                dynamic responseData;
                switch (command)
                {
                case CommandConstants.Login:
                    try
                    {
                        user         = Login(word);
                        response     = new StringResponse();
                        responseData = "true";
                        response.SendResponse(command, responseData, socket, responseData.Length);
                        log.Level    = Log.SUCCESS_LEVEL;
                        log.Username = user.Username;
                        SendLog(log);
                        break;
                    }
                    catch (Exception)
                    {
                        response     = new StringResponse();
                        responseData = "false";
                        response.SendResponse(command, responseData, socket, responseData.Length);
                        log.Level    = Log.WARNING_LEVEL;
                        log.Username = "******";
                        SendLog(log);
                        break;
                    }

                case CommandConstants.SignUp:
                    try
                    {
                        SignUp(word);
                        //response = new StringResponse();
                        //responseData = "true";
                        //response.SendResponse(command, responseData, socket, responseData.Length);
                        break;
                    }
                    catch (UserAlreadyExistException)
                    {
                        break;
                    }

                case CommandConstants.ListUsers:
                    List <string> usersList = GetUsers();
                    response     = new ListStringResponse();
                    responseData = usersList;
                    int responseDataLength = ListStringDataTransfer.ListLength(usersList);
                    response.SendResponse(command, responseData, socket, responseDataLength);
                    break;

                case CommandConstants.ListFiles:
                    User userPhoto = new User();
                    userPhoto.Username = word;
                    List <string> fileList = GetUserPhotos(userPhoto);
                    response           = new ListStringResponse();
                    responseData       = fileList;
                    responseDataLength = ListStringDataTransfer.ListLength(fileList);
                    response.SendResponse(command, responseData, socket, responseDataLength);
                    break;

                case CommandConstants.UploadFile:
                    long fileSize;
                    ReciveFileData(word, out fileName, out fileSize);
                    transfer = new ByteDataTransfer();
                    break;

                case CommandConstants.UploadFileSignal:
                    byte[]             fileBytes     = (byte[])result.objectResult;
                    IFileSenderHandler senderHandler = new FileSenderHandler();
                    senderHandler.Write(fileName, fileBytes);
                    Console.WriteLine(Directory.GetCurrentDirectory());
                    break;

                default:
                    Console.WriteLine("Invalid command");
                    break;
                }
            }
        }