void JobThreadFunc(void) { Lock(); O2IMessages queue(Queue); Queue.clear(); Unlock(); if (queue.size() == 0) return; hashT myid; Profile->GetID(myid); O2IMessagesIt it; for (it = queue.begin(); it != queue.end() && IsActive(); it++) { O2IMessage &im = *it; TRACEA("[BroadcastJob]"); TRACEW(it->msg.c_str()); TRACEA("\n"); O2NodeDB::NodeListT neighbors; if (NodeDB->neighbors(myid, neighbors, false, O2_BROADCAST_PATH_LIMIT+2) == 0) return; O2NodeDB::NodeListT::iterator nit = neighbors.begin(); while (nit != neighbors.end()) { if (nit->id == im.id) { nit = neighbors.erase(nit); continue; } hashListT::iterator hit = std::find(im.paths.begin(), im.paths.end(), nit->id); if (hit != im.paths.end()) { nit = neighbors.erase(nit); continue; } nit++; } if (neighbors.empty()) continue; hashT myid; Profile->GetID(myid); im.paths.push_back(myid); while (im.paths.size() > O2_BROADCAST_PATH_LIMIT) im.paths.pop_front(); for (nit = neighbors.begin(); nit != neighbors.end() && IsActive(); nit++) { nit->lastlink = 0; nit->reset(); // Broadcast発行 O2SocketSession ss; ss.ip = nit->ip; ss.port = nit->port; string xml; BroadcastDB->MakeSendXML(im, xml); string url; MakeURL(ss.ip, ss.port, O2PROTOPATH_BROADCAST, url); HTTPHeader hdr(HTTPHEADERTYPE_REQUEST); hdr.method = "POST"; hdr.SetURL(url.c_str()); AddRequestHeaderFields(hdr, Profile); AddContentFields(hdr, xml.size(), "text/xml", DEFAULT_XML_CHARSET); hdr.Make(ss.sbuff); ss.sbuff += xml; Client->AddRequest(&ss); ss.Wait(); HTTPHeader *header = (HTTPHeader*)ss.data; if (CheckResponse(&ss, header, NodeDB, *nit)) { ; } if (header) delete header; Sleep(1000); } for (nit = neighbors.begin(); nit != neighbors.end() && IsActive(); nit++) { if (nit->lastlink) { // 成功したノードをtouch NodeDB->touch(*nit); } else { // 失敗したノードをremove NodeDB->remove(*nit); KeyDB->DeleteKeyByNodeID(nit->id); } } Sleep(IsActive() ? 1000 : 0); } }
void JobThreadFunc(void) { Lock(); O2KeyList keylist(RequestQueue); RequestQueue.clear(); Unlock(); if (keylist.size() == 0) return; O2NodeDB::NodeListT Nodes; // キーでループ O2KeyListIt it; for (it = keylist.begin(); it != keylist.end() && IsActive(); it++) { O2Key &key = *it; TRACEA("[GETDAT]"); TRACEW(it->url.c_str()); TRACEA("\n"); O2Node node; node.id = it->nodeid; node.ip = it->ip; node.port = it->port; // リクエスト発行 O2SocketSession ss; ss.ip = key.ip; ss.port = key.port; MakeRequest_Dat(&key.hash, NULL, &ss, Profile, DatIO, ss.sbuff); Client->AddRequest(&ss); ss.Wait(); HTTPHeader *header = (HTTPHeader*)ss.data; if (CheckResponse(&ss, header, NodeDB, node)) { // 本文のdat取り込み const char *rawdata = &ss.rbuff[header->length]; uint64 datsize = ss.rbuff.size() - header->length; ImportDat(DatIO, Profile, NULL, *header, rawdata, datsize, Logger, ss.ip, ss.port, QueryDB, hwndBaloonCallback, msgBaloonCallback); } if (header) delete header; Nodes.push_back(node); Sleep(IsActive() ? QUERY_DAT_INTERVAL_MS : 0); } O2NodeDB::NodeListT::iterator nit; for (nit = Nodes.begin(); nit != Nodes.end() && IsActive(); nit++) { if (nit->lastlink) { // 成功したノードをtouch NodeDB->touch(*nit); } else { // 失敗したノードをremove NodeDB->remove(*nit); KeyDB->DeleteKeyByNodeID(nit->id); } } }