Ejemplo n.º 1
0
void OutOfBandData( netsrc_t sock, const netadr_t& adr, byte *data, std::size_t len )
{
	if ( len == 0 )
	{
		return;
	}

	std::basic_string<byte> message;
	message.reserve(OOBHeader().size() + len);
	message.append(OOBHeader().begin(), OOBHeader().end());
	message.append(data, len);

	msg_t mbuf;
	mbuf.data = &message[0];
	mbuf.cursize = message.size();
	Huff_Compress( &mbuf, 12 );
	// send the datagram
	NET_SendPacket( sock, mbuf.cursize, mbuf.data, adr );
}
Ejemplo n.º 2
0
/*
===============
NET_OutOfBandData

Sends a data message in an out-of-band datagram (only used for "connect")
================
*/
void QDECL NET_OutOfBandData( netsrc_t sock, netadr_t adr, byte *format, int len )
{
	byte  string[ MAX_MSGLEN * 2 ];
	int   i;
	msg_t mbuf;

	NET_SetOOBHeader( ( char * ) string );

	for ( i = 0; i < len; i++ )
	{
		string[ i + 4 ] = format[ i ];
	}

	mbuf.data = string;
	mbuf.cursize = len + 4;
	Huff_Compress( &mbuf, 12 );
	// send the datagram
	NET_SendPacket( sock, mbuf.cursize, mbuf.data, adr );
}
Ejemplo n.º 3
0
/*
===============
NET_OutOfBandPrint

Sends a data message in an out-of-band datagram (only used for "connect")
================
*/
void QDECL NET_OutOfBandData( netsrc_t sock, netadr_t adr, byte* format, int len )
{
	byte        string[MAX_MSGLEN * 2];
	int         i;
	msg_s       mbuf;
	
	// set the header
	string[0] = 0xff;
	string[1] = 0xff;
	string[2] = 0xff;
	string[3] = 0xff;
	
	for ( i = 0; i < len; i++ )
	{
		string[i + 4] = format[i];
	}
	
	mbuf.data = string;
	mbuf.cursize = len + 4;
	Huff_Compress( &mbuf, 12 );
	// send the datagram
	NET_SendPacket( sock, mbuf.cursize, mbuf.data, adr );
}
Ejemplo n.º 4
0
/*
================
SV_MakeCompressedPureList

Fills the last N configstrings with compressed pure list
================
*/
int SV_MakeCompressedPureList(void)
{
 unsigned char buf[PURE_COMPRESS_BUFFER];
 char tmp[1025];
 int i,l,bl,sh,shl,ol,csnr;
 const char *nam;
 msg_t msg = {0};
 const char *err_chunk = "ERROR: Too many pk3 files (compressed data doesn't fit into available space)\n";

 // Get raw checksums
 bl = FS_LoadedPakChecksumsBlob(buf+2,sizeof(buf)-2);
 if (!bl) {
  Com_Printf("ERROR: Too many pk3 files (size of checksums > buffer)\n");
  return 1;
 }
 Com_DPrintf("CRC SIZE: %d\n",bl);

 // Add number of files at start
 l = bl/4; // num files
 buf[0]=(l)&0xFF;
 buf[1]=(l>>8)&0xFF;

 // Get pak names
 nam = FS_LoadedPakNames();
#if 1
 msg.cursize = 2+bl;
 i = TextEncode6Bit(nam,buf+msg.cursize,sizeof(buf)-msg.cursize);
 if (i<0) return 1;
 msg.cursize+=i;
#else // not used, disables 6bit encoding
 msg.cursize = 2+bl+strlen(nam)+1;
 if (msg.cursize>sizeof(buf)) {
  Com_Printf("ERROR: Too many pk3 files (no space in buffer for names, need %d bytes)\n",msg.cursize-sizeof(buf));
  return 1;
 }
 strcpy((char*)buf+2+bl,nam);
#endif
 Com_Printf("Pure filelist (%d files) size: %d\n",l,msg.cursize);

// fprintf(stderr,"FNAMES: %s\n",nam);

// Com_Printf("BUF(%d): ",msg.cursize);
// for(i=0;i<msg.cursize;i++) Com_Printf("%02X",buf[i]);
// Com_Printf("\n");

 // Huffman compress names
 msg.maxsize = sizeof(buf);
 msg.data = buf;
 Huff_Compress(&msg,2+bl);
 bl = msg.cursize;

// fprintf(stderr,"COMPRESSED(%d): ",msg.cursize);
// for(i=0;i<msg.cursize;i++) fprintf(stderr,"%02X",buf[i]);
// fprintf(stderr,"\n");

 Com_Printf("Pure filelist compressed size: %d\n",bl);

 // Do 8bit to 7bit encoding, escaping \0 % " using @ char and original value + 1
 csnr = 0;
 sh = 0;
 l = 0;
 shl = 0;
 ol = 0;
 for(i=0;i<bl;i++) {
  sh=(sh<<8)|buf[i];
  shl+=8;
//  Com_Printf("IN:%02X\n",buf[i]);
  while(shl>=7) {
   shl-=7;
   int v = (sh>>shl)&127;
   if (v==0 || v=='"' || v=='%' || v=='@') {
	tmp[ol++] = '@';
//    Com_Printf("OUT:%02X\n",tmp[ol-1]);
	if (ol==sizeof(tmp)-1) {
	 tmp[ol]=0;
	 if (csnr==PURE_COMPRESS_NUMCS) {
	  Com_Printf(err_chunk);
	  return 1;
	 }
	 SV_SetConfigstring( MAX_CONFIGSTRINGS-PURE_COMPRESS_NUMCS+csnr, tmp);
	 csnr++;
	 ol=0;
	}
	tmp[ol++] = v+1;
   } else {
	tmp[ol++] = v;
   }
//   Com_Printf("OUT:%02X\n",tmp[ol-1]);
   if (ol==sizeof(tmp)-1) {
	tmp[ol]=0;
	if (csnr==PURE_COMPRESS_NUMCS) {
	 Com_Printf(err_chunk);
	 return 1;
	}
	SV_SetConfigstring( MAX_CONFIGSTRINGS-PURE_COMPRESS_NUMCS+csnr, tmp);
	csnr++;
	ol=0;
   }
  }
 }
// Com_Printf("[shl=%d sh=%X]\n",shl,sh);

 // Finish remaining bits if any
 if (shl>0) {
  int v = (sh<<(7-shl))&127;
  if (v==0 || v=='"' || v=='%' || v=='@') {
   tmp[ol++] = '@';
   if (ol==sizeof(tmp)-1) {
	tmp[ol]=0;
	if (csnr==PURE_COMPRESS_NUMCS) {
	 Com_Printf(err_chunk);
	 return 1;
	}
	SV_SetConfigstring( MAX_CONFIGSTRINGS-PURE_COMPRESS_NUMCS+csnr, tmp);
	csnr++;
	ol=0;
   }
   tmp[ol++] = v+1;
  } else {
   tmp[ol++] = v;
  }
//  Com_Printf("OUT:%02X\n",tmp[ol-1]);
 }
 if (ol) {
  if (csnr==PURE_COMPRESS_NUMCS) {
   Com_Printf(err_chunk);
   return 1;
  }
  tmp[ol]=0;
  SV_SetConfigstring( MAX_CONFIGSTRINGS-PURE_COMPRESS_NUMCS+csnr, tmp);
 }
 Com_Printf("Using %d configstrings to store pure filelist (encoded using %d characters)\n",csnr+1,ol+csnr*1024);
 return 0;
}