xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/ViewSettings.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ViewSettings.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 "../../../../C/CpuArch.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Registry.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "ViewSettings.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
16*f6dc9357SAndroid Build Coastguard Worker using namespace NRegistry;
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #define REG_PATH_FM TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") TEXT(STRING_PATH_SEPARATOR) TEXT("FM")
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kCUBasePath = REG_PATH_FM;
21*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kCulumnsKeyName = REG_PATH_FM TEXT(STRING_PATH_SEPARATOR) TEXT("Columns");
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kPositionValueName = TEXT("Position");
24*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kPanelsInfoValueName = TEXT("Panels");
25*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kToolbars = TEXT("Toolbars");
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kPanelPathValueName = L"PanelPath";
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kListMode = TEXT("ListMode");
30*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kFolderHistoryValueName = TEXT("FolderHistory");
31*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kFastFoldersValueName = TEXT("FolderShortcuts");
32*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kCopyHistoryValueName = TEXT("CopyHistory");
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker static NSynchronization::CCriticalSection g_CS;
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker #define Set32(p, v) SetUi32(((Byte *)p), v)
37*f6dc9357SAndroid Build Coastguard Worker #define SetBool(p, v) Set32(p, ((v) ? 1 : 0))
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker #define Get32(p, dest) dest = GetUi32((const Byte *)p);
40*f6dc9357SAndroid Build Coastguard Worker #define Get32_LONG(p, dest) dest = (LONG)GetUi32((const Byte *)p);
41*f6dc9357SAndroid Build Coastguard Worker #define GetBool(p, dest) dest = (GetUi32(p) != 0);
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker /*
44*f6dc9357SAndroid Build Coastguard Worker struct CColumnHeader
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker   UInt32 Version;
47*f6dc9357SAndroid Build Coastguard Worker   UInt32 SortID;
48*f6dc9357SAndroid Build Coastguard Worker   UInt32 Ascending; // bool
49*f6dc9357SAndroid Build Coastguard Worker };
50*f6dc9357SAndroid Build Coastguard Worker */
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kListViewHeaderSize = 3 * 4;
53*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kColumnInfoSize = 3 * 4;
54*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kListViewVersion = 1;
55*f6dc9357SAndroid Build Coastguard Worker 
Save(const UString & id) const56*f6dc9357SAndroid Build Coastguard Worker void CListViewInfo::Save(const UString &id) const
57*f6dc9357SAndroid Build Coastguard Worker {
58*f6dc9357SAndroid Build Coastguard Worker   const UInt32 dataSize = kListViewHeaderSize + kColumnInfoSize * Columns.Size();
59*f6dc9357SAndroid Build Coastguard Worker   CByteArr buf(dataSize);
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker   Set32(buf, kListViewVersion)
62*f6dc9357SAndroid Build Coastguard Worker   Set32(buf + 4, SortID)
63*f6dc9357SAndroid Build Coastguard Worker   SetBool(buf + 8, Ascending)
64*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, Columns)
65*f6dc9357SAndroid Build Coastguard Worker   {
66*f6dc9357SAndroid Build Coastguard Worker     const CColumnInfo &column = Columns[i];
67*f6dc9357SAndroid Build Coastguard Worker     Byte *p = buf + kListViewHeaderSize + i * kColumnInfoSize;
68*f6dc9357SAndroid Build Coastguard Worker     Set32(p, column.PropID)
69*f6dc9357SAndroid Build Coastguard Worker     SetBool(p + 4, column.IsVisible)
70*f6dc9357SAndroid Build Coastguard Worker     Set32(p + 8, column.Width)
71*f6dc9357SAndroid Build Coastguard Worker   }
72*f6dc9357SAndroid Build Coastguard Worker   {
73*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(g_CS);
74*f6dc9357SAndroid Build Coastguard Worker     CKey key;
75*f6dc9357SAndroid Build Coastguard Worker     key.Create(HKEY_CURRENT_USER, kCulumnsKeyName);
76*f6dc9357SAndroid Build Coastguard Worker     key.SetValue(GetSystemString(id), (const Byte *)buf, dataSize);
77*f6dc9357SAndroid Build Coastguard Worker   }
78*f6dc9357SAndroid Build Coastguard Worker }
79*f6dc9357SAndroid Build Coastguard Worker 
Read(const UString & id)80*f6dc9357SAndroid Build Coastguard Worker void CListViewInfo::Read(const UString &id)
81*f6dc9357SAndroid Build Coastguard Worker {
82*f6dc9357SAndroid Build Coastguard Worker   Clear();
83*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer buf;
84*f6dc9357SAndroid Build Coastguard Worker   {
85*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(g_CS);
86*f6dc9357SAndroid Build Coastguard Worker     CKey key;
87*f6dc9357SAndroid Build Coastguard Worker     if (key.Open(HKEY_CURRENT_USER, kCulumnsKeyName, KEY_READ) != ERROR_SUCCESS)
88*f6dc9357SAndroid Build Coastguard Worker       return;
89*f6dc9357SAndroid Build Coastguard Worker     if (key.QueryValue_Binary(GetSystemString(id), buf) != ERROR_SUCCESS)
90*f6dc9357SAndroid Build Coastguard Worker       return;
91*f6dc9357SAndroid Build Coastguard Worker   }
92*f6dc9357SAndroid Build Coastguard Worker   unsigned size = (unsigned)buf.Size();
93*f6dc9357SAndroid Build Coastguard Worker   if (size < kListViewHeaderSize)
94*f6dc9357SAndroid Build Coastguard Worker     return;
95*f6dc9357SAndroid Build Coastguard Worker   UInt32 version;
96*f6dc9357SAndroid Build Coastguard Worker   Get32(buf, version)
97*f6dc9357SAndroid Build Coastguard Worker   if (version != kListViewVersion)
98*f6dc9357SAndroid Build Coastguard Worker     return;
99*f6dc9357SAndroid Build Coastguard Worker   Get32(buf + 4, SortID)
100*f6dc9357SAndroid Build Coastguard Worker   GetBool(buf + 8, Ascending)
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker   IsLoaded = true;
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker   size -= kListViewHeaderSize;
105*f6dc9357SAndroid Build Coastguard Worker   if (size % kColumnInfoSize != 0)
106*f6dc9357SAndroid Build Coastguard Worker     return;
107*f6dc9357SAndroid Build Coastguard Worker   if (size > 1000 * kColumnInfoSize)
108*f6dc9357SAndroid Build Coastguard Worker     return;
109*f6dc9357SAndroid Build Coastguard Worker   const unsigned numItems = size / kColumnInfoSize;
110*f6dc9357SAndroid Build Coastguard Worker   Columns.ClearAndReserve(numItems);
111*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < numItems; i++)
112*f6dc9357SAndroid Build Coastguard Worker   {
113*f6dc9357SAndroid Build Coastguard Worker     CColumnInfo column;
114*f6dc9357SAndroid Build Coastguard Worker     const Byte *p = buf + kListViewHeaderSize + i * kColumnInfoSize;
115*f6dc9357SAndroid Build Coastguard Worker     Get32(p, column.PropID)
116*f6dc9357SAndroid Build Coastguard Worker     GetBool(p + 4, column.IsVisible)
117*f6dc9357SAndroid Build Coastguard Worker     Get32(p + 8, column.Width)
118*f6dc9357SAndroid Build Coastguard Worker     Columns.AddInReserved(column);
119*f6dc9357SAndroid Build Coastguard Worker   }
120*f6dc9357SAndroid Build Coastguard Worker }
121*f6dc9357SAndroid Build Coastguard Worker 
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker /*
124*f6dc9357SAndroid Build Coastguard Worker struct CWindowPosition
125*f6dc9357SAndroid Build Coastguard Worker {
126*f6dc9357SAndroid Build Coastguard Worker   RECT Rect;
127*f6dc9357SAndroid Build Coastguard Worker   UInt32 Maximized; // bool
128*f6dc9357SAndroid Build Coastguard Worker };
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker struct CPanelsInfo
131*f6dc9357SAndroid Build Coastguard Worker {
132*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumPanels;
133*f6dc9357SAndroid Build Coastguard Worker   UInt32 CurrentPanel;
134*f6dc9357SAndroid Build Coastguard Worker   UInt32 SplitterPos;
135*f6dc9357SAndroid Build Coastguard Worker };
136*f6dc9357SAndroid Build Coastguard Worker */
137*f6dc9357SAndroid Build Coastguard Worker 
138*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kWindowPositionHeaderSize = 5 * 4;
139*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kPanelsInfoHeaderSize = 3 * 4;
140*f6dc9357SAndroid Build Coastguard Worker 
Save() const141*f6dc9357SAndroid Build Coastguard Worker void CWindowInfo::Save() const
142*f6dc9357SAndroid Build Coastguard Worker {
143*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CCriticalSectionLock lock(g_CS);
144*f6dc9357SAndroid Build Coastguard Worker   CKey key;
145*f6dc9357SAndroid Build Coastguard Worker   key.Create(HKEY_CURRENT_USER, kCUBasePath);
146*f6dc9357SAndroid Build Coastguard Worker   {
147*f6dc9357SAndroid Build Coastguard Worker     Byte buf[kWindowPositionHeaderSize];
148*f6dc9357SAndroid Build Coastguard Worker     Set32(buf,      (UInt32)rect.left)
149*f6dc9357SAndroid Build Coastguard Worker     Set32(buf +  4, (UInt32)rect.top)
150*f6dc9357SAndroid Build Coastguard Worker     Set32(buf +  8, (UInt32)rect.right)
151*f6dc9357SAndroid Build Coastguard Worker     Set32(buf + 12, (UInt32)rect.bottom)
152*f6dc9357SAndroid Build Coastguard Worker     SetBool(buf + 16, maximized)
153*f6dc9357SAndroid Build Coastguard Worker     key.SetValue(kPositionValueName, buf, kWindowPositionHeaderSize);
154*f6dc9357SAndroid Build Coastguard Worker   }
155*f6dc9357SAndroid Build Coastguard Worker   {
156*f6dc9357SAndroid Build Coastguard Worker     Byte buf[kPanelsInfoHeaderSize];
157*f6dc9357SAndroid Build Coastguard Worker     Set32(buf,      numPanels)
158*f6dc9357SAndroid Build Coastguard Worker     Set32(buf +  4, currentPanel)
159*f6dc9357SAndroid Build Coastguard Worker     Set32(buf +  8, splitterPos)
160*f6dc9357SAndroid Build Coastguard Worker     key.SetValue(kPanelsInfoValueName, buf, kPanelsInfoHeaderSize);
161*f6dc9357SAndroid Build Coastguard Worker   }
162*f6dc9357SAndroid Build Coastguard Worker }
163*f6dc9357SAndroid Build Coastguard Worker 
QueryBuf(CKey & key,LPCTSTR name,CByteBuffer & buf,UInt32 dataSize)164*f6dc9357SAndroid Build Coastguard Worker static bool QueryBuf(CKey &key, LPCTSTR name, CByteBuffer &buf, UInt32 dataSize)
165*f6dc9357SAndroid Build Coastguard Worker {
166*f6dc9357SAndroid Build Coastguard Worker   return key.QueryValue_Binary(name, buf) == ERROR_SUCCESS && buf.Size() == dataSize;
167*f6dc9357SAndroid Build Coastguard Worker }
168*f6dc9357SAndroid Build Coastguard Worker 
Read(bool & windowPosDefined,bool & panelInfoDefined)169*f6dc9357SAndroid Build Coastguard Worker void CWindowInfo::Read(bool &windowPosDefined, bool &panelInfoDefined)
170*f6dc9357SAndroid Build Coastguard Worker {
171*f6dc9357SAndroid Build Coastguard Worker   windowPosDefined = false;
172*f6dc9357SAndroid Build Coastguard Worker   panelInfoDefined = false;
173*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CCriticalSectionLock lock(g_CS);
174*f6dc9357SAndroid Build Coastguard Worker   CKey key;
175*f6dc9357SAndroid Build Coastguard Worker   if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS)
176*f6dc9357SAndroid Build Coastguard Worker     return;
177*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer buf;
178*f6dc9357SAndroid Build Coastguard Worker   if (QueryBuf(key, kPositionValueName, buf, kWindowPositionHeaderSize))
179*f6dc9357SAndroid Build Coastguard Worker   {
180*f6dc9357SAndroid Build Coastguard Worker     Get32_LONG(buf,      rect.left)
181*f6dc9357SAndroid Build Coastguard Worker     Get32_LONG(buf +  4, rect.top)
182*f6dc9357SAndroid Build Coastguard Worker     Get32_LONG(buf +  8, rect.right)
183*f6dc9357SAndroid Build Coastguard Worker     Get32_LONG(buf + 12, rect.bottom)
184*f6dc9357SAndroid Build Coastguard Worker     GetBool(buf + 16, maximized)
185*f6dc9357SAndroid Build Coastguard Worker     windowPosDefined = true;
186*f6dc9357SAndroid Build Coastguard Worker   }
187*f6dc9357SAndroid Build Coastguard Worker   if (QueryBuf(key, kPanelsInfoValueName, buf, kPanelsInfoHeaderSize))
188*f6dc9357SAndroid Build Coastguard Worker   {
189*f6dc9357SAndroid Build Coastguard Worker     Get32(buf,      numPanels)
190*f6dc9357SAndroid Build Coastguard Worker     Get32(buf +  4, currentPanel)
191*f6dc9357SAndroid Build Coastguard Worker     Get32(buf +  8, splitterPos)
192*f6dc9357SAndroid Build Coastguard Worker     panelInfoDefined = true;
193*f6dc9357SAndroid Build Coastguard Worker   }
194*f6dc9357SAndroid Build Coastguard Worker   return;
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker 
SaveUi32Val(const TCHAR * name,UInt32 value)198*f6dc9357SAndroid Build Coastguard Worker static void SaveUi32Val(const TCHAR *name, UInt32 value)
199*f6dc9357SAndroid Build Coastguard Worker {
200*f6dc9357SAndroid Build Coastguard Worker   CKey key;
201*f6dc9357SAndroid Build Coastguard Worker   key.Create(HKEY_CURRENT_USER, kCUBasePath);
202*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(name, value);
203*f6dc9357SAndroid Build Coastguard Worker }
204*f6dc9357SAndroid Build Coastguard Worker 
ReadUi32Val(const TCHAR * name,UInt32 & value)205*f6dc9357SAndroid Build Coastguard Worker static bool ReadUi32Val(const TCHAR *name, UInt32 &value)
206*f6dc9357SAndroid Build Coastguard Worker {
207*f6dc9357SAndroid Build Coastguard Worker   CKey key;
208*f6dc9357SAndroid Build Coastguard Worker   if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS)
209*f6dc9357SAndroid Build Coastguard Worker     return false;
210*f6dc9357SAndroid Build Coastguard Worker   return key.GetValue_UInt32_IfOk(name, value) == ERROR_SUCCESS;
211*f6dc9357SAndroid Build Coastguard Worker }
212*f6dc9357SAndroid Build Coastguard Worker 
SaveToolbarsMask(UInt32 toolbarMask)213*f6dc9357SAndroid Build Coastguard Worker void SaveToolbarsMask(UInt32 toolbarMask)
214*f6dc9357SAndroid Build Coastguard Worker {
215*f6dc9357SAndroid Build Coastguard Worker   SaveUi32Val(kToolbars, toolbarMask);
216*f6dc9357SAndroid Build Coastguard Worker }
217*f6dc9357SAndroid Build Coastguard Worker 
218*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kDefaultToolbarMask = ((UInt32)1 << 31) | 8 | 4 | 1;
219*f6dc9357SAndroid Build Coastguard Worker 
ReadToolbarsMask()220*f6dc9357SAndroid Build Coastguard Worker UInt32 ReadToolbarsMask()
221*f6dc9357SAndroid Build Coastguard Worker {
222*f6dc9357SAndroid Build Coastguard Worker   UInt32 mask;
223*f6dc9357SAndroid Build Coastguard Worker   if (!ReadUi32Val(kToolbars, mask))
224*f6dc9357SAndroid Build Coastguard Worker     return kDefaultToolbarMask;
225*f6dc9357SAndroid Build Coastguard Worker   return mask;
226*f6dc9357SAndroid Build Coastguard Worker }
227*f6dc9357SAndroid Build Coastguard Worker 
228*f6dc9357SAndroid Build Coastguard Worker 
Save() const229*f6dc9357SAndroid Build Coastguard Worker void CListMode::Save() const
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker   UInt32 t = 0;
232*f6dc9357SAndroid Build Coastguard Worker   for (int i = 0; i < 2; i++)
233*f6dc9357SAndroid Build Coastguard Worker     t |= (Panels[i] & 0xFF) << (i * 8);
234*f6dc9357SAndroid Build Coastguard Worker   SaveUi32Val(kListMode, t);
235*f6dc9357SAndroid Build Coastguard Worker }
236*f6dc9357SAndroid Build Coastguard Worker 
Read()237*f6dc9357SAndroid Build Coastguard Worker void CListMode::Read()
238*f6dc9357SAndroid Build Coastguard Worker {
239*f6dc9357SAndroid Build Coastguard Worker   Init();
240*f6dc9357SAndroid Build Coastguard Worker   UInt32 t;
241*f6dc9357SAndroid Build Coastguard Worker   if (!ReadUi32Val(kListMode, t))
242*f6dc9357SAndroid Build Coastguard Worker     return;
243*f6dc9357SAndroid Build Coastguard Worker   for (int i = 0; i < 2; i++)
244*f6dc9357SAndroid Build Coastguard Worker   {
245*f6dc9357SAndroid Build Coastguard Worker     Panels[i] = t & 0xFF;
246*f6dc9357SAndroid Build Coastguard Worker     t >>= 8;
247*f6dc9357SAndroid Build Coastguard Worker   }
248*f6dc9357SAndroid Build Coastguard Worker }
249*f6dc9357SAndroid Build Coastguard Worker 
GetPanelPathName(UInt32 panelIndex)250*f6dc9357SAndroid Build Coastguard Worker static UString GetPanelPathName(UInt32 panelIndex)
251*f6dc9357SAndroid Build Coastguard Worker {
252*f6dc9357SAndroid Build Coastguard Worker   UString s (kPanelPathValueName);
253*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt32(panelIndex);
254*f6dc9357SAndroid Build Coastguard Worker   return s;
255*f6dc9357SAndroid Build Coastguard Worker }
256*f6dc9357SAndroid Build Coastguard Worker 
SavePanelPath(UInt32 panel,const UString & path)257*f6dc9357SAndroid Build Coastguard Worker void SavePanelPath(UInt32 panel, const UString &path)
258*f6dc9357SAndroid Build Coastguard Worker {
259*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CCriticalSectionLock lock(g_CS);
260*f6dc9357SAndroid Build Coastguard Worker   CKey key;
261*f6dc9357SAndroid Build Coastguard Worker   key.Create(HKEY_CURRENT_USER, kCUBasePath);
262*f6dc9357SAndroid Build Coastguard Worker   key.SetValue(GetPanelPathName(panel), path);
263*f6dc9357SAndroid Build Coastguard Worker }
264*f6dc9357SAndroid Build Coastguard Worker 
ReadPanelPath(UInt32 panel,UString & path)265*f6dc9357SAndroid Build Coastguard Worker bool ReadPanelPath(UInt32 panel, UString &path)
266*f6dc9357SAndroid Build Coastguard Worker {
267*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CCriticalSectionLock lock(g_CS);
268*f6dc9357SAndroid Build Coastguard Worker   CKey key;
269*f6dc9357SAndroid Build Coastguard Worker   if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS)
270*f6dc9357SAndroid Build Coastguard Worker     return false;
271*f6dc9357SAndroid Build Coastguard Worker   return (key.QueryValue(GetPanelPathName(panel), path) == ERROR_SUCCESS);
272*f6dc9357SAndroid Build Coastguard Worker }
273*f6dc9357SAndroid Build Coastguard Worker 
274*f6dc9357SAndroid Build Coastguard Worker 
SaveStringList(LPCTSTR valueName,const UStringVector & folders)275*f6dc9357SAndroid Build Coastguard Worker static void SaveStringList(LPCTSTR valueName, const UStringVector &folders)
276*f6dc9357SAndroid Build Coastguard Worker {
277*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CCriticalSectionLock lock(g_CS);
278*f6dc9357SAndroid Build Coastguard Worker   CKey key;
279*f6dc9357SAndroid Build Coastguard Worker   key.Create(HKEY_CURRENT_USER, kCUBasePath);
280*f6dc9357SAndroid Build Coastguard Worker   key.SetValue_Strings(valueName, folders);
281*f6dc9357SAndroid Build Coastguard Worker }
282*f6dc9357SAndroid Build Coastguard Worker 
ReadStringList(LPCTSTR valueName,UStringVector & folders)283*f6dc9357SAndroid Build Coastguard Worker static void ReadStringList(LPCTSTR valueName, UStringVector &folders)
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker   folders.Clear();
286*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CCriticalSectionLock lock(g_CS);
287*f6dc9357SAndroid Build Coastguard Worker   CKey key;
288*f6dc9357SAndroid Build Coastguard Worker   if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) == ERROR_SUCCESS)
289*f6dc9357SAndroid Build Coastguard Worker     key.GetValue_Strings(valueName, folders);
290*f6dc9357SAndroid Build Coastguard Worker }
291*f6dc9357SAndroid Build Coastguard Worker 
SaveFolderHistory(const UStringVector & folders)292*f6dc9357SAndroid Build Coastguard Worker void SaveFolderHistory(const UStringVector &folders)
293*f6dc9357SAndroid Build Coastguard Worker   { SaveStringList(kFolderHistoryValueName, folders); }
ReadFolderHistory(UStringVector & folders)294*f6dc9357SAndroid Build Coastguard Worker void ReadFolderHistory(UStringVector &folders)
295*f6dc9357SAndroid Build Coastguard Worker   { ReadStringList(kFolderHistoryValueName, folders); }
296*f6dc9357SAndroid Build Coastguard Worker 
SaveFastFolders(const UStringVector & folders)297*f6dc9357SAndroid Build Coastguard Worker void SaveFastFolders(const UStringVector &folders)
298*f6dc9357SAndroid Build Coastguard Worker   { SaveStringList(kFastFoldersValueName, folders); }
ReadFastFolders(UStringVector & folders)299*f6dc9357SAndroid Build Coastguard Worker void ReadFastFolders(UStringVector &folders)
300*f6dc9357SAndroid Build Coastguard Worker   { ReadStringList(kFastFoldersValueName, folders); }
301*f6dc9357SAndroid Build Coastguard Worker 
SaveCopyHistory(const UStringVector & folders)302*f6dc9357SAndroid Build Coastguard Worker void SaveCopyHistory(const UStringVector &folders)
303*f6dc9357SAndroid Build Coastguard Worker   { SaveStringList(kCopyHistoryValueName, folders); }
ReadCopyHistory(UStringVector & folders)304*f6dc9357SAndroid Build Coastguard Worker void ReadCopyHistory(UStringVector &folders)
305*f6dc9357SAndroid Build Coastguard Worker   { ReadStringList(kCopyHistoryValueName, folders); }
306*f6dc9357SAndroid Build Coastguard Worker 
AddUniqueStringToHeadOfList(UStringVector & list,const UString & s)307*f6dc9357SAndroid Build Coastguard Worker void AddUniqueStringToHeadOfList(UStringVector &list, const UString &s)
308*f6dc9357SAndroid Build Coastguard Worker {
309*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < list.Size();)
310*f6dc9357SAndroid Build Coastguard Worker     if (s.IsEqualTo_NoCase(list[i]))
311*f6dc9357SAndroid Build Coastguard Worker       list.Delete(i);
312*f6dc9357SAndroid Build Coastguard Worker     else
313*f6dc9357SAndroid Build Coastguard Worker       i++;
314*f6dc9357SAndroid Build Coastguard Worker   list.Insert(0, s);
315*f6dc9357SAndroid Build Coastguard Worker }
316