00001 /******************************************************************** 00002 Description: The Client Core Thread 00003 part of the 3Dsia project 00004 created: xandi, 080400 00005 00006 History: 00007 date, name, changes, in funtion 00008 180400 StonedBones added dynamic packet length 00009 00010 ********************************************************************/ 00011 00012 00013 00014 /*................................................................... 00015 Description: The Client Core Thread 00016 Args: ThreadArgs* targs 00017 Returns: none 00018 Created: xandi, 080400 00019 [ToDo:] 00020 [Comments:] 00021 Changes: 00022 -------------------------------------------------------------------*/ 00023 00024 #include "misc.h" 00025 #include "coreClass.h" 00026 00027 #include "../common/databaseAccess.h" 00028 #include "parseObject.h" 00029 00030 Buffer* coreBufferIn = 0;//< the buffer the core Thread reads from 00031 00032 extern map<int,Buffer*> clientBufferIn; //< the buffers the matrixThread uses to send its clients replies 00033 00034 void* coreThread ( void* targz ) 00035 { 00036 ThreadArgs* targs = (ThreadArgs*) targz; 00037 coreClass* cc = new coreClass ( targs ); 00038 00039 extern Buffer* outputBufferIn; 00040 00041 Buffer* coreIn = 0; 00042 Buffer* comOut = 0; 00043 00044 packet* pak = 0; 00045 00046 if ( cc->connectNow() ) 00047 { 00048 fprintf(stderr,"[coreThread] unable to connect to host\n"); 00049 pthread_exit (NULL); 00050 } 00051 00052 if ( ! (coreIn = cc->getBuffer ( INCOMING ) ) ) 00053 exit (1); 00054 if ( ! (comOut = cc->getBuffer ( OUTGOING ) ) ) 00055 exit (1); 00056 if ( !outputBufferIn ) 00057 exit (1); 00058 00059 00060 clientBufferIn[CLIENT_CORE] = coreIn; 00061 DatabaseAccess dbAccess ( CLIENT_CORE ); 00062 00063 int myObjectID = 0; 00064 00065 // <TEMPORARILY> 00066 coreBufferIn = coreIn; 00067 // </TEMPORARILY> 00068 00069 cc->startQuartz ( 25 ); 00070 // cc->setUpdateFreq ( 10 ); 00071 00072 while (1) 00073 { 00074 if ( !coreIn->isEmpty() ) 00075 { 00076 pak = coreIn->read (); 00077 00078 #ifdef DEBUG 00079 fprintf ( stderr, "[coT] got a packet %d \n", pak->h.header[0]); 00080 #endif 00081 00082 switch ( pak->h.header[0] ) 00083 { 00084 /* case PROT_ACCESS_MATRIX: 00085 { 00086 cc->accessMatrix ( pak->data ); 00087 delete pak; 00088 break; 00089 } 00090 */ 00091 case PROT_REGISTER_ENTITY_REPLY: 00092 { 00093 00094 //OK, You can now send your avatardata!!! COOL!! :)) 00095 myObjectID = pak->h.header[1]; 00096 fprintf(stderr,"[coT] my Avatar ID is %d\n",myObjectID); 00097 00098 pak->h.header[0] = PROT_AVATAR_HULL; 00099 pak->data = readFile( "clonewar.avatar" ); 00100 00101 comOut->write ( pak ); 00102 00103 00104 packet* xpak = new packet; 00105 xpak->h.header[0] = PROT_OUTPUT_VISUAL; 00106 xpak->h.header[1] = VISUAL_MY_OBJECT; 00107 xpak->h.header[2] = myObjectID; 00108 00109 outputBufferIn->write ( xpak ); 00110 00111 break; 00112 } 00113 00114 00115 case PROT_SEND_MSG: 00116 { 00117 #ifdef DEBUG 00118 fprintf(stderr,"[coT] trying to send a message...\n"); 00119 #endif 00120 comOut->write (pak); 00121 break; 00122 } 00123 00124 case PROT_TEXT_MSG: 00125 { 00126 outputBufferIn->write ( pak ); 00127 break; 00128 } 00129 00130 case PROT_CHAT_MSG: 00131 { 00132 fprintf(stderr,"[coT] trying to send a message...\n"); 00133 00134 comOut->write (pak); 00135 break; 00136 } 00137 00138 00139 case PROT_CHANGE_POSITION: 00140 { 00141 comOut->write ( pak ); 00142 break; 00143 } 00144 00145 case PROT_RECEIVE_OBJECT: 00146 { 00147 /******************************************************* 00148 header[1] ObjectID 00149 data the name of the object 00150 *******************************************************/ 00151 #ifdef DEBUG 00152 fprintf(stderr,"[coT] Received an object\n"); 00153 #endif 00154 dbAccess.addObject ( pak->h.header[1], pak->data ); 00155 00156 delete pak; 00157 pak = 0; 00158 break; 00159 } 00160 00161 00162 case PROT_RECEIVE_ATOM: 00163 { 00164 /******************************************************* 00165 header[1] ObjectID 00166 header[2] atom Type 00167 header[3] atomID 00168 header[4] valueType 00169 data the atom data 00170 *******************************************************/ 00171 00172 #ifdef DEBUG2 00173 fprintf(stderr,"[coT] Received an atom %d %d %d %d %s\n",pak->h.header[1], pak->h.header[2], pak->h.header[3],pak->h.header[4], pak->data.c_str()); 00174 #endif 00175 00176 dbAccess.addAtom ( pak->h.header[3], pak->h.header[1], pak->h.header[2], pak->data ); 00177 // dbAccess.addAtom ( pak->h.header[3], pak->h.header[1], pak->h.header[2],pak->h.header[4], pak->data ); 00178 00179 delete pak; 00180 pak = 0; 00181 break; 00182 } 00183 00184 00185 case PROT_OUTPUT_VISUAL: 00186 { 00187 #ifdef DEBUG 00188 fprintf(stderr,"[coT] getting a PROT_OUTPUT_VISUAL\n"); 00189 #endif 00190 outputBufferIn->write ( pak ); 00191 break; 00192 } 00193 00194 case PROT_OUTPUT_DUMMY: 00195 { 00196 #ifdef DEBUG 00197 fprintf(stderr,"[coT] getting a PROT_OUTPUT_DUMMY\n"); 00198 #endif 00199 outputBufferIn->write ( pak ); 00200 break; 00201 } 00202 00203 00204 default: 00205 { 00206 //#ifdef DEBUG 00207 fprintf(stderr,"[coreThread] packet number: %d\n",pak->h.header[0]); 00208 //#endif 00209 delete pak; 00210 pak = 0; 00211 break; 00212 } 00213 } 00214 } 00215 } 00216 } 00217 00218 00219 00220 00221 /* 00222 case PROT_REQUEST_REPLY: 00223 { 00224 #ifdef DEBUG 00225 fprintf(stderr,"[coreThread] matrix successfully accessed\n"); 00226 #endif 00227 delete pak; 00228 break; 00229 } 00230 00231 case PROT_MATRIX_STUFF_REPLY: 00232 { 00233 #ifdef DEBUG 00234 fprintf(stderr,"[coT] PROT_MATRIX_STUFF_REPLY!\n"); 00235 #endif 00236 switch ( pak->h.header[1] ) 00237 { 00238 default: 00239 #ifdef DEBUG 00240 fprintf(stderr,"[coT] h.header[1] = %d\n", pak->h.header[1]); 00241 #endif 00242 break; 00243 } 00244 delete pak; 00245 break; 00246 } 00247 00248 */ 00249