OpenClonk
C4Network2ResList Class Reference

#include <C4Network2Res.h>

Inheritance diagram for C4Network2ResList:
[legend]
Collaboration diagram for C4Network2ResList:
[legend]

Public Member Functions

 C4Network2ResList ()
 
 ~C4Network2ResList () override
 
bool Init (int32_t iClientID, C4Network2IO *pIOClass)
 
void SetLocalID (int32_t iClientID)
 
C4Network2Res::Ref getRefRes (int32_t iResID)
 
C4Network2Res::Ref getRefRes (const char *szFile, bool fLocalOnly=false)
 
C4Network2Res::Ref getRefNextRes (int32_t iResID)
 
void Add (C4Network2Res *pRes)
 
C4Network2Res::Ref AddByFile (const char *strFilePath, bool fTemp, C4Network2ResType eType, int32_t iResID=-1, const char *szResName=nullptr, bool fAllowUnloadable=false)
 
C4Network2Res::Ref AddByGroup (C4Group *pGrp, bool fTemp, C4Network2ResType eType, int32_t iResID=-1, const char *szResName=nullptr, bool fAllowUnloadable=false)
 
C4Network2Res::Ref AddByCore (const C4Network2ResCore &Core, bool fLoad=true)
 
C4Network2Res::Ref AddLoad (const C4Network2ResCore &Core)
 
void RemoveAtClient (int32_t iClientID)
 
void Clear ()
 
bool SendDiscover (C4Network2IOConnection *pTo=nullptr)
 
void OnClientConnect (C4Network2IOConnection *pConn)
 
void HandlePacket (char cStatus, const C4PacketBase *pPacket, C4Network2IOConnection *pConn)
 
void OnTimer ()
 
void OnShareFree (CStdCSecEx *pCSec) override
 
C4Network2IOgetIOClass ()
 

Protected Member Functions

int32_t nextResID ()
 
C4Network2ResgetRes (int32_t iResID)
 
C4Network2ResgetRes (const char *szFile, bool fLocalOnly)
 
void OnResComplete (C4Network2Res *pRes)
 
bool CreateNetworkFolder ()
 
bool FindTempResFileName (const char *szFilename, char *pTarget)
 

Protected Attributes

C4Network2RespFirst {nullptr}
 
CStdCSecEx ResListCSec
 
CStdCSec ResListAddCSec
 
int32_t iClientID {-1}
 
int32_t iNextResID
 
CStdCSec ResIDCSec
 
int32_t iLastDiscover {0}
 
int32_t iLastStatus {0}
 
C4Network2IOpIO {nullptr}
 

Friends

class C4Network2Res
 
class C4Network2
 

Detailed Description

Definition at line 326 of file C4Network2Res.h.

Constructor & Destructor Documentation

◆ C4Network2ResList()

C4Network2ResList::C4Network2ResList ( )

Definition at line 1273 of file C4Network2Res.cpp.

1274  : ResListCSec(this)
1275  , iNextResID((~0u) << 16)
1276 {}
CStdCSecEx ResListCSec

◆ ~C4Network2ResList()

C4Network2ResList::~C4Network2ResList ( )
override

Definition at line 1278 of file C4Network2Res.cpp.

1279 {
1280  Clear();
1281 }

References Clear().

Here is the call graph for this function:

Member Function Documentation

◆ Add()

void C4Network2ResList::Add ( C4Network2Res pRes)

Definition at line 1368 of file C4Network2Res.cpp.

1369 {
1370  // get locks
1371  CStdShareLock ResListLock(&ResListCSec);
1372  CStdLock ResListAddLock(&ResListAddCSec);
1373  // reference
1374  pRes->AddRef();
1375  // add
1376  pRes->pNext = pFirst;
1377  pFirst = pRes;
1378 }
C4Network2Res * pNext
C4Network2Res * pFirst
CStdCSec ResListAddCSec

References C4Network2Res::AddRef(), pFirst, C4Network2Res::pNext, ResListAddCSec, and ResListCSec.

Referenced by AddByCore(), AddByFile(), AddByGroup(), AddLoad(), and C4Network2Res::Derive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AddByCore()

C4Network2Res::Ref C4Network2ResList::AddByCore ( const C4Network2ResCore Core,
bool  fLoad = true 
)

Definition at line 1431 of file C4Network2Res.cpp.

1432 {
1433  // already in list?
1434  C4Network2Res::Ref pRes = getRefRes(Core.getID());
1435  if (pRes) return pRes;
1436 #ifdef C4NET2RES_LOAD_ALL
1437  // load without check (if possible)
1438  if (Core.isLoadable()) return AddLoad(Core);
1439 #endif
1440  // create new
1441  pRes = new C4Network2Res(this);
1442  // try set by core
1443  if (!pRes->SetByCore(Core, true))
1444  {
1445  pRes.Clear();
1446  // try load (if specified)
1447  return fLoad ? AddLoad(Core) : nullptr;
1448  }
1449  // log
1450  Application.InteractiveThread.ThreadLogS("Network: Found identical %s. Not loading.", pRes->getCore().getFileName());
1451  // add to list
1452  Add(pRes);
1453  // ok
1454  return pRes;
1455 }
C4Application Application
Definition: C4Globals.cpp:44
C4InteractiveThread InteractiveThread
Definition: C4Application.h:45
bool ThreadLogS(const char *szMessage,...) GNUC_FORMAT_ATTRIBUTE_O
const char * getFileName() const
Definition: C4Network2Res.h:94
int32_t getID() const
Definition: C4Network2Res.h:86
bool isLoadable() const
Definition: C4Network2Res.h:88
const C4Network2ResCore & getCore() const
bool SetByCore(const C4Network2ResCore &nCore, bool fSilent=false, const char *szAsFilename=nullptr, int32_t iRecursion=0)
C4Network2Res::Ref getRefRes(int32_t iResID)
void Add(C4Network2Res *pRes)
friend class C4Network2Res
C4Network2Res::Ref AddLoad(const C4Network2ResCore &Core)

References Add(), AddLoad(), Application, C4Network2Res, C4Network2Res::Ref::Clear(), C4Network2Res::getCore(), C4Network2ResCore::getFileName(), C4Network2ResCore::getID(), getRefRes(), C4Application::InteractiveThread, C4Network2ResCore::isLoadable(), C4Network2Res::SetByCore(), and C4InteractiveThread::ThreadLogS().

Referenced by C4Network2::HandleJoinData(), C4GameRes::Load(), C4PlayerInfo::LoadResource(), C4ControlJoinPlayer::PreExecute(), and C4Network2::RetrieveRes().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AddByFile()

C4Network2Res::Ref C4Network2ResList::AddByFile ( const char *  strFilePath,
bool  fTemp,
C4Network2ResType  eType,
int32_t  iResID = -1,
const char *  szResName = nullptr,
bool  fAllowUnloadable = false 
)

Definition at line 1380 of file C4Network2Res.cpp.

1381 {
1382  // already in list?
1383  C4Network2Res::Ref pRes = getRefRes(strFilePath);
1384  if (pRes) return pRes;
1385  // get resource ID
1386  if (iResID < 0) iResID = nextResID();
1387  if (iResID < 0) { Log("AddByFile: no more resource IDs available!"); return nullptr; }
1388  // create new
1389  pRes = new C4Network2Res(this);
1390  // initialize
1391  if (!pRes->SetByFile(strFilePath, fTemp, eType, iResID, szResName)) { return nullptr; }
1392  // create standalone for non-system files
1393  // system files shouldn't create a standalone; they should never be marked loadable!
1394  if (eType != NRT_System)
1395  if (!pRes->GetStandalone(nullptr, 0, true, fAllowUnloadable))
1396  if (!fAllowUnloadable)
1397  {
1398  delete pRes;
1399  return nullptr;
1400  }
1401  // add to list
1402  Add(pRes);
1403  return pRes;
1404 }
bool Log(const char *szMessage)
Definition: C4Log.cpp:204
@ NRT_System
Definition: C4Network2Res.h:47
bool GetStandalone(char *pTo, int32_t iMaxL, bool fSetOfficial, bool fAllowUnloadable=false, bool fSilent=false)
bool SetByFile(const char *strFilePath, bool fTemp, C4Network2ResType eType, int32_t iResID, const char *szResName=nullptr, bool fSilent=false)

References Add(), C4Network2Res, getRefRes(), C4Network2Res::GetStandalone(), Log(), nextResID(), NRT_System, and C4Network2Res::SetByFile().

Referenced by C4Network2::CreateDynamic(), and C4GameRes::Publish().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AddByGroup()

C4Network2Res::Ref C4Network2ResList::AddByGroup ( C4Group pGrp,
bool  fTemp,
C4Network2ResType  eType,
int32_t  iResID = -1,
const char *  szResName = nullptr,
bool  fAllowUnloadable = false 
)

Definition at line 1406 of file C4Network2Res.cpp.

1407 {
1408  // get resource ID
1409  if (iResID < 0) iResID = nextResID();
1410  if (iResID < 0) { Log("AddByGroup: no more resource IDs available!"); return nullptr; }
1411  // create new
1412  C4Network2Res::Ref pRes = new C4Network2Res(this);
1413  // initialize
1414  if (!pRes->SetByGroup(pGrp, fTemp, eType, iResID, szResName))
1415  {
1416  delete pRes;
1417  return nullptr;
1418  }
1419  // create standalone
1420  if (!pRes->GetStandalone(nullptr, 0, true, fAllowUnloadable))
1421  if (!fAllowUnloadable)
1422  {
1423  delete pRes;
1424  return nullptr;
1425  }
1426  // add to list
1427  Add(pRes);
1428  return pRes;
1429 }
bool SetByGroup(C4Group *pGrp, bool fTemp, C4Network2ResType eType, int32_t iResID, const char *szResName=nullptr, bool fSilent=false)

References Add(), C4Network2Res, C4Network2Res::GetStandalone(), Log(), nextResID(), and C4Network2Res::SetByGroup().

Referenced by C4PlayerInfo::LoadFromLocalFile().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AddLoad()

C4Network2Res::Ref C4Network2ResList::AddLoad ( const C4Network2ResCore Core)

Definition at line 1457 of file C4Network2Res.cpp.

1458 {
1459  // marked unloadable by creator?
1460  if (!Core.isLoadable())
1461  {
1462  // show error msg
1463  Application.InteractiveThread.ThreadLog("Network: Cannot load %s (marked unloadable)", Core.getFileName());
1464  return nullptr;
1465  }
1466  // create new
1467  C4Network2Res::Ref pRes = new C4Network2Res(this);
1468  // initialize
1469  pRes->SetLoad(Core);
1470  // log
1471  Application.InteractiveThread.ThreadLogS("Network: loading %s...", Core.getFileName());
1472  // add to list
1473  Add(pRes);
1474  return pRes;
1475 }
bool ThreadLog(const char *szMessage,...) GNUC_FORMAT_ATTRIBUTE_O
bool SetLoad(const C4Network2ResCore &nCore)

References Add(), Application, C4Network2Res, C4Network2ResCore::getFileName(), C4Application::InteractiveThread, C4Network2ResCore::isLoadable(), C4Network2Res::SetLoad(), C4InteractiveThread::ThreadLog(), and C4InteractiveThread::ThreadLogS().

Referenced by AddByCore().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Clear()

void C4Network2ResList::Clear ( )

Definition at line 1485 of file C4Network2Res.cpp.

1486 {
1487  CStdShareLock ResListLock(&ResListCSec);
1488  for (C4Network2Res *pRes = pFirst; pRes; pRes = pRes->pNext)
1489  {
1490  pRes->Remove();
1491  pRes->iLastReqTime = 0;
1492  }
1494  iLastDiscover = iLastStatus = 0;
1495 }
const int32_t C4ClientIDUnknown
Definition: C4Client.h:24

References C4ClientIDUnknown, iClientID, iLastDiscover, iLastStatus, pFirst, C4Network2Res::pNext, and ResListCSec.

Referenced by C4Network2::Clear(), Init(), and ~C4Network2ResList().

Here is the caller graph for this function:

◆ CreateNetworkFolder()

bool C4Network2ResList::CreateNetworkFolder ( )
protected

Definition at line 1670 of file C4Network2Res.cpp.

1671 {
1672  // get network path without trailing backslash
1673  char szNetworkPath[_MAX_PATH_LEN];
1674  SCopy(Config.AtNetworkPath(""), szNetworkPath, _MAX_PATH);
1675  TruncateBackslash(szNetworkPath);
1676  // but make sure that the configured path has one
1678  // does not exist?
1679  if (!DirectoryExists(szNetworkPath))
1680  {
1681  if (!CreatePath(szNetworkPath))
1682  { LogFatal("Network: could not create network path!"); return false; }
1683  return true;
1684  }
1685  return true;
1686 }
C4Config Config
Definition: C4Config.cpp:930
bool LogFatal(const char *szMessage)
Definition: C4Log.cpp:239
#define _MAX_PATH
#define _MAX_PATH_LEN
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
Definition: Standard.cpp:152
bool DirectoryExists(const char *szFilename)
Definition: StdFile.cpp:708
void AppendBackslash(char *szFilename)
Definition: StdFile.cpp:254
bool CreatePath(const std::string &path)
Definition: StdFile.cpp:656
void TruncateBackslash(char *szFilename)
Definition: StdFile.cpp:263
C4ConfigNetwork Network
Definition: C4Config.h:259
const char * AtNetworkPath(const char *filename)
Definition: C4Config.cpp:607
char WorkPath[CFG_MaxString+1]
Definition: C4Config.h:145

References _MAX_PATH, _MAX_PATH_LEN, AppendBackslash(), C4Config::AtNetworkPath(), Config, CreatePath(), DirectoryExists(), LogFatal(), C4Config::Network, SCopy(), TruncateBackslash(), and C4ConfigNetwork::WorkPath.

Referenced by Init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FindTempResFileName()

bool C4Network2ResList::FindTempResFileName ( const char *  szFilename,
char *  pTarget 
)
protected

Definition at line 1688 of file C4Network2Res.cpp.

1689 {
1690  char safeFilename[_MAX_PATH];
1691  char* safePos = safeFilename;
1692  while (*szFilename)
1693  {
1694  if ((*szFilename >= 'a' && *szFilename <= 'z') ||
1695  (*szFilename >= 'A' && *szFilename <= 'Z') ||
1696  (*szFilename >= '0' && *szFilename <= '9') ||
1697  (*szFilename == '.') || (*szFilename == '/'))
1698  *safePos = *szFilename;
1699  else
1700  *safePos = '_';
1701 
1702  ++safePos;
1703  ++szFilename;
1704  }
1705  *safePos = 0;
1706  szFilename = safeFilename;
1707 
1708  // create temporary file
1709  SCopy(Config.AtNetworkPath(GetFilename(szFilename)), pTarget, _MAX_PATH);
1710  // file name is free?
1711  if (!ItemExists(pTarget)) return true;
1712  // find another file name
1713  char szFileMask[_MAX_PATH_LEN];
1714  SCopy(pTarget, szFileMask, GetExtension(pTarget)-1-pTarget);
1715  SAppend("_%d", szFileMask, _MAX_PATH);
1716  SAppend(GetExtension(pTarget)-1, szFileMask, _MAX_PATH);
1717  for (int32_t i = 2; i < 1000; i++)
1718  {
1719  snprintf(pTarget, _MAX_PATH, szFileMask, i);
1720  // doesn't exist?
1721  if (!ItemExists(pTarget))
1722  return true;
1723  }
1724  // not found
1725  return false;
1726 }
void SAppend(const char *szSource, char *szTarget, int iMaxL)
Definition: Standard.cpp:263
char * GetExtension(char *szFilename)
Definition: StdFile.cpp:118
char * GetFilename(char *szPath)
Definition: StdFile.cpp:42
bool ItemExists(const char *szItemName)
Definition: StdFile.h:75

References _MAX_PATH, _MAX_PATH_LEN, C4Config::AtNetworkPath(), Config, GetExtension(), GetFilename(), ItemExists(), SAppend(), and SCopy().

Referenced by C4Network2::CreateDynamic(), C4Network2Res::Derive(), C4Network2Res::GetStandalone(), C4Network2Res::OptimizeStandalone(), C4Network2::RetrieveScenario(), and C4Network2Res::SetLoad().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getIOClass()

C4Network2IO* C4Network2ResList::getIOClass ( )
inline

Definition at line 387 of file C4Network2Res.h.

387 { return pIO; }
C4Network2IO * pIO

References pIO.

Referenced by C4Network2Res::FinishDerive(), C4Network2Res::OnChunk(), C4Network2Res::SendChunk(), C4Network2Res::SendStatus(), and C4Network2Res::StartLoad().

Here is the caller graph for this function:

◆ getRefNextRes()

C4Network2Res::Ref C4Network2ResList::getRefNextRes ( int32_t  iResID)

Definition at line 1357 of file C4Network2Res.cpp.

1358 {
1359  CStdShareLock ResListLock(&ResListCSec);
1360  C4Network2Res *pRes = nullptr;
1361  for (C4Network2Res *pCur = pFirst; pCur; pCur = pCur->pNext)
1362  if (!pCur->isRemoved() && pCur->getResID() >= iResID)
1363  if (!pRes || pRes->getResID() > pCur->getResID())
1364  pRes = pCur;
1365  return pRes;
1366 }
int32_t getResID() const

References C4Network2Res::getResID(), pFirst, C4Network2Res::pNext, and ResListCSec.

Referenced by C4Network2ResDlg::Update().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getRefRes() [1/2]

C4Network2Res::Ref C4Network2ResList::getRefRes ( const char *  szFile,
bool  fLocalOnly = false 
)

Definition at line 1351 of file C4Network2Res.cpp.

1352 {
1353  CStdShareLock ResListLock(&ResListCSec);
1354  return getRes(szFile, fLocalOnly);
1355 }
C4Network2Res * getRes(int32_t iResID)

References getRes(), and ResListCSec.

Here is the call graph for this function:

◆ getRefRes() [2/2]

C4Network2Res::Ref C4Network2ResList::getRefRes ( int32_t  iResID)

Definition at line 1345 of file C4Network2Res.cpp.

1346 {
1347  CStdShareLock ResListLock(&ResListCSec);
1348  return getRes(iResID);
1349 }

References getRes(), and ResListCSec.

Referenced by AddByCore(), AddByFile(), C4PlayerInfo::LoadFromLocalFile(), C4ControlJoinPlayer::PreExecute(), C4ControlJoinPlayer::PreRec(), C4MessageInput::ProcessCommand(), C4Network2::RemoveDynamic(), C4Network2::RetrieveRes(), and C4Player::Save().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getRes() [1/2]

C4Network2Res * C4Network2ResList::getRes ( const char *  szFile,
bool  fLocalOnly 
)
protected

Definition at line 1334 of file C4Network2Res.cpp.

1335 {
1336  CStdShareLock ResListLock(&ResListCSec);
1337  for (C4Network2Res *pCur = pFirst; pCur; pCur = pCur->pNext)
1338  if (!pCur->isAnonymous())
1339  if (SEqual(pCur->getFile(), szFile))
1340  if (!fLocalOnly || pCur->getResClient()==iClientID)
1341  return pCur;
1342  return nullptr;
1343 }
bool SEqual(const char *szStr1, const char *szStr2)
Definition: Standard.h:93

References iClientID, pFirst, C4Network2Res::pNext, ResListCSec, and SEqual().

Here is the call graph for this function:

◆ getRes() [2/2]

C4Network2Res * C4Network2ResList::getRes ( int32_t  iResID)
protected

Definition at line 1325 of file C4Network2Res.cpp.

1326 {
1327  CStdShareLock ResListLock(&ResListCSec);
1328  for (C4Network2Res *pCur = pFirst; pCur; pCur = pCur->pNext)
1329  if (pCur->getResID() == iResID)
1330  return pCur;
1331  return nullptr;
1332 }

References pFirst, C4Network2Res::pNext, and ResListCSec.

Referenced by getRefRes(), HandlePacket(), and nextResID().

Here is the caller graph for this function:

◆ HandlePacket()

void C4Network2ResList::HandlePacket ( char  cStatus,
const C4PacketBase pPacket,
C4Network2IOConnection pConn 
)

Definition at line 1510 of file C4Network2Res.cpp.

1511 {
1512  // security
1513  if (!pConn) return;
1514 
1515  switch (cStatus)
1516  {
1517 
1518  case PID_NetResDis: // resource discover
1519  {
1520  if (!pConn->isOpen()) break;
1521  auto Pkt = GetPkt<C4PacketResDiscover>(pPacket);
1522  // search matching resources
1523  CStdShareLock ResListLock(&ResListCSec);
1524  for (C4Network2Res *pRes = pFirst; pRes; pRes = pRes->pNext)
1525  if (Pkt.isIDPresent(pRes->getResID()))
1526  // must be binary compatible
1527  if (pRes->IsBinaryCompatible())
1528  pRes->OnDiscover(pConn);
1529  }
1530  break;
1531 
1532  case PID_NetResStat: // resource status
1533  {
1534  if (!pConn->isOpen()) break;
1535  auto Pkt = GetPkt<C4PacketResStatus>(pPacket);
1536  // matching resource?
1537  CStdShareLock ResListLock(&ResListCSec);
1538  C4Network2Res *pRes = getRes(Pkt.getResID());
1539  // present / being loaded? call handler
1540  if (pRes)
1541  pRes->OnStatus(Pkt.getChunks(), pConn);
1542  }
1543  break;
1544 
1545  case PID_NetResDerive: // resource derive
1546  {
1547  auto Core = GetPkt<C4Network2ResCore>(pPacket);
1548  if (Core.getDerID() < 0) break;
1549  // Check if there is a anonymous derived resource with matching parent.
1550  CStdShareLock ResListLock(&ResListCSec);
1551  for (C4Network2Res *pRes = pFirst; pRes; pRes = pRes->pNext)
1552  if (pRes->isAnonymous() && pRes->getCore().getDerID() == Core.getDerID())
1553  pRes->FinishDerive(Core);
1554  }
1555  break;
1556 
1557  case PID_NetResReq: // resource request
1558  {
1559  auto Pkt = GetPkt<C4PacketResRequest>(pPacket);
1560  // find resource
1561  CStdShareLock ResListLock(&ResListCSec);
1562  C4Network2Res *pRes = getRes(Pkt.getReqID());
1563  // send requested chunk
1564  if (pRes && pRes->IsBinaryCompatible()) pRes->SendChunk(Pkt.getReqChunk(), pConn->getClientID());
1565  }
1566  break;
1567 
1568  case PID_NetResData: // a chunk of data is coming in
1569  {
1570  auto Chunk = GetPkt<C4Network2ResChunk>(pPacket);
1571  // find resource
1572  CStdShareLock ResListLock(&ResListCSec);
1573  C4Network2Res *pRes = getRes(Chunk.getResID());
1574  // send requested chunk
1575  if (pRes) pRes->OnChunk(Chunk);
1576  }
1577  break;
1578  }
1579 }
@ PID_NetResDis
Definition: C4PacketBase.h:129
@ PID_NetResReq
Definition: C4PacketBase.h:132
@ PID_NetResDerive
Definition: C4PacketBase.h:131
@ PID_NetResStat
Definition: C4PacketBase.h:130
@ PID_NetResData
Definition: C4PacketBase.h:133
int32_t getDerID() const
Definition: C4Network2Res.h:87
void OnStatus(const C4Network2ResChunkData &rChunkData, C4Network2IOConnection *pBy)
void OnChunk(const C4Network2ResChunk &rChunk)
bool SendChunk(uint32_t iChunk, int32_t iToClient)
bool isAnonymous() const
bool IsBinaryCompatible()

References C4Network2IOConnection::getClientID(), getRes(), C4Network2Res::IsBinaryCompatible(), C4Network2IOConnection::isOpen(), C4Network2Res::OnChunk(), C4Network2Res::OnStatus(), pFirst, PID_NetResData, PID_NetResDerive, PID_NetResDis, PID_NetResReq, PID_NetResStat, C4Network2Res::pNext, ResListCSec, and C4Network2Res::SendChunk().

Referenced by C4Network2IO::CallHandlers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Init()

bool C4Network2ResList::Init ( int32_t  iClientID,
C4Network2IO pIOClass 
)

Definition at line 1283 of file C4Network2Res.cpp.

1284 {
1285  // clear old list
1286  Clear();
1287  // safe IO class
1288  pIO = pIOClass;
1289  // set client id
1290  iNextResID = iClientID = 0;
1291  SetLocalID(inClientID);
1292  // create network path
1293  if (!CreateNetworkFolder()) return false;
1294  // ok
1295  return true;
1296 }
void SetLocalID(int32_t iClientID)

References Clear(), CreateNetworkFolder(), iClientID, iNextResID, pIO, and SetLocalID().

Referenced by C4Network2::InitHost().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ nextResID()

int32_t C4Network2ResList::nextResID ( )
protected

Definition at line 1313 of file C4Network2Res.cpp.

1314 {
1315  CStdLock ResIDLock(&ResIDCSec);
1316  assert(iNextResID >= (iClientID << 16));
1317  if (iNextResID >= ((iClientID+1) << 16) - 1)
1318  iNextResID = std::max<int32_t>(0, iClientID) << 16;
1319  // find free
1320  while (getRes(iNextResID))
1321  iNextResID++;
1322  return iNextResID++;
1323 }

References getRes(), iClientID, iNextResID, and ResIDCSec.

Referenced by AddByFile(), AddByGroup(), and C4Network2Res::FinishDerive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnClientConnect()

void C4Network2ResList::OnClientConnect ( C4Network2IOConnection pConn)

Definition at line 1497 of file C4Network2Res.cpp.

1498 {
1499  // discover resources
1500  SendDiscover(pConn);
1501 }
bool SendDiscover(C4Network2IOConnection *pTo=nullptr)

References SendDiscover().

Referenced by C4Network2::OnClientConnect().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnResComplete()

void C4Network2ResList::OnResComplete ( C4Network2Res pRes)
protected

Definition at line 1662 of file C4Network2Res.cpp.

1663 {
1664  // log (network thread -> ThreadLog)
1665  Application.InteractiveThread.ThreadLogS("Network: %s received.", pRes->getCore().getFileName());
1666  // call handler (ctrl might wait for this resource)
1668 }
C4GameControl Control
C4GameControlNetwork Network
Definition: C4GameControl.h:67
void OnResComplete(C4Network2Res *pRes)

References Application, Control, C4Network2Res::getCore(), C4Network2ResCore::getFileName(), C4Application::InteractiveThread, C4GameControl::Network, C4GameControlNetwork::OnResComplete(), and C4InteractiveThread::ThreadLogS().

Referenced by C4Network2Res::EndLoad().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnShareFree()

void C4Network2ResList::OnShareFree ( CStdCSecEx pCSec)
overridevirtual

Implements CStdCSecExCallback.

Definition at line 1615 of file C4Network2Res.cpp.

1616 {
1617  if (pCSec == &ResListCSec)
1618  {
1619  // remove entries
1620  for (C4Network2Res *pRes = pFirst, *pNext, *pPrev = nullptr; pRes; pRes = pNext)
1621  {
1622  pNext = pRes->pNext;
1623  if (pRes->isRemoved() && (!pRes->getLastReqTime() || difftime(time(nullptr), pRes->getLastReqTime()) > C4NetResDeleteTime))
1624  {
1625  // unlink
1626  (pPrev ? pPrev->pNext : pFirst) = pNext;
1627  // remove
1628  pRes->pNext = nullptr;
1629  pRes->DelRef();
1630  }
1631  else
1632  pPrev = pRes;
1633  }
1634  }
1635 }
const int32_t C4NetResDeleteTime
Definition: C4Network2Res.h:35

References C4NetResDeleteTime, pFirst, and ResListCSec.

◆ OnTimer()

void C4Network2ResList::OnTimer ( )

Definition at line 1581 of file C4Network2Res.cpp.

1582 {
1583  CStdShareLock ResListLock(&ResListCSec);
1584  C4Network2Res *pRes;
1585  // do loads, check timeouts
1586  for (pRes = pFirst; pRes; pRes = pRes->pNext)
1587  if (pRes->isLoading() && !pRes->isRemoved())
1588  if (!pRes->DoLoad())
1589  pRes->Remove();
1590  // discovery time?
1591  if (!iLastDiscover || difftime(time(nullptr), iLastDiscover) >= C4NetResDiscoverInterval)
1592  {
1593  // needed?
1594  bool fSendDiscover = false;
1595  for (C4Network2Res *pRes = pFirst; pRes; pRes = pRes->pNext)
1596  if (pRes->isLoading() && !pRes->isRemoved())
1597  fSendDiscover |= pRes->NeedsDiscover();
1598  // send
1599  if (fSendDiscover)
1600  SendDiscover();
1601  }
1602  // status update?
1603  if (!iLastStatus || difftime(time(nullptr), iLastStatus) >= C4NetResStatusInterval)
1604  {
1605  // any?
1606  bool fStatusUpdates = false;
1607  for (pRes = pFirst; pRes; pRes = pRes->pNext)
1608  if (pRes->isDirty() && !pRes->isRemoved())
1609  fStatusUpdates |= pRes->SendStatus();
1610  // set time accordingly
1611  iLastStatus = fStatusUpdates ? time(nullptr) : 0;
1612  }
1613 }
const int32_t C4NetResStatusInterval
Definition: C4Network2Res.h:32
const int32_t C4NetResDiscoverInterval
Definition: C4Network2Res.h:31
bool isLoading() const
bool isDirty() const
bool SendStatus(C4Network2IOConnection *pTo=nullptr)
bool isRemoved() const

References C4NetResDiscoverInterval, C4NetResStatusInterval, C4Network2Res::DoLoad(), iLastDiscover, iLastStatus, C4Network2Res::isDirty(), C4Network2Res::isLoading(), C4Network2Res::isRemoved(), C4Network2Res::NeedsDiscover(), pFirst, C4Network2Res::pNext, C4Network2Res::Remove(), ResListCSec, SendDiscover(), and C4Network2Res::SendStatus().

Referenced by C4Network2IO::Execute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RemoveAtClient()

void C4Network2ResList::RemoveAtClient ( int32_t  iClientID)

Definition at line 1477 of file C4Network2Res.cpp.

1478 {
1479  CStdShareLock ResListLock(&ResListCSec);
1480  for (C4Network2Res *pRes = pFirst; pRes; pRes = pRes->pNext)
1481  if (pRes->getResClient() == iClientID)
1482  pRes->Remove();
1483 }

References iClientID, pFirst, C4Network2Res::pNext, and ResListCSec.

◆ SendDiscover()

bool C4Network2ResList::SendDiscover ( C4Network2IOConnection pTo = nullptr)

Definition at line 1637 of file C4Network2Res.cpp.

1638 {
1639  // make packet
1640  C4PacketResDiscover Pkt;
1641  // add special retrieves
1642  CStdShareLock ResListLock(&ResListCSec);
1643  for (C4Network2Res *pRes = pFirst; pRes; pRes = pRes->pNext)
1644  if (!pRes->isRemoved())
1645  if (pRes->isLoading())
1646  Pkt.AddDisID(pRes->getResID());
1647  ResListLock.Clear();
1648  // empty?
1649  if (!Pkt.getDisIDCnt()) return false;
1650  // broadcast?
1651  if (!pTo)
1652  {
1653  // save time
1654  iLastDiscover = time(nullptr);
1655  // send
1657  }
1658  else
1659  return pTo->Send(MkC4NetIOPacket(PID_NetResDis, Pkt));
1660 }
C4NetIOPacket MkC4NetIOPacket(char cStatus, const class C4PacketBase &Pkt, const C4NetIO::addr_t &addr=C4NetIO::addr_t())
Definition: C4PacketBase.h:40
bool Send(const C4NetIOPacket &rPkt)
bool BroadcastMsg(const C4NetIOPacket &rPkt)
bool AddDisID(int32_t iID)
Definition: C4Packet2.cpp:540
int32_t getDisIDCnt() const

References C4PacketResDiscover::AddDisID(), C4Network2IO::BroadcastMsg(), CStdShareLock::Clear(), C4PacketResDiscover::getDisIDCnt(), iLastDiscover, MkC4NetIOPacket(), pFirst, PID_NetResDis, pIO, C4Network2Res::pNext, ResListCSec, and C4Network2IOConnection::Send().

Referenced by OnClientConnect(), and OnTimer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetLocalID()

void C4Network2ResList::SetLocalID ( int32_t  iClientID)

Definition at line 1298 of file C4Network2Res.cpp.

1299 {
1300  CStdLock ResIDLock(&ResIDCSec);
1301  int32_t iOldClientID = iClientID;
1302  int32_t iIDDiff = (inClientID - iClientID) << 16;
1303  // set new counter
1304  iClientID = inClientID;
1305  iNextResID += iIDDiff;
1306  // change resource ids
1307  CStdLock ResListLock(&ResListCSec);
1308  for (C4Network2Res *pRes = pFirst; pRes; pRes = pRes->pNext)
1309  if (pRes->getResClient() == iOldClientID)
1310  pRes->ChangeID(pRes->getResID() + iIDDiff);
1311 }

References iClientID, iNextResID, pFirst, C4Network2Res::pNext, ResIDCSec, and ResListCSec.

Referenced by C4Network2::HandleJoinData(), and Init().

Here is the caller graph for this function:

Friends And Related Function Documentation

◆ C4Network2

friend class C4Network2
friend

Definition at line 329 of file C4Network2Res.h.

◆ C4Network2Res

friend class C4Network2Res
friend

Definition at line 328 of file C4Network2Res.h.

Referenced by AddByCore(), AddByFile(), AddByGroup(), and AddLoad().

Member Data Documentation

◆ iClientID

int32_t C4Network2ResList::iClientID {-1}
protected

Definition at line 340 of file C4Network2Res.h.

Referenced by Clear(), getRes(), Init(), nextResID(), RemoveAtClient(), and SetLocalID().

◆ iLastDiscover

int32_t C4Network2ResList::iLastDiscover {0}
protected

Definition at line 344 of file C4Network2Res.h.

Referenced by Clear(), OnTimer(), and SendDiscover().

◆ iLastStatus

int32_t C4Network2ResList::iLastStatus {0}
protected

Definition at line 344 of file C4Network2Res.h.

Referenced by Clear(), and OnTimer().

◆ iNextResID

int32_t C4Network2ResList::iNextResID
protected

Definition at line 340 of file C4Network2Res.h.

Referenced by Init(), nextResID(), and SetLocalID().

◆ pFirst

C4Network2Res* C4Network2ResList::pFirst {nullptr}
protected

◆ pIO

C4Network2IO* C4Network2ResList::pIO {nullptr}
protected

Definition at line 347 of file C4Network2Res.h.

Referenced by getIOClass(), Init(), and SendDiscover().

◆ ResIDCSec

CStdCSec C4Network2ResList::ResIDCSec
protected

Definition at line 341 of file C4Network2Res.h.

Referenced by nextResID(), and SetLocalID().

◆ ResListAddCSec

CStdCSec C4Network2ResList::ResListAddCSec
protected

Definition at line 338 of file C4Network2Res.h.

Referenced by Add().

◆ ResListCSec

CStdCSecEx C4Network2ResList::ResListCSec
protected

The documentation for this class was generated from the following files: