static int image_parser(void* param, const char* xml) { XMLParser parser(xml); if(!parser.Valid()) return ERROR_PARAM; const char* encoding = parser.GetEncoding(); std::string title, datetime, text; if(!parser.GetValue("title", title) || !parser.GetValue("datetime", datetime)) return ERROR_PARAM; Comic comic; comic.title.assign((const char*)UTF8Encode(title.c_str(), encoding)); comic.datetime.assign((const char*)UTF8Encode(datetime.c_str(), encoding)); comic.datetime += ":00"; const char *p = comic.title.c_str(); while('0'>*p || *p > '9' ) ++p; comic.id = atoi(p); size_t n = comic.title.find('-'); if(std::string::npos != n) comic.title = comic.title.substr(n+1); parser.GetValue("text", text); comic.text.assign((const char*)UTF8Encode(text.c_str(), encoding)); for(bool i=parser.Foreach("images/image"); i; i=parser.Next()) { std::string uri; parser.GetValue(".", uri); if(!uri.empty()) comic.images.push_back(std::string("http://www.yyxj8.com")+(const char*)UTF8Encode(uri.c_str(), encoding)); } for(bool i=parser.Foreach("texts/text"); i; i=parser.Next()) { std::string v; parser.GetValue(".", v); if(!v.empty()) comic.text += (const char*)UTF8Encode(v.c_str(), encoding); } if(!comic.images.empty()) { Comics *comics = (Comics*)param; comics->push_back(comic); } return 0; }
void CConnection::SendHTML(UINT nResourceID) { CString strResponse; CString strBody = LoadRichHTML( nResourceID, strResponse ); if ( strResponse.IsEmpty() ) Write( _P("HTTP/1.1 200 OK\r\n") ); else Write( _T("HTTP/1.1 ") + strResponse ); if ( nResourceID == IDR_HTML_BUSY ) Write( _P("Retry-After: 30\r\n") ); Write( _P("Content-Type: text/html\r\n") ); CStringA strBodyUTF8 = UTF8Encode( strBody ); CString strLength; strLength.Format( _T("Content-Length: %i\r\n\r\n"), strBodyUTF8.GetLength() ); Write( strLength ); LogOutgoing(); Write( (LPCSTR)strBodyUTF8, strBodyUTF8.GetLength() ); }
BOOL CGProfile::Save() { const CString strPath = Settings.General.DataPath + L"Profile.xml"; CFile pFile; if ( ! pFile.Open( strPath, CFile::modeWrite | CFile::modeCreate ) ) return FALSE; CStringA sUTF8 = UTF8Encode( m_pXML->ToString( TRUE, TRUE ) ); pFile.Write( (LPCSTR)sUTF8, sUTF8.GetLength() ); 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 }