Exemplo n.º 1
0
CString CLocalSearch::GetXMLString()
{
	CString strXML;

	for ( POSITION pos1 = m_pSchemas.GetStartPosition() ; pos1 ; )
	{
		CXMLElement* pGroup;
		CSchema* pSchema;

		m_pSchemas.GetNextAssoc( pos1, (void*&)pSchema, (void*&)pGroup );

		strXML += _T("<?xml version=\"1.0\"?>\r\n");
		pGroup->ToString( strXML, TRUE );

		for ( POSITION pos2 = pGroup->GetElementIterator() ; pos2 ; )
		{
			CXMLElement* pChild = pGroup->GetNextElement( pos2 );
			pChild->DeleteAttribute( _T("index") );
			pChild->Detach();
		}

		delete pGroup;
	}

	m_pSchemas.RemoveAll();

	return strXML;
}
Exemplo n.º 2
0
LONG WINAPI XCallWorker(LPTSTR string, DWORD nTimeOut)
{
	CXMLElement* pXML;
	LONG nResult = Network.CallWorker(&pXML, nTimeOut);
	
	if ( nResult || ! string ) return nResult;
	
	CString strXML = pXML->ToString( FALSE, TRUE );
	_tcscpy( string, (LPCTSTR)strXML );
	
	pXML->Delete();
	return nResult;
}
Exemplo n.º 3
0
CG2Packet* CLocalSearch::AlbumToPacket(CAlbumFolder* pFolder)
{
	if ( pFolder == NULL ) return NULL;

	if ( pFolder->m_pSchema != NULL && pFolder->m_pSchema->m_bPrivate ) return NULL;
	if ( pFolder->GetSharedCount() == 0 ) return NULL;

	CG2Packet* pPacket = CG2Packet::New( "VF", TRUE );

	if ( pFolder->m_pSchema != NULL )
	{
		CXMLElement* pXML = pFolder->m_pSchema->Instantiate( TRUE );

		if ( pFolder->m_pXML != NULL )
		{
			pXML->AddElement( pFolder->m_pXML->Clone() );
		}
		else
		{
			CXMLElement* pBody = pXML->AddElement( pFolder->m_pSchema->m_sSingular );
			pBody->AddAttribute( pFolder->m_pSchema->GetFirstMemberName(), pFolder->m_sName );
		}

		CString strXML = pXML->ToString();
		delete pXML;

		pPacket->WritePacket( "MD", pPacket->GetStringLen( strXML ) );
		pPacket->WriteString( strXML, FALSE );
	}

	for ( POSITION pos = pFolder->GetFolderIterator() ; pos ; )
	{
		if ( CG2Packet* pChild = AlbumToPacket( pFolder->GetNextFolder( pos ) ) )
		{
			pPacket->WritePacket( pChild );
			pChild->Release();
		}
	}

	pPacket->WritePacket( "FILES", pFolder->GetFileCount() * 4 );

	for ( POSITION pos = pFolder->GetFileIterator() ; pos ; )
	{
		CLibraryFile* pFile = pFolder->GetNextFile( pos );
		pPacket->WriteLongBE( pFile->m_nIndex );
	}

	return pPacket;
}
Exemplo n.º 4
0
BOOL CPlayerWnd::SaveXML(CXMLElement* pXML)
{
	ASSERT( pXML != NULL );
	
	CFile pFile;
	if ( ! pFile.Open( _T("Xhistory.xml"), CFile::modeWrite|CFile::modeCreate ) ) return FALSE;
	
	CXMLElement* pParent = LoadXML( pXML->GetName() );
	if ( ! pParent ) pParent = CreateXML();
	
	pParent->GetElementByName( pXML->GetName() )->Delete();
	pParent->AddElement( pXML );
	
	CString strXML;
	strXML = pParent->ToString( TRUE, TRUE );
	
	pFile.Write( (LPCSTR)strXML, strXML.GetLength() );
	
	pFile.Close();
	pXML->Detach();
	pParent->Delete();
	
	return TRUE;
}
Exemplo n.º 5
0
void CLocalSearch::WriteTrailerG1(CG1Packet* pPacket, CSchemaMap& pSchemas, BYTE nHits)
{
	// Prepare XML
	CStringA sXML;
	for ( POSITION pos1 = pSchemas.GetStartPosition() ; pos1 ; )
	{
		CXMLElement* pGroup;
		CSchemaPtr pSchema;
		pSchemas.GetNextAssoc( pos1, pSchema, pGroup );
		sXML += UTF8Encode( pGroup->ToString( TRUE, FALSE ) );
		delete pGroup;
	}
	pSchemas.RemoveAll();

	// Compress XML
	DWORD nXMLLength = sXML.GetLength();
	DWORD nCompressedXMLLength = 0;
	auto_array< BYTE > pCompressedXML;
	if ( nXMLLength )
	{
		pCompressedXML = CZLib::Compress( (LPCSTR)sXML, nXMLLength, &nCompressedXMLLength );
	}

	// Flags: 'I understand' first byte, 'Yes/No' - second byte
	// REMEMBER THAT THE PUSH BIT IS SET OPPOSITE THAN THE OTHERS
	BYTE nFlags[ 2 ] =
	{
		G1_QHD_BUSY | G1_QHD_STABLE | G1_QHD_SPEED | G1_QHD_GGEP,
		G1_QHD_PUSH
	};
	if ( Network.IsFirewalled() )
		nFlags[ 0 ] |= G1_QHD_PUSH;
	if ( Uploads.m_bStable )
		nFlags[ 1 ] |= G1_QHD_STABLE;
	if ( Uploads.m_bStable )
		nFlags[ 1 ] |= G1_QHD_SPEED;
	if ( ! UploadQueues.IsTransferAvailable() )
		nFlags[ 1 ] |= G1_QHD_BUSY;
	if ( Settings.Gnutella1.EnableGGEP )
		nFlags[ 1 ] |= G1_QHD_GGEP;

	// Correct the number of files sent
	pPacket->m_pBuffer[ 0 ] = nHits;

	// Write client vendor code
	pPacket->WriteString( _T(VENDOR_CODE), FALSE );

	// Write public info
	pPacket->WriteByte( 4 ); // Public size: flags (2 bytes) + xml size (2 bytes)
	pPacket->WriteByte( nFlags[ 0 ] );
	pPacket->WriteByte( nFlags[ 1 ] );
	if ( pCompressedXML.get() && nCompressedXMLLength + 9 < nXMLLength + 2 )
	{
		// "{deflate}" (9 bytes) + NUL
		pPacket->WriteShortLE( (WORD)( nCompressedXMLLength + 9 + 1 ) );
	}
	else if ( nXMLLength )
	{
		// "{}" (2 bytes) + NUL
		pPacket->WriteShortLE( WORD( nXMLLength + 2 + 1 ) );

		pCompressedXML.reset();
		nCompressedXMLLength = 0;
	}
	else
	{
		// NUL
		pPacket->WriteShortLE( WORD( 1 ) );
	}

	// Write Chat flag
	pPacket->WriteByte( Settings.Community.ChatEnable ? G1_QHD_CHAT : 0 );

	// Write GGEP block
	if ( Settings.Gnutella1.EnableGGEP )
	{
		CGGEPBlock pBlock;

		// Write Browse flag
		if ( Settings.Community.ServeFiles )
		{
			pBlock.Add( GGEP_HEADER_BROWSE_HOST );
		}
		if ( Settings.Community.ChatEnable )
		{
			pBlock.Add( GGEP_HEADER_CHAT );
		}
		if ( m_bUDP && m_pSearch->m_nHops == 0 )
		{
			pBlock.Add( GGEP_HEADER_MULTICAST_RESPONSE );
		}

		pBlock.Write( pPacket );
	}

	// Write XML
	if ( nCompressedXMLLength )
	{
		pPacket->Write( "{deflate}", 9 );
		pPacket->Write( pCompressedXML.get(), nCompressedXMLLength );
		pPacket->WriteByte( 0 );
	}
	else if ( nXMLLength )
	{
		pPacket->Write( "{}", 2 );
		pPacket->Write( (LPCSTR)sXML, nXMLLength );
		pPacket->WriteByte( 0 );
	}
	else
	{
		pPacket->WriteByte( 0 );
	}

	// Client GUID
	pPacket->Write( Hashes::Guid( MyProfile.oGUID ) );

#ifdef _DEBUG
	// Test created hit
	if ( CQueryHit* pDebugHit = CQueryHit::FromG1Packet( pPacket ) )
	{
		pDebugHit->Delete();
		pPacket->m_nPosition = 0;
	}
	else
		theApp.Message( MSG_ERROR | MSG_FACILITY_SEARCH, _T("[G1] Shareaza produced search packet above but cannot parse it back!") );
#endif // _DEBUG
}