From 3ef82e0fce72f6b4d9fb2ba09e530109715e0908 Mon Sep 17 00:00:00 2001 From: Brad Arant Date: Mon, 24 Jan 2022 18:36:47 -0800 Subject: [PATCH] Compiles --- .vscode/c_cpp_properties.json | 3 +- .vscode/settings.json | 3 ++ CommandList.cpp | 14 ++++-- ConsoleSession.cpp | 1 + SessionFilter.h | 12 ++--- Socket.cpp | 89 +++++++++++++++++----------------- Subscription.cpp | 12 ++++- Subscription.h | 4 +- SubscriptionManager.cpp | 65 +++++++++++++++---------- SubscriptionManager.h | 3 +- TCPServer.h | 7 ++- TCPSession.cpp | 59 +++++++++++----------- compile | 2 +- output/main | Bin 106544 -> 106552 bytes 14 files changed, 159 insertions(+), 115 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index be23ad4..7adc94f 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -11,7 +11,8 @@ "cStandard": "c17", "cppStandard": "gnu++20", "intelliSenseMode": "windows-gcc-x64", - "compileCommands": "./compile" + "compileCommands": "./compile", + "configurationProvider": "ms-vscode.cmake-tools" }, { "name": "config", diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..82cfcc9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cmake.configureOnOpen": false +} \ No newline at end of file diff --git a/CommandList.cpp b/CommandList.cpp index 23a30b5..b3ab300 100644 --- a/CommandList.cpp +++ b/CommandList.cpp @@ -17,11 +17,17 @@ namespace core { else { if(request.equals("")) return false; - request.split(delimiter); - auto command = commands[request[0].str()]; - return command->processCommand(request, session); + request.split(delimiter, 2); + request.reset(); + try { + auto command = commands.at(request[0].str()); + return command->processCommand(request, session); + } + catch(...) { + return false; + } } - return false; + return true; } bool CommandList::grabInput(TCPSession &session, Command &command) { diff --git a/ConsoleSession.cpp b/ConsoleSession.cpp index 28c6f63..a21affa 100644 --- a/ConsoleSession.cpp +++ b/ConsoleSession.cpp @@ -33,6 +33,7 @@ namespace core { out << "Password: "; status = WAIT_PASSWORD; break; + case WAIT_PASSWORD: status = PROMPT; protocol(blank); diff --git a/SessionFilter.h b/SessionFilter.h index 8cca085..56c27df 100644 --- a/SessionFilter.h +++ b/SessionFilter.h @@ -4,18 +4,18 @@ //#include "Session.h" namespace core { - + class TCPSession; - + class SessionFilter : public Object { - + public: virtual bool test(TCPSession &session) { return true; - } - + } + }; - + } #endif diff --git a/Socket.cpp b/Socket.cpp index 5e05ccf..c065148 100644 --- a/Socket.cpp +++ b/Socket.cpp @@ -5,13 +5,13 @@ #include "Log.h" namespace core { - + Socket::Socket(EPoll &ePoll, std::string text) : ePoll(ePoll), text(text) { coreutils::Log(coreutils::LOG_DEBUG_2) << "Socket object created [" << text << "]."; buffer = (char *)malloc(4096); length = 4096; } - + Socket::~Socket() { free(buffer); if(descriptor == -1) @@ -21,7 +21,7 @@ namespace core { coreutils::Log(coreutils::LOG_DEBUG_3) << "Socket destroyed for socket " << descriptor << "."; close(descriptor); } - + void Socket::setDescriptor(int descriptor) { if((descriptor == -1) && (errno == 24)) { shutdown("Too many files open"); @@ -37,84 +37,85 @@ namespace core { onRegistered(); lock.unlock(); } - + int Socket::getDescriptor() { return descriptor; } - + void Socket::setBufferSize(int length) { this->length = length; buffer = (char *)realloc(buffer, length); - + } - + int Socket::getBufferSize() { return length; } - + void Socket::onRegister() {} - + void Socket::onRegistered() {} - + void Socket::onUnregister() {} - + void Socket::onUnregistered() {} - + bool Socket::eventReceived(struct epoll_event event) { - + lock.lock(); - + if(event.events & EPOLLRDHUP) { readHangup = true; shutdown("hangup received"); - lock.unlock(); + lock.unlock(); return false; } - + if(event.events & EPOLLIN) { coreutils::ZString zbuffer(buffer, length); - receiveData(zbuffer); + receiveData(zbuffer); } - + if(event.events & EPOLLWRNORM) { - writeSocket(); + writeSocket(); } - + if(event.events & EPOLLHUP) { shutdown(); - lock.unlock(); - return false; + lock.unlock(); + return false; } - + lock.unlock(); - + reset = true; return reset; } - + void Socket::onDataReceived(std::string data) { throw coreutils::Exception("Need to override onDataReceived.", __FILE__, __LINE__, -1); } - + void Socket::onDataReceived(coreutils::ZString &data) { onDataReceived(std::string(data.getData(), data.getLength())); } - + void Socket::receiveData(coreutils::ZString &buffer) { - + coreutils::ZString blank(""); - + if(buffer.getLength() <= 0) throw coreutils::Exception("Request to receive data with a zero buffer length.", __FILE__, __LINE__, -1); - + int len; int error = -1; - + // for(int ix = 0; ix < buffer.getLength(); ++ix) // buffer[ix] = 0; if((len = ::read(getDescriptor(), buffer.getData(), buffer.getLength())) >= 0) { coreutils::ZString zbuffer(buffer.getData(), len); +// coreutils::Log(coreutils::LOG_DEBUG_1) << zbuffer; onDataReceived(zbuffer); } else { @@ -129,27 +130,27 @@ namespace core { case ENOTCONN: onDataReceived(blank); break; - + case ECONNRESET: break; - + default: throw coreutils::Exception("Error in read of data from socket.", __FILE__, __LINE__, error); } } } - + void Socket::writeSocket() { if(fifo.size() > 0) { - outlock.lock(); + outlock.lock(); ::write(descriptor, fifo.front().c_str(), fifo.front().length()); fifo.pop(); - if(shutDown && !needsToWrite()) - delete this; - outlock.unlock(); + if(shutDown && !needsToWrite()) + delete this; + outlock.unlock(); } } - + int Socket::write(std::string data) { outlock.lock(); fifo.emplace(data); @@ -157,22 +158,22 @@ namespace core { ePoll.resetSocket(this); return 1; } - + void Socket::output(std::stringstream &out) { out << "|" << descriptor << "|"; } - + bool Socket::needsToWrite() { return fifo.size() > 0; } - + void Socket::shutdown(std::string text) { coreutils::Log(coreutils::LOG_DEBUG_2) << "Shutdown requested on socket " << descriptor << " with reason " << text << "."; shutDown = true; reset = false; // if(!needsToWrite()) delete this; - + } - + } diff --git a/Subscription.cpp b/Subscription.cpp index 2d8201f..94231cd 100644 --- a/Subscription.cpp +++ b/Subscription.cpp @@ -2,7 +2,15 @@ namespace core { - Subscription::Subscription(std::string id, TCPSession &session) : id(id), owner(&session) {} + Subscription::Subscription(std::string id, TCPSession &session) : id(id), owner(session) {} + + Subscription::~Subscription() { + std::stringstream out; + out << "cancel:" << id << std::endl; + for(auto subscriber : subscribers) { + subscriber->write(out.str()); + } + } int Subscription::subscribe(TCPSession &session) { subscribers.push_back(&session); @@ -12,7 +20,7 @@ namespace core { int Subscription::unsubscribe(TCPSession &session) { for(auto subscriber = subscribers.begin(); subscriber < subscribers.end(); ++subscriber) { if(*subscriber == &session) { - subscribers.erase(subscriber); + subscribers.erase(subscriber++); return 1; } } diff --git a/Subscription.h b/Subscription.h index 1d2625d..93e307f 100644 --- a/Subscription.h +++ b/Subscription.h @@ -5,6 +5,7 @@ #include "Command.h" #include "ZString.h" #include +#include namespace core { @@ -12,6 +13,7 @@ namespace core { public: Subscription(std::string id, TCPSession &session); + ~Subscription(); int subscribe(TCPSession &session); int unsubscribe(TCPSession &session); @@ -22,7 +24,7 @@ namespace core { int processCommand(coreutils::ZString &request, TCPSession &session) override; std::string id; - TCPSession *owner; + TCPSession &owner; std::vector subscribers; diff --git a/SubscriptionManager.cpp b/SubscriptionManager.cpp index 56881b9..c93c530 100644 --- a/SubscriptionManager.cpp +++ b/SubscriptionManager.cpp @@ -6,49 +6,62 @@ namespace core { SubscriptionManager::SubscriptionManager() {} int SubscriptionManager::removeSessionSubscriptions(TCPSession &session) { - int count = 0; - for(auto subscription = subscriptions.begin(); subscription < subscriptions.end(); ++subscription) { - count += (*subscription)->unsubscribe(session); + int countSubscribed = 0; + int countPublished = 0; + for(auto subscription = subscriptions.begin(); subscription != subscriptions.end();) { + countSubscribed += (*subscription).second->unsubscribe(session); + if(&(*subscription).second->owner == &session) { + subscription = subscriptions.erase(subscription); + delete (*subscription).second; + ++countPublished; + } else + ++subscription; + } - coreutils::Log(coreutils::LOG_DEBUG_2) << "Removed session from " << count << " subscriptions."; - return count; + coreutils::Log(coreutils::LOG_DEBUG_2) << "Removed session from " << countSubscribed << " subscription(s)."; + coreutils::Log(coreutils::LOG_DEBUG_2) << "Cancelled " << countPublished << " channel(s) for session."; + return countSubscribed; } int SubscriptionManager::processCommand(coreutils::ZString &request, TCPSession &session) { + coreutils::Log(coreutils::LOG_DEBUG_2) << "Processing subscription request: " << request << "."; + if(request[0].equals("publish")) { - subscriptions.push_back(new Subscription(request[1].str(), session)); + Subscription *newSubscription = new Subscription(request[1].str(), session); + subscriptions.insert(std::make_pair(request[1].str(), newSubscription)); + return 1; } else if(request[0].equals("catalog")) { session.out << ":catalog:"; - for(auto subscription = subscriptions.begin(); subscription < subscriptions.end(); ++subscription) { - session.out << (*subscription)->id << "|"; - (*subscription)->processCommand(request, session); + for(auto const& [key, subscription] : subscriptions) { + session.out << subscription->id << "|"; + subscription->processCommand(request, session); session.out << (";"); } session.out << std::endl; return 1; } - for(auto subscription = subscriptions.begin(); subscription < subscriptions.end(); ++subscription) { - if(request[1].equals((*subscription)->id)) { - if(request[0].equals("unpublish")) { - subscriptions.erase(subscription); - } else if(request[0].equals("subscribe")) { - (*subscription)->subscribe(session); - } else if(request[0].equals("unsubscribe")) { - (*subscription)->unsubscribe(session); - } else if(request[0].equals("event")) { - if((*subscription)->owner == &session) { - std::stringstream out; - (*subscription)->process(request, out); - (*subscription)->event(out); - } - else - return 0; + auto subscription = subscriptions[request[1].str()]; + + if(request[1].equals(subscription->id)) { + if(request[0].equals("unpublish")) { + subscriptions.erase(request[1].str()); + } else if(request[0].equals("subscribe")) { + subscription->subscribe(session); + } else if(request[0].equals("unsubscribe")) { + subscription->unsubscribe(session); + } else if(request[0].equals("event")) { + if(&subscription->owner == &session) { + std::stringstream out; + subscription->process(request, out); + subscription->event(out); } - return 1; + else + return 0; } + return 1; } return 0; } diff --git a/SubscriptionManager.h b/SubscriptionManager.h index aa11409..0f32db9 100644 --- a/SubscriptionManager.h +++ b/SubscriptionManager.h @@ -6,6 +6,7 @@ #include "Command.h" #include "ZString.h" #include +#include namespace core { @@ -19,7 +20,7 @@ namespace core { int processCommand(coreutils::ZString &request, TCPSession &session) override; private: - std::vector subscriptions; + std::map subscriptions; }; } diff --git a/TCPServer.h b/TCPServer.h index 0bd3a1c..98aa8f3 100644 --- a/TCPServer.h +++ b/TCPServer.h @@ -109,6 +109,12 @@ namespace core { void sendToAll(std::stringstream &out, TCPSession &sender); + /// + /// The Subscription Manager tracks all subscriptions on the server. + /// + + SubscriptionManager subscriptions; + protected: /// @@ -136,7 +142,6 @@ namespace core { TCPSession * accept(); std::mutex lock; - SubscriptionManager subscriptions; }; diff --git a/TCPSession.cpp b/TCPSession.cpp index ef51955..45bd1e0 100644 --- a/TCPSession.cpp +++ b/TCPSession.cpp @@ -9,6 +9,7 @@ namespace core { TCPSession::~TCPSession() { server.removeFromSessionList(this); + server.subscriptions.removeSessionSubscriptions(*this); coreutils::Log(coreutils::LOG_DEBUG_1) << "Terminating TCPSession level."; } @@ -17,8 +18,10 @@ namespace core { } void TCPSession::protocol(coreutils::ZString &data) { - if(!server.commands.processRequest(data, *this)) { - coreutils::Log(coreutils::LOG_DEBUG_1) << "Received data could not be parsed: " << data.str(); + if(data.getLength() != 0) { + if(!server.commands.processRequest(data, *this)) { + coreutils::Log(coreutils::LOG_DEBUG_1) << "Received data could not be parsed: " << data.str(); + } } } @@ -35,33 +38,33 @@ namespace core { void TCPSession::onDataReceived(coreutils::ZString &data) { if(data.getLength() > 0) { - lineBuffer = (char *)realloc(lineBuffer, lineBufferSize + data.getLength()); - memcpy(lineBuffer + lineBufferSize, data.getData(), data.getLength()); - lineBufferSize += data.getLength(); - while(lineBufferSize > 0) { - if(blockSize == 0) { - lineLength = strcspn(lineBuffer, "\r\n"); - if(lineLength == lineBufferSize) - break; + lineBuffer = (char *)realloc(lineBuffer, lineBufferSize + data.getLength()); + memcpy(lineBuffer + lineBufferSize, data.getData(), data.getLength()); + lineBufferSize += data.getLength(); + while(lineBufferSize > 0) { + if(blockSize == 0) { + lineLength = strcspn(lineBuffer, "\r\n"); + if(lineLength == lineBufferSize) + break; coreutils::ZString zLine(lineBuffer, lineLength); - onLineReceived(zLine); - if(lineBuffer[lineLength] == '\r') - ++lineLength; - if(lineBuffer[lineLength] == '\n') - ++lineLength; - lineBufferSize -= lineLength; - if(lineBufferSize > 0) - memmove(lineBuffer, lineBuffer + lineLength, lineBufferSize); - lineBuffer = (char *)realloc(lineBuffer, lineBufferSize); + onLineReceived(zLine); + if(lineBuffer[lineLength] == '\r') + ++lineLength; + if(lineBuffer[lineLength] == '\n') + ++lineLength; + lineBufferSize -= lineLength; + if(lineBufferSize > 0) + memmove(lineBuffer, lineBuffer + lineLength, lineBufferSize); + lineBuffer = (char *)realloc(lineBuffer, lineBufferSize); } else if(lineBufferSize >= blockLength) { - coreutils::ZString zBlock(lineBuffer, blockLength); - onBlockReceived(zBlock); - lineBufferSize -= blockLength; - if(lineBufferSize > 0) - memmove(lineBuffer, lineBuffer + blockLength, lineBufferSize); - lineBuffer = (char *)realloc(lineBuffer, lineBufferSize); - } - } + coreutils::ZString zBlock(lineBuffer, blockLength); + onBlockReceived(zBlock); + lineBufferSize -= blockLength; + if(lineBufferSize > 0) + memmove(lineBuffer, lineBuffer + blockLength, lineBufferSize); + lineBuffer = (char *)realloc(lineBuffer, lineBufferSize); + } + } } } @@ -84,7 +87,7 @@ namespace core { void TCPSession::send() { if(out.tellp() > 0) - write(out.str()); + write(out.str()); out.str(""); } diff --git a/compile b/compile index 404498b..ca6498e 100755 --- a/compile +++ b/compile @@ -5,7 +5,7 @@ do filename="${file%.*}" list="$list $filename.o" echo -n "Compiling $filename..." - g++ -g -c -I../CoreUtils $file & + g++ -g -c -std=c++17 -I../CoreUtils $file & if [ $? = '0' ] then echo "OK" diff --git a/output/main b/output/main index 3b68dd899ada3834349b4ebab3e92df583f2eefc..99f2acbf1cf5fb9e8cbdb9d0c842c9faa7beb4f6 100755 GIT binary patch delta 27644 zcmaic1$b1~_WijtlbmEohKUeQ$RIJ2KyVGgH9#69Sb;!rcOR^{ABsB^X^~P~3U#Wy zSEE#DA5^H&Qd;_2XkYtZd!Ku6$dlhc-#5wHXCGhd>~pSUo_;Ry%yWUO(~SDZ(wjOX zn?82(TjfnZ)#~E6w`zTJIMMs%7XR^?&Ig(0j*Sq))gxSpCIM=0jY>wF<9lmNadiD< zh7iU%hY-O(j1~BCZv`%QaW*m+$DPHW=V6D)LLmZbhn{r_5gH5}6wtZcQ!qStd&5x> z`ezA>mM2d@q4%yDQ!Cm(t_zHAA(uA_QQav-9ejfCQ4?XiGT`YRa&^5B?U35p_JlWU z3{O$$jZh(|#v$;GBJTq#7s1u{mpcxl$McZ9*e-_-3FzX&BM^A_UI(%Q-{y-`p`Hvmw*<@Kq^{$-|#Kv@4PWfvm_~)E} zXRfR_1tnXdt}giSK!e8*rkcMW1OEc)90h*~d}A%YH-u`guq+P#)!si6ga}81u>}5A zl!pf$RlX(Mn`9OSokZ@vwoABgf*KW9C)}T%i%hM8uJjRthT|oNh-n!wgmf5*-(dD) zyY&aRU%)AkEJZbe4MGM52oX00`~^13ilwUKuhxLkIE%Uwo-_wIH|$0tku5|fJ~i

rOQ6TG2MNAW_$4a+v>eqJ1p4wYGWdRm!YrA$=x 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 a!)R(u-S8Uz1b_Ot!QJk)A#9UT@&5rajR^Gs delta 27625 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