Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/proxy/src/lib/network/proxy/proxy_control.cc @ 9586

Last change on this file since 9586 was 9586, checked in by patrick, 18 years ago

removing the client from the network monitor does also work now

File size: 6.1 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Patrick Boenzli (patrick@orxonox.ethz.ch)
13*/
14
15#include "proxy_control.h"
16
17#include "class_list.h"
18
19
20#include "state.h"
21#include "shared_network_data.h"
22#include "network_game_manager.h"
23#include "ip.h"
24#include "peer_info.h"
25
26#include "converter.h"
27
28#include "preferences.h"
29
30#include "debug.h"
31
32#include "monitor/network_monitor.h"
33
34
35ProxyControl* ProxyControl::singletonRef = NULL;
36
37
38/**
39 * constructor
40 */
41ProxyControl::ProxyControl()
42{
43  this->setClassID( CL_PROXY_CONTROL, "ProxyControl" );
44
45  MessageManager::getInstance()->registerMessageHandler( MSGID_PROXY_NEWCLIENT, messageHandlerNewClient, NULL );
46  MessageManager::getInstance()->registerMessageHandler( MSGID_PROXY_LEAVECLIENT, messageHandlerLeaveClient, NULL );
47
48
49  PRINTF(0)("ProxyControl created\n");
50}
51
52
53/**
54 * standard deconstructor
55 */
56ProxyControl::~ProxyControl()
57{
58  ProxyControl::singletonRef = NULL;
59}
60
61
62 /**
63 * override this function to be notified on change
64 * of your registred variables.
65 * @param id id's which have changed
66  */
67void ProxyControl::varChangeHandler( std::list< int > & id )
68{
69//   if ( std::find( id.begin(), id.end(), playableUniqueId_handle ) != id.end() )
70//   {
71//     this->setPlayableUniqueId( this->playableUniqueId );
72//
73//     PRINTF(0)("uniqueID changed %d %d %d\n", userId, SharedNetworkData::getInstance()->getHostID(), getUniqueID());
74//   }
75}
76
77
78/**
79 *  signals new client connected to this local proxy
80 *
81 *  byte 0 - 3     :      userId
82 *  byte 4 - 7     :      ip address (IPaddress.host)
83 *
84 * @param userId userId of the new client
85 */
86void ProxyControl::signalNewClient(int userId)
87{
88  PRINTF(0)("Signaling new Client: %i\n", userId);
89  // make sure we are a proxy server
90  assert(SharedNetworkData::getInstance()->isProxyServerActive());
91
92  byte data[2 * INTSIZE];
93  // write the userId in the message
94  assert( Converter::intToByteArray( userId, data, INTSIZE ) == INTSIZE );
95  // and the ip as an int
96  PeerInfo* pInfo = SharedNetworkData::getInstance()->getNetworkMonitor()->getPeerByUserId(userId);
97  assert(pInfo != NULL);
98  assert( Converter::intToByteArray( pInfo->ip.host(), data + INTSIZE, INTSIZE ) == INTSIZE );
99
100  MessageManager::getInstance()->sendMessage( MSGID_PROXY_NEWCLIENT, data, 2*INTSIZE, RT_SERVER, NET_UNASSIGNED, MP_HIGHBANDWIDTH );
101}
102
103
104/**
105 * this is the handler for proxy signals: new clients
106 *
107 * @param messageType the type of the message
108 * @param data message data
109 * @param dataLength length of the message data
110 * @param someData some other atteched data
111 * @param senderId id of the sender client
112 * @param destinationId id of the destination client
113 * @return true if succeeded
114 */
115bool ProxyControl::messageHandlerNewClient( MessageType messageType, byte * data, int dataLength, void * someData, int senderId, int destinationId  )
116{
117  // body data length correct?
118  if ( dataLength != 2 * INTSIZE )
119  {
120    PRINTF(2)("new client message has wrong size: %d\n", dataLength );
121    return true;
122  }
123  // read the userId fromt he message body
124  int newClientId = 0;
125  assert( Converter::byteArrayToInt( data, &newClientId) == INTSIZE );
126  // now read the ip address
127  int ipHost = 0;
128  assert( Converter::byteArrayToInt( data + INTSIZE, &ipHost) == INTSIZE );
129
130  // register the new node at the network monitor
131  NetworkMonitor* netMon = SharedNetworkData::getInstance()->getNetworkMonitor();
132  PeerInfo* pInfo = new PeerInfo();
133  pInfo->bLocal = false;
134  pInfo->ip = IP(ipHost, 9999);
135  pInfo->nodeType = NET_CLIENT;
136  pInfo->userId = newClientId;
137  netMon->addNode(pInfo);
138
139  PRINTF(0)("Got Signal: from %i new player arrived with userId: %i and ip: %i\n", senderId, newClientId, pInfo->ip.ipString().c_str());
140  // part for the master server
141  if( SharedNetworkData::getInstance()->isMasterServer())
142  {
143    // we now create the new player ship and stuff...
144    NetworkGameManager::getInstance()->signalNewPlayer(newClientId);
145  }
146
147  return true;
148}
149
150
151
152/**
153 *  signals client disconnect
154 * @param userId userId of the old client
155 */
156void ProxyControl::signalLeaveClient(int userId)
157{
158  PRINTF(0)("Signaling new Client: %i\n", userId);
159  // make sure we are a proxy server
160  assert(SharedNetworkData::getInstance()->isProxyServerActive());
161
162  byte data[INTSIZE];
163
164  assert( Converter::intToByteArray( userId, data, INTSIZE ) == INTSIZE );
165
166  MessageManager::getInstance()->sendMessage( MSGID_PROXY_LEAVECLIENT, data, INTSIZE, RT_SERVER, NET_UNASSIGNED, MP_HIGHBANDWIDTH );
167}
168
169
170/**
171 * this is the handler for proxy signals: removing clients
172 *
173 * @param messageType the type of the message
174 * @param data message data
175 * @param dataLength length of the message data
176 * @param someData some other atteched data
177 * @param senderId id of the sender client
178 * @param destinationId id of the destination client
179 * @return true if succeeded
180 */
181bool ProxyControl::messageHandlerLeaveClient( MessageType messageType, byte * data, int dataLength, void * someData, int senderId, int destinationId  )
182{
183  // body data length correct?
184  if ( dataLength != INTSIZE )
185  {
186    PRINTF(2)("leave client message has wrong size: %d\n", dataLength );
187    return true;
188  }
189  // read the userId fromt he message body
190  int leaveClientId = 0;
191  assert( Converter::byteArrayToInt( data, &leaveClientId) == INTSIZE );
192
193  // remove the node from the network monitor
194  NetworkMonitor* netMon = SharedNetworkData::getInstance()->getNetworkMonitor();
195  netMon->removeNode( netMon->getPeerByUserId(leaveClientId));
196
197  PRINTF(0)("Got Signal: from %i new player left with userId: %i\n", senderId, leaveClientId);
198  // part for the master server
199  if( SharedNetworkData::getInstance()->isMasterServer())
200  {
201    // we now create the new player ship and stuff...
202    NetworkGameManager::getInstance()->signalLeftPlayer(leaveClientId);
203  }
204  else if(SharedNetworkData::getInstance()->isProxyServerActive())
205  {
206
207  }
208
209  return true;
210}
Note: See TracBrowser for help on using the repository browser.