#include "stdafx.h"
#include ".\htmlformataggregator.h"
#include "Misc.h"
#include "Tokenizer.h"
CHTMLFormatAggregator::CHTMLFormatAggregator(CStringA csSepator) :
m_csSeparator(csSepator)
{
//Remove the first line feed
// if(m_csSeparator.GetLength() > 1 && m_csSeparator[0] == '\r' && m_csSeparator[1] == '\n')
// {
// m_csSeparator.Delete(0);
// m_csSeparator.Delete(0);
// }
m_csSeparator.Replace("\r\n", "
");
}
CHTMLFormatAggregator::~CHTMLFormatAggregator(void)
{
}
bool CHTMLFormatAggregator::AddClip(LPVOID lpData, int nDataSize, int nPos, int nCount)
{
LPSTR pText = (LPSTR)lpData;
if(pText == NULL)
{
return false;
}
//Ensure it's null terminated
if(pText[nDataSize-1] != '\0')
{
pText[nDataSize-1] = NULL;
}
CHTMFormatStruct HtmlData;
if(HtmlData.GetData(pText))
{
m_csNewText += HtmlData.GetFragment();
if(m_csSourceURL.IsEmpty())
m_csSourceURL = HtmlData.GetURL();
if(m_csVersion.IsEmpty())
m_csVersion = HtmlData.GetVersion();
if(nPos != nCount-1)
{
m_csNewText += m_csSeparator;
}
}
return true;
}
HGLOBAL CHTMLFormatAggregator::GetHGlobal()
{
CHTMFormatStruct HtmlData;
HtmlData.SetFragment(m_csNewText);
HtmlData.SetURL(m_csSourceURL);
HtmlData.SetVersion(m_csVersion);
CStringA csHtmlFormat;
HtmlData.Serialize(csHtmlFormat);
long lLen = csHtmlFormat.GetLength();
HGLOBAL hGlobal = NewGlobalP(csHtmlFormat.GetBuffer(lLen), lLen+sizeof(char));
csHtmlFormat.ReleaseBuffer();
return hGlobal;
}
bool CHTMFormatStruct::GetData(LPCSTR HTML)
{
CTokenizer Tokenizer(HTML, "\r\n");
CString Token;
while(Tokenizer.Next(Token))
{
CTokenizer ItemTokenizer(Token, ":");
CString csParam;
ItemTokenizer.Next(csParam);
CString csValue = ItemTokenizer.Tail();
if(csParam == "Version")
{
m_csVersion = csValue;
}
else if(csParam == "StartHTML")
{
m_lStartHTML = ATOI(csValue);
}
else if(csParam == "EndHTML")
{
m_lEndHTML = ATOI(csValue);
}
else if(csParam == "StartFragment")
{
m_lStartFragment = ATOI(csValue);
}
else if(csParam == "EndFragment")
{
m_lEndFragment = ATOI(csValue);
}
else if(csParam == "SourceURL")
{
m_csSourceURL = csValue;
break;
}
else if(csParam.Left(5) == "= 0 && m_lEndFragment >= 0 && m_lStartFragment < m_lEndFragment)
{
m_csFragment = Tokenizer.m_cs.Mid(m_lStartFragment, m_lEndFragment-m_lStartFragment);
m_csFragment = m_csFragment.Trim();
}
if(m_csFragment.IsEmpty())
{
return false;
}
return true;
}
bool CHTMFormatStruct::Serialize(CStringA &csHTMLFormat)
{
//Build a structure just like this
// Version:0.9
// StartHTML:00000244
// EndHTML:00000338
// StartFragment:00000278
// StartFragment:00000302
// SourceURL:http://www.google.com/search?hl=en&client=firefox-a&channel=s&rls=org.mozilla%3Aen-US%3Aofficial&hs=oIx&q=c%2B%2B+interface&btnG=Search
//