bool HasClient(const CClient& client) const {
bool bHasClient = false;
- for (std::vector<CClient*>::const_iterator it = m_vClients.begin();
- it != m_vClients.end(); ++it) {
- CClient *pCurrentClient = *it;
+ for (std::map<CClient*, CString>::const_iterator it = m_mClientNetworkIDs.begin(); it != m_mClientNetworkIDs.end(); ++it) {
+ CClient *pCurrentClient = it->first;
if (&client == pCurrentClient) {
bHasClient = true;
return bHasClient;
}
- void AddClient(CClient& client) {
+ void AddClient(CClient &client, const CString& sNetworkID) {
if (HasClient(client) == false) {
- m_vClients.push_back(&client);
+ m_mClientNetworkIDs[&client] = sNetworkID;
}
}
void RemoveClient(const CClient& client) {
- for (std::vector<CClient*>::iterator it = m_vClients.begin();
- it != m_vClients.end(); ++it) {
- CClient *pCurrentClient = *it;
+ for (std::map<CClient*, CString>::iterator it = m_mClientNetworkIDs.begin(); it != m_mClientNetworkIDs.end(); ++it) {
+ CClient *pCurrentClient = it->first;
if (&client == pCurrentClient) {
- m_vClients.erase(it);
+ m_mClientNetworkIDs.erase(it);
break;
}
}
}
- bool AddNetwork(CIRCNetwork& network) {
- return AddNetworkNamed(network.GetUser()->GetUserName(), network.GetName());
+ const CString GetNetworkID(const CClient &client) const {
+ for (std::map<CClient*, CString>::const_iterator it = m_mClientNetworkIDs.begin(); it != m_mClientNetworkIDs.end(); ++it) {
+ CClient *pCurrentClient = it->first;
+
+ if (&client == pCurrentClient) {
+ return it->second;
+ }
+ }
+
+ return CString();
+ }
+
+ bool AddNetwork(const CIRCNetwork& network, const CString& sNetworkID) {
+ return AddNetworkNamed(network.GetUser()->GetUserName(), network.GetName(), sNetworkID);
}
bool HasNetworkNamed(const CString& sUsername, const CString& sNetwork) const {
bool bHasNetwork = false;
- std::map<CString, VCString>::const_iterator it = m_msvsNetworks.find(sUsername);
- if (it != m_msvsNetworks.end()) {
- const VCString& vNetworks = it->second;
+ std::map<CString, MCString>::const_iterator it = m_msmsNetworks.find(sUsername);
+ if (it != m_msmsNetworks.end()) {
+ const MCString& mNetworks = it->second;
- for (VCString::const_iterator it2 = vNetworks.begin(); it2 != vNetworks.end(); ++it2) {
- const CString &name = *it2;
+ for (MCString::const_iterator it2 = mNetworks.begin(); it2 != mNetworks.end(); ++it2) {
+ const CString &name = it2->first;
if (name.Equals(sNetwork)) {
bHasNetwork = true;
return bHasNetwork;
}
- bool AddNetworkNamed(const CString& sUsername, const CString& sNetwork) {
+ bool AddNetworkNamed(const CString& sUsername, const CString& sNetwork, const CString& sNetworkID) {
bool bDidAddNetwork = false;
if (HasNetworkNamed(sUsername, sNetwork) == false) {
- m_msvsNetworks[sUsername].push_back(sNetwork);
+ m_msmsNetworks[sUsername][sNetwork] = sNetworkID;
bDidAddNetwork = true;
}
const CUser *user = network.GetUser();
const CString& sUsername = user->GetUserName();
- std::map<CString, VCString>::iterator it = m_msvsNetworks.find(sUsername);
- if (it != m_msvsNetworks.end()) {
- VCString &networks = it->second;
+ std::map<CString, MCString>::iterator it = m_msmsNetworks.find(sUsername);
+ if (it != m_msmsNetworks.end()) {
+ MCString &networks = it->second;
- for (VCString::iterator it2 = networks.begin(); it2 != networks.end(); ++it2) {
- CString &name = *it2;
+ for (MCString::iterator it2 = networks.begin(); it2 != networks.end(); ++it2) {
+ const CString &name = it2->first;
if (name.Equals(network.GetName())) {
networks.erase(it2);
}
if (networks.empty()) {
- m_msvsNetworks.erase(it);
+ m_msmsNetworks.erase(it);
}
}
}
const CUser *user = network.GetUser();
const CString& sUsername = user->GetUserName();
- std::map<CString, VCString>::iterator it = m_msvsNetworks.find(sUsername);
- if (it != m_msvsNetworks.end()) {
- VCString &networks = it->second;
+ std::map<CString, MCString>::const_iterator it = m_msmsNetworks.find(sUsername);
+ if (it != m_msmsNetworks.end()) {
+ const MCString &networks = it->second;
- for (VCString::iterator it2 = networks.begin(); it2 != networks.end(); ++it2) {
- CString &name = *it2;
+ for (MCString::const_iterator it2 = networks.begin(); it2 != networks.end(); ++it2) {
+ const CString &name = it2->first;
if (name.Equals(network.GetName())) {
hasNetwork = true;
return hasNetwork;
}
+ const CString GetNetworkID(const CIRCNetwork& network) const {
+ const CString sUsername = network.GetUser()->GetUserName();
+ std::map<CString, MCString>::const_iterator it = m_msmsNetworks.find(sUsername);
+ if (it != m_msmsNetworks.end()) {
+ const MCString &networks = it->second;
+
+ for (MCString::const_iterator it2 = networks.begin(); it2 != networks.end(); ++it2) {
+ const CString &name = it2->first;
+
+ if (name.Equals(network.GetName())) {
+ return it2->second;
+ }
+ }
+ }
+
+ return "";
+ }
+
void ResetDevice() {
m_bInNegotiation = false;
m_sVersion = "";
} else if (sKey.Equals(kPLVMentionNickKey)) {
AddMentionNick(sValue);
} else if (sKey.Equals("NETWORK")) {
+ // Only from config file
CString sUsername = sValue.Token(0);
CString sNetwork = sValue.Token(1);
+ CString sNetworkID = sValue.Token(2);
- AddNetworkNamed(sUsername, sNetwork);
+ AddNetworkNamed(sUsername, sNetwork, sNetworkID);
}
} else if (sCommand.Equals("END")) {
SetInNegotiation(false);
File.Write("ADD " + CString(kPLVIgnoreNickKey) + " " + sNick + "\n");
}
- for (std::map<CString, VCString>::const_iterator it = m_msvsNetworks.begin();
- it != m_msvsNetworks.end(); ++it) {
+ for (std::map<CString, MCString>::const_iterator it = m_msmsNetworks.begin(); it != m_msmsNetworks.end(); ++it) {
const CString& sUsername = it->first;
- const VCString& networks = it->second;
+ const MCString& networks = it->second;
- for (VCString::const_iterator it2 = networks.begin();
+ for (MCString::const_iterator it2 = networks.begin();
it2 != networks.end(); ++it2) {
- const CString& sNetwork = *it2;
+ const CString& sNetwork = it2->first;
+ const CString& sNetworkID = it2->second;
- File.Write("ADD NETWORK " + sUsername + " " + sNetwork + "\n");
+ File.Write("ADD NETWORK " + sUsername + " " + sNetwork + " " + sNetworkID + "\n");
}
}
if (pChannel) {
sJSON += ",\"channel\": \"" + pChannel->GetName().Replace_n("\"", "\\\"") + "\"";
}
+ if (module.GetNetwork()) {
+ const CString sNetworkID = GetNetworkID(*module.GetNetwork());
+ sJSON += ",\"network\": \"" + sNetworkID.Replace_n("\"", "\\\"") + "\"";
+ }
sJSON += "}";
PLVHTTPSocket *pSocket = new PLVHTTPSocket(&module, "POST", GetPushEndpoint(), mcsHeaders, sJSON);
}
}
- std::map<CString, VCString> GetNetworks() const {
- return m_msvsNetworks;
+ std::map<CString, MCString> GetNetworks() const {
+ return m_msmsNetworks;
}
private:
CString m_sVersion;
CString m_sPushEndpoint;
- std::map<CString, VCString> m_msvsNetworks;
+ std::map<CString, MCString> m_msmsNetworks;
- std::vector<CClient*> m_vClients;
+ // Connected clients along with the clients network ID
+ std::map<CClient*, CString> m_mClientNetworkIDs;
VCString m_vMentionKeywords;
VCString m_vMentionChannels;
CString sToken = sLine.Token(2);
CString sVersion = sLine.Token(3);
+ CString sNetworkID = sLine.Token(4);
CDevice& device = DeviceWithToken(sToken);
device.SetInNegotiation(true);
}
- device.AddClient(*pClient);
+ device.AddClient(*pClient, sNetworkID);
CIRCNetwork *pNetwork = pClient->GetNetwork();
if (pNetwork) {
- if (device.AddNetwork(*pNetwork) && device.InNegotiation() == false) {
+ if (device.AddNetwork(*pNetwork, sNetworkID) && device.InNegotiation() == false) {
Save();
}
}
} else if (sCommand.Equals("BEGIN")) {
+ CDevice *pDevice = DeviceForClient(*pClient);
+ if (pDevice == NULL) {
+ // BEGIN before we received an client identification
+ return HALT;
+ }
+
CString sToken = sLine.Token(2);
CString sVersion = sLine.Token(3);
- CDevice& device = DeviceWithToken(sToken);
- device.ResetDevice();
- device.SetInNegotiation(true);
- device.SetVersion(sVersion);
+ if (!pDevice->GetToken().Equals(sToken)) {
+ // Setting was for a different device than the one the user registered with
+ return HALT;
+ }
- device.AddClient(*pClient);
+ pDevice->ResetDevice();
+ pDevice->SetInNegotiation(true);
+ pDevice->SetVersion(sVersion);
} else if (sCommand.Equals("SET") || sCommand.Equals("ADD") || sCommand.Equals("END")) {
CDevice *pDevice = DeviceForClient(*pClient);
// Associate client with the user/network
CDevice *pDevice = DeviceForClient(*m_pClient);
if (pDevice && m_pNetwork) {
- if (pDevice->AddNetwork(*m_pNetwork)) {
+ const CString sNetworkID = pDevice->GetNetworkID(*m_pClient);
+ if (pDevice->AddNetwork(*m_pNetwork, sNetworkID)) {
Save();
}
}
{
CDevice &device = **it;
- const std::map<CString, VCString> msvsNetworks = device.GetNetworks();
- std::map<CString, VCString>::const_iterator it2 = msvsNetworks.begin();
- for (;it2 != msvsNetworks.end(); ++it2) {
+ const std::map<CString, MCString> msmsNetworks = device.GetNetworks();
+ std::map<CString, MCString>::const_iterator it2 = msmsNetworks.begin();
+ for (;it2 != msmsNetworks.end(); ++it2) {
const CString sUsername = it2->first;
- const VCString &networks = it2->second;
+ const MCString &networks = it2->second;
- for (VCString::const_iterator it3 = networks.begin(); it3 != networks.end(); ++it3) {
- const CString sNetwork = *it3;
+ for (MCString::const_iterator it3 = networks.begin(); it3 != networks.end(); ++it3) {
+ const CString sNetwork = it3->first;
Table.AddRow();
Table.SetCell("Device", device.GetToken());
}
}
- if (msvsNetworks.size() == 0) {
+ if (msmsNetworks.size() == 0) {
Table.AddRow();
Table.SetCell("Device", device.GetToken());
Table.SetCell("User", "");