Beispiel #1
0
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;
}
Beispiel #2
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() );
}
Beispiel #3
0
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;
}
Beispiel #4
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
}