OleClipSource.cpp 5.7 KB

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