00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "kgameprocess.h"
00025 #include "kplayer.h"
00026 #include "kgame.h"
00027 #include "kgamemessage.h"
00028 #include "kmessageio.h"
00029
00030 #include <krandomsequence.h>
00031
00032 #include <qbuffer.h>
00033 #include <qdatastream.h>
00034 #include <qcstring.h>
00035
00036 #include <assert.h>
00037 #include <stdio.h>
00038 #include <stdlib.h>
00039 #include <unistd.h>
00040 #include <string.h>
00041
00042 #define READ_BUFFER_SIZE 1024
00043
00044
00045
00046 KGameProcess::KGameProcess() : QObject(0,0)
00047 {
00048 mTerminate=false;
00049
00050 rFile.open(IO_ReadOnly|IO_Raw,stdin);
00051 wFile.open(IO_WriteOnly|IO_Raw,stdout);
00052 mMessageIO=new KMessageFilePipe(this,&rFile,&wFile);
00053
00054
00055
00056
00057 connect (mMessageIO, SIGNAL(received(const QByteArray&)),
00058 this, SLOT(receivedMessage(const QByteArray&)));
00059 fprintf(stderr,"KGameProcess::constructor %p %p\n",&rFile,&wFile);
00060
00061 mRandom = new KRandomSequence;
00062 mRandom->setSeed(0);
00063 }
00064 KGameProcess::~KGameProcess()
00065 {
00066 delete mRandom;
00067
00068
00069 delete mMessageIO;
00070 rFile.close();
00071 wFile.close();
00072 fprintf(stderr,"KGameProcess::destructor\n");
00073 }
00074
00075
00076 bool KGameProcess::exec(int argc, char *argv[])
00077 {
00078
00079 processArgs(argc,argv);
00080 do
00081 {
00082 mMessageIO->exec();
00083 } while(!mTerminate);
00084 return true;
00085 }
00086
00087
00088
00089
00090
00091 void KGameProcess::sendSystemMessage(QDataStream &stream,int msgid,Q_UINT32 receiver)
00092 {
00093 fprintf(stderr,"KGameProcess::sendMessage id=%d recv=%d",msgid,receiver);
00094 QByteArray a;
00095 QDataStream outstream(a,IO_WriteOnly);
00096
00097 QBuffer *device=(QBuffer *)stream.device();
00098 QByteArray data=device->buffer();;
00099
00100 KGameMessage::createHeader(outstream,0,receiver,msgid);
00101 outstream.writeRawBytes(data.data(),data.size());
00102
00103
00104
00105
00106
00107 if (mMessageIO) mMessageIO->send(a);
00108 }
00109
00110 void KGameProcess::sendMessage(QDataStream &stream,int msgid,Q_UINT32 receiver)
00111 {
00112 sendSystemMessage(stream,msgid+KGameMessage::IdUser,receiver);
00113 }
00114
00115 void KGameProcess::processArgs(int argc, char *argv[])
00116 {
00117 int v=0;
00118 if (argc>2)
00119 {
00120 v=atoi(argv[2]);
00121
00122 }
00123 if (argc>1)
00124 {
00125 v=atoi(argv[1]);
00126
00127 }
00128 fprintf(stderr,"processArgs \n");
00129 fflush(stderr);
00130 }
00131
00132 void KGameProcess::receivedMessage(const QByteArray& receiveBuffer)
00133 {
00134 QDataStream stream(receiveBuffer, IO_ReadOnly);
00135 int msgid;
00136 Q_UINT32 sender;
00137 Q_UINT32 receiver;
00138 KGameMessage::extractHeader(stream, sender, receiver, msgid);
00139 fprintf(stderr,"------ receiveNetworkTransmission(): id=%d sender=%d,recv=%d\n",msgid,sender,receiver);
00140 switch(msgid)
00141 {
00142 case KGameMessage::IdTurn:
00143 Q_INT8 b;
00144 stream >> b;
00145 emit signalTurn(stream,(bool)b);
00146 break;
00147 case KGameMessage::IdIOAdded:
00148 Q_INT16 id;
00149 stream >> id;
00150 emit signalInit(stream,(int)id);
00151 break;
00152 default:
00153 emit signalCommand(stream,msgid-KGameMessage::IdUser,receiver,sender);
00154 break;
00155 }
00156 }
00157
00158 #include "kgameprocess.moc"