HTMLFormatAggregator.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #include "stdafx.h"
  2. #include ".\htmlformataggregator.h"
  3. #include "Misc.h"
  4. #include "Tokenizer.h"
  5. CHTMLFormatAggregator::CHTMLFormatAggregator(CStringA csSepator) :
  6. m_csSeparator(csSepator)
  7. {
  8. //Remove the first line feed
  9. // if(m_csSeparator.GetLength() > 1 && m_csSeparator[0] == '\r' && m_csSeparator[1] == '\n')
  10. // {
  11. // m_csSeparator.Delete(0);
  12. // m_csSeparator.Delete(0);
  13. // }
  14. m_csSeparator.Replace("\r\n", "<br>");
  15. }
  16. CHTMLFormatAggregator::~CHTMLFormatAggregator(void)
  17. {
  18. }
  19. bool CHTMLFormatAggregator::AddClip(LPVOID lpData, int nDataSize, int nPos, int nCount)
  20. {
  21. LPSTR pText = (LPSTR)lpData;
  22. if(pText == NULL)
  23. {
  24. return false;
  25. }
  26. //Ensure it's null terminated
  27. if(pText[nDataSize-1] != '\0')
  28. {
  29. pText[nDataSize-1] = NULL;
  30. }
  31. CHTMFormatStruct HtmlData;
  32. if(HtmlData.GetData(pText))
  33. {
  34. m_csNewText += HtmlData.GetFragment();
  35. if(m_csSourceURL.IsEmpty())
  36. m_csSourceURL = HtmlData.GetURL();
  37. if(m_csVersion.IsEmpty())
  38. m_csVersion = HtmlData.GetVersion();
  39. if(nPos != nCount-1)
  40. {
  41. m_csNewText += m_csSeparator;
  42. }
  43. }
  44. return true;
  45. }
  46. HGLOBAL CHTMLFormatAggregator::GetHGlobal()
  47. {
  48. CHTMFormatStruct HtmlData;
  49. HtmlData.SetFragment(m_csNewText);
  50. HtmlData.SetURL(m_csSourceURL);
  51. HtmlData.SetVersion(m_csVersion);
  52. CStringA csHtmlFormat;
  53. HtmlData.Serialize(csHtmlFormat);
  54. long lLen = csHtmlFormat.GetLength();
  55. HGLOBAL hGlobal = NewGlobalP(csHtmlFormat.GetBuffer(lLen), lLen+sizeof(char));
  56. csHtmlFormat.ReleaseBuffer();
  57. return hGlobal;
  58. }
  59. bool CHTMFormatStruct::GetData(LPCSTR HTML)
  60. {
  61. CTokenizer Tokenizer(HTML, "\r\n");
  62. CString Token;
  63. while(Tokenizer.Next(Token))
  64. {
  65. CTokenizer ItemTokenizer(Token, ":");
  66. CString csParam;
  67. ItemTokenizer.Next(csParam);
  68. CString csValue = ItemTokenizer.Tail();
  69. if(csParam == "Version")
  70. {
  71. m_csVersion = csValue;
  72. }
  73. else if(csParam == "StartHTML")
  74. {
  75. m_lStartHTML = ATOI(csValue);
  76. }
  77. else if(csParam == "EndHTML")
  78. {
  79. m_lEndHTML = ATOI(csValue);
  80. }
  81. else if(csParam == "StartFragment")
  82. {
  83. m_lStartFragment = ATOI(csValue);
  84. }
  85. else if(csParam == "EndFragment")
  86. {
  87. m_lEndFragment = ATOI(csValue);
  88. }
  89. else if(csParam == "SourceURL")
  90. {
  91. m_csSourceURL = csValue;
  92. break;
  93. }
  94. else if(csParam.Left(5) == "<html")
  95. {
  96. break;
  97. }
  98. }
  99. if(m_lStartFragment >= 0 && m_lEndFragment >= 0 && m_lStartFragment < m_lEndFragment)
  100. {
  101. m_csFragment = Tokenizer.m_cs.Mid(m_lStartFragment, m_lEndFragment-m_lStartFragment);
  102. m_csFragment = m_csFragment.Trim();
  103. }
  104. if(m_csFragment.IsEmpty())
  105. {
  106. return false;
  107. }
  108. return true;
  109. }
  110. bool CHTMFormatStruct::Serialize(CStringA &csHTMLFormat)
  111. {
  112. //Build a structure just like this
  113. // Version:0.9
  114. // StartHTML:00000244
  115. // EndHTML:00000338
  116. // StartFragment:00000278
  117. // StartFragment:00000302
  118. // 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
  119. // <html><body>
  120. // <!--StartFragment--><font size="-1">e</font><!--EndFragment-->
  121. // </body>
  122. // </html>
  123. CStringA csVersionText("Version:");
  124. CStringA csStartHTMLText("StartHTML:");
  125. CStringA csEndHTMLText("EndHTML:");
  126. CStringA csStartFragmentText("StartFragment:");
  127. CStringA csEndFragmentText("EndFragment:");
  128. CStringA csSourceURLText("SourceURL:");
  129. CStringA csStartFragmentMarkerText("<!--StartFragment-->");
  130. CStringA csEndFragmentMarkerText("<!--EndFragment-->");
  131. CStringA csStartHTML("<html><body>");
  132. CStringA csEndHTML("</body>\r\n</html>");
  133. long lNumberCharacters = 8;
  134. //+2 is for the line feeds
  135. long lCurrentPos = csVersionText.GetLength() + m_csVersion.GetLength() + 2 +
  136. csStartHTMLText.GetLength() + lNumberCharacters + 2 +
  137. csEndHTMLText.GetLength() + lNumberCharacters + 2 +
  138. csStartFragmentText.GetLength() + lNumberCharacters + 2 +
  139. csEndFragmentText.GetLength() + lNumberCharacters + 2 +
  140. csSourceURLText.GetLength() + m_csSourceURL.GetLength() + 2;
  141. m_lStartHTML = lCurrentPos;
  142. lCurrentPos += csStartHTMLText.GetLength() + 2 +
  143. csStartFragmentMarkerText.GetLength() + 2;
  144. m_lStartFragment = lCurrentPos;
  145. lCurrentPos += m_csFragment.GetLength();
  146. m_lEndFragment = lCurrentPos;
  147. lCurrentPos += csEndFragmentMarkerText.GetLength() + 2 +
  148. csEndHTML.GetLength();
  149. m_lEndHTML = lCurrentPos;
  150. csHTMLFormat = csVersionText + m_csVersion + "\r\n";
  151. CStringA csFormat;
  152. csFormat.Format("%s%08d\r\n", csStartHTMLText, m_lStartHTML);
  153. csHTMLFormat += csFormat;
  154. csFormat.Format("%s%08d\r\n", csEndHTMLText, m_lEndHTML);
  155. csHTMLFormat += csFormat;
  156. csFormat.Format("%s%08d\r\n", csStartFragmentText, m_lStartFragment);
  157. csHTMLFormat += csFormat;
  158. csFormat.Format("%s%08d\r\n", csEndFragmentText, m_lEndFragment);
  159. csHTMLFormat += csFormat;
  160. csFormat.Format("%s%s\r\n", csSourceURLText, m_csSourceURL);
  161. csHTMLFormat += csFormat;
  162. csFormat.Format("%s\r\n%s", csStartHTML, csStartFragmentMarkerText);
  163. csHTMLFormat += csFormat;
  164. csHTMLFormat += m_csFragment;
  165. csFormat.Format("%s\r\n%s", csEndFragmentMarkerText, csEndHTML);
  166. csHTMLFormat += csFormat;
  167. return true;
  168. }