xref: /aosp_15_r20/external/lzma/CPP/Windows/Clipboard.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Windows/Clipboard.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
6*f6dc9357SAndroid Build Coastguard Worker #include <winuserm.h>
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StringConvert.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "Clipboard.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "Defs.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "MemoryGlobal.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "Shell.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
17*f6dc9357SAndroid Build Coastguard Worker 
Open(HWND wndNewOwner)18*f6dc9357SAndroid Build Coastguard Worker bool CClipboard::Open(HWND wndNewOwner) throw()
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker   m_Open = BOOLToBool(::OpenClipboard(wndNewOwner));
21*f6dc9357SAndroid Build Coastguard Worker   return m_Open;
22*f6dc9357SAndroid Build Coastguard Worker }
23*f6dc9357SAndroid Build Coastguard Worker 
Close()24*f6dc9357SAndroid Build Coastguard Worker bool CClipboard::Close() throw()
25*f6dc9357SAndroid Build Coastguard Worker {
26*f6dc9357SAndroid Build Coastguard Worker   if (!m_Open)
27*f6dc9357SAndroid Build Coastguard Worker     return true;
28*f6dc9357SAndroid Build Coastguard Worker   m_Open = !BOOLToBool(CloseClipboard());
29*f6dc9357SAndroid Build Coastguard Worker   return !m_Open;
30*f6dc9357SAndroid Build Coastguard Worker }
31*f6dc9357SAndroid Build Coastguard Worker 
ClipboardIsFormatAvailableHDROP()32*f6dc9357SAndroid Build Coastguard Worker bool ClipboardIsFormatAvailableHDROP()
33*f6dc9357SAndroid Build Coastguard Worker {
34*f6dc9357SAndroid Build Coastguard Worker   return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP));
35*f6dc9357SAndroid Build Coastguard Worker }
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker /*
38*f6dc9357SAndroid Build Coastguard Worker bool ClipboardGetTextString(AString &s)
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker   s.Empty();
41*f6dc9357SAndroid Build Coastguard Worker   if (!IsClipboardFormatAvailable(CF_TEXT))
42*f6dc9357SAndroid Build Coastguard Worker     return false;
43*f6dc9357SAndroid Build Coastguard Worker   CClipboard clipboard;
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker   if (!clipboard.Open(NULL))
46*f6dc9357SAndroid Build Coastguard Worker     return false;
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker   HGLOBAL h = ::GetClipboardData(CF_TEXT);
49*f6dc9357SAndroid Build Coastguard Worker   if (h != NULL)
50*f6dc9357SAndroid Build Coastguard Worker   {
51*f6dc9357SAndroid Build Coastguard Worker     NMemory::CGlobalLock globalLock(h);
52*f6dc9357SAndroid Build Coastguard Worker     const char *p = (const char *)globalLock.GetPointer();
53*f6dc9357SAndroid Build Coastguard Worker     if (p != NULL)
54*f6dc9357SAndroid Build Coastguard Worker     {
55*f6dc9357SAndroid Build Coastguard Worker       s = p;
56*f6dc9357SAndroid Build Coastguard Worker       return true;
57*f6dc9357SAndroid Build Coastguard Worker     }
58*f6dc9357SAndroid Build Coastguard Worker   }
59*f6dc9357SAndroid Build Coastguard Worker   return false;
60*f6dc9357SAndroid Build Coastguard Worker }
61*f6dc9357SAndroid Build Coastguard Worker */
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker /*
64*f6dc9357SAndroid Build Coastguard Worker bool ClipboardGetFileNames(UStringVector &names)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker   names.Clear();
67*f6dc9357SAndroid Build Coastguard Worker   if (!IsClipboardFormatAvailable(CF_HDROP))
68*f6dc9357SAndroid Build Coastguard Worker     return false;
69*f6dc9357SAndroid Build Coastguard Worker   CClipboard clipboard;
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker   if (!clipboard.Open(NULL))
72*f6dc9357SAndroid Build Coastguard Worker     return false;
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker   HGLOBAL h = ::GetClipboardData(CF_HDROP);
75*f6dc9357SAndroid Build Coastguard Worker   if (h != NULL)
76*f6dc9357SAndroid Build Coastguard Worker   {
77*f6dc9357SAndroid Build Coastguard Worker     NMemory::CGlobalLock globalLock(h);
78*f6dc9357SAndroid Build Coastguard Worker     void *p = (void *)globalLock.GetPointer();
79*f6dc9357SAndroid Build Coastguard Worker     if (p != NULL)
80*f6dc9357SAndroid Build Coastguard Worker     {
81*f6dc9357SAndroid Build Coastguard Worker       NShell::CDrop drop(false);
82*f6dc9357SAndroid Build Coastguard Worker       drop.Attach((HDROP)p);
83*f6dc9357SAndroid Build Coastguard Worker       drop.QueryFileNames(names);
84*f6dc9357SAndroid Build Coastguard Worker       return true;
85*f6dc9357SAndroid Build Coastguard Worker     }
86*f6dc9357SAndroid Build Coastguard Worker   }
87*f6dc9357SAndroid Build Coastguard Worker   return false;
88*f6dc9357SAndroid Build Coastguard Worker }
89*f6dc9357SAndroid Build Coastguard Worker */
90*f6dc9357SAndroid Build Coastguard Worker 
ClipboardSetData(UINT uFormat,const void * data,size_t size)91*f6dc9357SAndroid Build Coastguard Worker static bool ClipboardSetData(UINT uFormat, const void *data, size_t size) throw()
92*f6dc9357SAndroid Build Coastguard Worker {
93*f6dc9357SAndroid Build Coastguard Worker   NMemory::CGlobal global;
94*f6dc9357SAndroid Build Coastguard Worker   if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size))
95*f6dc9357SAndroid Build Coastguard Worker     return false;
96*f6dc9357SAndroid Build Coastguard Worker   {
97*f6dc9357SAndroid Build Coastguard Worker     NMemory::CGlobalLock globalLock(global);
98*f6dc9357SAndroid Build Coastguard Worker     LPVOID p = globalLock.GetPointer();
99*f6dc9357SAndroid Build Coastguard Worker     if (!p)
100*f6dc9357SAndroid Build Coastguard Worker       return false;
101*f6dc9357SAndroid Build Coastguard Worker     memcpy(p, data, size);
102*f6dc9357SAndroid Build Coastguard Worker   }
103*f6dc9357SAndroid Build Coastguard Worker   if (::SetClipboardData(uFormat, global) == NULL)
104*f6dc9357SAndroid Build Coastguard Worker     return false;
105*f6dc9357SAndroid Build Coastguard Worker   global.Detach();
106*f6dc9357SAndroid Build Coastguard Worker   return true;
107*f6dc9357SAndroid Build Coastguard Worker }
108*f6dc9357SAndroid Build Coastguard Worker 
ClipboardSetText(HWND owner,const UString & s)109*f6dc9357SAndroid Build Coastguard Worker bool ClipboardSetText(HWND owner, const UString &s)
110*f6dc9357SAndroid Build Coastguard Worker {
111*f6dc9357SAndroid Build Coastguard Worker   CClipboard clipboard;
112*f6dc9357SAndroid Build Coastguard Worker   if (!clipboard.Open(owner))
113*f6dc9357SAndroid Build Coastguard Worker     return false;
114*f6dc9357SAndroid Build Coastguard Worker   if (!::EmptyClipboard())
115*f6dc9357SAndroid Build Coastguard Worker     return false;
116*f6dc9357SAndroid Build Coastguard Worker 
117*f6dc9357SAndroid Build Coastguard Worker   bool res;
118*f6dc9357SAndroid Build Coastguard Worker   res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Len() + 1) * sizeof(wchar_t));
119*f6dc9357SAndroid Build Coastguard Worker   #ifndef _UNICODE
120*f6dc9357SAndroid Build Coastguard Worker   AString a (UnicodeStringToMultiByte(s, CP_ACP));
121*f6dc9357SAndroid Build Coastguard Worker   if (ClipboardSetData(CF_TEXT, (const char *)a, (a.Len() + 1) * sizeof(char)))
122*f6dc9357SAndroid Build Coastguard Worker     res = true;
123*f6dc9357SAndroid Build Coastguard Worker   a = UnicodeStringToMultiByte(s, CP_OEMCP);
124*f6dc9357SAndroid Build Coastguard Worker   if (ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Len() + 1) * sizeof(char)))
125*f6dc9357SAndroid Build Coastguard Worker     res = true;
126*f6dc9357SAndroid Build Coastguard Worker   #endif
127*f6dc9357SAndroid Build Coastguard Worker   return res;
128*f6dc9357SAndroid Build Coastguard Worker }
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker }
131