Changeset 777 for code/branches/FICN/src/network/PacketDecoder.cc
- Timestamp:
- Dec 31, 2007, 7:40:23 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/FICN/src/network/PacketDecoder.cc
r636 r777 1 1 /* 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 * ORXONOX - the hottest 3D action shooter ever to exist 3 * 4 * 5 * License notice: 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 20 * 21 * Author: 22 * Dumeni Manatschal, (C) 2007 23 * Co-authors: 24 * ... 25 * 26 */ 27 27 28 28 /* 29 30 31 32 33 29 * Class contains functions to determine and decode incomming packages 30 * ->don't read this without the class PacketGenerator, since they belong together 31 * 32 * Autor: Dumeni Manatschal 33 * 34 34 */ 35 35 36 #include <enet/enet.h> 36 #include <iostream> 37 38 #include "PacketTypes.h" 37 39 #include "PacketManager.h" 38 #include <iostream> 39 40 using namespace std; 41 using namespace network; 42 43 PacketDecoder::PacketDecoder(){} 44 45 PacketDecoder::~PacketDecoder(){} 46 47 //call this function out of an instance of PacketDecoder 48 //it will determine the type id and call the right decode function 49 bool PacketDecoder::elaborate( ENetPacket* packet, int clientId ) 40 41 namespace network 50 42 { 51 int client = clientId; 52 cout << "clientId: " << client << endl; //control cout, not important, just debugging info 53 int id = (int)*packet->data; //the first 4 bytes are always the enet packet id 54 std::cout << "packet id: " << id << std::endl; 55 std::cout << "packet size inside packetdecoder: " << packet->dataLength << std::endl; 56 switch( id ) { 57 case ACK: 58 acknowledgement( packet, clientId ); 59 return true; 60 break; 61 case MOUSE: 62 mousem( packet, clientId ); 63 return true; 64 break; 65 case KEYBOARD: 66 keystrike( packet, clientId ); 67 return true; 68 break; 69 case CHAT: 70 chatMessage( packet, clientId ); 71 return true; 72 break; 73 case GAMESTATE: 74 gstate( packet ); 75 return true; 76 break; 77 case CLASSID: 78 clid(packet); 79 return true; 80 break; 81 } 82 return false; 43 using namespace std; 44 45 PacketDecoder::PacketDecoder(){} 46 47 PacketDecoder::~PacketDecoder(){} 48 49 //call this function out of an instance of PacketDecoder 50 //it will determine the type id and call the right decode function 51 bool PacketDecoder::elaborate( ENetPacket* packet, int clientId ) 52 { 53 int client = clientId; 54 cout << "clientId: " << client << endl; //control cout, not important, just debugging info 55 int id = (int)*packet->data; //the first 4 bytes are always the enet packet id 56 std::cout << "packet id: " << id << std::endl; 57 std::cout << "packet size inside packetdecoder: " << packet->dataLength << std::endl; 58 switch( id ) { 59 case ACK: 60 acknowledgement( packet, clientId ); 61 return true; 62 break; 63 case MOUSE: 64 mousem( packet, clientId ); 65 return true; 66 break; 67 case KEYBOARD: 68 keystrike( packet, clientId ); 69 return true; 70 break; 71 case CHAT: 72 chatMessage( packet, clientId ); 73 return true; 74 break; 75 case GAMESTATE: 76 gstate( packet ); 77 return true; 78 break; 79 case CLASSID: 80 clid(packet); 81 return true; 82 break; 83 } 84 return false; 85 } 86 87 //following are the decode functions for the data of the packets 88 89 void PacketDecoder::acknowledgement( ENetPacket* packet, int clientId ) 90 { 91 ack* a = new ack; 92 *a = *(ack*)packet->data; //press pattern of ack on new data 93 94 95 std::cout << "got ack id: " << a->id << std::endl; 96 processAck( a, clientId ); //debug info 97 98 //clean memory 99 enet_packet_destroy( packet ); 100 } 101 102 void PacketDecoder::mousem( ENetPacket* packet, int clientId ) 103 { 104 mouse* mouseMove = new mouse; 105 //copy data of packet->data to new struct 106 *mouseMove = *(mouse*)packet->data; 107 108 //clean memory 109 enet_packet_destroy( packet ); 110 111 printMouse( mouseMove ); //debug info 112 } 113 114 void PacketDecoder::keystrike( ENetPacket* packet, int clientId ) 115 { 116 keyboard* key = new keyboard; 117 *key = *(keyboard*)packet->data; //see above 118 119 //clean memory 120 enet_packet_destroy( packet ); 121 122 printKey( key ); //debug info 123 124 } 125 126 void PacketDecoder::chatMessage( ENetPacket* packet, int clientId ) 127 { 128 chat* chatting = new chat; 129 chatting->id = (int)*packet->data; //first copy id into new struct 130 //since the chat message is a char*, allocate the memory needed 131 char* reserve = new char[packet->dataLength-4]; 132 //copy the transmitted bytestream into the new generated char*, 133 //note the lenght of the message is represented as "packet->dataLength-sizeof( int )" 134 memcpy( &reserve[0], packet->data+sizeof(int), packet->dataLength-sizeof(int) ); 135 //put pointer of chatting struct to the begining of the new generated char* 136 chatting->message = reserve; 137 138 //clean memory 139 enet_packet_destroy( packet ); 140 141 processChat( chatting, clientId ); //debug info 142 } 143 144 void PacketDecoder::gstate( ENetPacket* packet ) 145 { 146 GameStateCompressed* currentState = new GameStateCompressed; 147 //since it's not alowed to use void* for pointer arithmetic 148 unsigned char* data = (unsigned char*)packet->data; 149 //copy the GameStateCompressed id into the struct, which is located at second place data+sizeof( int ) 150 //memcpy( (void*)&(currentState->id), (const void*)(data+sizeof( int )), sizeof( int ) ); 151 currentState->id = (int)*(data+sizeof(int)); 152 std::cout << "id: " << currentState->id << std::endl; 153 //copy the size of the GameStateCompressed compressed data into the new GameStateCompressed struct, located at 3th 154 //position of the data stream, data+2*sizeof( int ) 155 memcpy( (void*)&(currentState->compsize), (const void*)(data+2*sizeof( int )), sizeof( int) ); 156 //currentState->compsize = (int)*(data+2*sizeof(int)); 157 std::cout << "compsize: " << currentState->compsize << std::endl; 158 //size of uncompressed data 159 memcpy( (void*)&(currentState->normsize), (const void*)(data+3*sizeof( int )), sizeof( int ) ); 160 //currentState->normsize = (int)*(data+3*sizeof(int)); 161 std::cout << "normsize. " << currentState->normsize << std::endl; 162 //since the packetgenerator was changed, due to a new parameter, change this function too 163 memcpy( (void*)&(currentState->diffed), (const void*)(data+4*sizeof(int)), sizeof(bool)); 164 //currentState->diffed = (bool)*(data+4*sizeof(int)); 165 std::cout << "diffed: " << currentState->diffed << std::endl; 166 //since data is not allocated, because it's just a pointer, allocate it with size of gamestatedatastream 167 currentState->data = (unsigned char*)(malloc( currentState->compsize )); 168 if(currentState->data==NULL) 169 std::cout << "memory leak" << std::endl; 170 //copy the GameStateCompressed data 171 //std::cout << "packet size (enet): " << packet->dataLength << std::endl; 172 //std::cout << "totallen: " << 4*sizeof(int)+sizeof(bool)+currentState->compsize << std::endl; 173 memcpy( (void*)(currentState->data), (const void*)(data+4*sizeof( int ) + sizeof(bool)), currentState->compsize ); 174 175 //clean memory 176 enet_packet_destroy( packet ); 177 //run processGameStateCompressed 178 //TODO: not yet implemented! 179 processGamestate(currentState); 180 } 181 182 void PacketDecoder::clid( ENetPacket *packet) 183 { 184 classid* cid = new classid; 185 cid->length = ((classid*)(packet->data))->length; 186 cid->id = ((classid *)(packet->data))->id; 187 cid->clid = ((classid *)(packet->data))->clid; 188 cid->message = (const char *)malloc(cid->length); 189 void *data = (void *)cid->message; 190 memcpy(data, (const void*)(packet->data+3*sizeof(int)), cid->length); 191 std::cout << "classid: " << cid->clid << ", name: " << cid->message << std::endl; 192 enet_packet_destroy( packet ); 193 processClassid(cid); 194 } 195 196 197 // now the data processing functions: 198 199 void PacketDecoder::processChat( chat *data, int clientId) 200 { 201 printChat(data, clientId); 202 } 203 204 void PacketDecoder::processGamestate( GameStateCompressed *state ) 205 { 206 } 207 208 void PacketDecoder::processClassid( classid *cid) 209 { 210 printClassid(cid); 211 return; 212 } 213 214 void PacketDecoder::processAck( ack *data, int clientID) 215 { 216 printAck(data); 217 return; 218 } 219 220 221 //these are some print functions for test stuff 222 223 void PacketDecoder::printAck( ack* data ) 224 { 225 cout << "data id: " << data->id << endl; 226 cout << "data: " << data->a << endl; 227 } 228 229 void PacketDecoder::printMouse( mouse* data ) 230 { 231 cout << "data id: " << data->id << endl; 232 cout << "data: " << data->x << " " << data->y << endl; 233 } 234 235 void PacketDecoder::printKey( keyboard* data ) 236 { 237 cout << "data id: " << data->id << endl; 238 cout << "data: " << (char)data->press << endl; 239 } 240 241 void PacketDecoder::printChat( chat* data, int clientId ) 242 { 243 if(clientId!=CLIENTID_CLIENT) 244 cout << "client: " << clientId << endl; 245 cout << "data id: " << data->id << endl; 246 cout << "data: " << data->message << endl; 247 } 248 249 void PacketDecoder::printGamestate( GameStateCompressed* data ) 250 { 251 cout << "id of GameStateCompressed: " << data->id << endl; 252 cout << "size of GameStateCompressed: " << data->compsize << endl; 253 } 254 255 void PacketDecoder::printClassid( classid *cid) 256 { 257 cout << "id of classid: " << cid->id << endl; 258 cout << "size of classid: " << cid->length << endl; 259 cout << "ID of classid: " << cid->clid <<endl; 260 cout << "data of classid: " << cid->message <<endl; 261 } 262 83 263 } 84 85 //following are the decode functions for the data of the packets86 87 void PacketDecoder::acknowledgement( ENetPacket* packet, int clientId )88 {89 ack* a = new ack;90 *a = *(ack*)packet->data; //press pattern of ack on new data91 92 93 std::cout << "got ack id: " << a->id << std::endl;94 processAck( a, clientId ); //debug info95 96 //clean memory97 enet_packet_destroy( packet );98 }99 100 void PacketDecoder::mousem( ENetPacket* packet, int clientId )101 {102 mouse* mouseMove = new mouse;103 //copy data of packet->data to new struct104 *mouseMove = *(mouse*)packet->data;105 106 //clean memory107 enet_packet_destroy( packet );108 109 printMouse( mouseMove ); //debug info110 }111 112 void PacketDecoder::keystrike( ENetPacket* packet, int clientId )113 {114 keyboard* key = new keyboard;115 *key = *(keyboard*)packet->data; //see above116 117 //clean memory118 enet_packet_destroy( packet );119 120 printKey( key ); //debug info121 122 }123 124 void PacketDecoder::chatMessage( ENetPacket* packet, int clientId )125 {126 chat* chatting = new chat;127 chatting->id = (int)*packet->data; //first copy id into new struct128 //since the chat message is a char*, allocate the memory needed129 char* reserve = new char[packet->dataLength-4];130 //copy the transmitted bytestream into the new generated char*,131 //note the lenght of the message is represented as "packet->dataLength-sizeof( int )"132 memcpy( &reserve[0], packet->data+sizeof(int), packet->dataLength-sizeof(int) );133 //put pointer of chatting struct to the begining of the new generated char*134 chatting->message = reserve;135 136 //clean memory137 enet_packet_destroy( packet );138 139 processChat( chatting, clientId ); //debug info140 141 }142 143 void PacketDecoder::gstate( ENetPacket* packet )144 {145 GameStateCompressed* currentState = new GameStateCompressed;146 //since it's not alowed to use void* for pointer arithmetic147 unsigned char* data = (unsigned char*)packet->data;148 //copy the GameStateCompressed id into the struct, which is located at second place data+sizeof( int )149 //memcpy( (void*)&(currentState->id), (const void*)(data+sizeof( int )), sizeof( int ) );150 currentState->id = (int)*(data+sizeof(int));151 std::cout << "id: " << currentState->id << std::endl;152 //copy the size of the GameStateCompressed compressed data into the new GameStateCompressed struct, located at 3th153 //position of the data stream, data+2*sizeof( int )154 memcpy( (void*)&(currentState->compsize), (const void*)(data+2*sizeof( int )), sizeof( int) );155 //currentState->compsize = (int)*(data+2*sizeof(int));156 std::cout << "compsize: " << currentState->compsize << std::endl;157 //size of uncompressed data158 memcpy( (void*)&(currentState->normsize), (const void*)(data+3*sizeof( int )), sizeof( int ) );159 //currentState->normsize = (int)*(data+3*sizeof(int));160 std::cout << "normsize. " << currentState->normsize << std::endl;161 //since the packetgenerator was changed, due to a new parameter, change this function too162 memcpy( (void*)&(currentState->diffed), (const void*)(data+4*sizeof(int)), sizeof(bool));163 //currentState->diffed = (bool)*(data+4*sizeof(int));164 std::cout << "diffed: " << currentState->diffed << std::endl;165 //since data is not allocated, because it's just a pointer, allocate it with size of gamestatedatastream166 currentState->data = (unsigned char*)(malloc( currentState->compsize ));167 if(currentState->data==NULL)168 std::cout << "memory leak" << std::endl;169 //copy the GameStateCompressed data170 //std::cout << "packet size (enet): " << packet->dataLength << std::endl;171 //std::cout << "totallen: " << 4*sizeof(int)+sizeof(bool)+currentState->compsize << std::endl;172 memcpy( (void*)(currentState->data), (const void*)(data+4*sizeof( int ) + sizeof(bool)), currentState->compsize );173 174 //clean memory175 enet_packet_destroy( packet );176 //run processGameStateCompressed177 //TODO: not yet implemented!178 processGamestate(currentState);179 }180 181 void PacketDecoder::clid( ENetPacket *packet)182 {183 classid* cid = new classid;184 cid->length = ((classid*)(packet->data))->length;185 cid->id = ((classid *)(packet->data))->id;186 cid->clid = ((classid *)(packet->data))->clid;187 cid->message = (const char *)malloc(cid->length);188 void *data = (void *)cid->message;189 memcpy(data, (const void*)(packet->data+3*sizeof(int)), cid->length);190 std::cout << "classid: " << cid->clid << ", name: " << cid->message << std::endl;191 enet_packet_destroy( packet );192 processClassid(cid);193 }194 195 196 // now the data processing functions:197 198 void PacketDecoder::processChat( chat *data, int clientId){199 printChat(data, clientId);200 }201 202 void PacketDecoder::processGamestate( GameStateCompressed *state ){203 204 }205 206 void PacketDecoder::processClassid( classid *cid){207 printClassid(cid);208 return;209 }210 211 void PacketDecoder::processAck( ack *data, int clientID){212 printAck(data);213 return;214 }215 216 217 //these are some print functions for test stuff218 219 void PacketDecoder::printAck( ack* data )220 {221 cout << "data id: " << data->id << endl;222 cout << "data: " << data->a << endl;223 }224 225 void PacketDecoder::printMouse( mouse* data )226 {227 cout << "data id: " << data->id << endl;228 cout << "data: " << data->x << " " << data->y << endl;229 }230 231 void PacketDecoder::printKey( keyboard* data )232 {233 cout << "data id: " << data->id << endl;234 cout << "data: " << (char)data->press << endl;235 }236 237 void PacketDecoder::printChat( chat* data, int clientId )238 {239 if(clientId!=CLIENTID_CLIENT)240 cout << "client: " << clientId << endl;241 cout << "data id: " << data->id << endl;242 cout << "data: " << data->message << endl;243 }244 245 void PacketDecoder::printGamestate( GameStateCompressed* data )246 {247 cout << "id of GameStateCompressed: " << data->id << endl;248 cout << "size of GameStateCompressed: " << data->compsize << endl;249 }250 251 void PacketDecoder::printClassid( classid *cid)252 {253 cout << "id of classid: " << cid->id << endl;254 cout << "size of classid: " << cid->length << endl;255 cout << "ID of classid: " << cid->clid <<endl;256 cout << "data of classid: " << cid->message <<endl;257 }
Note: See TracChangeset
for help on using the changeset viewer.