7e1e46d029a7ec0973756be022f115837f9c8a9c
[blender.git] / source / gameengine / Ketsji / KXNetwork / KX_NetworkMessageSensor.cpp
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  * Ketsji Logic Extenstion: Network Message Sensor generic implementation
32  */
33
34 #include "KX_NetworkMessageSensor.h"
35 #include "KX_NetworkEventManager.h"
36 #include "NG_NetworkMessage.h"
37 #include "NG_NetworkScene.h"
38 #include "NG_NetworkObject.h"
39 #include "SCA_IObject.h"        
40 #include "InputParser.h"
41 #include "ListValue.h"
42 #include "StringValue.h"
43
44 #ifdef HAVE_CONFIG_H
45 #include <config.h>
46 #endif
47
48 #ifdef NAN_NET_DEBUG
49   #include <iostream>
50 #endif
51
52 KX_NetworkMessageSensor::KX_NetworkMessageSensor(
53         class KX_NetworkEventManager* eventmgr, // our eventmanager
54         class NG_NetworkScene *NetworkScene,    // our scene
55         SCA_IObject* gameobj,                                   // the sensor controlling object
56         const STR_String &subject,
57         PyTypeObject* T
58 ) :
59     SCA_ISensor(gameobj,eventmgr,T),
60     m_Networkeventmgr(eventmgr),
61     m_NetworkScene(NetworkScene),
62     m_subject(subject),
63         m_frame_message_count (0),
64     m_IsUp(false),
65         m_BodyList(NULL)
66 {
67 }
68
69 KX_NetworkMessageSensor::~KX_NetworkMessageSensor()
70 {
71 }
72
73 CValue* KX_NetworkMessageSensor::GetReplica() {
74         // This is the standard sensor implementation of GetReplica
75         // There may be more network message sensor specific stuff to do here.
76         CValue* replica = new KX_NetworkMessageSensor(*this);
77
78         if (replica == NULL) return NULL;
79
80         // this will copy properties and so on...
81         CValue::AddDataToReplica(replica);
82
83         return replica;
84 }
85
86 // Return true only for flank (UP and DOWN)
87 bool KX_NetworkMessageSensor::Evaluate(CValue* event)
88 {
89         bool result = false;
90         bool WasUp = m_IsUp;
91
92         m_IsUp = false;
93         if (m_BodyList) {
94                 m_BodyList->Release();
95                 m_BodyList = NULL;
96         }
97
98         STR_String toname=GetParent()->GetName();
99         STR_String subject = this->m_subject;
100
101         vector<NG_NetworkMessage*> messages =
102                 m_NetworkScene->FindMessages(toname,"",subject,true);
103
104         m_frame_message_count = messages.size();
105
106         if (!messages.empty()) {
107 #ifdef NAN_NET_DEBUG
108                 printf("KX_NetworkMessageSensor found one or more messages\n");
109 #endif
110                 m_IsUp = true;
111                 m_BodyList = new CListValue();
112         }
113
114         vector<NG_NetworkMessage*>::iterator mesit;
115         for (mesit=messages.begin();mesit!=messages.end();mesit++)
116         {
117                 // save the body
118                 STR_String body = (*mesit)->GetMessageText();
119 #ifdef NAN_NET_DEBUG
120                 if (body) {
121                         cout << "body [" << body << "]\n";
122                 }
123 #endif
124                 m_BodyList->Add(new CStringValue(body,"body"));
125
126                 // free the message
127                 (*mesit)->Release();
128         }
129         messages.clear();
130
131         result = (WasUp != m_IsUp);
132
133         // Return true if the message received state has changed. 
134         return result;
135 }
136
137 // return true for being up (no flank needed)
138 bool KX_NetworkMessageSensor::IsPositiveTrigger()
139 {
140 //      printf("KX_NetworkMessageSensor IsPositiveTrigger\n");
141         return m_IsUp;
142 }
143
144 /* --------------------------------------------------------------------- */
145 /* Python interface ---------------------------------------------------- */
146 /* --------------------------------------------------------------------- */
147
148 /* Integration hooks --------------------------------------------------- */
149 PyTypeObject KX_NetworkMessageSensor::Type = {
150         PyObject_HEAD_INIT(&PyType_Type)
151         0,
152         "KX_NetworkMessageSensor",
153         sizeof(KX_NetworkMessageSensor),
154         0,
155         PyDestructor,
156         0,
157         __getattr,
158         __setattr,
159         0, //&MyPyCompare,
160         __repr,
161         0, //&cvalue_as_number,
162         0,
163         0,
164         0,
165         0
166 };
167
168 PyParentObject KX_NetworkMessageSensor::Parents[] = {
169         &KX_NetworkMessageSensor::Type,
170         &SCA_ISensor::Type,
171         &SCA_ILogicBrick::Type,
172         &CValue::Type,
173         NULL
174 };
175
176 PyMethodDef KX_NetworkMessageSensor::Methods[] = {
177         {"setSubjectFilterText", (PyCFunction)
178                 KX_NetworkMessageSensor::sPySetSubjectFilterText, METH_VARARGS,
179                 SetSubjectFilterText_doc},
180         {"getFrameMessageCount", (PyCFunction)
181                 KX_NetworkMessageSensor::sPyGetFrameMessageCount, METH_VARARGS,
182                 GetFrameMessageCount_doc},
183         {"getBodies", (PyCFunction)
184                 KX_NetworkMessageSensor::sPyGetBodies, METH_VARARGS,
185                 GetBodies_doc},
186         {"getSubject", (PyCFunction)
187                 KX_NetworkMessageSensor::sPyGetSubject, METH_VARARGS,
188                 GetSubject_doc},
189         {NULL,NULL} //Sentinel
190 };
191
192 PyObject* KX_NetworkMessageSensor::_getattr(char* attr) {
193         _getattr_up(SCA_ISensor); // implicit return!
194 }
195
196 // 1. Set the message subject that this sensor listens for
197 char KX_NetworkMessageSensor::SetSubjectFilterText_doc[] = 
198 "\tsetSubjectFilterText(value)\n"
199 "\tChange the message subject text that this sensor is listening to.\n";
200
201 PyObject* KX_NetworkMessageSensor::PySetSubjectFilterText(
202         PyObject* self,
203         PyObject* args,
204         PyObject* kwds)
205 {
206         char* Subject;
207
208         if (PyArg_ParseTuple(args, "s", &Subject))
209         {
210              m_subject = Subject;
211         }
212
213         Py_Return;
214 }
215
216 // 2. Get the number of messages received since the last frame
217 char KX_NetworkMessageSensor::GetFrameMessageCount_doc[] =
218 "\tgetFrameMessageCount()\n"
219 "\tGet the number of messages received since the last frame.\n";
220
221 PyObject* KX_NetworkMessageSensor::PyGetFrameMessageCount(
222         PyObject* self,
223         PyObject* args,
224         PyObject* kwds)
225 {
226         return PyInt_FromLong(long(m_frame_message_count));
227 }
228
229 // 3. Get the message bodies
230 char KX_NetworkMessageSensor::GetBodies_doc[] =
231 "\tgetBodies()\n"
232 "\tGet the list of message bodies.\n";
233
234 PyObject* KX_NetworkMessageSensor::PyGetBodies(
235         PyObject* self,
236         PyObject* args,
237         PyObject* kwds)
238 {
239         if (m_BodyList) {
240                 return ((PyObject*) m_BodyList->AddRef());
241         }
242
243         Py_Return;
244 }
245
246 // 4. Get the message subject
247 char KX_NetworkMessageSensor::GetSubject_doc[] =
248 "\tgetSubject()\n"
249 "\tGet the subject of the message.\n";
250
251 PyObject* KX_NetworkMessageSensor::PyGetSubject(
252         PyObject* self,
253         PyObject* args,
254         PyObject* kwds)
255 {
256         if (m_subject) {
257                 return PyString_FromString(m_subject);
258         }
259
260         Py_Return;
261 }
262