Ejemplo n.º 1
0
static unsigned long 
SendRequest(u_size op_code,u_size total_objects,void *packet, u_size size)
{
	header_t header;
	void *to_send;
	int socket;
	int ret;
	ack_t *ack_ptr;
	void *data;
	u_size header_size;
	
	/* Tipo de pedido */
	header.opCode = op_code;
	header.total_objects = total_objects;
	/* Identificacion del usuario */
	strcpy(header.user,log_user);
	strcpy(header.passwd,log_passwd);
	header_size = GetHeaderData(header, &data);	
	/* Concateno los paquetes header y pedido */
	if( (to_send = malloc(header_size+size)) == NULL )
		return CONNECT_ERROR;	
	memmove(to_send, data, header_size);
	free(data);
	/* Chequeo si realmente se manda un paquete asociado al pedido */
	if( packet != NULL ) {
		memmove(to_send+header_size, packet, size);
	}	
	/* Me conecto al servidor */
	if( (socket=connectTCP(server_host,server_port)) < 0 ){
		free(to_send);
		return CONNECT_ERROR;
	}

	setSocketTimeout(socket,TIMEOUT_DEFAULT);
	/* Mando el paquete */
	sendTCP(socket, to_send,header_size+size);
	free(to_send);
	if(exitPipe==1)
	{
	    exitPipe=0;
	    close(socket);
	    return TIMEOUT_ERROR;
	}
	
	/* Espero por la respuesta del servidor */
	ack_ptr = receiveTCP(socket);
	if(ack_ptr==NULL)
	{
	    close(socket);
	    return TIMEOUT_ERROR;
	}
	ret = ack_ptr->ret_code;
	free(ack_ptr);
	/* Cierro la conexion????? */
	close(socket);
	return ret;
}
Ejemplo n.º 2
0
static download_header_t
SendDownloadRequest(void *packet, u_size size)
{
	header_t header;
	void *to_send;
	int socket;
	download_header_t download_info;
	void *data;
	u_size header_size;
	void *ack_data;
	
	download_info.ret_code = CONNECT_ERROR;
	
	/* Tipo de pedido */
	header.opCode = __DOWNLOAD__;
	header.total_objects = 1;
	/* Identificacion del usuario */
	strcpy(header.user,log_user);
	strcpy(header.passwd,log_passwd);	
	header_size = GetHeaderData(header, &data);	
	/* Concateno los paquetes header y pedido */
	if( (to_send = malloc(header_size+size)) == NULL )
		return download_info;	
	memmove(to_send, data, header_size);
	memmove(to_send+header_size, packet, size);
	free(data);
	/* Me conecto al servidor */
	if( (socket=connectTCP(server_host,server_port)) < 0 ){
		free(to_send);
		return download_info;
	}
	setSocketTimeout(socket,TIMEOUT_DEFAULT);
	/* Mando el paquete */
	sendTCP(socket, to_send,header_size+size);
	free(to_send);
	if(exitPipe==1)
	{
	    exitPipe=0;
	    close(socket);
	    return download_info;
	}
	
	/* Espero por la respuesta del servidor */
	ack_data = receiveTCP(socket);
	if(ack_data==NULL)
	{
	    close(socket);
	    return download_info;
	}
	GetDownloadHeaderPack(ack_data, &download_info);
	/* Cierro la conexion????? */
	close(socket);
	return download_info;
	
}
Ejemplo n.º 3
0
static status
SendSignal(u_size op_code, void *packet, u_size size)
{
	header_t header;
	void *to_send;
	int socket;
	u_size header_size;
	void *data;
	
	/* Tipo de senial */
	header.opCode = op_code;
	header.total_objects = 1;
	/* Identificacion del usuario */
	strcpy(header.user,log_user);
	strcpy(header.passwd,log_passwd);
	/* Concateno los paquetes header y pedido */
	header_size = GetHeaderData(header, &data);	
	if( (to_send = malloc(header_size+size)) == NULL )
		return ERROR;	
	memmove(to_send, data, header_size);
	memmove(to_send + header_size,packet,size);
	free(data);
	/* Me conecto al servidor */
	if( (socket=connectTCP(server_host,server_port)) < 0 ){
		free(to_send);
		return ERROR;
	}
	setSocketTimeout(socket,TIMEOUT_DEFAULT);
	/* Mando el paquete */
	sendTCP(socket, to_send,header_size+size);
	free(to_send);
	if(exitPipe==1)
	{
	    exitPipe=0;
	    close(socket);
	    return ERROR;
	}
	
	close(socket);
	return OK;	
}
// Read Header
// Run through the rest of the header information
bool trpgr_Archive::ReadHeader(bool readAllBlocks)
{
    int ret;

    if (!fp || headerRead)
        return false;

    headerRead = true;

    // Next int64 should be the header size
    trpgEndian cpuNess = trpg_cpu_byte_order();
    int32 headerSize;
    if (fread(&headerSize,sizeof(int32),1,fp) != 1)
        return false;
    if (ness != cpuNess)
        headerSize = trpg_byteswap_int(headerSize);
    int headLen = headerSize;
    if (headLen < 0)
        return false;

    // Read in the header whole
    trpgMemReadBuffer buf(ness);
    buf.SetLength(headLen);
    char *data = buf.GetDataPtr();
    if ((ret = GetHeaderData(data,headLen,fp)) != headLen)
        return false;

    // Set up a parser
    // Catch the tables we need for the archive
    trpgMatTable1_0 oldMatTable;
    trpgTexTable1_0 oldTexTable;
    trpgr_Parser parser;
    parser.AddCallback(TRPGHEADER,&header);
    parser.AddCallback(TRPGMATTABLE,&materialTable);    // Went back to oldest style for 2.0
    parser.AddCallback(TRPGMATTABLE2,&oldMatTable);     // Added 11-14-98 (1.0 material table)
    parser.AddCallback(TRPGTEXTABLE,&oldTexTable);
    parser.AddCallback(TRPGTEXTABLE2,&texTable);            // Added for 2.0
    parser.AddCallback(TRPGMODELTABLE,&modelTable);
    parser.AddCallback(TRPGLIGHTTABLE,&lightTable);                // Added for 2.0
    parser.AddCallback(TRPGRANGETABLE,&rangeTable);                // Added for 2.0
    parser.AddCallback(TRPG_TEXT_STYLE_TABLE,&textStyleTable);                // Added for 2.1
    parser.AddCallback(TRPG_SUPPORT_STYLE_TABLE,&supportStyleTable);
    parser.AddCallback(TRPG_LABEL_PROPERTY_TABLE,&labelPropertyTable);
    // Don't read the tile table for v1.0 archives
    // It's only really used for 2.0 archives
    parser.AddCallback(TRPGTILETABLE2,&tileTable);

    // Parse the buffer
    if (!parser.Parse(buf))
        return false;

    if(header.GetIsMaster())
    {
        // bool firstBlock = true;
        //if the master has textures, we want to use them instead of the tables in the
        //block archives

        // int numTiles = 0;
        //tileTable.
        int totalrows,totalcols;
        trpg2dPoint mhdr_swExtents;
        trpg2dPoint mhdr_neExtents;
        trpg3dPoint mhdr_Origin;
        // integrate header information from the block header.
        header.GetExtents(mhdr_swExtents,mhdr_neExtents);
        header.GetOrigin(mhdr_Origin);
        header.GetBlocks(totalrows,totalcols);
        if(readAllBlocks) {
            for(int row=0;row<totalrows;row++) {
                for(int col=0;col<totalcols;col++) {
                    // Read each block -- Warning, this can take a while!!!
                    ReadSubArchive( row, col, cpuNess);
                }
            }
        }
        else {
            ReadSubArchive( 0, 0, cpuNess);//Get the first archive!
        }

    }
    tileTable.SetCurrentBlock(-1,-1,false);

    // 1.0 Compatibility
    // If we see an older style material table, convert it to the new style
    // This isn't terribly memory efficient, but it does work
    if (oldMatTable.isValid())
        materialTable = oldMatTable;
    if (oldTexTable.isValid())
        texTable = oldTexTable;

    // Set up a tile cache, if needed
    trpgTileTable::TileMode tileMode;
    tileTable.GetMode(tileMode);
    if (tileMode == trpgTileTable::Local) {
        if (tileCache)  delete tileCache;
        char fullBase[1060];
        sprintf(fullBase,"%s" PATHSEPERATOR "tileFile",dir);
        tileCache = GetNewRAppFileCache(fullBase,"tpf");
    }

    valid = true;

    return true;
}
/**
 * Read a sub block from a 2.2 TXP database. This can be called any time after ReadHeader is called
 * if ReadHeader is called with the false parameter to specify not to read all the sub-archives.
 * This can make a huge improvement in startup time for loading a very large archive with many blocks.
 **/
bool trpgr_Archive::ReadSubArchive(int row, int col, trpgEndian cpuNess)
{
    int ret;
    trpgHeader blockHeader;
    trpgr_Parser bparser;

    char blockpath[1060];
    //open the block archive
    // the block archive will be in the base dir + \\cols\\row\\archive.txp
    sprintf(blockpath,"%s%s%d%s%d%sarchive.txp",dir,PATHSEPERATOR,col,PATHSEPERATOR,row,PATHSEPERATOR);
    FILE *bfp = osgDB::fopen(blockpath,"rb");
    if(!bfp) {
        return false;
    }
    // Look for a magic # and endianness
    int32 bmagic;
    if (fread(&bmagic,sizeof(int32),1,bfp) != 1)
    {
        //close the block archive
        fclose(bfp);
        return false;
    }

    // The block archive will always be the same endianness as the master
    if ( (bmagic != GetMagicNumber()) && (trpg_byteswap_int(bmagic) != GetMagicNumber()) )
    {
        //close the block archive
        fclose(bfp);
        return false;
    }

    int32 bheaderSize=0;
    if (fread(&bheaderSize,sizeof(int32),1,bfp) != 1)
    {
        //close the block archive
        fclose(bfp);
        return false;
    }

    if (ness != cpuNess)
        bheaderSize = trpg_byteswap_int(bheaderSize);

    int bheadLen = bheaderSize;
    if (bheadLen < 0)
    {
        //close the block archive
        fclose(bfp);
        return false;
    }

    // Read in the header whole
    trpgMemReadBuffer bbuf(ness);
    bbuf.SetLength(bheadLen);
    char *bdata = bbuf.GetDataPtr();
    if ((ret = GetHeaderData(bdata,bheadLen,bfp)) != bheadLen)
    {
        //close the block archive
        fclose(bfp);
        return false;
    }

    //keep track of where this came from in the master table.
    tileTable.SetCurrentBlock(row,col,true);
    texTable.SetCurrentBlock(row,col);

    bparser.AddCallback(TRPGHEADER,&blockHeader);
    bparser.AddCallback(TRPGMATTABLE,&materialTable);    // Went back to oldest style for 2.0
    //if(!headerHasTexTable) {
    bparser.AddCallback(TRPGTEXTABLE2,&texTable);            // Added for 2.0
    //}
    bparser.AddCallback(TRPGMODELTABLE,&modelTable);
    bparser.AddCallback(TRPGLIGHTTABLE,&lightTable);                // Added for 2.0
    bparser.AddCallback(TRPGRANGETABLE,&rangeTable);                // Added for 2.0
    bparser.AddCallback(TRPG_TEXT_STYLE_TABLE,&textStyleTable);                // Added for 2.1
    bparser.AddCallback(TRPG_SUPPORT_STYLE_TABLE,&supportStyleTable);
    bparser.AddCallback(TRPG_LABEL_PROPERTY_TABLE,&labelPropertyTable);
    // Don't read the tile table for v1.0 archives
    // It's only really used for 2.0 archives
    bparser.AddCallback(TRPGTILETABLE2,&tileTable);

    // Parse the buffer
    if (!bparser.Parse(bbuf))
        return false;
    //close the block archive
    fclose(bfp);

    tileTable.SetCurrentBlock(-1,-1,false);

    return true;
}
Ejemplo n.º 6
0
static int
SendListMoviesRequest(void *data, u_size size, movie_t ***out_ptr)
{
	header_t header;
	header_t ack_header;
	void *ack_movies;
	void *to_send;
	void * ackHeader;
	int socket;
	void *header_data;
	u_size header_size;
	
	/* Tipo de pedido */
	header.opCode = __LIST_MOVIES_BY_GEN__;
	header.total_objects = 1;
	/* Identificacion del usuario */
	strcpy(header.user,log_user);
	strcpy(header.passwd,log_passwd);
	header_size = GetHeaderData(header, &header_data);	
	/* Concateno los paquetes header y pedido */
	if( (to_send = malloc(header_size+size)) == NULL )
		return CONNECT_ERROR;	
	memmove(to_send, header_data, header_size);
	free(header_data);
	/* Chequeo si realmente se manda un paquete asociado al pedido */
	
	memmove(to_send+header_size, data, size);
	
	/* Me conecto al servidor */
	if( (socket=connectTCP(server_host,server_port)) < 0 ){
		free(to_send);
		return -1;
	}
	setSocketTimeout(socket,TIMEOUT_DEFAULT);
	/* Mando el paquete */
	sendTCP(socket, to_send,header_size+size);
	free(to_send);
	if(exitPipe==1)
	{
	    exitPipe=0;
	    close(socket);
	    return TIMEOUT_ERROR;
	}
	
	/* Espero por la respuesta del servidor */
	ackHeader=receiveTCP(socket);
	if(ackHeader==NULL)
	{
	    close(socket);
	    return TIMEOUT_ERROR;
	}
	GetHeaderPack(ackHeader,&ack_header);
	fflush(stdout);
	if( ack_header.opCode == __LIST_OK__ ) {
		ack_movies = receiveTCP(socket);
		if(ack_movies==NULL)
		{
		    close(socket);
		    return TIMEOUT_ERROR;
		}
		*out_ptr = GetMovies(ack_movies,ack_header.total_objects);
		free(ack_movies);
	}
	else
		ack_header.total_objects = 0;
	close(socket);
	return ack_header.total_objects;
}
Ejemplo n.º 7
0
static int
SendListUsersRequest(client_t ***out_ptr)
{
	header_t header;
	header_t ack_header;
	void *ack_users;
	void * ackHeader;
	int socket;
	void *header_data;
	u_size header_size;
	char * decripted;
	
	/* Tipo de pedido */
	header.opCode = __LIST_USERS__;
	header.total_objects = 1;
	/* Identificacion del usuario */
	strcpy(header.user,log_user);
	strcpy(header.passwd,log_passwd);
	header_size = GetHeaderData(header, &header_data);	
	
	/* Me conecto al servidor */
	if( (socket=connectTCP(server_host,server_port)) < 0 ){
		free(header_data);
		return -1;
	}
	setSocketTimeout(socket,TIMEOUT_DEFAULT);
	/* Mando el paquete */
	sendTCP(socket, header_data,header_size);
	free(header_data);
	if(exitPipe==1)
	{
	    exitPipe=0;
	    close(socket);
	    return -1;
	}
	
	/* Espero por la respuesta del servidor */
	ackHeader=receiveTCP(socket);
	if(ackHeader==NULL)
	{
	    close(socket);
	    return -1;
	}
	GetHeaderPack(ackHeader,&ack_header);
	
	if( ack_header.opCode == __LIST_USERS_OK__ ) {
		
		ack_users = receiveTCP(socket);
		if(ack_users==NULL)
		{
		    close(socket);
		    return -1;
		}
		decripted=Decypher(ack_users,ack_header.total_objects*(MAX_USER_LEN+MAX_USER_MAIL+MAX_USER_DESC+sizeof(unsigned char)),log_passwd);
		*out_ptr = GetUsersList(decripted,ack_header.total_objects);
		free(decripted);
		free(ack_users);
	}
	else {
		if(  ack_header.opCode == __USER_ACCESS_DENY__ || ack_header.opCode == __USER_IS_NOT_LOG__ )  
			return -2;
		else
			return -1;
	}
		
	
	close(socket);
	return ack_header.total_objects;	
	
}
Ejemplo n.º 8
0
static int
SendListGensRequest(list_movie_request_t ***out_ptr)
{
	header_t header;
	header_t ack_header;
	void *ack_gens;
	void * dataAux;
	int socket;
	void *header_data;
	u_size header_size;
	
	/* Tipo de pedido */
	header.opCode = __LIST_GENS__;
	header.total_objects = 1;
	/* Identificacion del usuario */
	strcpy(header.user,log_user);
	strcpy(header.passwd,log_passwd);
	header_size = GetHeaderData(header, &header_data);	
	
	/* Me conecto al servidor */
	if( (socket=connectTCP(server_host,server_port)) < 0 ){
		free(header_data);
		return -1;
	}
	setSocketTimeout(socket,TIMEOUT_DEFAULT);
	/* Mando el paquete */
	sendTCP(socket, header_data,header_size);
	free(header_data);
	if(exitPipe==1)
	{
	    exitPipe=0;
	    close(socket);
	    return -1;
	}
	
	/* Espero por la respuesta del servidor */
	dataAux=receiveTCP(socket);
	if(dataAux==NULL)
	{
	    close(socket);
	    return -1;
	}
	GetHeaderPack(dataAux,&ack_header);
	
	if( ack_header.opCode == __LIST_OK__ ) {
		
		ack_gens = receiveTCP(socket);
		if(ack_gens==NULL)
		{
		    close(socket);
		    return -1;
		}
		*out_ptr = GetGenList(ack_gens,ack_header.total_objects);
		free(ack_gens);
	}
	else {
		return -1;
	}
	
	
	close(socket);
	return ack_header.total_objects;	
	
}