2 * ***** BEGIN GPL LICENSE BLOCK *****
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19 * All rights reserved.
21 * The Original Code is: all of this file.
23 * Contributor(s): none yet.
25 * ***** END GPL LICENSE BLOCK *****
26 * NetworkSceneManagement generic implementation
29 /** \file gameengine/Network/NG_NetworkScene.cpp
34 #include <MT_assert.h>
37 #include "NG_NetworkScene.h"
38 #include "NG_NetworkDeviceInterface.h"
39 #include "NG_NetworkMessage.h"
40 #include "NG_NetworkObject.h"
42 NG_NetworkScene::NG_NetworkScene(NG_NetworkDeviceInterface* nic)
44 m_networkdevice = nic;
47 NG_NetworkScene::~NG_NetworkScene()
49 ClearAllMessageMaps();
53 * progress one frame, handle all network traffic
55 void NG_NetworkScene::proceed(double curtime)
57 if (!m_networkdevice) return;
58 if (!m_networkdevice->IsOnline()) return;
60 ClearAllMessageMaps();
62 // read all NetworkMessages from the device
63 vector<NG_NetworkMessage*> messages =
64 m_networkdevice->RetrieveNetworkMessages();
66 vector<NG_NetworkMessage*>::iterator mesit = messages.begin();
67 for (; !(mesit == messages.end()); mesit++) {
68 NG_NetworkMessage* message = (*mesit);
69 vector<NG_NetworkMessage*>* tmplist=NULL;
71 vector<NG_NetworkMessage*>** tmplistptr =
72 m_messagesByDestinationName[message->GetDestinationName()];
73 // if there is already a vector of messages, append, else create
74 // a new vector and insert into map
76 tmplist = new vector<NG_NetworkMessage*>;
77 m_messagesByDestinationName.insert(message->GetDestinationName(),
80 tmplist = *tmplistptr;
83 tmplist->push_back(message);
86 tmplistptr = m_messagesBySenderName[message->GetSenderName()];
87 // if there is already a vector of messages, append, else create
88 // a new vector and insert into map
90 tmplist = new vector<NG_NetworkMessage*>;
91 m_messagesBySenderName.insert(message->GetSenderName(), tmplist);
93 tmplist = *tmplistptr;
96 tmplist->push_back(message);
99 tmplistptr = m_messagesBySubject[message->GetSubject()];
100 // if there is already a vector of messages, append, else create
101 // a new vector and insert into map
103 tmplist = new vector<NG_NetworkMessage*>;
104 m_messagesBySubject.insert(message->GetSubject(), tmplist);
106 tmplist = *tmplistptr;
109 tmplist->push_back(message);
115 * add a network object to the network scene
117 void NG_NetworkScene::AddObject(NG_NetworkObject* object)
119 if (! m_networkdevice->IsOnline()) return;
121 const STR_String& name = object->GetName();
122 m_networkObjects.insert(name, object);
126 * remove a network object from the network scene
128 void NG_NetworkScene::RemoveObject(NG_NetworkObject* object)
130 if (! m_networkdevice->IsOnline()) return;
132 const STR_String& name = object->GetName();
133 m_networkObjects.remove(name);
137 * remove all network scene objects at once
139 void NG_NetworkScene::RemoveAllObjects()
141 m_networkObjects.clear();
145 * get a single network object given its name
147 NG_NetworkObject* NG_NetworkScene::FindNetworkObject(const STR_String& objname)
149 NG_NetworkObject *nwobj = NULL;
150 if (! m_networkdevice->IsOnline()) return nwobj;
152 NG_NetworkObject **nwobjptr = m_networkObjects[objname];
160 bool NG_NetworkScene::ConstraintsAreValid(
161 const STR_String& from,
162 const STR_String& subject,
163 NG_NetworkMessage* message)
165 vector<NG_NetworkMessage*>** fromlistptr = m_messagesBySenderName[from];
166 vector<NG_NetworkMessage*>** subjectlistptr = m_messagesBySubject[subject];
168 vector<NG_NetworkMessage*>* fromlist = (fromlistptr ? *fromlistptr : NULL);
169 vector<NG_NetworkMessage*>* subjectlist = (subjectlistptr ? *subjectlistptr : NULL);
172 ( from.IsEmpty() || (!fromlist ? false : (!(std::find(fromlist->begin(), fromlist->end(), message) == fromlist->end())))
174 ( subject.IsEmpty() || (!subjectlist ? false : (!(std::find(subjectlist->begin(), subjectlist->end(), message) == subjectlist->end())))
178 vector<NG_NetworkMessage*> NG_NetworkScene::FindMessages(
179 const STR_String& to,
180 const STR_String& from,
181 const STR_String& subject,
184 vector<NG_NetworkMessage*> foundmessages;
185 bool notfound = false;
188 notfound = ((to.IsEmpty() || spamallowed) ? notfound : m_messagesByDestinationName[to] == NULL);
190 notfound = (from.IsEmpty() ? notfound : m_messagesBySenderName[from] == NULL);
192 notfound = (subject.IsEmpty() ? notfound : m_messagesBySubject[subject] == NULL);
194 // it's definitely NOT in the scene, so stop looking
195 } else { // narrow phase
196 // possibly it's there, but maybe not (false hit)
198 // take all messages, and check other fields
199 MT_assert(!"objectnames that are empty are not valid, so make it a hobby project :)\n");
201 //todo: find intersection of messages (that are in other 2 maps)
202 vector<NG_NetworkMessage*>** tolistptr = m_messagesByDestinationName[to];
204 vector<NG_NetworkMessage*>* tolist = *tolistptr;
205 vector<NG_NetworkMessage*>::iterator listit;
206 for (listit=tolist->begin();!(listit==tolist->end());listit++) {
207 NG_NetworkMessage* message = *listit;
208 if (ConstraintsAreValid(from, subject, message)) {
210 foundmessages.push_back(message);
214 // TODO find intersection of messages (that are in other 2 maps)
216 tolistptr = m_messagesByDestinationName[""];
218 vector<NG_NetworkMessage*>* tolist = *tolistptr;
219 vector<NG_NetworkMessage*>::iterator listit;
220 for (listit=tolist->begin();!(listit==tolist->end());listit++) {
221 NG_NetworkMessage* message = *listit;
222 if (ConstraintsAreValid(from, subject, message)) {
224 foundmessages.push_back(message);
231 return foundmessages;
234 void NG_NetworkScene::SendMessage(
235 const STR_String& to,
236 const STR_String& from,
237 const STR_String& subject,
238 const STR_String& message)
240 NG_NetworkMessage* msg = new NG_NetworkMessage(to, from, subject, message);
241 m_networkdevice->SendNetworkMessage(msg);
245 void NG_NetworkScene::ClearAllMessageMaps(void)
247 ClearMessageMap(m_messagesByDestinationName);
248 ClearMessageMap(m_messagesBySenderName);
249 ClearMessageMap(m_messagesBySubject);
252 void NG_NetworkScene::ClearMessageMap(TMessageMap& map)
254 // Release the messages in the map
255 for (int i = 0; i < map.size(); i++) {
256 vector<NG_NetworkMessage*>* msglist;
257 msglist = *(map.at(i));
259 // Iterate through the current vector and release all it's messages
260 vector<NG_NetworkMessage*>::iterator msgit;
261 for (msgit = msglist->begin(); msgit != msglist->end(); msgit++) {
265 // Delete the actual vector