Beaming Scene Service  2.0
RakNet wrapper for managing data communications between multiple Beaming clients
ClientServer.h
Go to the documentation of this file.
00001 // Uses ReplicaManager 3: A system to automatically create, destroy, and serialize objects
00002 
00003 #include "StringTable.h"
00004 #include "RakPeerInterface.h"
00005 #include "RakNetworkFactory.h"
00006 #include <stdio.h>
00007 #include "Kbhit.h"
00008 #include <string.h>
00009 #include "BitStream.h"
00010 #include "MessageIdentifiers.h"
00011 #include "ReplicaManager3.h"
00012 #include "NetworkIDManager.h"
00013 #include "RakSleep.h"
00014 #include "FormatString.h"
00015 #include "RakString.h"
00016 #include "GetTime.h"
00017 #include "SocketLayer.h"
00018 #include "Getche.h"
00019 #include <vector>
00020 #include "PacketFileLogger.h"
00021 #include "utilMath.h"
00022 #include <iostream>
00023 #include <string>
00024 #include <map>
00025 #include <math.h>
00026 #if defined(__WIN32__) || defined(WIN32)
00027         #include <windows.h>
00028 #else
00029         #include <cstdio>
00030 #endif
00031 
00032 //#define LOG_ENABLED
00033 
00034 enum
00035 {
00036         CLIENT,
00037         SERVER
00038 } topology;
00039 
00040 // ReplicaManager3 is in the namespace RakNet
00041 using namespace RakNet;
00042 
00043 class BeamingUser;
00044 class BeamingAvatarJointReplica;
00045 class BeamingEmotionReplica;
00046 class BeamingFacialReplica;
00047 class BeamingTactileReplica;
00048 class BeamingRobotReplica;
00049 class BeamingRoom;
00050 class BeamingVideoReplica;
00051 class BeamingObjectReplica;
00052 class BeamingAudioReplica;
00053 class BeamingPointCloudReplica;
00054 class BeamingGenericReplica;
00055 
00056 std::map<RakNetGUID, std::vector<std::string> > new_clients; //for client checkstatus() function - deprecated
00057 //NOTE: Perhaps using different maps may not be the most efficient approach, 
00058 //however, using one map for all replicas will require typecasting which can cause type errors or affect performance 
00059 std::map<RakNetGUID, std::vector<BeamingAvatarJointReplica*> > avatar_joint_replicas; //lookup by guid, to get pointers for avatar joint replicas
00060 std::map<RakNetGUID, std::vector<BeamingEmotionReplica*> > emotion_replicas; //lookup by guid, to get pointers for emotion replicas
00061 std::map<RakNetGUID, std::vector<BeamingFacialReplica*> > facial_replicas; //lookup by guid, to get pointers for facial replicas
00062 std::map<RakNetGUID, std::vector<BeamingTactileReplica*> > tactile_replicas; //lookup by guid, to get pointers for tactile replicas
00063 std::map<RakNetGUID, std::vector<BeamingRobotReplica*> > robot_replicas; //lookup by guid, to get pointers for robot replicas
00064 std::map<RakNetGUID, std::vector<BeamingVideoReplica*> > video_replicas; //lookup by guid, to get pointers for video replicas
00065 std::map<RakNetGUID, std::vector<BeamingObjectReplica*> > object_replicas; //lookup by guid, to get pointers for object replicas
00066 std::map<RakNetGUID, std::vector<BeamingAudioReplica*> > audio_replicas; //lookup by guid, to get pointers for audio replicas
00067 std::map<RakNetGUID, std::vector<BeamingPointCloudReplica*> > point_cloud_replicas; //lookup by guid, to get pointers for point cloud replicas
00068 std::map<RakNetGUID, std::vector<BeamingGenericReplica*> > generic_replicas; //lookup by guid, to get pointers for generic replicas
00069 struct node_info {
00070         std::string name;
00071         std::string type;
00072         char *peername;
00073         char *peertype;
00074         char *peercfg;
00075         char *ipport;
00076 };
00077 std::map<std::string, std::vector<node_info*> > nodes_map; //lookup by guid, to get node_info
00078 PacketFileLogger logfileHandler;
00079 bool logging=false;
00080 
00081 
00083 class BeamingUser : public Replica3
00084 {
00085 public:
00086         void PrintOutput(RakNet::BitStream *bs)
00087         {
00088                 if (bs->GetNumberOfBitsUsed()==0)
00089                         return;
00090                 RakNet::RakString rakString;
00091                 bs->Read(rakString);
00092                 printf("Receive: %s\n", rakString.C_String());
00093         }
00094         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     { 
00095                 constructionBitstream->Write(clientname);
00096                 constructionBitstream->Write(clientType);
00097                 constructionBitstream->Write(clientConfig);
00098                 constructionBitstream->Write(ip_port);
00099                 strcpy(username,"");
00100 #if defined(__WIN32__) || defined(WIN32)
00101           DWORD size;
00102           (GetUserNameA( username, &size ));
00103 #else
00104                 FILE *name;
00105                 name = popen("whoami", "r");
00106                 fgets(username, sizeof(username), name);
00107                 pclose(name);
00108 #endif
00109                 constructionBitstream->Write(username);
00110         }
00111         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 
00112                 constructionBitstream->Read(clientname);
00113                 constructionBitstream->Read(clientType);
00114                 constructionBitstream->Read(clientConfig);
00115                 constructionBitstream->Read(ip_port);
00116                 constructionBitstream->Read(username);
00117                 if (topology == SERVER)
00118                 {
00119                         printf("Connection from user: %s, ip: %s\n",username,sourceConnection->GetSystemAddress().ToString());
00120                         sprintf(ip_port,"%s",sourceConnection->GetSystemAddress().ToString());
00121 
00122                 } else {
00123                         printf("Connection from user: %s\n",username); }
00124                 new_clients[this->GetCreatingSystemGUID()].push_back(clientname);
00125                 new_clients[this->GetCreatingSystemGUID()].push_back(clientType);
00126                 new_clients[this->GetCreatingSystemGUID()].push_back(clientConfig);
00127                 return true; 
00128         }
00129         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { }
00130         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { return true; }
00131         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { delete this; }
00132         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
00133                 return RM3SR_BROADCAST_IDENTICALLY;
00134         }
00135         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { }
00136         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      { }
00137         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { }
00138         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      { }
00139         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { }
00140         virtual RM3ConstructionState QueryConstruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3) {
00141                         return QueryConstruction_ClientConstruction(destinationConnection);
00142         }
00143         virtual bool QueryRemoteConstruction(RakNet::Connection_RM3 *sourceConnection) {
00144                         return QueryRemoteConstruction_ClientConstruction(sourceConnection);
00145         }
00146 
00147         virtual RM3QuerySerializationResult QuerySerialization(RakNet::Connection_RM3 *destinationConnection) {
00148                         return QuerySerialization_ClientSerializable(destinationConnection);
00149         }
00150         virtual RM3ActionOnPopConnection QueryActionOnPopConnection(RakNet::Connection_RM3 *droppedConnection) const {
00151                 if (topology==SERVER)
00152                         return QueryActionOnPopConnection_Server(droppedConnection);
00153                 else
00154                         return QueryActionOnPopConnection_Client(droppedConnection);
00155         }
00156 
00157         char clientname[128];
00158         char clientConfig[128];
00159         char clientType[128];
00160         char username[128];
00161         char logstr[1024];
00162         char localtime[128];
00163         char ip_port[128];
00164 
00165         BeamingUser() { }
00166 
00167         virtual ~BeamingUser() { 
00168                 if (topology==SERVER)
00169                         BroadcastDestruction();
00170         }
00171 };
00172 
00173 
00175 class BeamingAvatarJointReplica : public BeamingUser
00176 {
00177         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("AVATAR");}
00178         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
00179                 allocationIdBitstream->Write(GetName());
00180         }
00181         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
00182                 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection);
00183                 constructionBitstream->Write(GetName() + RakNet::RakString(avatarjoint_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00184                 constructionBitstream->Write(avatarjoint_id);
00185                 constructionBitstream->Write(parentbone);
00186         }
00187         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00188                 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection))
00189                         return false;
00190                 RakNetTimeMS time = RakNet::GetTime();
00191                 PrintOutput(constructionBitstream);
00192                 constructionBitstream->Read(avatarjoint_id);
00193                 constructionBitstream->Read(parentbone);
00194                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,avatarjoint_id);
00195                 if (topology == CLIENT)
00196                 {
00197                         avatar_joint_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
00198                         thisnode = new node_info;
00199                         thisnode->name=avatarjoint_id;
00200                         thisnode->type=GetName().C_String();
00201                         thisnode->peername = clientname;
00202                         thisnode->peertype = clientType;
00203                         thisnode->peercfg = clientConfig;
00204                         thisnode->ipport = ip_port;
00205                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
00206                 }
00207                 if ((topology==SERVER)&&(logging==true))
00208                 {
00209                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),avatar_joint_replicas.size());
00210                         logfileHandler.GetLocalTime(localtime);
00211                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),avatar_joint_replicas.size());
00212                         logfileHandler.WriteLog(logstr);
00213                 }
00214                 return true;
00215         }
00216         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
00217                 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection);
00218                 destructionBitstream->Write(GetName() + RakNet::RakString(avatarjoint_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00219         }
00220         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00221                 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection))
00222                         return false;
00223                 RakNetTimeMS time = RakNet::GetTime();
00224                 PrintOutput(destructionBitstream);
00225                 if (topology == CLIENT)
00226                 {
00227                         //remove avatar joints from avatar_joint_replicas
00228                         for ( std::vector<BeamingAvatarJointReplica*>::iterator cIter = avatar_joint_replicas[this->GetCreatingSystemGUID()].begin(); cIter!=avatar_joint_replicas[this->GetCreatingSystemGUID()].end(); cIter++ ) {
00229                                 if (( strcmp((*cIter)->avatarjoint_id,avatarjoint_id) == 0 ) &&  ( strcmp((*cIter)->clientname,clientname) == 0 )) {
00230                                         avatar_joint_replicas[this->GetCreatingSystemGUID()].erase(cIter);
00231                                         break;
00232                                 }
00233                         }
00234                         //remove avatar joints from nodes_map
00235                         for ( std::vector<node_info*>::iterator cIter = nodes_map[this->GetCreatingSystemGUID().ToString()].begin(); cIter!=nodes_map[this->GetCreatingSystemGUID().ToString()].end(); cIter++ ) {
00236                                 if (( strcmp((*cIter)->name.c_str(),avatarjoint_id) == 0 ) &&  ( strcmp((*cIter)->peername,clientname) == 0 )) {
00237                                         nodes_map[this->GetCreatingSystemGUID().ToString()].erase(cIter);
00238                                         break;
00239                                 }
00240                         }
00241                         if (nodes_map[this->GetCreatingSystemGUID().ToString()].empty())
00242                         {       nodes_map.erase(this->GetCreatingSystemGUID().ToString());      }
00243                 }
00244                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
00245                 if ((topology==SERVER)&&(logging==true))
00246                 {
00247                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),avatar_joint_replicas.size());
00248                         logfileHandler.GetLocalTime(localtime);
00249                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),avatar_joint_replicas.size());
00250                         logfileHandler.WriteLog(logstr);
00251                 }
00252                 return true;
00253         }
00254         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
00255                 delete this;
00256         }
00257         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
00258                 BeamingUser::Serialize(serializeParameters);
00259                 RakNetTimeMS time = RakNet::GetTime();
00260                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&fname,sizeof(fname));
00261                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&lname,sizeof(lname));
00262                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&position,sizeof(position));
00263                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&orientation,sizeof(orientation));
00264                 return RM3SR_BROADCAST_IDENTICALLY;
00265         }
00266         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
00267                 BeamingUser::Deserialize(deserializeParameters);
00268                 RakNetTimeMS time = RakNet::GetTime();
00269                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&fname,sizeof(fname));
00270                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&lname,sizeof(lname));
00271                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&position,sizeof(position));
00272                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&orientation,sizeof(orientation));
00273                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %.3f %.3f %.3f %.3f %.3f %.3f %.3f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,avatarjoint_id,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w);
00274                 if ((topology==SERVER)&&(logging==true))//logging on server
00275                 {
00276                                 logfileHandler.GetLocalTime(localtime);
00277                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,avatarjoint_id,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w);
00278                                 logfileHandler.WriteLog(logstr); //writes additional lines
00279                 }
00280         }
00281         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00282                 serializationBitstream->Write(GetName() + RakNet::RakString(avatarjoint_id) + RakNet::RakString(" created on server"));
00283         }
00284         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
00285                 PrintOutput(serializationBitstream);
00286         }
00287         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00288                 serializationBitstream->Write(GetName() + RakNet::RakString(avatarjoint_id) + RakNet::RakString(" not created on server"));
00289         }
00290         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
00291                 PrintOutput(serializationBitstream);
00292         }
00293 
00294 public:
00295         char avatarjoint_id[128];
00296         CVec3 position;
00297         CQuat orientation;
00298         node_info *thisnode;
00299         RakNet::RakString parentbone;
00300         char fname[128];
00301         char lname[128];
00302 
00303         BeamingAvatarJointReplica() { }
00304 
00305         virtual ~BeamingAvatarJointReplica() { }
00306 };
00307 
00308 
00310 class BeamingFacialReplica : public BeamingUser
00311 {
00312         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("FACIAL");}
00313         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
00314                 allocationIdBitstream->Write(GetName());
00315         }
00316         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
00317                 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection);
00318                 constructionBitstream->Write(GetName() + RakNet::RakString(facial_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00319                 constructionBitstream->Write(facial_id);
00320         }
00321         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00322                 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection))
00323                         return false;
00324                 RakNetTimeMS time = RakNet::GetTime();
00325                 PrintOutput(constructionBitstream);
00326                 constructionBitstream->Read(facial_id);
00327                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,facial_id);
00328                 if (topology == CLIENT)
00329                 {
00330                         facial_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
00331                         thisnode = new node_info;
00332                         thisnode->name=facial_id;
00333                         thisnode->type=GetName().C_String();
00334                         thisnode->peername = clientname;
00335                         thisnode->peertype = clientType;
00336                         thisnode->peercfg = clientConfig;
00337                         thisnode->ipport = ip_port;
00338                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
00339                 }
00340                 if ((topology==SERVER)&&(logging==true))
00341                 {
00342                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),facial_replicas.size());
00343                         logfileHandler.GetLocalTime(localtime);
00344                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),facial_replicas.size());
00345                         logfileHandler.WriteLog(logstr);
00346                 }
00347                 return true;
00348         }
00349         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
00350                 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection);
00351                 destructionBitstream->Write(GetName() + RakNet::RakString(facial_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00352         }
00353         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00354                 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection))
00355                         return false;
00356                 RakNetTimeMS time = RakNet::GetTime();
00357                 PrintOutput(destructionBitstream);
00358                 if (topology == CLIENT)
00359                 {
00360                         facial_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection
00361                         nodes_map.erase(this->GetCreatingSystemGUID().ToString());
00362                 }
00363                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
00364                 if ((topology==SERVER)&&(logging==true))
00365                 {
00366                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),facial_replicas.size());
00367                         logfileHandler.GetLocalTime(localtime);
00368                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),facial_replicas.size());
00369                         logfileHandler.WriteLog(logstr);
00370                 }
00371                 return true;
00372         }
00373         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
00374                 delete this;
00375         }
00376         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
00377                 BeamingUser::Serialize(serializeParameters);
00378                 RakNetTimeMS time = RakNet::GetTime();
00379                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&blink,sizeof(blink));
00380                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&smile,sizeof(smile));
00381                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&frown,sizeof(frown));
00382                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&o,sizeof(o));
00383                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&e,sizeof(e));
00384                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&p,sizeof(p));
00385                 return RM3SR_BROADCAST_IDENTICALLY;
00386         }
00387         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
00388                 BeamingUser::Deserialize(deserializeParameters);
00389                 RakNetTimeMS time = RakNet::GetTime();
00390                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&blink,sizeof(blink));
00391                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&smile,sizeof(smile));
00392                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&frown,sizeof(frown));
00393                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&o,sizeof(o));
00394                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&e,sizeof(e));
00395                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&p,sizeof(p));
00396                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %d %.3f %.3f %.3f %.3f %.3f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,facial_id,blink,smile,frown,o,e,p);
00397                 if ((topology==SERVER)&&(logging==true))//logging on server
00398                 {
00399                                 logfileHandler.GetLocalTime(localtime);
00400                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%d;%.3f;%.3f;%.3f;%.3f;%.3f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,facial_id,blink,smile,frown,o,e,p);
00401                                 logfileHandler.WriteLog(logstr); //writes additional lines
00402                 }
00403         }
00404         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00405                 serializationBitstream->Write(GetName() + RakNet::RakString(facial_id) + RakNet::RakString(" created on server"));
00406         }
00407         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
00408                 PrintOutput(serializationBitstream);
00409         }
00410         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00411                 serializationBitstream->Write(GetName() + RakNet::RakString(facial_id) + RakNet::RakString(" not created on server"));
00412         }
00413         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
00414                 PrintOutput(serializationBitstream);
00415         }
00416 
00417 public:
00418         char facial_id[128];
00419         bool blink;
00420         float smile;
00421         float frown;
00422         float o;
00423         float e;
00424         float p;
00425         node_info *thisnode;
00426 
00427         BeamingFacialReplica() { }
00428 
00429         virtual ~BeamingFacialReplica() { }
00430 };
00431 
00432 
00434 class BeamingEmotionReplica : public BeamingUser
00435 {
00436         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("EMOTION");}
00437         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
00438                 allocationIdBitstream->Write(GetName());
00439         }
00440         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
00441                 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection);
00442                 constructionBitstream->Write(GetName() + RakNet::RakString(emotion_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00443                 constructionBitstream->Write(emotion_id);
00444         }
00445         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00446                 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection))
00447                         return false;
00448                 RakNetTimeMS time = RakNet::GetTime();
00449                 PrintOutput(constructionBitstream);
00450                 constructionBitstream->Read(emotion_id);
00451                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,emotion_id);
00452                 if (topology == CLIENT)
00453                 {
00454                         emotion_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
00455                         thisnode = new node_info;
00456                         thisnode->name=emotion_id;
00457                         thisnode->type=GetName().C_String();
00458                         thisnode->peername = clientname;
00459                         thisnode->peertype = clientType;
00460                         thisnode->peercfg = clientConfig;
00461                         thisnode->ipport = ip_port;
00462                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
00463                 }
00464                 if ((topology==SERVER)&&(logging==true))
00465                 {
00466                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),emotion_replicas.size());
00467                         logfileHandler.GetLocalTime(localtime);
00468                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),emotion_replicas.size());
00469                         logfileHandler.WriteLog(logstr);
00470                 }
00471                 return true;
00472         }
00473         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
00474                 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection);
00475                 destructionBitstream->Write(GetName() + RakNet::RakString(emotion_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00476         }
00477         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00478                 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection))
00479                         return false;
00480                 RakNetTimeMS time = RakNet::GetTime();
00481                 PrintOutput(destructionBitstream);
00482                 if (topology == CLIENT)
00483                 {
00484                         emotion_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection
00485                         nodes_map.erase(this->GetCreatingSystemGUID().ToString());
00486                 }
00487                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
00488                 if ((topology==SERVER)&&(logging==true))
00489                 {
00490                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),emotion_replicas.size());
00491                         logfileHandler.GetLocalTime(localtime);
00492                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),emotion_replicas.size());
00493                         logfileHandler.WriteLog(logstr);
00494                 }
00495                 return true;
00496         }
00497         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
00498                 delete this;
00499         }
00500         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
00501                 BeamingUser::Serialize(serializeParameters);
00502                 RakNetTimeMS time = RakNet::GetTime();
00503                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&valence,sizeof(valence));
00504                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&arousal,sizeof(arousal));
00505                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&misc,sizeof(misc));
00506                 return RM3SR_BROADCAST_IDENTICALLY;
00507         }
00508         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
00509                 BeamingUser::Deserialize(deserializeParameters);
00510                 RakNetTimeMS time = RakNet::GetTime();
00511                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&valence,sizeof(valence));
00512                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&arousal,sizeof(arousal));
00513                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&misc,sizeof(misc));
00514                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %f %f %f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,emotion_id,valence,arousal,misc);
00515                 if ((topology==SERVER)&&(logging==true))//logging on server
00516                 {
00517                                 logfileHandler.GetLocalTime(localtime);
00518                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%f;%f;%f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,emotion_id,valence,arousal,misc);
00519                                 logfileHandler.WriteLog(logstr); //writes additional lines
00520                 }
00521         }
00522         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00523                 serializationBitstream->Write(GetName() + RakNet::RakString(emotion_id) + RakNet::RakString(" created on server"));
00524         }
00525         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
00526                 PrintOutput(serializationBitstream);
00527         }
00528         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00529                 serializationBitstream->Write(GetName() + RakNet::RakString(emotion_id) + RakNet::RakString(" not created on server"));
00530         }
00531         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
00532                 PrintOutput(serializationBitstream);
00533         }
00534 
00535 public:
00536         char emotion_id[128];
00537         double valence;
00538         double arousal;
00539         double misc;
00540         node_info *thisnode;
00541 
00542         BeamingEmotionReplica() { }
00543 
00544         virtual ~BeamingEmotionReplica() { }
00545 };
00546 
00547 
00549 class BeamingTactileReplica : public BeamingUser
00550 {
00551         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("TACTILE");}
00552         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
00553                 allocationIdBitstream->Write(GetName());
00554         }
00555         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
00556                 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection);
00557                 constructionBitstream->Write(GetName() + RakNet::RakString(tactile_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00558                 constructionBitstream->Write(tactile_id);
00559         }
00560         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00561                 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection))
00562                         return false;
00563                 RakNetTimeMS time = RakNet::GetTime();
00564                 PrintOutput(constructionBitstream);
00565                 constructionBitstream->Read(tactile_id);
00566                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,tactile_id);
00567                 if (topology == CLIENT)
00568                 {
00569                         tactile_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
00570                         thisnode = new node_info;
00571                         thisnode->name=tactile_id;
00572                         thisnode->type=GetName().C_String();
00573                         thisnode->peername = clientname;
00574                         thisnode->peertype = clientType;
00575                         thisnode->peercfg = clientConfig;
00576                         thisnode->ipport = ip_port;
00577                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
00578                 }
00579                 if ((topology==SERVER)&&(logging==true))
00580                 {
00581                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),tactile_replicas.size());
00582                         logfileHandler.GetLocalTime(localtime);
00583                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),tactile_replicas.size());
00584                         logfileHandler.WriteLog(logstr);
00585                 }
00586                 return true;
00587         }
00588         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
00589                 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection);
00590                 destructionBitstream->Write(GetName() + RakNet::RakString(tactile_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00591         }
00592         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00593                 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection))
00594                         return false;
00595                 RakNetTimeMS time = RakNet::GetTime();
00596                 PrintOutput(destructionBitstream);
00597                 if (topology == CLIENT)
00598                 {
00599                         tactile_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection
00600                         nodes_map.erase(this->GetCreatingSystemGUID().ToString());
00601                 }
00602                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
00603                 if ((topology==SERVER)&&(logging==true))
00604                 {
00605                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),tactile_replicas.size());
00606                         logfileHandler.GetLocalTime(localtime);
00607                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),tactile_replicas.size());
00608                         logfileHandler.WriteLog(logstr);
00609                 }
00610                 return true;
00611         }
00612         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
00613                 delete this;
00614         }
00615         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
00616                 BeamingUser::Serialize(serializeParameters);
00617                 RakNetTimeMS time = RakNet::GetTime();
00618                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&duration,sizeof(duration));
00619                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&intensity,sizeof(intensity));
00620                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&temperature,sizeof(temperature));
00621                 return RM3SR_BROADCAST_IDENTICALLY;
00622         }
00623         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
00624                 BeamingUser::Deserialize(deserializeParameters);
00625                 RakNetTimeMS time = RakNet::GetTime();
00626                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&duration,sizeof(duration));
00627                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&intensity,sizeof(intensity));
00628                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&temperature,sizeof(temperature));
00629                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %f %.3f %.3f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,tactile_id,duration,intensity,temperature);
00630                 if ((topology==SERVER)&&(logging==true))//logging on server
00631                 {
00632                                 logfileHandler.GetLocalTime(localtime);
00633                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%f;%.3f;%.3f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,tactile_id,duration,intensity,temperature);
00634                                 logfileHandler.WriteLog(logstr); //writes additional lines
00635                 }
00636         }
00637         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00638                 serializationBitstream->Write(GetName() + RakNet::RakString(tactile_id) + RakNet::RakString(" created on server"));
00639         }
00640         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
00641                 PrintOutput(serializationBitstream);
00642         }
00643         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00644                 serializationBitstream->Write(GetName() + RakNet::RakString(tactile_id) + RakNet::RakString(" not created on server"));
00645         }
00646         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
00647                 PrintOutput(serializationBitstream);
00648         }
00649 
00650 public:
00651         char tactile_id[128];
00652         double duration;
00653         float intensity;
00654         float temperature;
00655         node_info *thisnode;
00656 
00657         BeamingTactileReplica() { }
00658 
00659         virtual ~BeamingTactileReplica() { }
00660 };
00661 
00662 
00664 class BeamingRobotReplica : public BeamingUser
00665 {
00666         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("ROBOT");}
00667         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
00668                 allocationIdBitstream->Write(GetName());
00669         }
00670         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
00671                 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection);
00672                 constructionBitstream->Write(GetName() + RakNet::RakString(robot_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00673                 constructionBitstream->Write(robot_id);
00674         }
00675         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00676                 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection))
00677                         return false;
00678                 RakNetTimeMS time = RakNet::GetTime();
00679                 PrintOutput(constructionBitstream);
00680                 constructionBitstream->Read(robot_id);
00681                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,robot_id);
00682                 if (topology == CLIENT)
00683                 {
00684                         robot_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
00685                         thisnode = new node_info;
00686                         thisnode->name=robot_id;
00687                         thisnode->type=GetName().C_String();
00688                         thisnode->peername = clientname;
00689                         thisnode->peertype = clientType;
00690                         thisnode->peercfg = clientConfig;
00691                         thisnode->ipport = ip_port;
00692                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
00693                 }
00694                 if ((topology==SERVER)&&(logging==true))
00695                 {
00696                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),robot_replicas.size());
00697                         logfileHandler.GetLocalTime(localtime);
00698                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),robot_replicas.size());
00699                         logfileHandler.WriteLog(logstr);
00700                 }
00701                 return true;
00702         }
00703         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
00704                 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection);
00705                 destructionBitstream->Write(GetName() + RakNet::RakString(robot_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00706         }
00707         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00708                 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection))
00709                         return false;
00710                 RakNetTimeMS time = RakNet::GetTime();
00711                 PrintOutput(destructionBitstream);
00712                 if (topology == CLIENT)
00713                 {
00714                         robot_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection
00715                         nodes_map.erase(this->GetCreatingSystemGUID().ToString());
00716                 }
00717                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
00718                 if ((topology==SERVER)&&(logging==true))
00719                 {
00720                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),robot_replicas.size());
00721                         logfileHandler.GetLocalTime(localtime);
00722                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),robot_replicas.size());
00723                         logfileHandler.WriteLog(logstr);
00724                 }
00725                 return true;
00726         }
00727         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
00728                 delete this;
00729         }
00730         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
00731                 BeamingUser::Serialize(serializeParameters);
00732                 RakNetTimeMS time = RakNet::GetTime();
00733                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&type,sizeof(type));
00734                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&details,sizeof(details));
00735                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&freespace,sizeof(freespace));
00736                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&position,sizeof(position));
00737                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&orientation,sizeof(orientation));
00738                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&time_remain,sizeof(time_remain));
00739                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&contact_type,sizeof(contact_type));
00740                 return RM3SR_BROADCAST_IDENTICALLY;
00741         }
00742         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
00743                 BeamingUser::Deserialize(deserializeParameters);
00744                 RakNetTimeMS time = RakNet::GetTime();
00745                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&type,sizeof(type));
00746                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&details,sizeof(details));
00747                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&freespace,sizeof(freespace));
00748                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&position,sizeof(position));
00749                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&orientation,sizeof(orientation));
00750                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&time_remain,sizeof(time_remain));
00751                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&contact_type,sizeof(contact_type));
00752                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %i %i %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %i\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,robot_id,type,details,freespace,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w,time_remain,contact_type);
00753                 if ((topology==SERVER)&&(logging==true))//logging on server
00754                 {
00755                                 logfileHandler.GetLocalTime(localtime);
00756                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%i;%i;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%i",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,robot_id,type,details,freespace,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w,time_remain,contact_type);
00757                                 logfileHandler.WriteLog(logstr); //writes additional lines
00758                 }
00759         }
00760         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00761                 serializationBitstream->Write(GetName() + RakNet::RakString(robot_id) + RakNet::RakString(" created on server"));
00762         }
00763         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
00764                 PrintOutput(serializationBitstream);
00765         }
00766         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00767                 serializationBitstream->Write(GetName() + RakNet::RakString(robot_id) + RakNet::RakString(" not created on server"));
00768         }
00769         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
00770                 PrintOutput(serializationBitstream);
00771         }
00772 
00773 public:
00774         char robot_id[128];
00775         int type;
00776         int details;
00777         float freespace;
00778         CVec3 position;
00779         CQuat orientation;
00780         float time_remain;
00781         int contact_type;
00782         node_info *thisnode;
00783 
00784         BeamingRobotReplica() { }
00785 
00786         virtual ~BeamingRobotReplica() { }
00787 };
00788 
00790 class BeamingGenericReplica : public BeamingUser
00791 {
00792         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("GENERIC");}
00793         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
00794                 allocationIdBitstream->Write(GetName());
00795         }
00796         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
00797                 BeamingUser::SerializeConstruction(constructionBitstream, destinationConnection);
00798                 constructionBitstream->Write(GetName() + RakNet::RakString(generic_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00799                 constructionBitstream->Write(generic_id);
00800         }
00801         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00802                 if (!BeamingUser::DeserializeConstruction(constructionBitstream, sourceConnection))
00803                         return false;
00804                 RakNetTimeMS time = RakNet::GetTime();
00805                 PrintOutput(constructionBitstream);
00806                 constructionBitstream->Read(generic_id);
00807                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,generic_id);
00808                 if (topology == CLIENT)
00809                 {
00810                         generic_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
00811                         thisnode = new node_info;
00812                         thisnode->name=generic_id;
00813                         thisnode->type=GetName().C_String();
00814                         thisnode->peername = clientname;
00815                         thisnode->peertype = clientType;
00816                         thisnode->peercfg = clientConfig;
00817                         thisnode->ipport = ip_port;
00818                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
00819                 }
00820                 if ((topology==SERVER)&&(logging==true))
00821                 {
00822                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),generic_replicas.size());
00823                         logfileHandler.GetLocalTime(localtime);
00824                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),generic_replicas.size());
00825                         logfileHandler.WriteLog(logstr);
00826                 }
00827                 return true;
00828         }
00829         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
00830                 BeamingUser::SerializeDestruction(destructionBitstream, destinationConnection);
00831                 destructionBitstream->Write(GetName() + RakNet::RakString(generic_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
00832         }
00833         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
00834                 if (!BeamingUser::DeserializeDestruction(destructionBitstream, sourceConnection))
00835                         return false;
00836                 RakNetTimeMS time = RakNet::GetTime();
00837                 PrintOutput(destructionBitstream);
00838                 if (topology == CLIENT)
00839                 {
00840                         //remove generic from generic_replicas
00841                         for ( std::vector<BeamingGenericReplica*>::iterator cIter = generic_replicas[this->GetCreatingSystemGUID()].begin(); cIter!=generic_replicas[this->GetCreatingSystemGUID()].end(); cIter++ ) {
00842                                 if (( strcmp((*cIter)->generic_id,generic_id) == 0 ) &&  ( strcmp((*cIter)->clientname,clientname) == 0 )) {
00843                                         generic_replicas[this->GetCreatingSystemGUID()].erase(cIter);
00844                                         break;
00845                                 }
00846                         }
00847                         //remove generic data from nodes_map
00848                         for ( std::vector<node_info*>::iterator cIter = nodes_map[this->GetCreatingSystemGUID().ToString()].begin(); cIter!=nodes_map[this->GetCreatingSystemGUID().ToString()].end(); cIter++ ) {
00849                                 if (( strcmp((*cIter)->name.c_str(),generic_id) == 0 ) &&  ( strcmp((*cIter)->peername,clientname) == 0 )) {
00850                                         nodes_map[this->GetCreatingSystemGUID().ToString()].erase(cIter);
00851                                         break;
00852                                 }
00853                         }
00854                         if (nodes_map[this->GetCreatingSystemGUID().ToString()].empty())
00855                         {       nodes_map.erase(this->GetCreatingSystemGUID().ToString());      }
00856                 }
00857                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
00858                 if ((topology==SERVER)&&(logging==true))
00859                 {
00860                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),generic_replicas.size());
00861                         logfileHandler.GetLocalTime(localtime);
00862                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),generic_replicas.size());
00863                         logfileHandler.WriteLog(logstr);
00864                 }
00865                 return true;
00866         }
00867         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
00868                 delete this;
00869         }
00870         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
00871                 BeamingUser::Serialize(serializeParameters);
00872                 RakNetTimeMS time = RakNet::GetTime();
00873                 serializeParameters->outputBitstream[0].WriteBits((const unsigned char*)anydata,1024*8);
00874                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&datasize,sizeof(datasize));
00875                 /*//begin printf
00876                 static int y = 0;
00877                 struct mystruct{
00878                         int x;
00879                         char name[28];
00880                         float myfloat;
00881                 } st;   
00882                 if (y == 100) {
00883                         printf("sending %s, %d, %.3f ...\n",((mystruct *)anydata)->name,((mystruct *)anydata)->x,((mystruct *)anydata)->myfloat);
00884                         y = 0;
00885                 }
00886                 y++;
00887                 //end printf*/
00888                 return RM3SR_BROADCAST_IDENTICALLY;
00889         }
00890         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
00891                 BeamingUser::Deserialize(deserializeParameters);
00892                 RakNetTimeMS time = RakNet::GetTime();
00893                 deserializeParameters->serializationBitstream[0].ReadBits((unsigned char*)anydata,1024*8);
00894                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&datasize,sizeof(datasize));
00895                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,generic_id/*,anydata*/);
00896                 if ((topology==SERVER)&&(logging==true))//logging on server
00897                 {
00898                                 logfileHandler.GetLocalTime(localtime);
00899                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,generic_id/*,anydata*/);
00900                                 logfileHandler.WriteLog(logstr); //writes additional lines
00901                 }
00902                 /*//begin printf
00903                 struct mystruct{
00904                         int x;
00905                         char name[28];
00906                         float myfloat;
00907                 } st;   
00908                 printf("receiving %s, %d, %.3f ...\n",((mystruct *)anydata)->name,((mystruct *)anydata)->x,((mystruct *)anydata)->myfloat);
00909                 //end printf*/
00910         }
00911         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00912                 serializationBitstream->Write(GetName() + RakNet::RakString(generic_id) + RakNet::RakString(" created on server"));
00913         }
00914         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
00915                 PrintOutput(serializationBitstream);
00916         }
00917         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
00918                 serializationBitstream->Write(GetName() + RakNet::RakString(generic_id) + RakNet::RakString(" not created on server"));
00919         }
00920         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
00921                 PrintOutput(serializationBitstream);
00922         }
00923 
00924 public:
00925         char generic_id[128];
00926         node_info *thisnode;
00927         //std::string parentbone;
00928         void *anydata;
00929         int datasize;
00930 
00931         BeamingGenericReplica() : anydata(malloc(1024)) { }
00932 
00933         virtual ~BeamingGenericReplica() { }
00934 };
00935 
00936 
00937 
00939 class BeamingRoom : public Replica3
00940 {
00941 public:
00942         void PrintOutput(RakNet::BitStream *bs)
00943         {
00944                 if (bs->GetNumberOfBitsUsed()==0)
00945                         return;
00946                 RakNet::RakString rakString;
00947                 bs->Read(rakString);
00948                 printf("Receive: %s\n", rakString.C_String());
00949         }
00950         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     { 
00951                 constructionBitstream->Write(clientname);
00952                 constructionBitstream->Write(clientType);
00953                 constructionBitstream->Write(clientConfig);
00954                 constructionBitstream->Write(ip_port);
00955                 gethostname(hostname,128);
00956                 constructionBitstream->Write(hostname);
00957                 constructionBitstream->Write(file_url);
00958                 constructionBitstream->Write(host);
00959                 constructionBitstream->Write(port);
00960         }
00961         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) { 
00962                 constructionBitstream->Read(clientname);
00963                 constructionBitstream->Read(clientType);
00964                 constructionBitstream->Read(clientConfig);
00965                 constructionBitstream->Read(ip_port);
00966                 constructionBitstream->Read(hostname);
00967                 if (topology == SERVER)
00968                 {
00969                         printf("Connection from host: %s, ip: %s\n",hostname,sourceConnection->GetSystemAddress().ToString());
00970                         sprintf(ip_port,"%s",sourceConnection->GetSystemAddress().ToString());
00971 
00972                 } else {
00973                         printf("Connection from host: %s\n",hostname); }
00974                 constructionBitstream->Read(file_url);
00975                 constructionBitstream->Read(host);
00976                 constructionBitstream->Read(port);
00977                 new_clients[this->GetCreatingSystemGUID()].push_back(clientname);
00978                 new_clients[this->GetCreatingSystemGUID()].push_back(clientType);
00979                 new_clients[this->GetCreatingSystemGUID()].push_back(clientConfig);
00980                 return true; 
00981         }
00982         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) { }
00983         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) { return true; }
00984         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) { delete this; }
00985         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
00986                 return RM3SR_BROADCAST_IDENTICALLY;
00987         }
00988         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) { }
00989         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      { }
00990         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) { }
00991         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      { }
00992         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) { }
00993         virtual RM3ConstructionState QueryConstruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3) {
00994                         return QueryConstruction_ClientConstruction(destinationConnection);
00995         }
00996         virtual bool QueryRemoteConstruction(RakNet::Connection_RM3 *sourceConnection) {
00997                         return QueryRemoteConstruction_ClientConstruction(sourceConnection);
00998         }
00999 
01000         virtual RM3QuerySerializationResult QuerySerialization(RakNet::Connection_RM3 *destinationConnection) {
01001                         return QuerySerialization_ClientSerializable(destinationConnection);
01002         }
01003         virtual RM3ActionOnPopConnection QueryActionOnPopConnection(RakNet::Connection_RM3 *droppedConnection) const {
01004                 if (topology==SERVER)
01005                         return QueryActionOnPopConnection_Server(droppedConnection);
01006                 else
01007                         return QueryActionOnPopConnection_Client(droppedConnection);
01008         }
01009 
01010         char clientname[128];
01011         char clientConfig[128];
01012         char clientType[128];
01013         char hostname[128];
01014         char host[128];
01015         int port;
01016         char file_url[128];
01017         char logstr[1024];
01018         char localtime[128];
01019         char ip_port[128];
01020 
01021         BeamingRoom() { }
01022 
01023         virtual ~BeamingRoom() { 
01024                 if (topology==SERVER)
01025                         BroadcastDestruction();
01026         }
01027 };
01028 
01029 
01030 
01032 class BeamingObjectReplica : public BeamingRoom
01033 {
01034         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("OBJECT");}
01035         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
01036                 allocationIdBitstream->Write(GetName());
01037         }
01038         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
01039                 BeamingRoom::SerializeConstruction(constructionBitstream, destinationConnection);
01040                 constructionBitstream->Write(GetName() + RakNet::RakString(object_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
01041                 constructionBitstream->Write(object_id);
01042         }
01043         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
01044                 if (!BeamingRoom::DeserializeConstruction(constructionBitstream, sourceConnection))
01045                         return false;
01046                 RakNetTimeMS time = RakNet::GetTime();
01047                 PrintOutput(constructionBitstream);
01048                 constructionBitstream->Read(object_id);
01049                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,object_id);
01050                 if (topology == CLIENT)
01051                 {
01052                         object_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
01053                         thisnode = new node_info;
01054                         thisnode->name=object_id;
01055                         thisnode->type=GetName().C_String();
01056                         thisnode->peername = clientname;
01057                         thisnode->peertype = clientType;
01058                         thisnode->peercfg = clientConfig;
01059                         thisnode->ipport = ip_port;
01060                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
01061                 }
01062                 if ((topology==SERVER)&&(logging==true))
01063                 {
01064                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),object_replicas.size());
01065                         logfileHandler.GetLocalTime(localtime);
01066                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),object_replicas.size());
01067                         logfileHandler.WriteLog(logstr);
01068                 }
01069                 return true;
01070         }
01071         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
01072                 BeamingRoom::SerializeDestruction(destructionBitstream, destinationConnection);
01073                 destructionBitstream->Write(GetName() + RakNet::RakString(object_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
01074         }
01075         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
01076                 if (!BeamingRoom::DeserializeDestruction(destructionBitstream, sourceConnection))
01077                         return false;
01078                 RakNetTimeMS time = RakNet::GetTime();
01079                 PrintOutput(destructionBitstream);
01080                 if (topology == CLIENT)
01081                 {
01082                         object_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection
01083                         nodes_map.erase(this->GetCreatingSystemGUID().ToString());
01084                 }
01085                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
01086                 if ((topology==SERVER)&&(logging==true))
01087                 {
01088                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),object_replicas.size());
01089                         logfileHandler.GetLocalTime(localtime);
01090                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),object_replicas.size());
01091                         logfileHandler.WriteLog(logstr);
01092                 }
01093                 return true;
01094         }
01095         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
01096                 delete this;
01097         }
01098         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
01099                 BeamingRoom::Serialize(serializeParameters);
01100                 RakNetTimeMS time = RakNet::GetTime();
01101                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&position,sizeof(position));
01102                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&orientation,sizeof(orientation));
01103                 return RM3SR_BROADCAST_IDENTICALLY;
01104         }
01105         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
01106                 BeamingRoom::Deserialize(deserializeParameters);
01107                 RakNetTimeMS time = RakNet::GetTime();
01108                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&position,sizeof(position));
01109                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&orientation,sizeof(orientation));
01110                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %.3f %.3f %.3f %.3f %.3f %.3f %.3f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,object_id,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w);
01111                 if ((topology==SERVER)&&(logging==true))//logging on server
01112                 {
01113                                 logfileHandler.GetLocalTime(localtime);
01114                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,object_id,position.x,position.y,position.z,orientation.x,orientation.y,orientation.z,orientation.w);
01115                                 logfileHandler.WriteLog(logstr); //writes additional lines
01116                 }
01117         }
01118         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
01119                 serializationBitstream->Write(GetName() + RakNet::RakString(object_id) + RakNet::RakString(" created on server"));
01120         }
01121         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
01122                 PrintOutput(serializationBitstream);
01123         }
01124         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
01125                 serializationBitstream->Write(GetName() + RakNet::RakString(object_id) + RakNet::RakString(" not created on server"));
01126         }
01127         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
01128                 PrintOutput(serializationBitstream);
01129         }
01130 
01131 public:
01132         char object_id[128];
01133         CVec3 position;
01134         CQuat orientation;
01135         node_info *thisnode;
01136 
01137         BeamingObjectReplica() { }
01138 
01139         virtual ~BeamingObjectReplica() { }
01140 };
01141 
01142 
01144 class BeamingVideoReplica : public BeamingRoom
01145 {
01146         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("VIDEO");}
01147         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
01148                 allocationIdBitstream->Write(GetName());
01149         }
01150         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
01151                 BeamingRoom::SerializeConstruction(constructionBitstream, destinationConnection);
01152                 constructionBitstream->Write(GetName() + RakNet::RakString(video_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
01153                 constructionBitstream->Write(video_id);
01154         }
01155         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
01156                 if (!BeamingRoom::DeserializeConstruction(constructionBitstream, sourceConnection))
01157                         return false;
01158                 RakNetTimeMS time = RakNet::GetTime();
01159                 PrintOutput(constructionBitstream);
01160                 constructionBitstream->Read(video_id);
01161                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,video_id);
01162                 if (topology == CLIENT)
01163                 {
01164                         video_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
01165                         thisnode = new node_info;
01166                         thisnode->name=video_id;
01167                         thisnode->type=GetName().C_String();
01168                         thisnode->peername = clientname;
01169                         thisnode->peertype = clientType;
01170                         thisnode->peercfg = clientConfig;
01171                         thisnode->ipport = ip_port;
01172                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
01173                 }
01174                 if ((topology==SERVER)&&(logging==true))
01175                 {
01176                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),video_replicas.size());
01177                         logfileHandler.GetLocalTime(localtime);
01178                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),video_replicas.size());
01179                         logfileHandler.WriteLog(logstr);
01180                 }
01181                 return true;
01182         }
01183         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
01184                 BeamingRoom::SerializeDestruction(destructionBitstream, destinationConnection);
01185                 destructionBitstream->Write(GetName() + RakNet::RakString(video_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
01186         }
01187         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
01188                 if (!BeamingRoom::DeserializeDestruction(destructionBitstream, sourceConnection))
01189                         return false;
01190                 RakNetTimeMS time = RakNet::GetTime();
01191                 PrintOutput(destructionBitstream);
01192                 if (topology == CLIENT)
01193                 {
01194                         video_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection
01195                         nodes_map.erase(this->GetCreatingSystemGUID().ToString());
01196                 }
01197                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
01198                 if ((topology==SERVER)&&(logging==true))
01199                 {
01200                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),video_replicas.size());
01201                         logfileHandler.GetLocalTime(localtime);
01202                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),video_replicas.size());
01203                         logfileHandler.WriteLog(logstr);
01204                 }
01205                 return true;
01206         }
01207         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
01208                 delete this;
01209         }
01210         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
01211                 BeamingRoom::Serialize(serializeParameters);
01212                 RakNetTimeMS time = RakNet::GetTime();
01213                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&frame_width,sizeof(frame_width));
01214                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&frame_height,sizeof(frame_height));
01215                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&bandwidth,sizeof(bandwidth));
01216                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&calibration1,sizeof(calibration1));
01217                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&calibration2,sizeof(calibration2));
01218                 return RM3SR_BROADCAST_IDENTICALLY;
01219         }
01220         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
01221                 BeamingRoom::Deserialize(deserializeParameters);
01222                 RakNetTimeMS time = RakNet::GetTime();
01223                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&frame_width,sizeof(frame_width));
01224                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&frame_height,sizeof(frame_height));
01225                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&bandwidth,sizeof(bandwidth));
01226                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&calibration1,sizeof(calibration1));
01227                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&calibration2,sizeof(calibration2));
01228                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %i %i %f\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,video_id,frame_width,frame_height,bandwidth);
01229                 if ((topology==SERVER)&&(logging==true))//logging on server
01230                 {
01231                                 logfileHandler.GetLocalTime(localtime);
01232                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%i;%i;%f",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,video_id,frame_width,frame_height,bandwidth);
01233                                 logfileHandler.WriteLog(logstr); //writes additional lines
01234                 }
01235         }
01236         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
01237                 serializationBitstream->Write(GetName() + RakNet::RakString(video_id) + RakNet::RakString(" created on server"));
01238         }
01239         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
01240                 PrintOutput(serializationBitstream);
01241         }
01242         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
01243                 serializationBitstream->Write(GetName() + RakNet::RakString(video_id) + RakNet::RakString(" not created on server"));
01244         }
01245         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
01246                 PrintOutput(serializationBitstream);
01247         }
01248 
01249 public:
01250         char video_id[128];
01251         int frame_width;
01252         int frame_height;
01253         double bandwidth;
01254         CMatrix calibration1;
01255         CMatrix calibration2;
01256         node_info *thisnode;
01257 
01258         BeamingVideoReplica() { }
01259 
01260         virtual ~BeamingVideoReplica() { }
01261 };
01262 
01263 
01265 class BeamingAudioReplica : public BeamingRoom
01266 {
01267         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("AUDIO");}
01268         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
01269                 allocationIdBitstream->Write(GetName());
01270         }
01271         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
01272                 BeamingRoom::SerializeConstruction(constructionBitstream, destinationConnection);
01273                 constructionBitstream->Write(GetName() + RakNet::RakString(audio_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
01274                 constructionBitstream->Write(audio_id);
01275         }
01276         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
01277                 if (!BeamingRoom::DeserializeConstruction(constructionBitstream, sourceConnection))
01278                         return false;
01279                 RakNetTimeMS time = RakNet::GetTime();
01280                 PrintOutput(constructionBitstream);
01281                 constructionBitstream->Read(audio_id);
01282                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,audio_id);
01283                 if (topology == CLIENT)
01284                 {
01285                         audio_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
01286                         thisnode = new node_info;
01287                         thisnode->name=audio_id;
01288                         thisnode->type=GetName().C_String();
01289                         thisnode->peername = clientname;
01290                         thisnode->peertype = clientType;
01291                         thisnode->peercfg = clientConfig;
01292                         thisnode->ipport = ip_port;
01293                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
01294                 }
01295                 if ((topology==SERVER)&&(logging==true))
01296                 {
01297                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),audio_replicas.size());
01298                         logfileHandler.GetLocalTime(localtime);
01299                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),audio_replicas.size());
01300                         logfileHandler.WriteLog(logstr);
01301                 }
01302                 return true;
01303         }
01304         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
01305                 BeamingRoom::SerializeDestruction(destructionBitstream, destinationConnection);
01306                 destructionBitstream->Write(GetName() + RakNet::RakString(audio_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
01307         }
01308         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
01309                 if (!BeamingRoom::DeserializeDestruction(destructionBitstream, sourceConnection))
01310                         return false;
01311                 RakNetTimeMS time = RakNet::GetTime();
01312                 PrintOutput(destructionBitstream);
01313                 audio_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection
01314                 nodes_map.erase(this->GetCreatingSystemGUID().ToString());
01315                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
01316                 if ((topology==SERVER)&&(logging==true))
01317                 {
01318                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),audio_replicas.size());
01319                         logfileHandler.GetLocalTime(localtime);
01320                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),audio_replicas.size());
01321                         logfileHandler.WriteLog(logstr);
01322                 }
01323                 return true;
01324         }
01325         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
01326                 delete this;
01327         }
01328         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
01329                 BeamingRoom::Serialize(serializeParameters);
01330                 RakNetTimeMS time = RakNet::GetTime();
01331                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&config,sizeof(config));
01332                 return RM3SR_BROADCAST_IDENTICALLY;
01333         }
01334         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
01335                 BeamingRoom::Deserialize(deserializeParameters);
01336                 RakNetTimeMS time = RakNet::GetTime();
01337                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&config,sizeof(config));
01338                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %s\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,audio_id,config);
01339                 if ((topology==SERVER)&&(logging==true))//logging on server
01340                 {
01341                                 logfileHandler.GetLocalTime(localtime);
01342                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%s",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,audio_id,config);
01343                                 logfileHandler.WriteLog(logstr); //writes additional lines
01344                 }
01345         }
01346         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
01347                 serializationBitstream->Write(GetName() + RakNet::RakString(audio_id) + RakNet::RakString(" created on server"));
01348         }
01349         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
01350                 PrintOutput(serializationBitstream);
01351         }
01352         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
01353                 serializationBitstream->Write(GetName() + RakNet::RakString(audio_id) + RakNet::RakString(" not created on server"));
01354         }
01355         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
01356                 PrintOutput(serializationBitstream);
01357         }
01358 
01359 public:
01360         char audio_id[128];
01361         char config[128];
01362         node_info *thisnode;
01363 
01364         BeamingAudioReplica() { }
01365 
01366         virtual ~BeamingAudioReplica() { }
01367 };
01368 
01369 
01371 class BeamingPointCloudReplica : public BeamingRoom
01372 {
01373         virtual RakNet::RakString GetName(void) const {return RakNet::RakString("POINTCLOUD");}
01374         virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const {
01375                 allocationIdBitstream->Write(GetName());
01376         }
01377         virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)     {
01378                 BeamingRoom::SerializeConstruction(constructionBitstream, destinationConnection);
01379                 constructionBitstream->Write(GetName() + RakNet::RakString(pointcloud_id) + RakNet::RakString(" created for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
01380                 constructionBitstream->Write(pointcloud_id);
01381         }
01382         virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
01383                 if (!BeamingRoom::DeserializeConstruction(constructionBitstream, sourceConnection))
01384                         return false;
01385                 RakNetTimeMS time = RakNet::GetTime();
01386                 PrintOutput(constructionBitstream);
01387                 constructionBitstream->Read(pointcloud_id);
01388                 printf("Client: %s, Type: %s, Config: %s, Node: %s\n",clientname,clientType,clientConfig,pointcloud_id);
01389                 if (topology == CLIENT)
01390                 {
01391                         point_cloud_replicas[this->GetCreatingSystemGUID()].push_back(this); //create within map on new client connection
01392                         thisnode = new node_info;
01393                         thisnode->name=pointcloud_id;
01394                         thisnode->type=GetName().C_String();
01395                         thisnode->peername = clientname;
01396                         thisnode->peertype = clientType;
01397                         thisnode->peercfg = clientConfig;
01398                         thisnode->ipport = ip_port;
01399                         nodes_map[this->GetCreatingSystemGUID().ToString()].push_back(thisnode);
01400                 }
01401                 if ((topology==SERVER)&&(logging==true))
01402                 {
01403                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client created; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),point_cloud_replicas.size());
01404                         logfileHandler.GetLocalTime(localtime);
01405                         sprintf(logstr,"C;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),point_cloud_replicas.size());
01406                         logfileHandler.WriteLog(logstr);
01407                 }
01408                 return true;
01409         }
01410         virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)       {
01411                 BeamingRoom::SerializeDestruction(destructionBitstream, destinationConnection);
01412                 destructionBitstream->Write(GetName() + RakNet::RakString(pointcloud_id) + RakNet::RakString(" removed for guid ") + RakNet::RakString(this->GetCreatingSystemGUID().ToString()));
01413         }
01414         virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {
01415                 if (!BeamingRoom::DeserializeDestruction(destructionBitstream, sourceConnection))
01416                         return false;
01417                 RakNetTimeMS time = RakNet::GetTime();
01418                 PrintOutput(destructionBitstream);
01419                 if (topology == CLIENT)
01420                 {
01421                         point_cloud_replicas.erase(this->GetCreatingSystemGUID()); //erase from map on client disconnection
01422                         nodes_map.erase(this->GetCreatingSystemGUID().ToString());
01423                 }
01424                 new_clients.erase(this->GetCreatingSystemGUID()); //deprecated
01425                 if ((topology==SERVER)&&(logging==true))
01426                 {
01427                         //printf("%"PRINTF_64_BIT_MODIFIER"u: %s client deleted; rem %i\n",(unsigned long long)time,sourceConnection->GetRakNetGUID().ToString(),point_cloud_replicas.size());
01428                         logfileHandler.GetLocalTime(localtime);
01429                         sprintf(logstr,"D;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;0;%i",(unsigned long long)time,localtime,sourceConnection->GetRakNetGUID().ToString(),point_cloud_replicas.size());
01430                         logfileHandler.WriteLog(logstr);
01431                 }
01432                 return true;
01433         }
01434         virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {
01435                 delete this;
01436         }
01437         virtual RM3SerializationResult Serialize(SerializeParameters *serializeParameters)      {
01438                 BeamingRoom::Serialize(serializeParameters);
01439                 RakNetTimeMS time = RakNet::GetTime();
01440                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&size,sizeof(size));
01441                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&bandwidth,sizeof(bandwidth));
01442                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&RGB_flag,sizeof(RGB_flag));
01443                 serializeParameters->outputBitstream[0].WriteAlignedBytes((const unsigned char*)&quality_level,sizeof(quality_level));
01444                 return RM3SR_BROADCAST_IDENTICALLY;
01445         }
01446         virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {
01447                 BeamingRoom::Deserialize(deserializeParameters);
01448                 RakNetTimeMS time = RakNet::GetTime();
01449                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&size,sizeof(size));
01450                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&bandwidth,sizeof(bandwidth));
01451                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&RGB_flag,sizeof(RGB_flag));
01452                 deserializeParameters->serializationBitstream[0].ReadAlignedBytes((unsigned char*)&quality_level,sizeof(quality_level));
01453                 //printf("%"PRINTF_64_BIT_MODIFIER"u: %s %s %s %s %s - %i %f %i\n",(unsigned long long)time,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,pointcloud_id,size,bandwidth,RGB_flag);
01454                 if ((topology==SERVER)&&(logging==true))//logging on server
01455                 {
01456                                 logfileHandler.GetLocalTime(localtime);
01457                                 sprintf(logstr,"M;%"PRINTF_64_BIT_MODIFIER"u;%s;%s;%s;%s;%s;%s;%i;%f;%i",(unsigned long long)time,localtime,clientname,this->GetCreatingSystemGUID().ToString(),clientType,clientConfig,pointcloud_id,size,bandwidth,RGB_flag);
01458                                 logfileHandler.WriteLog(logstr); //writes additional lines
01459                 }
01460         }
01461         virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
01462                 serializationBitstream->Write(GetName() + RakNet::RakString(pointcloud_id) + RakNet::RakString(" created on server"));
01463         }
01464         virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {
01465                 PrintOutput(serializationBitstream);
01466         }
01467         virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection)      {
01468                 serializationBitstream->Write(GetName() + RakNet::RakString(pointcloud_id) + RakNet::RakString(" not created on server"));
01469         }
01470         virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {
01471                 PrintOutput(serializationBitstream);
01472         }
01473 
01474 public:
01475         char pointcloud_id[128];
01476         int size;
01477         double bandwidth;
01478         bool RGB_flag;
01479         int quality_level;
01480         node_info *thisnode;
01481 
01482         BeamingPointCloudReplica() { }
01483 
01484         virtual ~BeamingPointCloudReplica() { }
01485 };
01486 
01487 
01489 class BeamingConnection : public Connection_RM3 {
01490 public:
01491         BeamingConnection(SystemAddress _systemAddress, RakNetGUID _guid) : Connection_RM3(_systemAddress, _guid) {}
01492         virtual ~BeamingConnection() {}
01493 
01495         virtual Replica3 *AllocReplica(RakNet::BitStream *allocationId, ReplicaManager3 *replicaManager3)
01496         {
01497                 RakNet::RakString typeName;
01498                 allocationId->Read(typeName);
01499                 if (typeName=="AVATAR") return new BeamingAvatarJointReplica;
01500                 if (typeName=="FACIAL") return new BeamingFacialReplica;
01501                 if (typeName=="EMOTION") return new BeamingEmotionReplica;
01502                 if (typeName=="TACTILE") return new BeamingTactileReplica;
01503                 if (typeName=="ROBOT") return new BeamingRobotReplica;
01504                 if (typeName=="OBJECT") return new BeamingObjectReplica;
01505                 if (typeName=="VIDEO") return new BeamingVideoReplica;
01506                 if (typeName=="AUDIO") return new BeamingAudioReplica;
01507                 if (typeName=="POINTCLOUD") return new BeamingPointCloudReplica;
01508                 if (typeName=="GENERIC") return new BeamingGenericReplica;
01509                 return 0;
01510         }
01511 protected:
01512 };
01513 
01514 
01516 class ReplicaManager3Beaming : public ReplicaManager3
01517 {
01518         virtual Connection_RM3* AllocConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID) const {
01519                 return new BeamingConnection(systemAddress,rakNetGUID);
01520         }
01521         virtual void DeallocConnection(Connection_RM3 *connection) const {
01522                 delete connection;
01523         }
01524 };
01525 
01526 
01527 
 All Classes Files Functions Variables Enumerations Enumerator Defines