#include "pch.h"
extern Global g;
TC_OBJECT_EXTERN_NON_CREATEABLE_IMPL(CAdminServer)
STDMETHODIMP CAdminServer::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IAdminServer
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP CAdminServer::get_Games(IAdminGames** ppAdminGames)
{
return GetAGCGlobal()->GetAGCObject(CFSMission::GetMissions(),
IID_IAdminGames, (void**)ppAdminGames);
}
STDMETHODIMP CAdminServer::get_PlayerCount(long* pVal)
{
CLEAROUT(pVal, (long)g.pServerCounters->cPlayersOnline);
return S_OK;
}
STDMETHODIMP CAdminServer::get_MissionCount(long* pVal)
{
const ListFSMission* plistMission = CFSMission::GetMissions();
CLEAROUT(pVal, (long)plistMission->n());
return S_OK;
}
STDMETHODIMP CAdminServer::SendMsg(BSTR bstrMessage)
{
if (!BSTRLen(bstrMessage))
return S_OK;
const ListFSMission * plistMission = CFSMission::GetMissions();
if (plistMission->n())
{
USES_CONVERSION;
LPCSTR pszMessage = OLE2CA(bstrMessage);
for (LinkFSMission* plinkMission = plistMission->first(); plinkMission; plinkMission = plinkMission->next())
{
CFSMission * pfsMission = plinkMission->data();
pfsMission->GetSite()->SendChat(
NULL, CHAT_EVERYONE, NA, NA, pszMessage,
c_cidNone,
NA,
NA,
NULL,
true); }
}
return S_OK;
}
STDMETHODIMP CAdminServer::get_Users( IAdminUsers** ppAdminUsers)
{
static CAdminSponsor<CAdminUsers> s_UsersSponsor;
RETURN_FAILED (s_UsersSponsor.Make(IID_IAdminUsers, (void**)ppAdminUsers));
return S_OK;
}
STDMETHODIMP CAdminServer::get_FindUser(BSTR bstrName, IAdminUser** ppUser)
{
*ppUser = NULL; USES_CONVERSION;
char * szName = OLE2A(bstrName);
const ListFSMission * plistMission = CFSMission::GetMissions();
for (LinkFSMission * plinkMission = plistMission->first(); plinkMission; plinkMission = plinkMission->next())
{
CFSMission* pfsMission = (CFSMission*)(plinkMission->data());
if (pfsMission)
{
ImissionIGC * pMission = pfsMission->GetIGCMission();
if (pMission)
{
for (ShipLinkIGC* psl = pMission->GetShips()->first(); (psl != NULL); psl = psl->next())
{
CFSShip* pfsShip = (CFSShip*)(psl->data()->GetPrivateData());
if(pfsShip->IsPlayer())
{
CFSPlayer * pfsPlayer = pfsShip->GetPlayer();
if (_stricmp(szName, pfsShip->GetName()) == 0)
{
RETURN_FAILED (pfsPlayer->CAdminSponsor<CAdminUser>::Make(IID_IAdminUser, (void**)ppUser));
pfsPlayer->CAdminSponsor<CAdminUser>::GetLimb()->Init(pfsPlayer);
return S_OK;
}
}
}
}
}
}
return S_OK; }
STDMETHODIMP CAdminServer::get_LookupUser(AGCUniqueID userid, IAdminUser** ppUser)
{
*ppUser = NULL; if ((userid >> 16) != AGC_AdminUser)
return S_OK;
AdminUserID id = userid & 0x0000FFFF;
const ListFSMission * plistMission = CFSMission::GetMissions();
for (LinkFSMission * plinkMission = plistMission->first(); plinkMission; plinkMission = plinkMission->next())
{
CFSMission* pfsMission = (CFSMission*)(plinkMission->data());
if (pfsMission)
{
ImissionIGC * pMission = pfsMission->GetIGCMission();
if (pMission)
{
for (ShipLinkIGC* psl = pMission->GetShips()->first(); (psl != NULL); psl = psl->next())
{
CFSShip* pfsShip = (CFSShip*)(psl->data()->GetPrivateData());
if(pfsShip->IsPlayer())
{
CFSPlayer * pfsPlayer = pfsShip->GetPlayer();
if (CAdminUser::DetermineID(pfsPlayer) == id)
{
RETURN_FAILED (pfsPlayer->CAdminSponsor<CAdminUser>::Make(IID_IAdminUser, (void**)ppUser));
pfsPlayer->CAdminSponsor<CAdminUser>::GetLimb()->Init(pfsPlayer);
}
}
}
}
}
}
return S_OK;
}
STDMETHODIMP CAdminServer::get_PacketsIn(long * pVal)
{
*pVal = 0;
return Error("This property is no longer supported. Use AdminSession::PerfCounters now.");
}
STDMETHODIMP CAdminServer::get_PlayersOnline(long * pVal)
{
*pVal = 0;
return Error("This property is no longer supported. Use AdminSession::PerfCounters now.");
}
STDMETHODIMP CAdminServer::get_TimeInnerLoop(long * pVal)
{
*pVal = 0;
return Error("This property is no longer supported. Use AdminSession::PerfCounters now.");
}
STDMETHODIMP CAdminServer::get_MachineName(BSTR * pbstrMachine)
{
char szMachine[64];
if (gethostname(szMachine, sizeof(szMachine)) != 0)
{
return Error("Cannot determine machine name.");
}
CComBSTR bstr(szMachine);
CLEAROUT(pbstrMachine, (BSTR)bstr);
bstr.Detach();
return S_OK;
}
STDMETHODIMP CAdminServer::put_LobbyServer(BSTR bstrLobbyServer)
{
#if defined(ALLSRV_STANDALONE)
return Error("This method is not intended for standalone servers");
#endif
if (BSTRLen(bstrLobbyServer))
{
USES_CONVERSION;
LPCSTR pszLobbyServer = OLE2CA(bstrLobbyServer);
if (0 != _stricmp(pszLobbyServer, g.strLobbyServer))
{
const ListFSMission * plistMission = CFSMission::GetMissions();
if (plistMission->n())
return Error(IDS_E_LOBBYSERVER_GAMES_EXIST, IID_IAdminServer);
}
HRESULT hr = ConnectToLobby(NULL);
if (FAILED(hr))
{
#if !defined(ALLSRV_STANDALONE)
_AGCModule.TriggerEvent(NULL, AllsrvEventID_ConnectError, "", -1, -1, -1, 0);
#endif return Error(IDS_E_CONNECT_LOBBY, IID_IAdminServer);
}
#if !defined(ALLSRV_STANDALONE)
CRegKey key;
LONG lr = key.Open(HKEY_LOCAL_MACHINE, HKLM_FedSrv);
if (ERROR_SUCCESS != lr)
{
g.fmLobby.Shutdown();
_AGCModule.TriggerEvent(NULL, AllsrvEventID_ConnectError, "", -1, -1, -1, 0);
return HRESULT_FROM_WIN32(lr);
}
key.SetValue(pszLobbyServer, "LobbyServer");
#endif
}
else
{
DisconnectFromLobby();
assert(!g.fmLobby.IsConnected());
g.strLobbyServer.SetEmpty();
}
return S_OK;
}
STDMETHODIMP CAdminServer::get_LobbyServer(BSTR* pbstrLobbyServer)
{
CComBSTR bstr(g.strLobbyServer);
CLEAROUT(pbstrLobbyServer, (BSTR)bstr);
bstr.Detach();
return S_OK;
}
STDMETHODIMP CAdminServer::CreateDefaultGames()
{
#if defined(ALLSRV_STANDALONE)
const ListFSMission * plistMission = CFSMission::GetMissions();
if (plistMission->n())
return S_FALSE;
StartDefaultGames();
return S_OK;
#else
return E_NOTIMPL;
#endif
}
STDMETHODIMP CAdminServer::get_PublicLobby(VARIANT_BOOL *pVal)
{
CLEAROUT(pVal, VARBOOL(g.fm.GetHostApplicationGuid() == FEDSRV_GUID));
return S_OK;
}
STDMETHODIMP CAdminServer::put_PublicLobby(VARIANT_BOOL bPublic)
{
const ListFSMission * plistMission = CFSMission::GetMissions();
if (plistMission->n())
return Error(IDS_E_LOBBYSERVER_GAMES_EXIST, IID_IAdminServer);
if (bPublic)
{
if (g.fm.GetHostApplicationGuid() != FEDSRV_GUID)
{
if (g.fm.GetHostApplicationGuid() != GUID_NULL)
g.fm.Shutdown();
printf("Preparing public session for clients ... ");
#if !defined(ALLSRV_STANDALONE)
_AGCModule.TriggerEvent(NULL, AllsrvEventID_HostSession, "", -1, -1, -1, 0);
#endif
HRESULT hr = g.fm.HostSession(FEDSRV_GUID, false, 0 , g.fProtocol
#if defined(MONOLITHIC_DPLAY) && defined(ALLSRV_STANDALONE)
, false
#endif
);
if (FAILED(hr))
{
#if !defined(ALLSRV_STANDALONE)
_AGCModule.TriggerEvent(NULL, AllsrvEventID_CantHostSession, "", -1, -1, -1, 0);
#endif
printf("failed.\n");
return E_FAIL;
}
printf("succeeded.\n");
}
bool bSupposedToConnectToLobby;
#if defined(ALLSRV_STANDALONE)
bSupposedToConnectToLobby = true;
#else
bSupposedToConnectToLobby = !g.strLobbyServer.IsEmpty();
#endif
if (bSupposedToConnectToLobby)
{
HRESULT hr = ConnectToLobby(NULL);
if (FAILED(hr))
{
#if !defined(ALLSRV_STANDALONE)
_AGCModule.TriggerEvent(NULL, AllsrvEventID_ConnectError, "", -1, -1, -1, 0);
#endif return Error(IDS_E_CONNECT_LOBBY, IID_IAdminServer);
}
}
else
{
#if !defined(ALLSRV_STANDALONE)
_AGCModule.TriggerEvent(NULL, AllsrvEventID_NoLobby, "", -1, -1, -1, 0);
#endif
}
}
else
{
#if !defined(ALLSRV_STANDALONE)
return Error("Only standalone servers can have private games");
#endif
if (g.fm.GetHostApplicationGuid() != FEDSRV_STANDALONE_PRIVATE_GUID)
{
if (g.fm.GetHostApplicationGuid() != GUID_NULL)
g.fm.Shutdown();
printf("Preparing LAN session for clients ... ");
#if !defined(ALLSRV_STANDALONE)
_AGCModule.TriggerEvent(NULL, AllsrvEventID_HostSession, "", -1, -1, -1, 0);
#endif
HRESULT hr = g.fm.HostSession(FEDSRV_STANDALONE_PRIVATE_GUID, false, 0 , g.fProtocol
#if defined(MONOLITHIC_DPLAY) && defined(ALLSRV_STANDALONE)
, false
#endif
);
if (FAILED(hr))
{
#if !defined(ALLSRV_STANDALONE)
_AGCModule.TriggerEvent(NULL, AllsrvEventID_CantHostSession, "", -1, -1, -1, 0);
#endif
printf("failed.\n");
return E_FAIL;
}
printf("succeeded.\n");
}
}
return S_OK;
}