Esempio n. 1
0
		virtual void dataReceived(bt::Buffer::Ptr ptr, const net::Address& addr)
		{
			try
			{
				// read and decode the packet
				BDecoder bdec(ptr->get(), ptr->size(), false);
				boost::scoped_ptr<BNode> n(bdec.decode());

				if (!n || n->getType() != BNode::DICT)
					return;

				// try to make a RPCMsg of it
				RPCMsg::Ptr msg = factory.build((BDictNode*)n.get(), this);
				if (msg)
				{
					if (addr.ipVersion() == 6 && addr.isIPv4Mapped())
						msg->setOrigin(addr.convertIPv4Mapped());
					else
						msg->setOrigin(addr);
					
					msg->apply(dh_table);
					// erase an existing call
					if (msg->getType() == RSP_MSG && calls.contains(msg->getMTID()))
					{
						// delete the call, but first notify it off the response
						RPCCall* c = calls.find(msg->getMTID());
						c->response(msg);
						calls.erase(msg->getMTID());
						c->deleteLater();
						doQueuedCalls();
					}
				}
			}
			catch (bt::Error & err)
			{
				Out(SYS_DHT | LOG_DEBUG) << "Error happened during parsing : " << err.toString() << endl;
			}
		}