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()); } }
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(); } } }
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; }
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; }
CUInt128 KadNode::GetDistance() { //return m_uDistance; return CUInt128((unsigned long)0); }