Compiles
This commit is contained in:
parent
96d9295df8
commit
3ef82e0fce
3
.vscode/c_cpp_properties.json
vendored
3
.vscode/c_cpp_properties.json
vendored
@ -11,7 +11,8 @@
|
||||
"cStandard": "c17",
|
||||
"cppStandard": "gnu++20",
|
||||
"intelliSenseMode": "windows-gcc-x64",
|
||||
"compileCommands": "./compile"
|
||||
"compileCommands": "./compile",
|
||||
"configurationProvider": "ms-vscode.cmake-tools"
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
|
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"cmake.configureOnOpen": false
|
||||
}
|
@ -17,12 +17,18 @@ namespace core {
|
||||
else {
|
||||
if(request.equals(""))
|
||||
return false;
|
||||
request.split(delimiter);
|
||||
auto command = commands[request[0].str()];
|
||||
request.split(delimiter, 2);
|
||||
request.reset();
|
||||
try {
|
||||
auto command = commands.at(request[0].str());
|
||||
return command->processCommand(request, session);
|
||||
}
|
||||
catch(...) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CommandList::grabInput(TCPSession &session, Command &command) {
|
||||
session.grab = &command;
|
||||
|
@ -33,6 +33,7 @@ namespace core {
|
||||
out << "Password: ";
|
||||
status = WAIT_PASSWORD;
|
||||
break;
|
||||
|
||||
case WAIT_PASSWORD:
|
||||
status = PROMPT;
|
||||
protocol(blank);
|
||||
|
@ -115,6 +115,7 @@ namespace core {
|
||||
|
||||
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 {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include "Command.h"
|
||||
#include "ZString.h"
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
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<TCPSession *> subscribers;
|
||||
|
||||
|
@ -6,50 +6,63 @@ 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)) {
|
||||
auto subscription = subscriptions[request[1].str()];
|
||||
|
||||
if(request[1].equals(subscription->id)) {
|
||||
if(request[0].equals("unpublish")) {
|
||||
subscriptions.erase(subscription);
|
||||
subscriptions.erase(request[1].str());
|
||||
} else if(request[0].equals("subscribe")) {
|
||||
(*subscription)->subscribe(session);
|
||||
subscription->subscribe(session);
|
||||
} else if(request[0].equals("unsubscribe")) {
|
||||
(*subscription)->unsubscribe(session);
|
||||
subscription->unsubscribe(session);
|
||||
} else if(request[0].equals("event")) {
|
||||
if((*subscription)->owner == &session) {
|
||||
if(&subscription->owner == &session) {
|
||||
std::stringstream out;
|
||||
(*subscription)->process(request, out);
|
||||
(*subscription)->event(out);
|
||||
subscription->process(request, out);
|
||||
subscription->event(out);
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "Command.h"
|
||||
#include "ZString.h"
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
namespace core {
|
||||
|
||||
@ -19,7 +20,7 @@ namespace core {
|
||||
int processCommand(coreutils::ZString &request, TCPSession &session) override;
|
||||
|
||||
private:
|
||||
std::vector<Subscription *> subscriptions;
|
||||
std::map<std::string, Subscription *> subscriptions;
|
||||
|
||||
};
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
@ -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,10 +18,12 @@ namespace core {
|
||||
}
|
||||
|
||||
void TCPSession::protocol(coreutils::ZString &data) {
|
||||
if(data.getLength() != 0) {
|
||||
if(!server.commands.processRequest(data, *this)) {
|
||||
coreutils::Log(coreutils::LOG_DEBUG_1) << "Received data could not be parsed: " << data.str();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TCPSession::onRegistered() {
|
||||
onConnected();
|
||||
|
2
compile
2
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"
|
||||
|
BIN
output/main
BIN
output/main
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user