| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- #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", "<br>");
- }
- 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) == "<html")
- {
- break;
- }
- }
- if(m_lStartFragment >= 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
- // <html><body>
- // <!--StartFragment--><font size="-1">e</font><!--EndFragment-->
- // </body>
- // </html>
- CStringA csVersionText("Version:");
- CStringA csStartHTMLText("StartHTML:");
- CStringA csEndHTMLText("EndHTML:");
- CStringA csStartFragmentText("StartFragment:");
- CStringA csEndFragmentText("EndFragment:");
- CStringA csSourceURLText("SourceURL:");
- CStringA csStartFragmentMarkerText("<!--StartFragment-->");
- CStringA csEndFragmentMarkerText("<!--EndFragment-->");
- CStringA csStartHTML("<html><body>");
- CStringA csEndHTML("</body>\r\n</html>");
- long lNumberCharacters = 8;
- //+2 is for the line feeds
- long lCurrentPos = csVersionText.GetLength() + m_csVersion.GetLength() + 2 +
- csStartHTMLText.GetLength() + lNumberCharacters + 2 +
- csEndHTMLText.GetLength() + lNumberCharacters + 2 +
- csStartFragmentText.GetLength() + lNumberCharacters + 2 +
- csEndFragmentText.GetLength() + lNumberCharacters + 2 +
- csSourceURLText.GetLength() + m_csSourceURL.GetLength() + 2;
- m_lStartHTML = lCurrentPos;
- lCurrentPos += csStartHTMLText.GetLength() + 2 +
- csStartFragmentMarkerText.GetLength() + 2;
- m_lStartFragment = lCurrentPos;
- lCurrentPos += m_csFragment.GetLength();
- m_lEndFragment = lCurrentPos;
- lCurrentPos += csEndFragmentMarkerText.GetLength() + 2 +
- csEndHTML.GetLength();
- m_lEndHTML = lCurrentPos;
- csHTMLFormat = csVersionText + m_csVersion + "\r\n";
- CStringA csFormat;
- csFormat.Format("%s%08d\r\n", csStartHTMLText, m_lStartHTML);
- csHTMLFormat += csFormat;
- csFormat.Format("%s%08d\r\n", csEndHTMLText, m_lEndHTML);
- csHTMLFormat += csFormat;
- csFormat.Format("%s%08d\r\n", csStartFragmentText, m_lStartFragment);
- csHTMLFormat += csFormat;
- csFormat.Format("%s%08d\r\n", csEndFragmentText, m_lEndFragment);
- csHTMLFormat += csFormat;
- csFormat.Format("%s%s\r\n", csSourceURLText, m_csSourceURL);
- csHTMLFormat += csFormat;
- csFormat.Format("%s\r\n%s", csStartHTML, csStartFragmentMarkerText);
- csHTMLFormat += csFormat;
- csHTMLFormat += m_csFragment;
- csFormat.Format("%s\r\n%s", csEndFragmentMarkerText, csEndHTML);
- csHTMLFormat += csFormat;
- return true;
- }
|