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