Commit 7ffb2373 authored by jan.koester's avatar jan.koester
Browse files

test

parent 8fa228de
Loading
Loading
Loading
Loading
+9 −16
Original line number Diff line number Diff line
@@ -18,21 +18,14 @@ License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*******************************************************************************/

class Gameinfo {
class GameInfoData{
public:

    ~Gameinfo(){};

    virtual void refresh()=0;

    virtual const char *getGameName()=0;
    virtual const char *getServerName()=0;
    virtual const char *getMapName()=0;
    virtual const char *getModName()=0;

    virtual bool        pwProtected()=0;

    virtual int getPlayers()=0;
    virtual int getMaxPlayers()=0;
    virtual int getBotsAmount()=0;
    std::string GameName;
    std::string ServerName;
    std::string MapName;
    std::string ModName;
    bool        pwProtected;
    int         Players;
    int         BotsAmount;
    int         MaxPlayers;
};
+21 −61
Original line number Diff line number Diff line
@@ -43,7 +43,6 @@ HldsView::HldsView(const char *addr,int port){
    }catch(netplus::NetException &exp){
        throw exp.what();
    }
    refresh();
}

HldsView::~HldsView(){
@@ -51,7 +50,7 @@ HldsView::~HldsView(){
    delete serverSocket;
}

void HldsView::refresh(){
void HldsView::refresh(HldsData &info){
    char buffer[1400];
    int rcv=0;
    try{
@@ -60,12 +59,12 @@ void HldsView::refresh(){

        clientSocket->sendData(serverSocket,(void*)&payload,A2S_INFO_PAYLOAD_LEN_WITHOUT_CHALLENGE);

        char recv[8];
        char recv[9];
        rcv=clientSocket->recvData(serverSocket,&recv,sizeof(recv));
        uint8_t challange[4]={0};

        if(recv[4] == 0x41){
            memcpy(challange,recv+5,3);
            memcpy(challange,recv+5,4);
        }

        AGAIN:
@@ -88,71 +87,32 @@ void HldsView::refresh(){
        throw exp.what();
    }

    _parse(buffer,rcv);
    _parse(info,buffer,rcv);
}

void HldsView::_parse(HldsData &info,const char* data, size_t len){

const char * HldsView::getGameName(){
    return _GameData.gamename.c_str();
}


const char *HldsView::getServerName(){
    return _GameData.name.c_str();;
}

const char *HldsView::getMapName(){
    return _GameData.map.c_str();;

}

const char *HldsView::getModName(){
    return _GameData.modname.c_str();;

}

bool HldsView::pwProtected(){
    if(_GameData.visibility==1)
        return true;
    return false;
}

int HldsView::getPlayers(){
    return (int)_GameData.players;
}

int HldsView::getMaxPlayers(){
    return (int) _GameData.maxplayers;
}


int HldsView::getBotsAmount(){
    return (int) _GameData.bots;
}

void HldsView::_parse(const char* data, size_t len){

    _GameData.header=0x00;
    info.header=0x00;
    for(int i=0; i<len; ++i){
        if(data[i]==0x49){
            _GameData.header=0x49;
            info.header=0x49;
            data+=++i;
            len-=i;
        }
    }


    if(_GameData.header!=0x49){
    if(info.header!=0x49){
        throw "_parse: no hlds server!";
    }

    _GameData.protocol=data[0];
    info.protocol=data[0];
    data=data+1;
    len-=1;

    for(int i=0; i<len; ++i){
        if(data[i]=='\0'){
            _GameData.name.assign(data,data+i);
            info.ServerName.assign(data,data+i);
            data+=++i;
            len-=i;
            break;
@@ -161,7 +121,7 @@ void HldsView::_parse(const char* data, size_t len){

    for(int i=0; i<len; ++i){
        if(data[i]=='\0'){
            _GameData.map.assign(data,data+i);
            info.MapName.assign(data,data+i);
            data+=++i;
            len-=i;
            break;
@@ -170,7 +130,7 @@ void HldsView::_parse(const char* data, size_t len){

    for(int i=0; i<len; ++i){
        if(data[i]=='\0'){
            _GameData.modname.assign(data,data+i);
            info.ModName.assign(data,data+i);
            data+=++i;
            len-=i;
            break;
@@ -180,42 +140,42 @@ void HldsView::_parse(const char* data, size_t len){

    for(int i=0; i<len; ++i){
        if(data[i]=='\0'){
            _GameData.gamename.assign(data,data+i);
            info.GameName.assign(data,data+i);
            data+=++i;
            len-=i;
            break;
        }
    }

    memcpy(&_GameData.steamid,data,sizeof(short));
    memcpy(&info.steamid,data,sizeof(short));
    data=data+sizeof(short);
    len-=sizeof(short);

    _GameData.players=data[0];
    info.Players=data[0];
    data=data+1;
    len-=1;

    _GameData.maxplayers=data[0];
    info.MaxPlayers=data[0];
    data=data+1;
    len-=1;

    _GameData.bots=data[0];
    info.BotsAmount=data[0];
    data=data+1;
    len-=1;

    _GameData.servertype=data[0];
    info.servertype=data[0];
    data=data+1;
    len-=1;

    _GameData.env=data[0];
    info.env=data[0];
    data=data+1;
    len-=1;

    _GameData.visibility=data[0];
    info.visibility=data[0];
    data=data+1;
    len-=1;

    _GameData.vac=data[0];
    info.vac=data[0];
    data=data+1;
    len-=1;
}
+9 −24
Original line number Diff line number Diff line
@@ -24,42 +24,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

#pragma once

class HldsView : public Gameinfo {
class HldsView {
public:
    HldsView(const char *addr,int port);
    ~HldsView();

    void refresh();

    const char *getGameName();
    const char *getServerName();
    const char *getMapName();
    const char *getModName();
    bool        pwProtected();

    int getPlayers();
    int getMaxPlayers();
    int getBotsAmount();

private:
    struct {
    class HldsData : public GameInfoData{
    public:
        uint8_t     header;
        uint8_t     protocol;
        std::string name;
        std::string map;
        std::string modname;
        std::string gamename;
        short       steamid;
        uint8_t     players;
        uint8_t     maxplayers;
        uint8_t     bots;
        uint8_t     servertype;
        uint8_t     env;
        uint8_t     visibility;
        uint8_t     vac;
    } _GameData;
        friend class HldsView;
    };

    void _parse(const char *data,size_t len);
    void refresh(HldsData &info);

private:
    void _parse(HldsData &info,const char *data,size_t len);

    netplus::udp *clientSocket;
    netplus::udp *serverSocket;