void CDownloadWithSources::Serialize(CArchive& ar, int nVersion) { CDownloadBase::Serialize( ar, nVersion ); if ( ar.IsStoring() ) { ar.WriteCount( GetSourceCount() ); for ( CDownloadSource* pSource = GetFirstSource() ; pSource ; pSource = pSource->m_pNext ) { pSource->Serialize( ar, nVersion ); } ar.WriteCount( m_pXML != NULL ? 1 : 0 ); if ( m_pXML ) m_pXML->Serialize( ar ); } else { for ( int nSources = ar.ReadCount() ; nSources ; nSources-- ) { // Create new source CDownloadSource* pSource = new CDownloadSource( (CDownload*)this ); // Add to the list m_nSourceCount ++; pSource->m_pPrev = m_pSourceLast; pSource->m_pNext = NULL; if ( m_pSourceLast != NULL ) { m_pSourceLast->m_pNext = pSource; m_pSourceLast = pSource; } else { m_pSourceFirst = m_pSourceLast = pSource; } // Load details from disk pSource->Serialize( ar, nVersion ); // Extract ed2k client ID from url (m_pAddress) because it wasn't saved if ( ( !pSource->m_nPort ) && ( _tcsnicmp( pSource->m_sURL, _T("ed2kftp://"), 10 ) == 0 ) ) { CString strURL = pSource->m_sURL.Mid(10); if ( strURL.GetLength()) _stscanf( strURL, _T("%lu"), &pSource->m_pAddress.S_un.S_addr ); } } if ( ar.ReadCount() ) { m_pXML = new CXMLElement(); m_pXML->Serialize( ar ); } } }
void CDownloadWithSources::Serialize(CArchive& ar, int nVersion) // DOWNLOAD_SER_VERSION { CDownloadBase::Serialize( ar, nVersion ); CQuickLock pLock( Transfers.m_pSection ); if ( ar.IsStoring() ) { DWORD_PTR nSources = GetCount(); if ( nSources > Settings.Downloads.SourcesWanted ) nSources = Settings.Downloads.SourcesWanted; ar.WriteCount( nSources ); for ( POSITION posSource = GetIterator() ; posSource && nSources ; nSources-- ) { CDownloadSource* pSource = GetNext( posSource ); pSource->Serialize( ar, nVersion ); } ar.WriteCount( m_pXML != NULL ? 1 : 0 ); if ( m_pXML ) m_pXML->Serialize( ar ); } else // Loading { for ( DWORD_PTR nSources = ar.ReadCount() ; nSources ; nSources-- ) { // Create new source //CDownloadSource* pSource = new CDownloadSource( (CDownload*)this ); CAutoPtr< CDownloadSource > pSource( new CDownloadSource( static_cast< CDownload* >( this ) ) ); if ( ! pSource ) AfxThrowMemoryException(); // Load details from disk pSource->Serialize( ar, nVersion ); // Extract ed2k client ID from url (m_pAddress) because it wasn't saved if ( ! pSource->m_nPort && _tcsnicmp( pSource->m_sURL, _T("ed2kftp://"), 10 ) == 0 ) { CString strURL = pSource->m_sURL.Mid(10); if ( ! strURL.IsEmpty() ) _stscanf( strURL, _T("%lu"), &pSource->m_pAddress.S_un.S_addr ); } InternalAdd( pSource.Detach() ); } if ( ar.ReadCount() ) { m_pXML = new CXMLElement(); if ( ! m_pXML ) AfxThrowMemoryException(); m_pXML->Serialize( ar ); } } }