示例#1
0
/*********************************************
Update an entry from a network frame
return RET_NOK on error
*********************************************/
ret_code_t entry_update(char * data)
{
	char * elements[5] = {NULL,NULL,NULL,NULL,NULL};
	config_setting_t * setting;
	const config_t * config= NULL;
	int value;
	char * token;
	int index = 0;
	ret_code_t ret = RET_NOK;

	token = _strsep(&data,NETWORK_DELIMITER);
	while( token != NULL ) {
		elements[index] = strdup(token);
		index++;
		if(index>5) {
			werr(LOGDEV,"Split string error");
			goto entry_update_cleanup;
		}
		token = _strsep(&data,NETWORK_DELIMITER);
	}

	SDL_LockMutex(entry_mutex);
	config = get_config(elements[1],elements[2]);
	if(config==NULL) {
		goto entry_update_cleanup;
	}

	setting = config_lookup (config, elements[3]);
	if(setting==NULL) {
		goto entry_update_cleanup;
	}

	if( strcmp(elements[0],ENTRY_TYPE_INT) == 0 ) {
		value = atoll(elements[4]);
		if(config_setting_set_int (setting, value) == CONFIG_FALSE) {
			werr(LOGUSER,"Errror setting %s/%s/%s to %d",elements[1],elements[2],elements[3],value);
		} else {
			write_config(config,elements[1],elements[2]);
		}
	} else if( strcmp(elements[0],ENTRY_TYPE_STRING) == 0 ) {
		if(config_setting_set_string (setting,elements[4]) == CONFIG_FALSE) {
			werr(LOGUSER,"Errror setting %s/%s/%s to %s",elements[1],elements[2],elements[3],elements[4]);
		} else {
			write_config(config,elements[1],elements[2]);
		}
	}

	ret = RET_OK;

entry_update_cleanup:
	SDL_UnlockMutex(entry_mutex);
	for(index=0; index<5; index++) {
		if(elements[index]) {
			free(elements[index]);
		}
	}

	return ret;
}
示例#2
0
/**************************************
Return RET_NOK on error
**************************************/
ret_code_t parse_incoming_data(context_t * context, Uint32 command, Uint32 command_size, char * data)
{
	char * value = NULL;
	char * fullname;
	char * elements[512];
	char * cksum;
	int i;
	char * user_name;
	char * password;

	if( !context_get_connected(context) && ( command != CMD_REQ_LOGIN  && command != CMD_REQ_FILE) ) {
		werr(LOGUSER,"Request from not authenticated client, close connection");
		return RET_NOK;
	}

	switch(command) {
	case CMD_REQ_LOGIN:
		wlog(LOGDEBUG,"Received CMD_REQ_LOGIN");
		user_name = _strsep(&data,NETWORK_DELIMITER);
		password = _strsep(&data,NETWORK_DELIMITER);

		if(entry_read_string(PASSWD_TABLE, user_name, &value, PASSWD_KEY_PASSWORD,NULL) == RET_NOK) {
			return RET_NOK;
		}
		if( strcmp(value, password) != 0) {
			free(value);
			werr(LOGUSER,"Wrong login for %s",user_name);
			// send answer
			network_send_command(context, CMD_SEND_LOGIN_NOK, 0, NULL, false);
			// force client disconnection
			return RET_NOK;
		} else {
			free(value);

			if( context_set_username(context, user_name) == RET_NOK ) {
				return RET_NOK;
			}
			context_set_connected(context, true);

			// send answer
			network_send_command(context, CMD_SEND_LOGIN_OK, 0, NULL, false);
			wlog(LOGUSER,"Login successful for user %s",context->user_name);
		}
		break;
	case CMD_REQ_CHARACTER_LIST :
		wlog(LOGDEBUG,"Received CMD_REQ_CHARACTER_LIST");
		character_send_list(context);
		wlog(LOGDEBUG,"character list sent");
		break;
	case CMD_REQ_FILE :
		i = 0;
		elements[i] = _strsep(&data,NETWORK_DELIMITER);
		while(elements[i]) {
			i++;
			elements[i] = _strsep(&data,NETWORK_DELIMITER);
		}

		if(elements[0]==NULL || elements[1]==NULL) {
			werr(LOGDEV,"Received erroneous CMD_REQ_FILE");
			break;
		}
		wlog(LOGDEBUG,"Received CMD_REQ_FILE for %s",elements[0]);
		/* compare checksum */
		fullname = strconcat(base_directory,"/",elements[0],NULL);

		cksum = checksum_file(fullname);
		free(fullname);

		if( cksum == NULL) {
			werr(LOGUSER,"Required file %s doesn't exists",elements[0]);
			break;
		}

		if( strcmp(elements[1],cksum) == 0 ) {
			wlog(LOGDEBUG,"Client has already newest %s file",elements[0]);
			free(cksum);
			break;
		}
		free(cksum);

		network_send_file(context,elements[0]);
		wlog(LOGDEBUG,"File %s sent",elements[0]);
		break;
	case CMD_REQ_USER_CHARACTER_LIST :
		wlog(LOGDEBUG,"Received CMD_REQ_USER_CHARACTER_LIST");
		character_user_send_list(context);
		wlog(LOGDEBUG,"user %s's character list sent",context->user_name);
		break;
	case CMD_REQ_START :
		if( context->in_game == false ) {
			context->id = strdup(data);
			context->in_game = true;
			context_update_from_file(context);
			context_spread(context);
			context_request_other_context(context);
		}
		wlog(LOGDEBUG,"Received CMD_REQ_START for %s /%s",context->user_name,context->id);
		break;
	case CMD_REQ_STOP :
		wlog(LOGDEBUG,"Received CMD_REQ_STOP for %s /%s",context->user_name,context->id);
		if( context->in_game == true ) {
			context->in_game = false;
			if( context->map ) {
				free(context->map);
			}
			context->map = NULL;
			if( context->prev_map ) {
				free(context->prev_map);
			}
			context->prev_map = NULL;
			if( context->id ) {
				free(context->id);
			}
			context->id = NULL;
			context_spread(context);
		}
		break;
	case CMD_REQ_ACTION :
		i = 0;
		elements[i] = NULL;
		elements[i] = _strsep(&data,NETWORK_DELIMITER);
		while(elements[i]) {
			i++;
			elements[i] = _strsep(&data,NETWORK_DELIMITER);
		}
		elements[i+1] = NULL;

		wlog(LOGDEBUG,"Received CMD_REQ_ACTION %s from %s /%s",elements[0],context->user_name,context->character_name);

		action_execute(context,elements[0],&elements[1]);
		break;
	default:
		werr(LOGDEV,"Unknown request %d from client",command);
		return RET_NOK;
	}

	return RET_OK;
}
示例#3
0
// this function reads a file for "," separated values and creates a matrix object from it
int CFmDataFrame::Load(const char* filename, bool bRowName, bool bColName)
{
    _log_debug(_HI_, "CFmDataFrame::Load:%s, bRowName=%d, bColName=%d", filename, bRowName, bColName);

    FILE* fp = fopen( filename, "rt");
    if (fp==NULL)
    {
        _log_error(_HI_, "The file can not be opened(%s)", filename);
        return(ERR_OPEN_FILE);
    }

    char aLine[MAX_LINE_WIDTH+1]={0};
    if( fgets( aLine, MAX_LINE_WIDTH, fp ) == NULL)
    {
        _log_error( _HI_, "Failed to read a line (%s)", filename);

        fclose(fp);
        return(ERR_READ_FILE);
    }

    CFmVectorStr vctRowNames(0);
    CFmVectorStr vctColNames(0);
    int col_size = 0;

    // count how many elements in the first lines
    const char seps1[] = ",\t\n\r";

    char* running = Strdup (aLine);
    char* runnptr = running;
    char* token = _strsep((char**)&running, seps1 );
    while(token)
    {
		if(strlen(token)!=0)
		{
			vctColNames.Put( token);
		    col_size++;
        }

    	token = _strsep( (char**)&running, seps1 );
    }

    Free(runnptr);

    _log_debug(_HI_, "CFmDataFrame::Load:  col_size: %d", col_size);

    CFmVector tmpRow(col_size, 0.0);
    if (bRowName && !bColName)
        tmpRow.Resize(col_size-1);

    int nMaxRows = 20;
    int nMaxCols = tmpRow.GetLength();
    m_nNumCols = tmpRow.GetLength();
    m_nNumRows = 0;

    AllocMemory( nMaxRows, nMaxCols );

    if (!bColName)
    {
        if (!bRowName)
        {
            m_nNumCols = col_size;
            for (int i=0; i<col_size; i++)
                Set(0, i, vctColNames[i]);
        }
        else
        {
            m_nNumCols = col_size-1;
            for (int i=1; i<col_size+1; i++)
                Set(0, i-1, vctColNames[i]);
            vctRowNames.Put( vctColNames[0] );
        }

        m_nNumRows++;
    }

    CFmVectorStr vctTmpRow(0);
    while(!feof(fp))
    {
        if( fgets( aLine, MAX_LINE_WIDTH, fp ) == NULL)
            break;

        char* running = Strdup (aLine);

        vctTmpRow.Reset(0);
        char* token = _strsep( &running, seps1 );
        int nNonEmty = 0;

        while(token)
        {
            if (strlen(token)!=0 &&
                strncmp(token, "\n", 1)!=0 &&
                strncmp(token, "\r", 1)!=0 &&
                strncmp(token, "\t", 1)!=0)
                nNonEmty ++;
            vctTmpRow.Put(token);
            token = _strsep( &running, seps1 );
        }

        Free(running);
        if (nNonEmty==0)
            break;

        m_nNumRows++;
        if (m_nNumRows >= m_nMaxRows )
            AllocMemory( m_nNumRows+20, m_nMaxCols );

        if (!bRowName)
        {
            for (int i=0; i<col_size && i<vctTmpRow.GetLength(); i++)
                Set( m_nNumRows-1, i,  vctTmpRow[i] );
        }
        else
        {
            for (int i=1; i<col_size+1 && i<vctTmpRow.GetLength(); i++)
            {
                Set( m_nNumRows-1, i-1,  vctTmpRow[i] );
            }

            vctRowNames.Put( vctTmpRow[0]);
        }
    }

    fclose(fp);

	CFmNewTemp refNew;
    if (bRowName)
        m_pRowNames = new (refNew) CFmVectorStr( &vctRowNames );

    if (bColName)
        m_pColNames = new (refNew) CFmVectorStr( &vctColNames );

    _log_debug(_HI_, "CFmDataFrame::Load:%d,%d", m_nNumRows, m_nNumCols);

    return(0);
}