# GUI-CLI Protocol Protocol version: "0.2" Every json message must be minimized and be followed by a newline. This rule makes receiving and parsing the messages easier because you can read until a newline comes and you will parse every json message seperately because you won't read multiple json messages from the buffer at a time. ## 0. Connect to the server The GUI creates a new instance of the CLI with the entered IP Address as a paramater. The CLI then tries to establish a connection to the given server and tells the GUI if the connection was successful. CLI: ``` { "command": "connect", "accept": bool, "error": string } ``` ## 1. Start a connection To connect to a server, the CLI has to do a version check. Once that is successful, the GUI will pass the username and password to establish a connection. ### 1.1 Version check CLI: ``` { "command": "version", "serverversion": string, "clientversion": string, "accept": bool } ``` If `accept` is `true` the connection is valid. Else the connection will be terminated after the server answered. ## 1.2 Login / Signup The GUI will send the username and password right after another into the pipe. If the response contains a "true" for accept, the login was successful. ### 1.2.1 Login GUI: ``` write: username write: password ``` CLI: ``` { "command": "login", "accept": bool, "error": string } ``` If `accept` is `true` the connection is valid and the user is logged in. Else `error` has an error string and the connection will be terminated after the server answered. ### 1.2.2 Signup GUI: ``` write: #ToBeAdded ``` Server: ``` { "command": "signup", #ToBeAdded } ``` If `accept` is `true` the connection is valid and the user is logged in and signed up. Else `error` has an error string and the connection will be terminated after the server answered. ## 2. Sending commands Commands can be sent by the client after a connection has been negotiated (See 1). Commands can be used unrelated to each other. ### 2.1 Status command GUI: ``` write: "status" ``` CLI: ``` { "command": "status", "response": string } ``` ### 2.2 List command `list` to request a list download. #### 2.2.1 list - request file list download GUI: ``` { write: "list" } ``` CLI: ``` { "command": "list", "accept": bool, "names": string[], "error": string } ``` ### 2.3 Put command Put is split in two commands. `put` to request a file upload and `putdata` to get the information about an ongoing upload. #### 2.3.1 put - request upload GUI: ``` write: "put" file_path ``` CLI: ``` { "command": "put", "accept": bool, "file": string, "error": string } ``` If `accept` is `true` the connection is valid and the client can start sending the file. Else the put request was rejected and is hereby canceled. `error` should contain an error string if the request was rejected. #### 2.3.2 putdata - upload data CLI: ``` { "command": "putdata", "file": string, "speed": float, "cancel": bool, "error": string } ``` If `cancel` is `true` then the upload of the file is canceled and an error message should be in `error`. `speed` shall contain a float describing the upload speed in kB/s. ### 2.4 Get command Get is split in two commands. `get` to request a file download and `getdata` to get the information about an ongoing download. #### 2.4.1 get - request download GUI: ``` write: "get" file_name ``` CLI: ``` { "command": "get", "accept": bool, "file": string, "error": string } ``` If `accept` is `true` the connection is valid and the server can start sending the file. Else the get request was rejected and is hereby canceled. `error` should contain an error string if the request was rejected. #### 2.4.2 getdata - download data CLI: ``` { "command": "putdata", "file": string, "speed": float, "cancel": bool, "error": string } ``` If `cancel` is `true` then the download of the file is canceled and an error message should be in `error`. `speed` shall contain a float describing the download speed in kB/s. ### TODO ## 3. Disconnect GUI: ``` { write: "disconnect" } ``` CLI: ``` { "command": "disconnect", "accept": bool } ``` If `accept` is true, the connection is closed and the program can exit.