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; }
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; }
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; }
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; }
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 }