DataPackage& pushPackageToSend() { packetsToSend.push_back(DataPackage()); return packetsToSend.back(); }
static bool composePackagesForConn(CBytestream& bs, const SmartPointer<NetControlIntern>& con, Net_ConnID connid) { assert(connid != INVALID_CONN_ID); typedef std::list<NetControlIntern::DataPackage*> Packages; Packages packages; for(NetControlIntern::Packages::iterator i = con->packetsToSend.begin(); i != con->packetsToSend.end(); ++i) if(i->connID == INVALID_CONN_ID || i->connID == connid) { if(!isServerNetConnID(connid)) { CServerConnection* cl = serverConnFromNetConnID(connid); if(!cl->gusLoggedIn()) { if(i->type == NetControlIntern::DataPackage::GPT_ConnectResult) cl->gusLoggedIn() = true; else continue; } } if(i->nodeMustBeSet() || i->node.get()) { if(i->node.get() == NULL) { errors << "composePackagesForConn: node must be set but is unset" << endl; continue; } if(!con->isServer) { if(i->repRules & Net_REPRULE_OWNER_2_AUTH) { if(i->node->ownerConn != con->myConnIdOnServer) continue; } else continue; } else { // server bool trgtIsOwner = i->node->ownerConn == connid; if(trgtIsOwner && !(i->repRules & Net_REPRULE_AUTH_2_OWNER)) continue; if(!trgtIsOwner && !(i->repRules & Net_REPRULE_AUTH_2_PROXY)) continue; } } else { // no node if(i->repRules != Net_REPRULE_NONE) warnings << "reprules should be none for gus package of type " << i->type << endl; } if(i->type == NetControlIntern::DataPackage::GPT_NodeUpdate) con->nodeUpdateManager[connid].pushUpdate(*i); else packages.push_back(&*i); } if(packages.size() == 0) return false; bs.writeByte(con->isServer ? (uchar)S2C_GUSANOS : (uchar)C2S_GUSANOS); writeEliasGammaNr(bs, packages.size() - 1); for(Packages::iterator i = packages.begin(); i != packages.end(); ++i) (*i)->send(bs); //bs.Dump(); return true; }