Exemple #1
0
static  bool    ModGetLine( a_window *wnd, int row, int piece,
                             wnd_line_piece *line )
{
    mod_handle  handle;
    mod_window  *mod = WndMod( wnd );
    modinfo     *info;

    if( row >= ModListNumRows( ModList( mod ) ) ) return( FALSE );
    handle = ModListMod( ModList( mod ), row );
    line->tabstop = FALSE;
    switch( piece ) {
    case PIECE_SOURCE:
        info = &mod->info[ row ];
        info->source = ModHasSourceInfo( handle );
        info->open = OpenGadget( wnd, line, handle, info->source );
        return( TRUE );
    case PIECE_MODULE:
        line->indent = MaxGadgetLength;
        line->tabstop = TRUE;
        ModListName( ModList( mod ), row, TxtBuff );
        line->text = TxtBuff;
        return( TRUE );
    case PIECE_IMAGE:
        line->indent = mod->max_modlen + MaxGadgetLength;
        line->text = ModImageName( handle );
        return( TRUE );
    default:
        return( FALSE );
    }
}
Exemple #2
0
static void     ModMenuItem( a_window *wnd, unsigned id, int row, int piece )
{
    address     addr;
    mod_handle  handle;
    mod_window  *mod = WndMod( wnd );

    piece=piece;

    handle = NO_MOD;
    addr = NilAddr;
    if( ModListNumRows( ModList( mod ) ) != 0 && row >= 0 ) {
        handle =  ModListMod( ModList( mod ), row );
        if( handle != NO_MOD ) {
            addr = ModFirstAddr( handle );
        }
    }
    switch( id ) {
    case MENU_INITIALIZE:
        WndMenuGrayAll( wnd );
        if( handle != NO_MOD ) {
            WndMenuEnable( wnd, MENU_MODULES_BREAK_SET_ALL, TRUE );
            WndMenuEnable( wnd, MENU_MODULES_BREAK_CLEAR_ALL, TRUE );
            WndMenuEnable( wnd, MENU_MODULES_ASSEMBLY, !IS_NIL_ADDR( addr ) );
            WndMenuEnable( wnd, MENU_MODULES_FUNCTIONS, TRUE );
            if( ModHasSourceInfo( handle ) ) {
                WndMenuEnable( wnd, MENU_MODULES_SOURCE, TRUE );
            }
        }
        WndMenuEnable( wnd, MENU_MODULES_SHOW_ALL, TRUE );
        WndMenuCheck( wnd, MENU_MODULES_SHOW_ALL, mod->all_modules );
        break;
    case MENU_MODULES_BREAK_SET_ALL:
        BreakAllModEntries( handle );
        break;
    case MENU_MODULES_BREAK_CLEAR_ALL:
        ClearAllModBreaks( handle );
        break;
    case MENU_MODULES_SOURCE:
        if( IS_NIL_ADDR( addr ) ) {
            ModName( handle, TxtBuff, TXT_LEN );
            WndFileInspect( TxtBuff, FALSE );
        } else {
            WndSrcInspect( addr );
        }
        break;
    case MENU_MODULES_ASSEMBLY:
        WndAsmInspect( addr );
        break;
    case MENU_MODULES_FUNCTIONS:
        WndFuncInspect( handle );
        break;
    case MENU_MODULES_SHOW_ALL:
        mod->all_modules = !mod->all_modules;
        ModInit( wnd );
        break;
    }
}
Exemple #3
0
// 客户端,收到了某个用户的请求,说明与此用户已经直通
bool CSrv_NAT::PU_HelloRequest(DWORD dwIP, WORD wPort, PPACK pPack)
{
    if (pPack->wCheckSum != pPack->GetCheckNum())
    {
        TRACE("PU_HelloRequest checknum Error %d\n", pPack->dwId);
        m_BuffPool.Free(pPack);
        return false;
    }

    USER_MAP::iterator user_iter = m_UserMap.find(pPack->dwAckId);
    if (m_UserMap.end() != user_iter)
    {
        (*user_iter).second.byCommState = COMMUNICED;
        ModList(pPack->dwAckId, 5, _T("直通"));

        // 回复应答		
        pPack->dwId      = m_PackId.GetPackId();
        pPack->wProtoNum = PT_U_U_HELLO_ANSWER;
        pPack->dwAckId   = m_dwMyId;

        m_QueueOut.AddPack(m_pMyUdpCC, dwIP, wPort, pPack->GetPackLen(), pPack);		
        return true;
    }
    else
    {
        m_BuffPool.Free(pPack);
        return false;
    }	
}
Exemple #4
0
static void     ModInit( a_window *wnd )
{
    mod_window  *mod = WndMod( wnd );
    int         size;

    ModListFree( ModList( mod ) );
    ModListAddModules( ModList( mod ), mod->handle, mod->all_modules );
    WndFree( mod->info );
    mod->info = NULL;
    size = sizeof( modinfo ) * ModListNumRows( ModList( mod ) );
    if( size != 0 ) {
        mod->info = WndAlloc( size );
        memset( mod->info, 0, size );
    }
    ModCalcIndent( wnd );
}
Exemple #5
0
void cForgeHandshake::AugmentServerListPing(Json::Value & a_ResponseValue)
{
	auto ProtocolVersion = m_Client->GetProtocolVersion();
	auto & Mods = cRoot::Get()->GetServer()->GetRegisteredForgeMods(ProtocolVersion);

	if (Mods.empty())
	{
		return;
	}

	LOGD("Received server ping from version: %d", ProtocolVersion);

	Json::Value Modinfo;
	Modinfo["type"] = "FML";

	Json::Value ModList(Json::arrayValue);
	for (auto & item: Mods)
	{
		Json::Value Mod;
		Mod["modid"] = item.first;
		Mod["version"] = item.second;
		ModList.append(Mod);
	}
	Modinfo["modList"] = ModList;

	a_ResponseValue["modinfo"] = Modinfo;
}
Exemple #6
0
static void ModCalcIndent( a_window *wnd )
{
    gui_ord     extent,max_extent;
    int         i,size;
    mod_window  *mod = WndMod( wnd );

    size = ModListNumRows( ModList( mod ) );
    max_extent = 0;
    for( i = 0; i < size; ++i ) {
        ModListName( ModList( mod ), i, TxtBuff );
        extent = WndExtentX( wnd, TxtBuff );
        if( extent > max_extent ) max_extent = extent;
    }
    mod->max_modlen = max_extent + WndMidCharX( wnd );
    WndNoSelect( wnd );
    WndRepaint( wnd );
}
Exemple #7
0
static void ModSetCurrent( a_window *wnd )
{
    int         i;
    mod_window  *mod = WndMod( wnd );
    wnd_row     row;
    int         piece;

    WndGetCurrent( wnd, &row, &piece );
    if( row != WND_NO_ROW && ModListMod( ModList( mod ), row ) == ContextMod ) {
        return;
    }
    for( i = 0; i < ModListNumRows( ModList( mod ) ); ++i ) {
        if( ModListMod( ModList( mod ), i ) == ContextMod ) {
            WndMoveCurrent( wnd, i, PIECE_MODULE );
        }
    }
}
Exemple #8
0
static void     ModRefresh( a_window *wnd )
{
    int         i;
    mod_window  *mod = WndMod( wnd );
    modinfo     *info;

    if( WndFlags & UP_SYM_CHANGE ) {
        ModInit( wnd );
    }
    if( WndFlags & UP_OPEN_CHANGE ) {
        for( i = 0; i < ModListNumRows( ModList( mod ) ); ++i ) {
            info = &mod->info[ i ];
            info->open = CheckOpenGadget( wnd, i, info->open,
                                          ModListMod( ModList( mod ), i ),
                                          info->source, PIECE_SOURCE );
        }
    }
    if( WndFlags & (UP_CSIP_CHANGE+UP_STACKPOS_CHANGE) ) {
        ModSetCurrent( wnd );
    }
}
Exemple #9
0
static void     ModModify( a_window *wnd, int row, int piece )
{
    if( piece == PIECE_SOURCE ) {
        if( ModHasSourceInfo( ModListMod( ModList( WndMod( wnd ) ), row ) ) ) {
            ModMenuItem( wnd, MENU_MODULES_SOURCE, row, piece );
        } else {
            ModMenuItem( wnd, MENU_MODULES_ASSEMBLY, row, piece );
        }
        WndDirtyCurr( wnd );
        WndNewCurrent( wnd, row, PIECE_TABSTOP );
    } else {
        WndFirstMenuItem( wnd, row, piece );
    }
}
Exemple #10
0
static bool ModEventProc( a_window * wnd, gui_event gui_ev, void *parm )
{
    mod_window  *mod = WndMod( wnd );

    parm=parm;
    switch( gui_ev ) {
    case GUI_INIT_WINDOW:
        ModListInit( ModList( mod ), NULL );
        mod->info = NULL;
        WndSetKey( wnd, PIECE_MODULE );
        ModSetOptions( wnd );
        ModSetCurrent( wnd );
        return( TRUE );
    case GUI_RESIZE:
        ModCalcIndent( wnd );
        return( TRUE );
    case GUI_DESTROY :
        ModListFree( ModList( mod ) );
        WndFree( mod->info );
        WndFree( mod );
        return( TRUE );
    }
    return( FALSE );
}
Exemple #11
0
// 服务器,通知各个客户端有用户退出
bool CSrv_NAT::PS_NotfiyUserOutRoom(PPACK pPack)
{
    if (pPack->wCheckSum != pPack->GetCheckNum())
    {
        TRACE("PS_NotfiyUserOutRoom checknum Error %d\n", pPack->dwId);
        m_BuffPool.Free(pPack);
        return false;
    }

    USERID_ROOMNUM *pUserIdRoomNum = (USERID_ROOMNUM*)&(pPack->szData[0]);

    pPack->wProtoNum = PT_S_U_OUT_ROOM_USER;

    ModList(pUserIdRoomNum->dwUserId, 5, _T("掉线"));

    S_Broadcast(pUserIdRoomNum->wRoomNum, 1, pPack);
    return false;
}
Exemple #12
0
// 服务器,通知各个客户端有用户退出(由心跳线程调用,用户数据由心跳线程删除)
bool CSrv_NAT::S_NotfiyUserOutRoom(DWORD dwUserId, WORD wRoomNum, USER_MAP* pUserMap)
{
    if (NULL == pUserMap) return false;

    PPACK pPack = (PPACK)m_BuffPool.GetBuff();
    pPack->dwFlag    = PACKFLAG;
    pPack->dwAckId	 = 0;
    pPack->dwId      = m_PackId.GetPackId();
    pPack->wProtoNum = PT_S_U_OUT_ROOM_USER;
    pPack->dwDataLen = (WORD)sizeof(USERID_ROOMNUM);
    USERID_ROOMNUM *pUserIdRoomNum = (USERID_ROOMNUM*)&(pPack->szData[0]);
    pUserIdRoomNum->dwUserId = dwUserId;
    pUserIdRoomNum->wRoomNum = wRoomNum;
    pPack->SetCheckNum();

    ModList(dwUserId, 5, _T("掉线"));

    int nCount = (int)pUserMap->size();
    USER_MAP::iterator delete_user_iter;	

    if (0 != nCount)
    {
        // 向房间内的所有人通知此用户退出
        USER_MAP::iterator user_iter = pUserMap->begin();
        for (; user_iter != pUserMap->end(); ++user_iter)
        {
            pPack->dwId = m_PackId.GetPackId();

            for (int i = 0; i < 2; i++)
            {
                m_QueueOut.AddPack(m_pMyUdpCC, (*user_iter).second.lPublicIp, (*user_iter).second.wPublicPort, 
                    pPack->GetPackLen(), pPack);

                ::Sleep(2);
            }
        }
        return true;
    }
    else
    {
        m_BuffPool.Free(pPack);
        return false;
    }
}
Exemple #13
0
// 客户端,连接应答,说明已经直通
bool CSrv_NAT::PU_HelloAnswer(DWORD dwIP, WORD wPort, PPACK pPack)
{
    if (pPack->wCheckSum != pPack->GetCheckNum())
    {
        TRACE("PU_HelloRequest checknum Error %d\n", pPack->dwId);
        m_BuffPool.Free(pPack);
        return false;
    }

    USER_MAP::iterator user_iter = m_UserMap.find(pPack->dwAckId);
    if (m_UserMap.end() != user_iter)
    {
        (*user_iter).second.byCommState = COMMUNICED;
        ModList(pPack->dwAckId, 5, _T("直通"));
    }

    m_BuffPool.Free(pPack);
    return true;
}
Exemple #14
0
// 客户端,收到某用户退出
bool CSrv_NAT::PU_UserOutRoom(DWORD dwIP, WORD wPort, PPACK pPack)
{
    if (pPack->wCheckSum != pPack->GetCheckNum())
    {
        TRACE("PU_UserOutRoom checknum Error %d\n", pPack->dwId);
        m_BuffPool.Free(pPack);
        return false;
    }

    USERID_ROOMNUM *pUserIdRoomNum = (USERID_ROOMNUM*)&(pPack->szData[0]);

    m_UserMap.erase(pUserIdRoomNum->dwUserId);

    ModList(pUserIdRoomNum->dwUserId, 5, _T("掉线"));

    m_RecvMap.DelUser(pUserIdRoomNum->dwUserId);

    m_BuffPool.Free(pPack);
    return true;
}
Exemple #15
0
static int ModNumRows( a_window *wnd )
{
    return( ModListNumRows( ModList( WndMod( wnd ) ) ) );
}