Ejemplo n.º 1
0
void CKadOperation::LogReport(UINT Flags, const wstring& ErrorMessage, const string& Error, const CVariant& Trace)
{
	wstring Operation = L"Kad Operation";
	if(m_pOperator)
	{
		CKadScript* pKadScript = m_pOperator->GetScript();
		ASSERT(pKadScript);

		Operation += L" (" + pKadScript->GetName() + L" v" + CKadScript::GetVersion(pKadScript->GetVersion()) + L")";
	}
	
	if(Trace.Count() > 0) // remote result
	{
		wstring Sender = CUInt128(Trace.At((uint32)0)).ToHex();
		if(!Error.empty())
			LogLine(LOG_DEBUG | Flags, L"%s recived an Error: %s from %s", Operation.c_str(), ErrorMessage.c_str(), Sender.c_str());
		else
			LogLine(LOG_DEBUG | Flags, L"%s recived a Report: %s from %s", Operation.c_str(), ErrorMessage.c_str(), Sender.c_str());
	}
	else
	{
		if(!Error.empty())
			LogLine(LOG_DEBUG | Flags, L"%s caused an Error: %s", Operation.c_str(), ErrorMessage.c_str());
		else
			LogLine(LOG_DEBUG | Flags, L"%s Reports: %s", Operation.c_str(), ErrorMessage.c_str());
	}
}
Ejemplo n.º 2
0
void CKadNode::Load(const CVariant& Node, bool bFull)
{
	m_Protocol = Node["PROT"];
	m_ID.SetValue(CUInt128(Node["NID"]));

	CVariant Addr = Node["ADDR"];
	for(uint32 i=0; i < Addr.Count(); i++)
	{
		CNodeAddress Address;
		if(bFull)
			Address.FromExtVariant(Addr.At(i));
		else
			Address.FromVariant(Addr.At(i));
		InsertAddress(Address);
	}

	if(bFull)
	{
		m_Version = Node["VER"].To<string>();
		m_uFirstSeen = Node["FSEN"];
		m_uLastSeen = Node["LSEN"];

		if(IsFading())
		{
			for(AddressMap::iterator I = m_AddressMap.begin(); I != m_AddressMap.end(); I++)
				I->second.SetClass(NODE_DEFAULT_CLASS);
			m_uLastSeen = GetTime();
		}
	}
}
Ejemplo n.º 3
0
CUInt128 CJSKadID::FromValue(v8::Local<v8::Value> value)
{
    v8::HandleScope HandleScope(v8::Isolate::GetCurrent());

	CUInt128 Value;
	if(value->IsString())
		Value.FromHex(CJSEngine::GetWStr(value));
	else if(value->IsObject())
	{
		if(CKadIDObj* pVariant = GetCObject<CKadIDObj>(value->ToObject()))
			Value = pVariant->m_Value;
		else if(CVariantPrx* pVariant = GetCObject<CVariantPrx>(value->ToObject()))
			Value = pVariant->GetCopy();
	}
	else	
	{
		sint64 iValue = value->IntegerValue();
		if(iValue < 0)
			Value = CUInt128(true);
		else
			Value = CUInt128((sint32)iValue);
	}
	return Value;
}
Ejemplo n.º 4
0
bool CKadHandler::ProcessPacket(const string& Name, const CVariant& Packet, CComChannel* pChannel)
{
	CKadNode* pNode = NULL;
	try
	{
		// Process cahnnel initialisation
		if(Name == KAD_INIT)
		{
			if(GetParent<CKademlia>()->Cfg()->GetBool("DebugTL"))
				LogLine(LOG_DEBUG, L"Recived 'Transaction Init' from %s", CUInt128(Packet["NID"]).ToHex().c_str());

			bool bAdded = false;
			SKadData* pData = pChannel->GetData<SKadData>(&bAdded);
			
			if(!pData->pNode)
			{
				pData->pNode = GetParent<CKademlia>()->Root()->GetNode(Packet["NID"]);
				if(!pData->pNode)
				{
					pData->pNode = new CKadNode(GetParent<CKademlia>()->Root());
					pData->pNode->SetID(Packet["NID"]);
					GetParent<CKademlia>()->Root()->AddNode(pData->pNode);
				}

				pChannel->AddUpLimit(pData->pNode->GetUpLimit());
				pChannel->AddDownLimit(pData->pNode->GetDownLimit());
			}
			else if(pData->pNode->GetID() != Packet["NID"])
				throw CException(LOG_ERROR, L"KadNode Miss Match"); // this should never ever happen!

			pData->pNode->SetProtocol(Packet["PROT"]);
			pData->pNode->SetVersion(Packet.Get("VER")); // Version is optional

			pData->Connected = true;

			if(bAdded) // if it was added it means its an incomming connectziona dnwe have to answer
			{
				SendInit(pData->pNode, pChannel);

				pData->pNode->UpdateAddress(pChannel->GetAddress()); // If this is incomming update addresses
			}
			return true;
		}
		else
		{
			if(SKadData* pData = pChannel->GetData<SKadData>())
				pNode = pData->pNode;
			if(!pNode || !pNode->GetParent())
				throw CException(LOG_WARNING, L"Kad Packet Recived %S on not initialized channel", Name.c_str());
		}

		if(Name.compare(KAD_CRYPTO_REQUEST) == 0)			HandleCryptoRequest(Packet, pNode, pChannel);
		else if(Name.compare(KAD_CRYPTO_RESPONSE) == 0)		HandleCryptoResponse(Packet, pNode, pChannel);

		else if(Name.compare(KAD_HELLO_REQUEST) == 0)		HandleHello(Packet, pNode, pChannel, true);
		else if(Name.compare(KAD_HELLO_RESPONSE) == 0)		HandleHello(Packet, pNode, pChannel, false);

		else if(Name.compare(KAD_NODE_REQUEST) == 0)		HandleNodeReq(Packet, pNode, pChannel);
		else if(Name.compare(KAD_NODE_RESPONSE) == 0)		HandleNodeRes(Packet, pNode, pChannel);

		// Lookup Handling
		else if(Name.compare(KAD_PROXY_REQUEST) == 0)		HandleProxyReq(Packet, pNode, pChannel);
		else if(Name.compare(KAD_PROXY_RESPONSE) == 0)		HandleProxyRes(Packet, pNode, pChannel);

		else if(Name.compare(KAD_CODE_REQUEST) == 0)		HandleCodeReq(Packet, pNode, pChannel);
		else if(Name.compare(KAD_CODE_RESPONSE) == 0)		HandleCodeRes(Packet, pNode, pChannel);

		else if(Name.compare(KAD_LOOKUP_MESSAGE) == 0)		HandleMessagePkt(Packet, pNode, pChannel);

		else if(Name.compare(KAD_EXECUTE_REQUEST) == 0)		HandleExecuteReq(Packet, pNode, pChannel);
		else if(Name.compare(KAD_EXECUTE_RESPONSE) == 0)	HandleExecuteRes(Packet, pNode, pChannel);

		else if(Name.compare(KAD_STORE_REQUEST) == 0)		HandleStoreReq(Packet, pNode, pChannel);
		else if(Name.compare(KAD_STORE_RESPONSE) == 0)		HandleStoreRes(Packet, pNode, pChannel);

		else if(Name.compare(KAD_LOAD_REQUEST) == 0)		HandleLoadReq(Packet, pNode, pChannel);
		else if(Name.compare(KAD_LOAD_RESPONSE) == 0)		HandleLoadRes(Packet, pNode, pChannel);

		else if(Name.compare(KAD_LOOKUP_REPORT) == 0)		HandleReportPkt(Packet, pNode, pChannel);

		// Routing Handling
		else if(Name.compare(KAD_ROUTE_REQUEST) == 0)		HandleRouteReq(Packet, pNode, pChannel);
		else if(Name.compare(KAD_ROUTE_RESPONSE) == 0)		HandleRouteRes(Packet, pNode, pChannel);

		else if(Name.compare(KAD_RELAY_REQUEST) == 0)		HandleRelayReq(Packet, pNode, pChannel);
		else if(Name.compare(KAD_RELAY_RESPONSE) == 0)		HandleRelayRes(Packet, pNode, pChannel);
		else if(Name.compare(KAD_RELAY_RETURN) == 0)		HandleRelayRet(Packet, pNode, pChannel);

		else if(Name.compare(KAD_RELAY_CONTROL) == 0)		HandleRelayCtrl(Packet, pNode, pChannel);
		else if(Name.compare(KAD_RELAY_STATUS) == 0)		HandleRelayStat(Packet, pNode, pChannel);

		else 
			throw CException(LOG_WARNING, L"Unsupported Kad Packet Recived %S", Name.c_str());
	}
	catch(const CException& Exception)
	{
		LogLine(Exception.GetFlag(), L"Packet \'%S\' Error: '%s' from: %s (%s)", Name.c_str(), Exception.GetLine().c_str(), pNode ? pNode->GetID().ToHex().c_str() : L"Unknown", pChannel->GetAddress().ToString().c_str());
		pChannel->Close();
		return false;
	}
	return true;
}
Ejemplo n.º 5
0
CUInt128 KadNode::GetDistance()
{
	//return m_uDistance;
    return CUInt128((unsigned long)0);
}