Initial revision
[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 NAN_NET_DEBUG
45   #include <iostream>
46 #endif
47
48 KX_NetworkMessageSensor::KX_NetworkMessageSensor(
49         class KX_NetworkEventManager* eventmgr, // our eventmanager
50         class NG_NetworkScene *NetworkScene,    // our scene
51         SCA_IObject* gameobj,                                   // the sensor controlling object
52         const STR_String &subject,
53         PyTypeObject* T
54 ) :
55     SCA_ISensor(gameobj,eventmgr,T),
56     m_Networkeventmgr(eventmgr),
57     m_NetworkScene(NetworkScene),
58     m_subject(subject),
59         m_frame_message_count (0),
60     m_IsUp(false),
61         m_BodyList(NULL)
62 {
63 }
64
65 KX_NetworkMessageSensor::~KX_NetworkMessageSensor()
66 {
67 }
68
69 CValue* KX_NetworkMessageSensor::GetReplica() {
70         // This is the standard sensor implementation of GetReplica
71         // There may be more network message sensor specific stuff to do here.
72         CValue* replica = new KX_NetworkMessageSensor(*this);
73
74         if (replica == NULL) return NULL;
75
76         // this will copy properties and so on...
77         CValue::AddDataToReplica(replica);
78
79         return replica;
80 }
81
82 // Return true only for flank (UP and DOWN)
83 bool KX_NetworkMessageSensor::Evaluate(CValue* event)
84 {
85         bool result = false;
86         bool WasUp = m_IsUp;
87
88         m_IsUp = false;
89         if (m_BodyList) {
90                 m_BodyList->Release();
91                 m_BodyList = NULL;
92         }
93
94         STR_String toname=GetParent()->GetName();
95         STR_String subject = this->m_subject;
96
97         vector<NG_NetworkMessage*> messages =
98                 m_NetworkScene->FindMessages(toname,"",subject,true);
99
100         m_frame_message_count = messages.size();
101
102         if (!messages.empty()) {
103 #ifdef NAN_NET_DEBUG
104                 printf("KX_NetworkMessageSensor found one or more messages\n");
105 #endif
106                 m_IsUp = true;
107                 m_BodyList = new CListValue();
108         }
109
110         vector<NG_NetworkMessage*>::iterator mesit;
111         for (mesit=messages.begin();mesit!=messages.end();mesit++)
112         {
113                 // save the body
114                 STR_String body = (*mesit)->GetMessageText();
115 #ifdef NAN_NET_DEBUG
116                 if (body) {
117                         cout << "body [" << body << "]\n";
118                 }
119 #endif
120                 m_BodyList->Add(new CStringValue(body,"body"));
121
122                 // free the message
123                 (*mesit)->Release();
124         }
125         messages.clear();
126
127         result = (WasUp != m_IsUp);
128
129         // Return true if the message received state has changed. 
130         return result;
131 }
132
133 // return true for being up (no flank needed)
134 bool KX_NetworkMessageSensor::IsPositiveTrigger()
135 {
136 //      printf("KX_NetworkMessageSensor IsPositiveTrigger\n");
137         return m_IsUp;
138 }
139
140 /* --------------------------------------------------------------------- */
141 /* Python interface ---------------------------------------------------- */
142 /* --------------------------------------------------------------------- */
143
144 /* Integration hooks --------------------------------------------------- */
145 PyTypeObject KX_NetworkMessageSensor::Type = {
146         PyObject_HEAD_INIT(&PyType_Type)
147         0,
148         "KX_NetworkMessageSensor",
149         sizeof(KX_NetworkMessageSensor),
150         0,
151         PyDestructor,
152         0,
153         __getattr,
154         __setattr,
155         0, //&MyPyCompare,
156         __repr,
157         0, //&cvalue_as_number,
158         0,
159         0,
160         0,
161         0
162 };
163
164 PyParentObject KX_NetworkMessageSensor::Parents[] = {
165         &KX_NetworkMessageSensor::Type,
166         &SCA_ISensor::Type,
167         &SCA_ILogicBrick::Type,
168         &CValue::Type,
169         NULL
170 };
171
172 PyMethodDef KX_NetworkMessageSensor::Methods[] = {
173         {"setSubjectFilterText", (PyCFunction)
174                 KX_NetworkMessageSensor::sPySetSubjectFilterText, METH_VARARGS,
175                 SetSubjectFilterText_doc},
176         {"getFrameMessageCount", (PyCFunction)
177                 KX_NetworkMessageSensor::sPyGetFrameMessageCount, METH_VARARGS,
178                 GetFrameMessageCount_doc},
179         {"getBodies", (PyCFunction)
180                 KX_NetworkMessageSensor::sPyGetBodies, METH_VARARGS,
181                 GetBodies_doc},
182         {"getSubject", (PyCFunction)
183                 KX_NetworkMessageSensor::sPyGetSubject, METH_VARARGS,
184                 GetSubject_doc},
185         {NULL,NULL} //Sentinel
186 };
187
188 PyObject* KX_NetworkMessageSensor::_getattr(char* attr) {
189         _getattr_up(SCA_ISensor); // implicit return!
190 }
191
192 // 1. Set the message subject that this sensor listens for
193 char KX_NetworkMessageSensor::SetSubjectFilterText_doc[] = 
194 "\tsetSubjectFilterText(value)\n"
195 "\tChange the message subject text that this sensor is listening to.\n";
196
197 PyObject* KX_NetworkMessageSensor::PySetSubjectFilterText(
198         PyObject* self,
199         PyObject* args,
200         PyObject* kwds)
201 {
202         char* Subject;
203
204         if (PyArg_ParseTuple(args, "s", &Subject))
205         {
206              m_subject = Subject;
207         }
208
209         Py_Return;
210 }
211
212 // 2. Get the number of messages received since the last frame
213 char KX_NetworkMessageSensor::GetFrameMessageCount_doc[] =
214 "\tgetFrameMessageCount()\n"
215 "\tGet the number of messages received since the last frame.\n";
216
217 PyObject* KX_NetworkMessageSensor::PyGetFrameMessageCount(
218         PyObject* self,
219         PyObject* args,
220         PyObject* kwds)
221 {
222         return PyInt_FromLong(long(m_frame_message_count));
223 }
224
225 // 3. Get the message bodies
226 char KX_NetworkMessageSensor::GetBodies_doc[] =
227 "\tgetBodies()\n"
228 "\tGet the list of message bodies.\n";
229
230 PyObject* KX_NetworkMessageSensor::PyGetBodies(
231         PyObject* self,
232         PyObject* args,
233         PyObject* kwds)
234 {
235         if (m_BodyList) {
236                 return ((PyObject*) m_BodyList->AddRef());
237         }
238
239         Py_Return;
240 }
241
242 // 4. Get the message subject
243 char KX_NetworkMessageSensor::GetSubject_doc[] =
244 "\tgetSubject()\n"
245 "\tGet the subject of the message.\n";
246
247 PyObject* KX_NetworkMessageSensor::PyGetSubject(
248         PyObject* self,
249         PyObject* args,
250         PyObject* kwds)
251 {
252         if (m_subject) {
253                 return PyString_FromString(m_subject);
254         }
255
256         Py_Return;
257 }
258