xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Far/FarUtils.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // FarUtils.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker // #include "../../../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Console.h"
10*f6dc9357SAndroid Build Coastguard Worker #endif
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Defs.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #include "FarUtils.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker namespace NFar {
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker CStartupInfo g_StartupInfo;
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker const char kRegistryKeyDelimiter = '\\';
23*f6dc9357SAndroid Build Coastguard Worker 
Init(const PluginStartupInfo & pluginStartupInfo,const char * pluginNameForRegistry)24*f6dc9357SAndroid Build Coastguard Worker void CStartupInfo::Init(const PluginStartupInfo &pluginStartupInfo,
25*f6dc9357SAndroid Build Coastguard Worker     const char *pluginNameForRegistry)
26*f6dc9357SAndroid Build Coastguard Worker {
27*f6dc9357SAndroid Build Coastguard Worker   m_Data = pluginStartupInfo;
28*f6dc9357SAndroid Build Coastguard Worker   m_RegistryPath = pluginStartupInfo.RootKey;
29*f6dc9357SAndroid Build Coastguard Worker   m_RegistryPath += kRegistryKeyDelimiter;
30*f6dc9357SAndroid Build Coastguard Worker   m_RegistryPath += pluginNameForRegistry;
31*f6dc9357SAndroid Build Coastguard Worker }
32*f6dc9357SAndroid Build Coastguard Worker 
GetMsgString(int messageId)33*f6dc9357SAndroid Build Coastguard Worker const char *CStartupInfo::GetMsgString(int messageId)
34*f6dc9357SAndroid Build Coastguard Worker {
35*f6dc9357SAndroid Build Coastguard Worker   return (const char*)m_Data.GetMsg(m_Data.ModuleNumber, messageId);
36*f6dc9357SAndroid Build Coastguard Worker }
37*f6dc9357SAndroid Build Coastguard Worker 
ShowMessage(UInt32 flags,const char * helpTopic,const char ** items,unsigned numItems,int numButtons)38*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::ShowMessage(UInt32 flags,
39*f6dc9357SAndroid Build Coastguard Worker     const char *helpTopic, const char **items, unsigned numItems, int numButtons)
40*f6dc9357SAndroid Build Coastguard Worker {
41*f6dc9357SAndroid Build Coastguard Worker   return m_Data.Message(m_Data.ModuleNumber, flags, helpTopic,
42*f6dc9357SAndroid Build Coastguard Worker       items, (int)numItems, numButtons);
43*f6dc9357SAndroid Build Coastguard Worker }
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker namespace NMessageID
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   enum
48*f6dc9357SAndroid Build Coastguard Worker   {
49*f6dc9357SAndroid Build Coastguard Worker     kOk,
50*f6dc9357SAndroid Build Coastguard Worker     kCancel,
51*f6dc9357SAndroid Build Coastguard Worker     kWarning,
52*f6dc9357SAndroid Build Coastguard Worker     kError
53*f6dc9357SAndroid Build Coastguard Worker   };
54*f6dc9357SAndroid Build Coastguard Worker }
55*f6dc9357SAndroid Build Coastguard Worker 
ShowWarningWithOk(const char ** items,unsigned numItems)56*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::ShowWarningWithOk(const char **items, unsigned numItems)
57*f6dc9357SAndroid Build Coastguard Worker {
58*f6dc9357SAndroid Build Coastguard Worker   return ShowMessage(FMSG_WARNING | FMSG_MB_OK, NULL, items, numItems, 0);
59*f6dc9357SAndroid Build Coastguard Worker }
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker extern const char *g_PluginName_for_Error;
62*f6dc9357SAndroid Build Coastguard Worker 
SetErrorTitle(AString & s)63*f6dc9357SAndroid Build Coastguard Worker void CStartupInfo::SetErrorTitle(AString &s)
64*f6dc9357SAndroid Build Coastguard Worker {
65*f6dc9357SAndroid Build Coastguard Worker   if (g_PluginName_for_Error)
66*f6dc9357SAndroid Build Coastguard Worker   {
67*f6dc9357SAndroid Build Coastguard Worker     s += g_PluginName_for_Error;
68*f6dc9357SAndroid Build Coastguard Worker     s += ": ";
69*f6dc9357SAndroid Build Coastguard Worker   }
70*f6dc9357SAndroid Build Coastguard Worker   s += GetMsgString(NMessageID::kError);
71*f6dc9357SAndroid Build Coastguard Worker }
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker /*
74*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::ShowErrorMessage(const char *message)
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker   AString s;
77*f6dc9357SAndroid Build Coastguard Worker   SetErrorTitle(s);
78*f6dc9357SAndroid Build Coastguard Worker   const char *items[]= { s, message };
79*f6dc9357SAndroid Build Coastguard Worker   return ShowWarningWithOk(items, Z7_ARRAY_SIZE(items));
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker */
82*f6dc9357SAndroid Build Coastguard Worker 
ShowErrorMessage2(const char * m1,const char * m2)83*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::ShowErrorMessage2(const char *m1, const char *m2)
84*f6dc9357SAndroid Build Coastguard Worker {
85*f6dc9357SAndroid Build Coastguard Worker   AString s;
86*f6dc9357SAndroid Build Coastguard Worker   SetErrorTitle(s);
87*f6dc9357SAndroid Build Coastguard Worker   const char *items[]= { s, m1, m2 };
88*f6dc9357SAndroid Build Coastguard Worker   return ShowWarningWithOk(items, Z7_ARRAY_SIZE(items));
89*f6dc9357SAndroid Build Coastguard Worker }
90*f6dc9357SAndroid Build Coastguard Worker 
SplitString(const AString & src,AStringVector & destStrings)91*f6dc9357SAndroid Build Coastguard Worker static void SplitString(const AString &src, AStringVector &destStrings)
92*f6dc9357SAndroid Build Coastguard Worker {
93*f6dc9357SAndroid Build Coastguard Worker   destStrings.Clear();
94*f6dc9357SAndroid Build Coastguard Worker   AString s;
95*f6dc9357SAndroid Build Coastguard Worker   unsigned len = src.Len();
96*f6dc9357SAndroid Build Coastguard Worker   if (len == 0)
97*f6dc9357SAndroid Build Coastguard Worker     return;
98*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < len; i++)
99*f6dc9357SAndroid Build Coastguard Worker   {
100*f6dc9357SAndroid Build Coastguard Worker     char c = src[i];
101*f6dc9357SAndroid Build Coastguard Worker     if (c == '\n')
102*f6dc9357SAndroid Build Coastguard Worker     {
103*f6dc9357SAndroid Build Coastguard Worker       if (!s.IsEmpty())
104*f6dc9357SAndroid Build Coastguard Worker       {
105*f6dc9357SAndroid Build Coastguard Worker         destStrings.Add(s);
106*f6dc9357SAndroid Build Coastguard Worker         s.Empty();
107*f6dc9357SAndroid Build Coastguard Worker       }
108*f6dc9357SAndroid Build Coastguard Worker     }
109*f6dc9357SAndroid Build Coastguard Worker     else
110*f6dc9357SAndroid Build Coastguard Worker       s += c;
111*f6dc9357SAndroid Build Coastguard Worker   }
112*f6dc9357SAndroid Build Coastguard Worker   if (!s.IsEmpty())
113*f6dc9357SAndroid Build Coastguard Worker     destStrings.Add(s);
114*f6dc9357SAndroid Build Coastguard Worker }
115*f6dc9357SAndroid Build Coastguard Worker 
ShowErrorMessage(const char * message)116*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::ShowErrorMessage(const char *message)
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker   AStringVector strings;
119*f6dc9357SAndroid Build Coastguard Worker   SplitString((AString)message, strings);
120*f6dc9357SAndroid Build Coastguard Worker   const unsigned kNumStringsMax = 20;
121*f6dc9357SAndroid Build Coastguard Worker   const char *items[kNumStringsMax + 1];
122*f6dc9357SAndroid Build Coastguard Worker   unsigned pos = 0;
123*f6dc9357SAndroid Build Coastguard Worker   items[pos++] = GetMsgString(NMessageID::kError);
124*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < strings.Size() && pos < kNumStringsMax; i++)
125*f6dc9357SAndroid Build Coastguard Worker     items[pos++] = strings[i];
126*f6dc9357SAndroid Build Coastguard Worker   items[pos++] = GetMsgString(NMessageID::kOk);
127*f6dc9357SAndroid Build Coastguard Worker 
128*f6dc9357SAndroid Build Coastguard Worker   return ShowMessage(FMSG_WARNING, NULL, items, pos, 1);
129*f6dc9357SAndroid Build Coastguard Worker }
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker /*
132*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::ShowMessageLines(const char *message)
133*f6dc9357SAndroid Build Coastguard Worker {
134*f6dc9357SAndroid Build Coastguard Worker   AString s = GetMsgString(NMessageID::kError);
135*f6dc9357SAndroid Build Coastguard Worker   s.Add_LF();
136*f6dc9357SAndroid Build Coastguard Worker   s += message;
137*f6dc9357SAndroid Build Coastguard Worker   return ShowMessage(FMSG_WARNING | FMSG_MB_OK | FMSG_ALLINONE, NULL,
138*f6dc9357SAndroid Build Coastguard Worker       (const char **)(const char *)s, 1, 0);
139*f6dc9357SAndroid Build Coastguard Worker }
140*f6dc9357SAndroid Build Coastguard Worker */
141*f6dc9357SAndroid Build Coastguard Worker 
ShowMessage(int messageId)142*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::ShowMessage(int messageId)
143*f6dc9357SAndroid Build Coastguard Worker {
144*f6dc9357SAndroid Build Coastguard Worker   return ShowErrorMessage(GetMsgString(messageId));
145*f6dc9357SAndroid Build Coastguard Worker }
146*f6dc9357SAndroid Build Coastguard Worker 
ShowDialog(int X1,int Y1,int X2,int Y2,const char * helpTopic,struct FarDialogItem * items,unsigned numItems)147*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::ShowDialog(int X1, int Y1, int X2, int Y2,
148*f6dc9357SAndroid Build Coastguard Worker     const char *helpTopic, struct FarDialogItem *items, unsigned numItems)
149*f6dc9357SAndroid Build Coastguard Worker {
150*f6dc9357SAndroid Build Coastguard Worker   return m_Data.Dialog(m_Data.ModuleNumber, X1, Y1, X2, Y2, const_cast<char *>(helpTopic),
151*f6dc9357SAndroid Build Coastguard Worker       items, (int)numItems);
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker 
ShowDialog(int sizeX,int sizeY,const char * helpTopic,struct FarDialogItem * items,unsigned numItems)154*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::ShowDialog(int sizeX, int sizeY,
155*f6dc9357SAndroid Build Coastguard Worker     const char *helpTopic, struct FarDialogItem *items, unsigned numItems)
156*f6dc9357SAndroid Build Coastguard Worker {
157*f6dc9357SAndroid Build Coastguard Worker   return ShowDialog(-1, -1, sizeX, sizeY, helpTopic, items, numItems);
158*f6dc9357SAndroid Build Coastguard Worker }
159*f6dc9357SAndroid Build Coastguard Worker 
GetBOOLValue(bool v)160*f6dc9357SAndroid Build Coastguard Worker inline static BOOL GetBOOLValue(bool v) { return (v? TRUE: FALSE); }
161*f6dc9357SAndroid Build Coastguard Worker 
InitDialogItems(const CInitDialogItem * srcItems,FarDialogItem * destItems,unsigned numItems)162*f6dc9357SAndroid Build Coastguard Worker void CStartupInfo::InitDialogItems(const CInitDialogItem  *srcItems,
163*f6dc9357SAndroid Build Coastguard Worker     FarDialogItem *destItems, unsigned numItems)
164*f6dc9357SAndroid Build Coastguard Worker {
165*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < numItems; i++)
166*f6dc9357SAndroid Build Coastguard Worker   {
167*f6dc9357SAndroid Build Coastguard Worker     const CInitDialogItem &srcItem = srcItems[i];
168*f6dc9357SAndroid Build Coastguard Worker     FarDialogItem &destItem = destItems[i];
169*f6dc9357SAndroid Build Coastguard Worker 
170*f6dc9357SAndroid Build Coastguard Worker     destItem.Type = srcItem.Type;
171*f6dc9357SAndroid Build Coastguard Worker     destItem.X1 = srcItem.X1;
172*f6dc9357SAndroid Build Coastguard Worker     destItem.Y1 = srcItem.Y1;
173*f6dc9357SAndroid Build Coastguard Worker     destItem.X2 = srcItem.X2;
174*f6dc9357SAndroid Build Coastguard Worker     destItem.Y2 = srcItem.Y2;
175*f6dc9357SAndroid Build Coastguard Worker     destItem.Focus = GetBOOLValue(srcItem.Focus);
176*f6dc9357SAndroid Build Coastguard Worker     if (srcItem.HistoryName != NULL)
177*f6dc9357SAndroid Build Coastguard Worker       destItem.History = srcItem.HistoryName;
178*f6dc9357SAndroid Build Coastguard Worker     else
179*f6dc9357SAndroid Build Coastguard Worker       destItem.Selected = GetBOOLValue(srcItem.Selected);
180*f6dc9357SAndroid Build Coastguard Worker     destItem.Flags = srcItem.Flags;
181*f6dc9357SAndroid Build Coastguard Worker     destItem.DefaultButton = GetBOOLValue(srcItem.DefaultButton);
182*f6dc9357SAndroid Build Coastguard Worker 
183*f6dc9357SAndroid Build Coastguard Worker     if (srcItem.DataMessageId < 0)
184*f6dc9357SAndroid Build Coastguard Worker       MyStringCopy(destItem.Data, srcItem.DataString);
185*f6dc9357SAndroid Build Coastguard Worker     else
186*f6dc9357SAndroid Build Coastguard Worker       MyStringCopy(destItem.Data, GetMsgString(srcItem.DataMessageId));
187*f6dc9357SAndroid Build Coastguard Worker 
188*f6dc9357SAndroid Build Coastguard Worker     /*
189*f6dc9357SAndroid Build Coastguard Worker     if ((unsigned)Init[i].Data < 0xFFF)
190*f6dc9357SAndroid Build Coastguard Worker       MyStringCopy(destItem.Data, GetMsg((unsigned)srcItem.Data));
191*f6dc9357SAndroid Build Coastguard Worker     else
192*f6dc9357SAndroid Build Coastguard Worker       MyStringCopy(destItem.Data,srcItem.Data);
193*f6dc9357SAndroid Build Coastguard Worker     */
194*f6dc9357SAndroid Build Coastguard Worker   }
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker // --------------------------------------------
198*f6dc9357SAndroid Build Coastguard Worker 
SaveScreen(int X1,int Y1,int X2,int Y2)199*f6dc9357SAndroid Build Coastguard Worker HANDLE CStartupInfo::SaveScreen(int X1, int Y1, int X2, int Y2)
200*f6dc9357SAndroid Build Coastguard Worker {
201*f6dc9357SAndroid Build Coastguard Worker   return m_Data.SaveScreen(X1, Y1, X2, Y2);
202*f6dc9357SAndroid Build Coastguard Worker }
203*f6dc9357SAndroid Build Coastguard Worker 
SaveScreen()204*f6dc9357SAndroid Build Coastguard Worker HANDLE CStartupInfo::SaveScreen()
205*f6dc9357SAndroid Build Coastguard Worker {
206*f6dc9357SAndroid Build Coastguard Worker   return SaveScreen(0, 0, -1, -1);
207*f6dc9357SAndroid Build Coastguard Worker }
208*f6dc9357SAndroid Build Coastguard Worker 
RestoreScreen(HANDLE handle)209*f6dc9357SAndroid Build Coastguard Worker void CStartupInfo::RestoreScreen(HANDLE handle)
210*f6dc9357SAndroid Build Coastguard Worker {
211*f6dc9357SAndroid Build Coastguard Worker   m_Data.RestoreScreen(handle);
212*f6dc9357SAndroid Build Coastguard Worker }
213*f6dc9357SAndroid Build Coastguard Worker 
GetFullKeyName(const char * keyName) const214*f6dc9357SAndroid Build Coastguard Worker CSysString CStartupInfo::GetFullKeyName(const char *keyName) const
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker   AString s (m_RegistryPath);
217*f6dc9357SAndroid Build Coastguard Worker   if (keyName && *keyName)
218*f6dc9357SAndroid Build Coastguard Worker   {
219*f6dc9357SAndroid Build Coastguard Worker     s += kRegistryKeyDelimiter;
220*f6dc9357SAndroid Build Coastguard Worker     s += keyName;
221*f6dc9357SAndroid Build Coastguard Worker   }
222*f6dc9357SAndroid Build Coastguard Worker   return (CSysString)s;
223*f6dc9357SAndroid Build Coastguard Worker }
224*f6dc9357SAndroid Build Coastguard Worker 
225*f6dc9357SAndroid Build Coastguard Worker 
CreateRegKey(HKEY parentKey,const char * keyName,NRegistry::CKey & destKey) const226*f6dc9357SAndroid Build Coastguard Worker LONG CStartupInfo::CreateRegKey(HKEY parentKey,
227*f6dc9357SAndroid Build Coastguard Worker     const char *keyName, NRegistry::CKey &destKey) const
228*f6dc9357SAndroid Build Coastguard Worker {
229*f6dc9357SAndroid Build Coastguard Worker   return destKey.Create(parentKey, GetFullKeyName(keyName));
230*f6dc9357SAndroid Build Coastguard Worker }
231*f6dc9357SAndroid Build Coastguard Worker 
OpenRegKey(HKEY parentKey,const char * keyName,NRegistry::CKey & destKey) const232*f6dc9357SAndroid Build Coastguard Worker LONG CStartupInfo::OpenRegKey(HKEY parentKey,
233*f6dc9357SAndroid Build Coastguard Worker     const char *keyName, NRegistry::CKey &destKey) const
234*f6dc9357SAndroid Build Coastguard Worker {
235*f6dc9357SAndroid Build Coastguard Worker   return destKey.Open(parentKey, GetFullKeyName(keyName));
236*f6dc9357SAndroid Build Coastguard Worker }
237*f6dc9357SAndroid Build Coastguard Worker 
SetRegKeyValue(HKEY parentKey,const char * keyName,LPCTSTR valueName,LPCTSTR value) const238*f6dc9357SAndroid Build Coastguard Worker void CStartupInfo::SetRegKeyValue(HKEY parentKey, const char *keyName,
239*f6dc9357SAndroid Build Coastguard Worker     LPCTSTR valueName, LPCTSTR value) const
240*f6dc9357SAndroid Build Coastguard Worker {
241*f6dc9357SAndroid Build Coastguard Worker   NRegistry::CKey regKey;
242*f6dc9357SAndroid Build Coastguard Worker   CreateRegKey(parentKey, keyName, regKey);
243*f6dc9357SAndroid Build Coastguard Worker   regKey.SetValue(valueName, value);
244*f6dc9357SAndroid Build Coastguard Worker }
245*f6dc9357SAndroid Build Coastguard Worker 
SetRegKeyValue(HKEY parentKey,const char * keyName,LPCTSTR valueName,UInt32 value) const246*f6dc9357SAndroid Build Coastguard Worker void CStartupInfo::SetRegKeyValue(HKEY parentKey, const char *keyName,
247*f6dc9357SAndroid Build Coastguard Worker     LPCTSTR valueName, UInt32 value) const
248*f6dc9357SAndroid Build Coastguard Worker {
249*f6dc9357SAndroid Build Coastguard Worker   NRegistry::CKey regKey;
250*f6dc9357SAndroid Build Coastguard Worker   CreateRegKey(parentKey, keyName, regKey);
251*f6dc9357SAndroid Build Coastguard Worker   regKey.SetValue(valueName, value);
252*f6dc9357SAndroid Build Coastguard Worker }
253*f6dc9357SAndroid Build Coastguard Worker 
SetRegKeyValue(HKEY parentKey,const char * keyName,LPCTSTR valueName,bool value) const254*f6dc9357SAndroid Build Coastguard Worker void CStartupInfo::SetRegKeyValue(HKEY parentKey, const char *keyName,
255*f6dc9357SAndroid Build Coastguard Worker     LPCTSTR valueName, bool value) const
256*f6dc9357SAndroid Build Coastguard Worker {
257*f6dc9357SAndroid Build Coastguard Worker   NRegistry::CKey regKey;
258*f6dc9357SAndroid Build Coastguard Worker   CreateRegKey(parentKey, keyName, regKey);
259*f6dc9357SAndroid Build Coastguard Worker   regKey.SetValue(valueName, value);
260*f6dc9357SAndroid Build Coastguard Worker }
261*f6dc9357SAndroid Build Coastguard Worker 
QueryRegKeyValue(HKEY parentKey,const char * keyName,LPCTSTR valueName,const CSysString & valueDefault) const262*f6dc9357SAndroid Build Coastguard Worker CSysString CStartupInfo::QueryRegKeyValue(HKEY parentKey, const char *keyName,
263*f6dc9357SAndroid Build Coastguard Worker     LPCTSTR valueName, const CSysString &valueDefault) const
264*f6dc9357SAndroid Build Coastguard Worker {
265*f6dc9357SAndroid Build Coastguard Worker   NRegistry::CKey regKey;
266*f6dc9357SAndroid Build Coastguard Worker   if (OpenRegKey(parentKey, keyName, regKey) != ERROR_SUCCESS)
267*f6dc9357SAndroid Build Coastguard Worker     return valueDefault;
268*f6dc9357SAndroid Build Coastguard Worker 
269*f6dc9357SAndroid Build Coastguard Worker   CSysString value;
270*f6dc9357SAndroid Build Coastguard Worker   if (regKey.QueryValue(valueName, value) != ERROR_SUCCESS)
271*f6dc9357SAndroid Build Coastguard Worker     return valueDefault;
272*f6dc9357SAndroid Build Coastguard Worker 
273*f6dc9357SAndroid Build Coastguard Worker   return value;
274*f6dc9357SAndroid Build Coastguard Worker }
275*f6dc9357SAndroid Build Coastguard Worker 
QueryRegKeyValue(HKEY parentKey,const char * keyName,LPCTSTR valueName,UInt32 valueDefault) const276*f6dc9357SAndroid Build Coastguard Worker UInt32 CStartupInfo::QueryRegKeyValue(HKEY parentKey, const char *keyName,
277*f6dc9357SAndroid Build Coastguard Worker     LPCTSTR valueName, UInt32 valueDefault) const
278*f6dc9357SAndroid Build Coastguard Worker {
279*f6dc9357SAndroid Build Coastguard Worker   NRegistry::CKey regKey;
280*f6dc9357SAndroid Build Coastguard Worker   if (OpenRegKey(parentKey, keyName, regKey) != ERROR_SUCCESS)
281*f6dc9357SAndroid Build Coastguard Worker     return valueDefault;
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker   UInt32 value;
284*f6dc9357SAndroid Build Coastguard Worker   if (regKey.GetValue_UInt32_IfOk(valueName, value) != ERROR_SUCCESS)
285*f6dc9357SAndroid Build Coastguard Worker     return valueDefault;
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker   return value;
288*f6dc9357SAndroid Build Coastguard Worker }
289*f6dc9357SAndroid Build Coastguard Worker 
QueryRegKeyValue(HKEY parentKey,const char * keyName,LPCTSTR valueName,bool valueDefault) const290*f6dc9357SAndroid Build Coastguard Worker bool CStartupInfo::QueryRegKeyValue(HKEY parentKey, const char *keyName,
291*f6dc9357SAndroid Build Coastguard Worker     LPCTSTR valueName, bool valueDefault) const
292*f6dc9357SAndroid Build Coastguard Worker {
293*f6dc9357SAndroid Build Coastguard Worker   NRegistry::CKey regKey;
294*f6dc9357SAndroid Build Coastguard Worker   if (OpenRegKey(parentKey, keyName, regKey) != ERROR_SUCCESS)
295*f6dc9357SAndroid Build Coastguard Worker     return valueDefault;
296*f6dc9357SAndroid Build Coastguard Worker 
297*f6dc9357SAndroid Build Coastguard Worker   bool value;
298*f6dc9357SAndroid Build Coastguard Worker   if (regKey.GetValue_bool_IfOk(valueName, value) != ERROR_SUCCESS)
299*f6dc9357SAndroid Build Coastguard Worker     return valueDefault;
300*f6dc9357SAndroid Build Coastguard Worker 
301*f6dc9357SAndroid Build Coastguard Worker   return value;
302*f6dc9357SAndroid Build Coastguard Worker }
303*f6dc9357SAndroid Build Coastguard Worker 
Control(HANDLE pluginHandle,int command,void * param)304*f6dc9357SAndroid Build Coastguard Worker bool CStartupInfo::Control(HANDLE pluginHandle, int command, void *param)
305*f6dc9357SAndroid Build Coastguard Worker {
306*f6dc9357SAndroid Build Coastguard Worker   return BOOLToBool(m_Data.Control(pluginHandle, command, param));
307*f6dc9357SAndroid Build Coastguard Worker }
308*f6dc9357SAndroid Build Coastguard Worker 
ControlRequestActivePanel(int command,void * param)309*f6dc9357SAndroid Build Coastguard Worker bool CStartupInfo::ControlRequestActivePanel(int command, void *param)
310*f6dc9357SAndroid Build Coastguard Worker {
311*f6dc9357SAndroid Build Coastguard Worker   return Control(INVALID_HANDLE_VALUE, command, param);
312*f6dc9357SAndroid Build Coastguard Worker }
313*f6dc9357SAndroid Build Coastguard Worker 
ControlGetActivePanelInfo(PanelInfo & panelInfo)314*f6dc9357SAndroid Build Coastguard Worker bool CStartupInfo::ControlGetActivePanelInfo(PanelInfo &panelInfo)
315*f6dc9357SAndroid Build Coastguard Worker {
316*f6dc9357SAndroid Build Coastguard Worker   return ControlRequestActivePanel(FCTL_GETPANELINFO, &panelInfo);
317*f6dc9357SAndroid Build Coastguard Worker }
318*f6dc9357SAndroid Build Coastguard Worker 
ControlSetSelection(const PanelInfo & panelInfo)319*f6dc9357SAndroid Build Coastguard Worker bool CStartupInfo::ControlSetSelection(const PanelInfo &panelInfo)
320*f6dc9357SAndroid Build Coastguard Worker {
321*f6dc9357SAndroid Build Coastguard Worker   return ControlRequestActivePanel(FCTL_SETSELECTION, (void *)&panelInfo);
322*f6dc9357SAndroid Build Coastguard Worker }
323*f6dc9357SAndroid Build Coastguard Worker 
ControlGetActivePanelCurrentItemInfo(PluginPanelItem & pluginPanelItem)324*f6dc9357SAndroid Build Coastguard Worker bool CStartupInfo::ControlGetActivePanelCurrentItemInfo(
325*f6dc9357SAndroid Build Coastguard Worker     PluginPanelItem &pluginPanelItem)
326*f6dc9357SAndroid Build Coastguard Worker {
327*f6dc9357SAndroid Build Coastguard Worker   PanelInfo panelInfo;
328*f6dc9357SAndroid Build Coastguard Worker   if (!ControlGetActivePanelInfo(panelInfo))
329*f6dc9357SAndroid Build Coastguard Worker     return false;
330*f6dc9357SAndroid Build Coastguard Worker   if (panelInfo.ItemsNumber <= 0)
331*f6dc9357SAndroid Build Coastguard Worker     throw "There are no items";
332*f6dc9357SAndroid Build Coastguard Worker   pluginPanelItem = panelInfo.PanelItems[panelInfo.CurrentItem];
333*f6dc9357SAndroid Build Coastguard Worker   return true;
334*f6dc9357SAndroid Build Coastguard Worker }
335*f6dc9357SAndroid Build Coastguard Worker 
ControlGetActivePanelSelectedOrCurrentItems(CObjectVector<PluginPanelItem> & pluginPanelItems)336*f6dc9357SAndroid Build Coastguard Worker bool CStartupInfo::ControlGetActivePanelSelectedOrCurrentItems(
337*f6dc9357SAndroid Build Coastguard Worker     CObjectVector<PluginPanelItem> &pluginPanelItems)
338*f6dc9357SAndroid Build Coastguard Worker {
339*f6dc9357SAndroid Build Coastguard Worker   pluginPanelItems.Clear();
340*f6dc9357SAndroid Build Coastguard Worker   PanelInfo panelInfo;
341*f6dc9357SAndroid Build Coastguard Worker   if (!ControlGetActivePanelInfo(panelInfo))
342*f6dc9357SAndroid Build Coastguard Worker     return false;
343*f6dc9357SAndroid Build Coastguard Worker   if (panelInfo.ItemsNumber <= 0)
344*f6dc9357SAndroid Build Coastguard Worker     throw "There are no items";
345*f6dc9357SAndroid Build Coastguard Worker   if (panelInfo.SelectedItemsNumber == 0)
346*f6dc9357SAndroid Build Coastguard Worker     pluginPanelItems.Add(panelInfo.PanelItems[panelInfo.CurrentItem]);
347*f6dc9357SAndroid Build Coastguard Worker   else
348*f6dc9357SAndroid Build Coastguard Worker     for (int i = 0; i < panelInfo.SelectedItemsNumber; i++)
349*f6dc9357SAndroid Build Coastguard Worker       pluginPanelItems.Add(panelInfo.SelectedItems[i]);
350*f6dc9357SAndroid Build Coastguard Worker   return true;
351*f6dc9357SAndroid Build Coastguard Worker }
352*f6dc9357SAndroid Build Coastguard Worker 
ControlClearPanelSelection()353*f6dc9357SAndroid Build Coastguard Worker bool CStartupInfo::ControlClearPanelSelection()
354*f6dc9357SAndroid Build Coastguard Worker {
355*f6dc9357SAndroid Build Coastguard Worker   PanelInfo panelInfo;
356*f6dc9357SAndroid Build Coastguard Worker   if (!ControlGetActivePanelInfo(panelInfo))
357*f6dc9357SAndroid Build Coastguard Worker     return false;
358*f6dc9357SAndroid Build Coastguard Worker   for (int i = 0; i < panelInfo.ItemsNumber; i++)
359*f6dc9357SAndroid Build Coastguard Worker     panelInfo.PanelItems[i].Flags &= ~(DWORD)PPIF_SELECTED;
360*f6dc9357SAndroid Build Coastguard Worker   return ControlSetSelection(panelInfo);
361*f6dc9357SAndroid Build Coastguard Worker }
362*f6dc9357SAndroid Build Coastguard Worker 
363*f6dc9357SAndroid Build Coastguard Worker ////////////////////////////////////////////////
364*f6dc9357SAndroid Build Coastguard Worker // menu function
365*f6dc9357SAndroid Build Coastguard Worker 
Menu(int x,int y,int maxHeight,unsigned flags,const char * title,const char * aBottom,const char * helpTopic,int * breakKeys,int * breakCode,struct FarMenuItem * items,unsigned numItems)366*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::Menu(
367*f6dc9357SAndroid Build Coastguard Worker     int x,
368*f6dc9357SAndroid Build Coastguard Worker     int y,
369*f6dc9357SAndroid Build Coastguard Worker     int maxHeight,
370*f6dc9357SAndroid Build Coastguard Worker     unsigned flags,
371*f6dc9357SAndroid Build Coastguard Worker     const char *title,
372*f6dc9357SAndroid Build Coastguard Worker     const char *aBottom,
373*f6dc9357SAndroid Build Coastguard Worker     const char *helpTopic,
374*f6dc9357SAndroid Build Coastguard Worker     int *breakKeys,
375*f6dc9357SAndroid Build Coastguard Worker     int *breakCode,
376*f6dc9357SAndroid Build Coastguard Worker     struct FarMenuItem *items,
377*f6dc9357SAndroid Build Coastguard Worker     unsigned numItems)
378*f6dc9357SAndroid Build Coastguard Worker {
379*f6dc9357SAndroid Build Coastguard Worker   return m_Data.Menu(m_Data.ModuleNumber, x, y, maxHeight, flags,
380*f6dc9357SAndroid Build Coastguard Worker       const_cast<char *>(title),
381*f6dc9357SAndroid Build Coastguard Worker       const_cast<char *>(aBottom),
382*f6dc9357SAndroid Build Coastguard Worker       const_cast<char *>(helpTopic),
383*f6dc9357SAndroid Build Coastguard Worker       breakKeys, breakCode, items, (int)numItems);
384*f6dc9357SAndroid Build Coastguard Worker }
385*f6dc9357SAndroid Build Coastguard Worker 
Menu(unsigned flags,const char * title,const char * helpTopic,struct FarMenuItem * items,unsigned numItems)386*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::Menu(
387*f6dc9357SAndroid Build Coastguard Worker     unsigned flags,
388*f6dc9357SAndroid Build Coastguard Worker     const char *title,
389*f6dc9357SAndroid Build Coastguard Worker     const char *helpTopic,
390*f6dc9357SAndroid Build Coastguard Worker     struct FarMenuItem *items,
391*f6dc9357SAndroid Build Coastguard Worker     unsigned numItems)
392*f6dc9357SAndroid Build Coastguard Worker {
393*f6dc9357SAndroid Build Coastguard Worker   return Menu(-1, -1, 0, flags, title, NULL, helpTopic, NULL,
394*f6dc9357SAndroid Build Coastguard Worker       NULL, items, numItems);
395*f6dc9357SAndroid Build Coastguard Worker }
396*f6dc9357SAndroid Build Coastguard Worker 
Menu(unsigned flags,const char * title,const char * helpTopic,const AStringVector & items,int selectedItem)397*f6dc9357SAndroid Build Coastguard Worker int CStartupInfo::Menu(
398*f6dc9357SAndroid Build Coastguard Worker     unsigned flags,
399*f6dc9357SAndroid Build Coastguard Worker     const char *title,
400*f6dc9357SAndroid Build Coastguard Worker     const char *helpTopic,
401*f6dc9357SAndroid Build Coastguard Worker     const AStringVector &items,
402*f6dc9357SAndroid Build Coastguard Worker     int selectedItem)
403*f6dc9357SAndroid Build Coastguard Worker {
404*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<FarMenuItem> farMenuItems;
405*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, items)
406*f6dc9357SAndroid Build Coastguard Worker   {
407*f6dc9357SAndroid Build Coastguard Worker     FarMenuItem item;
408*f6dc9357SAndroid Build Coastguard Worker     item.Checked = 0;
409*f6dc9357SAndroid Build Coastguard Worker     item.Separator = 0;
410*f6dc9357SAndroid Build Coastguard Worker     item.Selected = ((int)i == selectedItem);
411*f6dc9357SAndroid Build Coastguard Worker     const AString reducedString (items[i].Left(Z7_ARRAY_SIZE(item.Text) - 1));
412*f6dc9357SAndroid Build Coastguard Worker     MyStringCopy(item.Text, reducedString);
413*f6dc9357SAndroid Build Coastguard Worker     farMenuItems.Add(item);
414*f6dc9357SAndroid Build Coastguard Worker   }
415*f6dc9357SAndroid Build Coastguard Worker   return Menu(flags, title, helpTopic, farMenuItems.NonConstData(), farMenuItems.Size());
416*f6dc9357SAndroid Build Coastguard Worker }
417*f6dc9357SAndroid Build Coastguard Worker 
418*f6dc9357SAndroid Build Coastguard Worker 
419*f6dc9357SAndroid Build Coastguard Worker //////////////////////////////////
420*f6dc9357SAndroid Build Coastguard Worker // CScreenRestorer
421*f6dc9357SAndroid Build Coastguard Worker 
~CScreenRestorer()422*f6dc9357SAndroid Build Coastguard Worker CScreenRestorer::~CScreenRestorer()
423*f6dc9357SAndroid Build Coastguard Worker {
424*f6dc9357SAndroid Build Coastguard Worker   Restore();
425*f6dc9357SAndroid Build Coastguard Worker }
Save()426*f6dc9357SAndroid Build Coastguard Worker void CScreenRestorer::Save()
427*f6dc9357SAndroid Build Coastguard Worker {
428*f6dc9357SAndroid Build Coastguard Worker   if (m_Saved)
429*f6dc9357SAndroid Build Coastguard Worker     return;
430*f6dc9357SAndroid Build Coastguard Worker   m_HANDLE = g_StartupInfo.SaveScreen();
431*f6dc9357SAndroid Build Coastguard Worker   m_Saved = true;
432*f6dc9357SAndroid Build Coastguard Worker }
433*f6dc9357SAndroid Build Coastguard Worker 
Restore()434*f6dc9357SAndroid Build Coastguard Worker void CScreenRestorer::Restore()
435*f6dc9357SAndroid Build Coastguard Worker {
436*f6dc9357SAndroid Build Coastguard Worker   if (m_Saved)
437*f6dc9357SAndroid Build Coastguard Worker   {
438*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.RestoreScreen(m_HANDLE);
439*f6dc9357SAndroid Build Coastguard Worker     m_Saved = false;
440*f6dc9357SAndroid Build Coastguard Worker   }
441*f6dc9357SAndroid Build Coastguard Worker }
442*f6dc9357SAndroid Build Coastguard Worker 
PrintErrorMessage(const char * message,unsigned code)443*f6dc9357SAndroid Build Coastguard Worker int PrintErrorMessage(const char *message, unsigned code)
444*f6dc9357SAndroid Build Coastguard Worker {
445*f6dc9357SAndroid Build Coastguard Worker   AString s (message);
446*f6dc9357SAndroid Build Coastguard Worker   s += " #";
447*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt32((UInt32)code);
448*f6dc9357SAndroid Build Coastguard Worker   return g_StartupInfo.ShowErrorMessage(s);
449*f6dc9357SAndroid Build Coastguard Worker }
450*f6dc9357SAndroid Build Coastguard Worker 
PrintErrorMessage(const char * message,const char * text)451*f6dc9357SAndroid Build Coastguard Worker int PrintErrorMessage(const char *message, const char *text)
452*f6dc9357SAndroid Build Coastguard Worker {
453*f6dc9357SAndroid Build Coastguard Worker   return g_StartupInfo.ShowErrorMessage2(message, text);
454*f6dc9357SAndroid Build Coastguard Worker }
455*f6dc9357SAndroid Build Coastguard Worker 
456*f6dc9357SAndroid Build Coastguard Worker 
ReduceString(UString & s,unsigned size)457*f6dc9357SAndroid Build Coastguard Worker void ReduceString(UString &s, unsigned size)
458*f6dc9357SAndroid Build Coastguard Worker {
459*f6dc9357SAndroid Build Coastguard Worker   if (s.Len() > size)
460*f6dc9357SAndroid Build Coastguard Worker   {
461*f6dc9357SAndroid Build Coastguard Worker     if (size > 5)
462*f6dc9357SAndroid Build Coastguard Worker       size -= 5;
463*f6dc9357SAndroid Build Coastguard Worker     s.Delete(size / 2, s.Len() - size);
464*f6dc9357SAndroid Build Coastguard Worker     s.Insert(size / 2, L" ... ");
465*f6dc9357SAndroid Build Coastguard Worker   }
466*f6dc9357SAndroid Build Coastguard Worker }
467*f6dc9357SAndroid Build Coastguard Worker 
PrintErrorMessage(const char * message,const wchar_t * name,unsigned maxLen)468*f6dc9357SAndroid Build Coastguard Worker int PrintErrorMessage(const char *message, const wchar_t *name, unsigned maxLen)
469*f6dc9357SAndroid Build Coastguard Worker {
470*f6dc9357SAndroid Build Coastguard Worker   UString s = name;
471*f6dc9357SAndroid Build Coastguard Worker   ReduceString(s, maxLen);
472*f6dc9357SAndroid Build Coastguard Worker   return PrintErrorMessage(message, UnicodeStringToMultiByte(s, CP_OEMCP));
473*f6dc9357SAndroid Build Coastguard Worker }
474*f6dc9357SAndroid Build Coastguard Worker 
ShowSysErrorMessage(DWORD errorCode)475*f6dc9357SAndroid Build Coastguard Worker int ShowSysErrorMessage(DWORD errorCode)
476*f6dc9357SAndroid Build Coastguard Worker {
477*f6dc9357SAndroid Build Coastguard Worker   const UString message = NError::MyFormatMessage(errorCode);
478*f6dc9357SAndroid Build Coastguard Worker   return g_StartupInfo.ShowErrorMessage(UnicodeStringToMultiByte(message, CP_OEMCP));
479*f6dc9357SAndroid Build Coastguard Worker }
480*f6dc9357SAndroid Build Coastguard Worker 
ShowLastErrorMessage()481*f6dc9357SAndroid Build Coastguard Worker int ShowLastErrorMessage()
482*f6dc9357SAndroid Build Coastguard Worker {
483*f6dc9357SAndroid Build Coastguard Worker   return ShowSysErrorMessage(::GetLastError());
484*f6dc9357SAndroid Build Coastguard Worker }
485*f6dc9357SAndroid Build Coastguard Worker 
ShowSysErrorMessage(DWORD errorCode,const wchar_t * name)486*f6dc9357SAndroid Build Coastguard Worker int ShowSysErrorMessage(DWORD errorCode, const wchar_t *name)
487*f6dc9357SAndroid Build Coastguard Worker {
488*f6dc9357SAndroid Build Coastguard Worker   const UString s = NError::MyFormatMessage(errorCode);
489*f6dc9357SAndroid Build Coastguard Worker   return g_StartupInfo.ShowErrorMessage2(
490*f6dc9357SAndroid Build Coastguard Worker       UnicodeStringToMultiByte(s, CP_OEMCP),
491*f6dc9357SAndroid Build Coastguard Worker       UnicodeStringToMultiByte(name, CP_OEMCP));
492*f6dc9357SAndroid Build Coastguard Worker }
493*f6dc9357SAndroid Build Coastguard Worker 
494*f6dc9357SAndroid Build Coastguard Worker 
WasEscPressed()495*f6dc9357SAndroid Build Coastguard Worker bool WasEscPressed()
496*f6dc9357SAndroid Build Coastguard Worker {
497*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
498*f6dc9357SAndroid Build Coastguard Worker   return false;
499*f6dc9357SAndroid Build Coastguard Worker   #else
500*f6dc9357SAndroid Build Coastguard Worker   NConsole::CIn inConsole;
501*f6dc9357SAndroid Build Coastguard Worker   HANDLE handle = ::GetStdHandle(STD_INPUT_HANDLE);
502*f6dc9357SAndroid Build Coastguard Worker   if (handle == INVALID_HANDLE_VALUE)
503*f6dc9357SAndroid Build Coastguard Worker     return true;
504*f6dc9357SAndroid Build Coastguard Worker   inConsole.Attach(handle);
505*f6dc9357SAndroid Build Coastguard Worker   for (;;)
506*f6dc9357SAndroid Build Coastguard Worker   {
507*f6dc9357SAndroid Build Coastguard Worker     DWORD numEvents;
508*f6dc9357SAndroid Build Coastguard Worker     if (!inConsole.GetNumberOfEvents(numEvents))
509*f6dc9357SAndroid Build Coastguard Worker       return true;
510*f6dc9357SAndroid Build Coastguard Worker     if (numEvents == 0)
511*f6dc9357SAndroid Build Coastguard Worker       return false;
512*f6dc9357SAndroid Build Coastguard Worker 
513*f6dc9357SAndroid Build Coastguard Worker     INPUT_RECORD event;
514*f6dc9357SAndroid Build Coastguard Worker     if (!inConsole.ReadEvent(event, numEvents))
515*f6dc9357SAndroid Build Coastguard Worker       return true;
516*f6dc9357SAndroid Build Coastguard Worker     if (event.EventType == KEY_EVENT &&
517*f6dc9357SAndroid Build Coastguard Worker         event.Event.KeyEvent.bKeyDown &&
518*f6dc9357SAndroid Build Coastguard Worker         event.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
519*f6dc9357SAndroid Build Coastguard Worker       return true;
520*f6dc9357SAndroid Build Coastguard Worker   }
521*f6dc9357SAndroid Build Coastguard Worker   #endif
522*f6dc9357SAndroid Build Coastguard Worker }
523*f6dc9357SAndroid Build Coastguard Worker 
524*f6dc9357SAndroid Build Coastguard Worker }
525