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