OleClipSource.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. #include "stdafx.h"
  2. #include "CP_Main.h"
  3. #include "OleClipSource.h"
  4. #include "TextConvert.h"
  5. #include "CF_HDropAggregator.h"
  6. #include "CF_UnicodeTextAggregator.h"
  7. #include "CF_TextAggregator.h"
  8. #include "richtextaggregator.h"
  9. #include "htmlformataggregator.h"
  10. /*------------------------------------------------------------------*\
  11. COleClipSource
  12. \*------------------------------------------------------------------*/
  13. //IMPLEMENT_DYNAMIC(COleClipSource, COleDataSource)
  14. COleClipSource::COleClipSource()
  15. {
  16. m_bLoadedFormats = false;
  17. m_bOnlyPaste_CF_TEXT = false;
  18. m_bPasteHTMLFormatAs_CF_TEXT = false;
  19. m_pCustomPasteFormats = NULL;
  20. }
  21. COleClipSource::~COleClipSource()
  22. {
  23. }
  24. BOOL COleClipSource::DoDelayRender()
  25. {
  26. CClipTypes types;
  27. m_ClipIDs.GetTypes(types);
  28. int count = types.GetSize();
  29. for(int i=0; i < count; i++)
  30. DelayRenderData(types[i]);
  31. return count;
  32. }
  33. #include "Client.h"
  34. BOOL COleClipSource::DoImmediateRender()
  35. {
  36. if(m_bLoadedFormats)
  37. return TRUE;
  38. m_bLoadedFormats = true;
  39. if(m_pCustomPasteFormats != NULL)
  40. {
  41. return PutFormatOnClipboard(m_pCustomPasteFormats, m_bPasteHTMLFormatAs_CF_TEXT);
  42. }
  43. int count = m_ClipIDs.GetSize();
  44. if(count <= 0)
  45. return 0;
  46. BOOL bProcessedMult = FALSE;
  47. if(count > 1)
  48. {
  49. CStringA SepA = CTextConvert::ConvertToChar(g_Opt.GetMultiPasteSeparator());
  50. CCF_TextAggregator CFText(SepA);
  51. if(m_ClipIDs.AggregateData(CFText, CF_TEXT, g_Opt.m_bMultiPasteReverse && g_Opt.m_bHistoryStartTop))
  52. {
  53. CacheGlobalData(CF_TEXT, CFText.GetHGlobal());
  54. bProcessedMult = TRUE;
  55. }
  56. CStringW SepW = CTextConvert::ConvertToUnicode(g_Opt.GetMultiPasteSeparator());
  57. CCF_UnicodeTextAggregator CFUnicodeText(SepW);
  58. if(m_ClipIDs.AggregateData(CFUnicodeText, CF_UNICODETEXT, g_Opt.m_bMultiPasteReverse && g_Opt.m_bHistoryStartTop))
  59. {
  60. CacheGlobalData(CF_UNICODETEXT, CFUnicodeText.GetHGlobal());
  61. bProcessedMult = TRUE;
  62. }
  63. if(m_bOnlyPaste_CF_TEXT == false)
  64. {
  65. CCF_HDropAggregator HDrop;
  66. if(m_ClipIDs.AggregateData(HDrop, CF_HDROP, g_Opt.m_bMultiPasteReverse && g_Opt.m_bHistoryStartTop))
  67. {
  68. CacheGlobalData(CF_HDROP, HDrop.GetHGlobal());
  69. bProcessedMult = TRUE;
  70. }
  71. CRichTextAggregator RichText(SepA);
  72. if(m_ClipIDs.AggregateData(RichText, theApp.m_RTFFormat, g_Opt.m_bMultiPasteReverse && g_Opt.m_bHistoryStartTop))
  73. {
  74. CacheGlobalData(theApp.m_RTFFormat, RichText.GetHGlobal());
  75. bProcessedMult = TRUE;
  76. }
  77. CHTMLFormatAggregator Html(SepA);
  78. if(m_ClipIDs.AggregateData(Html, theApp.m_HTML_Format, g_Opt.m_bMultiPasteReverse && g_Opt.m_bHistoryStartTop))
  79. {
  80. CacheGlobalData(theApp.m_HTML_Format, Html.GetHGlobal());
  81. bProcessedMult = TRUE;
  82. }
  83. }
  84. }
  85. if(count >= 1 && bProcessedMult == FALSE)
  86. {
  87. CClip clip;
  88. CClipFormats formats;
  89. clip.LoadFormats(m_ClipIDs[0], m_bOnlyPaste_CF_TEXT);
  90. return PutFormatOnClipboard(&clip.m_Formats, m_bPasteHTMLFormatAs_CF_TEXT);
  91. }
  92. return bProcessedMult;
  93. }
  94. long COleClipSource::PutFormatOnClipboard(CClipFormats *pFormats, bool bPasteHTMLFormatAs_CF_TEXT)
  95. {
  96. CClipFormat* pCF;
  97. bool bDelayedRenderCF_HDROP = false;
  98. int count = pFormats->GetSize();
  99. int i = 0;
  100. //see if the html format is in the list
  101. //if it is the list we will not paste CF_TEXT
  102. for(i = 0; i < count; i++)
  103. {
  104. pCF = &pFormats->ElementAt(i);
  105. if(bPasteHTMLFormatAs_CF_TEXT)
  106. {
  107. if(pCF->m_cfType == theApp.m_HTML_Format)
  108. break;
  109. }
  110. if(pCF->m_cfType == theApp.m_RemoteCF_HDROP)
  111. {
  112. bDelayedRenderCF_HDROP = true;
  113. }
  114. }
  115. //Didn't find html format
  116. if(i == count)
  117. bPasteHTMLFormatAs_CF_TEXT = false;
  118. for(i = 0; i < count; i++)
  119. {
  120. pCF = &pFormats->ElementAt(i);
  121. if(bDelayedRenderCF_HDROP)
  122. {
  123. if(pCF->m_cfType == CF_HDROP)
  124. {
  125. DelayRenderData(pCF->m_cfType);
  126. }
  127. continue;
  128. }
  129. if(bPasteHTMLFormatAs_CF_TEXT)
  130. {
  131. if(pCF->m_cfType == CF_TEXT)
  132. continue;
  133. if(pCF->m_cfType == theApp.m_HTML_Format)
  134. pCF->m_cfType = CF_TEXT;
  135. }
  136. CacheGlobalData( pCF->m_cfType, pCF->m_hgData );
  137. pCF->m_hgData = 0; // OLE owns it now
  138. }
  139. pFormats->RemoveAll();
  140. m_bLoadedFormats = true;
  141. return count;
  142. }
  143. BOOL COleClipSource::OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal)
  144. {
  145. static bool bInHere = false;
  146. if(bInHere)
  147. {
  148. return FALSE;
  149. }
  150. bInHere = true;
  151. HGLOBAL hData = NULL;
  152. CClipFormat *pFind = m_DelayRenderedFormats.FindFormat(lpFormatEtc->cfFormat);
  153. if(pFind)
  154. {
  155. if(pFind->m_hgData)
  156. {
  157. hData = NewGlobalH(pFind->m_hgData, GlobalSize(pFind->m_hgData));
  158. }
  159. }
  160. else
  161. {
  162. CClip clip;
  163. clip.LoadFormats(m_ClipIDs[0]);
  164. CClipFormat *pDittoDelayCF_HDROP = clip.m_Formats.FindFormat(theApp.m_RemoteCF_HDROP);
  165. CClipFormat *pCF_HDROP = clip.m_Formats.FindFormat(CF_HDROP);
  166. if(pDittoDelayCF_HDROP && pCF_HDROP)
  167. {
  168. CDittoCF_HDROP *pData = (CDittoCF_HDROP*)GlobalLock(pDittoDelayCF_HDROP->m_hgData);
  169. if(pData)
  170. {
  171. CString csComputerName;
  172. CString csIP;
  173. CTextConvert::ConvertFromUTF8(pData->m_cIP, csIP);
  174. CTextConvert::ConvertFromUTF8(pData->m_cComputerName, csComputerName);
  175. GlobalUnlock(pDittoDelayCF_HDROP->m_hgData);
  176. CClient cl;
  177. hData = cl.RequestCopiedFiles(*pCF_HDROP, csIP, csComputerName);
  178. }
  179. }
  180. else
  181. {
  182. hData = m_ClipIDs.Render(lpFormatEtc->cfFormat);
  183. }
  184. //Add to a cache of already rendered data
  185. //Windows seems to call this function multiple times
  186. //so only the first time do we need to go get the data
  187. HGLOBAL hCopy = NULL;
  188. if(hData)
  189. {
  190. hCopy = NewGlobalH(hData, GlobalSize(hData));
  191. }
  192. CClipFormat format(lpFormatEtc->cfFormat, hCopy);
  193. format.bDeleteData = false; //owned by m_DelayRenderedFormats
  194. m_DelayRenderedFormats.Add(format);
  195. }
  196. BOOL bRet = FALSE;
  197. if(hData)
  198. {
  199. // if phGlobal is null, we can just give the allocated mem
  200. // else, our data must fit within the GlobalSize(*phGlobal)
  201. if(*phGlobal == 0)
  202. *phGlobal = hData;
  203. else
  204. {
  205. UINT len = min(::GlobalSize(*phGlobal), ::GlobalSize(hData));
  206. if(len)
  207. CopyToGlobalHH(*phGlobal, hData, len);
  208. ::GlobalFree(hData);
  209. }
  210. bRet = TRUE;
  211. }
  212. bInHere = false;
  213. return bRet;
  214. }