コード例 #1
0
ファイル: listener.c プロジェクト: swhatelse/URB_Final
void handle_normal(message_t* msg, node_t* sender) {
    if(!is_already_in(delivered, msg)) {
        // Message have not received yet
        if(!is_already_in(already_received, msg)) {
            GList* element = get_msg_from_list(not_received_yet, msg);
            // Check is the message is already referenced in the not_received yet
            if(element) {
                message_element_t* msg_elmnt = (message_element_t*)element->data;
                not_received_yet = g_list_remove(not_received_yet, msg_elmnt);
                already_received = g_list_append(already_received, msg_elmnt);
                add_ack(msg_elmnt, &my_id);
            }
            else {
                // Completely new message
                insert_message(msg, &already_received);
            }
            /* DEBUG_RECV("[%d][%d] Message received from [%s:%d][%d]\n", msg->node_id, msg->id, inet_ntoa(sender->inbox->infos.sin_addr), ntohs(sender->inbox->infos.sin_port), sender->inbox->fd); */
            DEBUG_RECV("[%d][%d] Message received from [%d]\n", msg->node_id, msg->id, sender->id);
            acknowledge(*msg);
            multicast(msg, sizeof(message_t));
            DEBUG_SEND("[%d][%d] Retransmited\n", msg->node_id, msg->id);
        }
        else {
            // Message already received, we can drop it
            free(msg);
            msg = NULL;
        }
    }
    else {
        free(msg);
        msg = NULL;
    }
}
コード例 #2
0
// 20-2-2016 添加数据库的相关处理
int proccess_upper_cmpt_discussion_parameter( uint16_t protocol_type, void *data, uint32_t data_len ) //后期可能需要修改11/10。
{
    tcmpt_discuss_parameter qu_dis_para, set_dis_para;
    uint16_t send_data_len = 0; // 协议数据负载的长度
    thost_system_set set_sys; // 系统配置文件的格式

    if ( -1 == system_db_queue_configure_system_table( &set_sys ))
    {   // load from memory(system.dat)
        memcpy( &set_sys, &gset_sys, sizeof(thost_system_set));
    }

    if((protocol_type & CMPT_MSG_TYPE_MARK) == CMPT_MSG_TYPE_QUERY )
    {
        qu_dis_para.chairman_first = set_sys.chman_first ? ENABLE_VAL : FORBID_VAL;
        qu_dis_para.chair_music = set_sys.chman_music ? ENABLE_VAL : FORBID_VAL;
        qu_dis_para.auto_close = set_sys.auto_close ? ENABLE_VAL : FORBID_VAL;
        qu_dis_para.discuss_mode = set_sys.discuss_mode & 0x07;
        qu_dis_para.limit_speak_num = set_sys.speak_limit & 0xff;
        qu_dis_para.limit_apply_num = set_sys.apply_limit & 0xff;
        qu_dis_para.limit_chm_time = set_sys.chman_limitime ? ENABLE_VAL : FORBID_VAL;
        qu_dis_para.limit_vip_time = set_sys.vip_limitime ? ENABLE_VAL : FORBID_VAL;
        qu_dis_para.limit_speak_time = set_sys.spk_limtime & 0x3f;
        send_data_len = sizeof(tcmpt_discuss_parameter);

        send_upper_computer_command( CMPT_MSG_TYPE_RESPONSE |CMPT_MSG_TYPE_QUERY, \
                                     DISCUSSION_PARAMETER, &qu_dis_para, send_data_len );
    }
    else if((protocol_type & CMPT_MSG_TYPE_MARK) == CMPT_MSG_TYPE_SET )// 设置保存系统状态值并设置系统状态
    {
        get_host_upper_cmpt_data( &set_dis_para, data, CMPT_DATA_OFFSET, sizeof(tcmpt_discuss_parameter));
        DEBUG_RECV( &set_dis_para, sizeof(tcmpt_discuss_parameter), "Dis Param ");

        send_upper_computer_command( CMPT_MSG_TYPE_RESPONSE |CMPT_MSG_TYPE_SET, \
                                     DISCUSSION_PARAMETER, NULL, 0 ); // 第三个与第四个参数与协议有些出入,这里是根据黄工代码写的。协议是数据单元仅一个字节0,设置成功;非零设置失败。而黄工的没有数据单元,故这里写NULL

        if( set_dis_para.discuss_mode == UPPER_CMPT_DISCUSS_FREE_MODE )// 数字会议系统没有自由模式
        {
            terminal_start_discuss( false );
            return 0;
        }

        // 保存配置文件
        if( (profile_dis_param_save_to_ram( &gset_sys, &set_dis_para ) != -1) && (-1 != profile_system_file_write_gb_param( profile_file_fd, &gset_sys )) )
        {
            Fflush( profile_file_fd );
            // 设置系统状态
            uint8_t temp_status = set_dis_para.auto_close;
            if( temp_status != set_sys.auto_close )
            {
                // 自动关闭麦克风
                find_func_command_link( MENUMENT_USE, MENU_AUTO_CLOSE_CMD, 0, &temp_status, 1 );
            }

            temp_status = set_dis_para.discuss_mode;
            if( temp_status != set_sys.discuss_mode )
            {
                // 设置系统讨论模式
                DEBUG_INFO("discuss mode = %d", temp_status);
                find_func_command_link( MENUMENT_USE, MENU_DISC_MODE_SET_CMD, 0, &temp_status, 1 );
            }

            temp_status = set_dis_para.limit_speak_num;
            if( temp_status != set_sys.speak_limit )
            {
                // 设置限制的发言人数
                find_func_command_link( MENUMENT_USE, MENU_SPK_LIMIT_NUM_SET, 0, &temp_status, 1 );
            }

            temp_status = set_dis_para.limit_apply_num;
            if( temp_status != set_sys.apply_limit )
            {
                // 设置限制申请人数
                find_func_command_link( MENUMENT_USE, MUNU_APPLY_LIMIT_NUM_SET, 0, &temp_status, 1 );
            }

            // 限时设置
            terminal_limit_speak_time_set( 0, NULL, 0 );

            // 设置会议讨论状态
            terminal_start_discuss( false );

            //更新数据库系统配置信息
            system_db_update_configure_system_table( gset_sys );
        }
    }

    terminal_main_state_send( 0, NULL, 0 );

    return 0;
}