OleClipSource.cpp 5.0 KB

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