void CLocalSearch::CreatePacketG2() { CG2Packet* pPacket = CG2Packet::New( G2_PACKET_HIT, TRUE ); m_pPacket = pPacket; pPacket->WritePacket( "GU", 16 ); GGUID tmp( MyProfile.GUID ); pPacket->Write( &tmp, sizeof(GGUID) ); if ( TRUE /* Network.IsListening() */ ) { pPacket->WritePacket( "NA", 6 ); pPacket->WriteLongLE( Network.m_pHost.sin_addr.S_un.S_addr ); pPacket->WriteShortBE( htons( Network.m_pHost.sin_port ) ); } pPacket->WritePacket( "V", 4 ); pPacket->WriteString( SHAREAZA_VENDOR_A, FALSE ); if ( ! Network.IsStable() || ! Datagrams.IsStable() ) { pPacket->WritePacket( "FW", 0 ); } { CSingleLock pNetLock( &Network.m_pSection ); if ( pNetLock.Lock( 50 ) ) { for ( POSITION pos = Neighbours.GetIterator() ; pos ; ) { CNeighbour* pNeighbour = Neighbours.GetNext( pos ); if ( pNeighbour->m_nNodeType != ntLeaf && pNeighbour->m_nProtocol == PROTOCOL_G2 ) { pPacket->WritePacket( "NH", 6 ); pPacket->WriteLongLE( pNeighbour->m_pHost.sin_addr.S_un.S_addr ); pPacket->WriteShortBE( htons( pNeighbour->m_pHost.sin_port ) ); } } } } if ( ! Uploads.m_bStable ) pPacket->WritePacket( "UNSTA", 0 ); CSingleLock pQueueLock( &UploadQueues.m_pSection ); int nQueue = 1; if ( pQueueLock.Lock() ) { for ( POSITION pos = UploadQueues.GetIterator() ; pos ; nQueue++ ) { CUploadQueue* pQueue = UploadQueues.GetNext( pos ); pPacket->WritePacket( "HG", ( 4 + 7 ) + 2, TRUE ); pPacket->WritePacket( "SS", 7 ); pPacket->WriteShortBE( pQueue->GetQueuedCount() + pQueue->GetTransferCount() ); pPacket->WriteByte( pQueue->GetTransferCount( TRUE ) ); pPacket->WriteLongBE( pQueue->GetPredictedBandwidth() * 8 / 1024 ); pPacket->WriteByte( 0 ); pPacket->WriteByte( nQueue ); } pQueueLock.Unlock(); } CString strNick = MyProfile.GetNick(); if ( strNick.GetLength() > 32 ) strNick = strNick.Left( 32 ); if ( strNick.GetLength() ) { int nNick = pPacket->GetStringLen( strNick ); pPacket->WritePacket( "UPRO", nNick + 6, TRUE ); pPacket->WritePacket( "NICK", nNick ); pPacket->WriteString( strNick, FALSE ); } if ( Settings.Community.ServeProfile ) pPacket->WritePacket( "BUP", 0 ); if ( Settings.Community.ServeFiles ) pPacket->WritePacket( "BH", 0 ); if ( Settings.Community.ChatEnable ) pPacket->WritePacket( "PCH", 0 ); }
CG2Packet* CLocalSearch::CreatePacketG2() { CG2Packet* pPacket = CG2Packet::New( G2_PACKET_HIT, TRUE ); pPacket->WritePacket( G2_PACKET_NODE_GUID, Hashes::Guid::byteCount ); pPacket->Write( Hashes::Guid( MyProfile.oGUID ) ); pPacket->WritePacket( G2_PACKET_NODE_ADDRESS, 6 ); pPacket->WriteLongLE( Network.m_pHost.sin_addr.s_addr ); pPacket->WriteShortBE( htons( Network.m_pHost.sin_port ) ); pPacket->WritePacket( G2_PACKET_VENDOR, 4 ); pPacket->WriteString( VENDOR_CODE, FALSE ); if ( Network.IsFirewalled() ) { pPacket->WritePacket( G2_PACKET_PEER_FIREWALLED, 0 ); } { CSingleLock pNetLock( &Network.m_pSection ); if ( pNetLock.Lock( 50 ) ) { for ( POSITION pos = Neighbours.GetIterator() ; pos ; ) { CNeighbour* pNeighbour = Neighbours.GetNext( pos ); if ( pNeighbour->m_nNodeType != ntLeaf && pNeighbour->m_nProtocol == PROTOCOL_G2 ) { pPacket->WritePacket( G2_PACKET_NEIGHBOUR_HUB, 6 ); pPacket->WriteLongLE( pNeighbour->m_pHost.sin_addr.s_addr ); pPacket->WriteShortBE( htons( pNeighbour->m_pHost.sin_port ) ); } } } } if ( ! Uploads.m_bStable ) pPacket->WritePacket( G2_PACKET_PEER_UNSTABLE, 0 ); CSingleLock pQueueLock( &UploadQueues.m_pSection ); int nQueue = 1; if ( pQueueLock.Lock() ) { for ( POSITION pos = UploadQueues.GetIterator() ; pos ; nQueue++ ) { CUploadQueue* pQueue = UploadQueues.GetNext( pos ); pPacket->WritePacket( G2_PACKET_HIT_GROUP, ( 4 + 7 ) + 2, TRUE ); pPacket->WritePacket( G2_PACKET_PEER_STATUS, 7 ); pPacket->WriteShortBE( WORD( pQueue->GetQueuedCount() + pQueue->GetTransferCount() ) ); pPacket->WriteByte( BYTE( pQueue->GetTransferCount( TRUE ) ) ); pPacket->WriteLongBE( pQueue->GetPredictedBandwidth() * 8 / 1024 ); pPacket->WriteByte( 0 ); pPacket->WriteByte( BYTE( nQueue ) ); } pQueueLock.Unlock(); } CString strNick = MyProfile.GetNick(); if ( strNick.GetLength() > 32 ) strNick = strNick.Left( 32 ); if ( strNick.GetLength() ) { int nNick = pPacket->GetStringLen( strNick ); pPacket->WritePacket( G2_PACKET_PROFILE, nNick + 6, TRUE ); pPacket->WritePacket( G2_PACKET_NICK, nNick ); pPacket->WriteString( strNick, FALSE ); } if ( Settings.Community.ServeProfile ) pPacket->WritePacket( G2_PACKET_BROWSE_PROFILE, 0 ); if ( Settings.Community.ServeFiles ) pPacket->WritePacket( G2_PACKET_BROWSE_HOST, 0 ); if ( Settings.Community.ChatEnable ) pPacket->WritePacket( G2_PACKET_PEER_CHAT, 0 ); return pPacket; }