From ddb25c98b54e08d3fdaf033bb4b7f731a02ca741 Mon Sep 17 00:00:00 2001 From: Sean Date: Sat, 16 Aug 2025 18:40:58 -0400 Subject: [PATCH] Refactoring code to use SmartPointers --- sstp/.vscode/settings.json | 3 +- sstp/clientsocketsender.cpp | 6 ++ sstp/clientsocketsender.hpp | 1 + sstp/main.cpp | 156 +++++++++++++++++++++++++++--------- sstp/socketserver.cpp | 7 ++ sstp/socketserver.hpp | 1 + 6 files changed, 135 insertions(+), 39 deletions(-) diff --git a/sstp/.vscode/settings.json b/sstp/.vscode/settings.json index 6da71c9..f46726b 100644 --- a/sstp/.vscode/settings.json +++ b/sstp/.vscode/settings.json @@ -52,6 +52,7 @@ "semaphore": "cpp", "stop_token": "cpp", "thread": "cpp", - "*.tpp": "cpp" + "*.tpp": "cpp", + "csignal": "cpp" } } \ No newline at end of file diff --git a/sstp/clientsocketsender.cpp b/sstp/clientsocketsender.cpp index 19a2423..ef7cbab 100644 --- a/sstp/clientsocketsender.cpp +++ b/sstp/clientsocketsender.cpp @@ -1,5 +1,11 @@ #include +/// @Brief This is to provide a definition for SmartPointer +ClientSocketSender::ClientSocketSender() +: mIPAddress(""), mPort(0) +{ +} + /// @brief Establish a connection to the socket specified by ipAddress and port /// @param ipAddress The ipAddress /// @param port The port diff --git a/sstp/clientsocketsender.hpp b/sstp/clientsocketsender.hpp index a0dd3dd..726325c 100644 --- a/sstp/clientsocketsender.hpp +++ b/sstp/clientsocketsender.hpp @@ -16,6 +16,7 @@ class ClientSocketSender { public: + ClientSocketSender(); ClientSocketSender(String ipAddress,int port); virtual ~ClientSocketSender(); bool sendFile(String &pathFileName); diff --git a/sstp/main.cpp b/sstp/main.cpp index d003c3d..00b9bcd 100644 --- a/sstp/main.cpp +++ b/sstp/main.cpp @@ -21,6 +21,83 @@ void handleClient(Block &commands); // handler for client mode bool registerSignalHandler(void); // registers a Control-c handler void signalHandler(int signal); // The Control-C handler +class SSTP; + +SmartPointer sstp; + +class SSTP +{ + public: + SSTP(); + ~SSTP(); + void handleServer(Block& arguments); + void handleClient(Block& arguments); + private: + SmartPointer mSocketServer; + SmartPointer mClientSocketSender; +}; + +inline +SSTP::SSTP() +{ +} + +inline +SSTP::~SSTP() +{ + mSocketServer.destroy(); + mClientSocketSender.destroy(); +} + +/// @brief [0]=program [1]=SERVERMODE [2]={port} +/// @Note Currently this method will never return. The application is terminate with CTRL-C. Ideally, we would exit is some cleaner fashion +/// perhaps by implementing a CTRL-C hook and then destroying the SocketServer properly by calling it's destructor. See SocketServer::~SocketServer() +/// @param commands +inline +void SSTP::handleServer(Block& commands) +{ + Profiler profiler; + + if(commands.size()!=3) + { + std::cout << "Missing required parameters" << std::endl; + return; + } + int port = commands[2].toInt(); + std::cout << commands[1] << ":" << commands[2] << std::endl; + SocketServer socketServer(commands[2].toInt()); + socketServer.listen(); + std::cout << "Done, total took " << Utility::formatNumber(profiler.end()) << "(ms)" << std::endl; +} + +/// @brief [0]=program, [1]=CLIENTMODE, [2]=serveripaddress, [3]=serverport, [4]=pathfilename +/// @param commands +inline +void SSTP::handleClient(Block& arguments) +{ + Profiler profiler; + if(arguments.size()!=5) + { + std::cout << "Missing required parameters" << std::endl; + return; + } + mClientSocketSender.destroy(); + mClientSocketSender = new ClientSocketSender(arguments[2],arguments[3].toInt()); + bool returnCode = mClientSocketSender->sendFile(arguments[4]); + if(!returnCode) + { + std::cout << "The transfer failed." << std::endl; + } + else + { + std::cout << "Transfer complete" << std::endl; + } + std::cout << "Done, total took " << Utility::formatNumber(profiler.end()) << "(ms)" << std::endl; +} + + +// **************************************************************************************************************************************************************** + /// @brief /// @param argc /// @param argv [0] program. [1] SERVERMODE {port} [2] CLIENTMODE {serveripaddress} {serverport} SEND {FileName} @@ -52,15 +129,18 @@ int main(int argc, char **argv) String item(argv[index]); arguments.insert(item); } - + sstp=::new SSTP(); + sstp.disposition(PointerDisposition::Delete); std::cout << argv[1] << std::endl; if(arguments[1]=="SERVERMODE") { - handleServer(arguments); + sstp->handleServer(arguments); +// handleServer(arguments); } else if(arguments[1]=="CLIENTMODE") { - handleClient(arguments); + sstp->handleClient(arguments); +// handleClient(arguments); } else { @@ -89,6 +169,7 @@ int main(int argc, char **argv) void signalHandler(int signal) { std::cout << "SSTP Received signal " << signal << std::endl; + if(sstp.isOkay())sstp.destroy(); exit(signal); } @@ -109,47 +190,46 @@ bool registerSignalHandler(void) return true; } - /// @brief [0]=program [1]=SERVERMODE [2]={port} /// @Note Currently this method will never return. The application is terminate with CTRL-C. Ideally, we would exit is some cleaner fashion /// perhaps by implementing a CTRL-C hook and then destroying the SocketServer properly by calling it's destructor. See SocketServer::~SocketServer() /// @param commands -void handleServer(Block &commands) -{ - Profiler profiler; +// void handleServer(Block &commands) +// { +// Profiler profiler; - if(commands.size()!=3) - { - std::cout << "Missing required parameters" << std::endl; - return; - } - int port = commands[2].toInt(); - std::cout << commands[1] << ":" << commands[2] << std::endl; - SocketServer socketServer(commands[2].toInt()); - socketServer.listen(); - std::cout << "Done, total took " << Utility::formatNumber(profiler.end()) << "(ms)" << std::endl; -} +// if(commands.size()!=3) +// { +// std::cout << "Missing required parameters" << std::endl; +// return; +// } +// int port = commands[2].toInt(); +// std::cout << commands[1] << ":" << commands[2] << std::endl; +// SocketServer socketServer(commands[2].toInt()); +// socketServer.listen(); +// std::cout << "Done, total took " << Utility::formatNumber(profiler.end()) << "(ms)" << std::endl; +// } /// @brief [0]=program, [1]=CLIENTMODE, [2]=serveripaddress, [3]=serverport, [4]=pathfilename /// @param commands -void handleClient(Block &commands) -{ - Profiler profiler; - if(commands.size()!=5) - { - std::cout << "Missing required parameters" << std::endl; - return; - } +// void handleClient(Block &commands) +// { +// Profiler profiler; +// if(commands.size()!=5) +// { +// std::cout << "Missing required parameters" << std::endl; +// return; +// } - ClientSocketSender clientSocketSender(commands[2],commands[3].toInt()); - bool returnCode = clientSocketSender.sendFile(commands[4]); - if(!returnCode) - { - std::cout << "The transfer failed." << std::endl; - } - else - { - std::cout << "Transfer complete" << std::endl; - } - std::cout << "Done, total took " << Utility::formatNumber(profiler.end()) << "(ms)" << std::endl; -} +// ClientSocketSender clientSocketSender(commands[2],commands[3].toInt()); +// bool returnCode = clientSocketSender.sendFile(commands[4]); +// if(!returnCode) +// { +// std::cout << "The transfer failed." << std::endl; +// } +// else +// { +// std::cout << "Transfer complete" << std::endl; +// } +// std::cout << "Done, total took " << Utility::formatNumber(profiler.end()) << "(ms)" << std::endl; +// } diff --git a/sstp/socketserver.cpp b/sstp/socketserver.cpp index bd764d4..121ca99 100644 --- a/sstp/socketserver.cpp +++ b/sstp/socketserver.cpp @@ -1,6 +1,13 @@ #include #include +/// @brief Defauly constructor. This is to provide a definition for SmartPointer +/// @param port +SocketServer::SocketServer() +: mListenPort(-1), mIsOkay(false), mSocketFileDescriptor(-1) +{ +} + /// @brief This will construct the socket listener. You must then call listen() to listen for connections /// @param port SocketServer::SocketServer(int port) diff --git a/sstp/socketserver.hpp b/sstp/socketserver.hpp index 6a55e5c..422167c 100644 --- a/sstp/socketserver.hpp +++ b/sstp/socketserver.hpp @@ -20,6 +20,7 @@ class SocketConnectionReceiver; class SocketServer { public: + SocketServer(); SocketServer(int port); virtual ~SocketServer(); void listen(void);