windows-aklog-cleanup-20080321
[openafs.git] / src / WINNT / afssvrmgr / prefs.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <winsock2.h>
11 #include <ws2tcpip.h>
12
13 extern "C" {
14 #include <afs/param.h>
15 #include <afs/stds.h>
16 }
17
18 #include "svrmgr.h"
19 #include "prefs.h"
20
21
22 /*
23  * DEFINITIONS ________________________________________________________________
24  *
25  */
26
27 #define SETTINGS_KW    TEXT("Settings")
28 #define PREFERENCES_KW TEXT("Preferences")
29 #define SERVICES_KW    TEXT("Services")
30 #define AGGREGATES_KW  TEXT("Aggregates")
31 #define FILESETS_KW    TEXT("Filesets")
32 #define SUBSETS_KW     TEXT("Server Subsets")
33
34
35 /*
36  * ROUTINES ___________________________________________________________________
37  *
38  */
39
40 BOOL GetPreferencesInfo (LPIDENT lpi, LPTSTR pszPath, WORD *pwVer)
41 {
42    if (lpi == NULL)
43       return FALSE;
44
45    // HKCU\Software\...\SVRMgr + \CellName
46    //
47    lstrcpy (pszPath, REGSTR_SETTINGS_PREFS);
48    lstrcat (pszPath, TEXT("\\"));
49    lpi->GetCellName (&pszPath[ lstrlen(pszPath) ]);
50
51    // HKCU\Software\...\SVRMgr\CellName + \ServerName
52    //
53    lstrcat (pszPath, TEXT("\\"));
54    lpi->GetLongServerName (&pszPath[ lstrlen(pszPath) ]);
55
56    *pwVer = wVerSERVER_PREF;
57
58    if (lpi->fIsService())
59       {
60       // HKCU\Software\...\SVRMgr\CellName\ServerName + \Services\ServiceName
61       //
62       lstrcat (pszPath, TEXT("\\"));
63       lstrcat (pszPath, SERVICES_KW);
64       lstrcat (pszPath, TEXT("\\"));
65       lpi->GetServiceName (&pszPath[ lstrlen(pszPath) ]);
66       *pwVer = wVerSERVICE_PREF;
67       }
68    else if (lpi->fIsAggregate())
69       {
70       // HKCU\Software\...\SVRMgr\CellName\ServerName + \Aggs\AggregateName
71       //
72       lstrcat (pszPath, TEXT("\\"));
73       lstrcat (pszPath, AGGREGATES_KW);
74       lstrcat (pszPath, TEXT("\\"));
75       lpi->GetAggregateName (&pszPath[ lstrlen(pszPath) ]);
76       *pwVer = wVerAGGREGATE_PREF;
77       }
78    else if (lpi->fIsFileset())
79       {
80       // HKCU\Software\...\SVRMgr\CellName\ServerName + \Filesets\FilesetName
81       //
82       lstrcat (pszPath, TEXT("\\"));
83       lstrcat (pszPath, FILESETS_KW);
84       lstrcat (pszPath, TEXT("\\"));
85       lpi->GetFilesetName (&pszPath[ lstrlen(pszPath) ]);
86       *pwVer = wVerFILESET_PREF;
87       }
88
89    return TRUE;
90 }
91
92
93 BOOL RestorePreferences (LPIDENT lpi, void *pData, size_t cbData)
94 {
95    TCHAR szPath[ MAX_PATH ];
96    WORD wVer;
97
98    if (!GetPreferencesInfo (lpi, szPath, &wVer))
99       return FALSE;
100
101    return RestoreSettings (REGSTR_SETTINGS_BASE, szPath, SETTINGS_KW, pData, cbData, wVer);
102 }
103
104
105 BOOL StorePreferences (LPIDENT lpi, void *pData, size_t cbData)
106 {
107    TCHAR szPath[ MAX_PATH ];
108    WORD wVer;
109
110    if (!GetPreferencesInfo (lpi, szPath, &wVer))
111       return FALSE;
112
113    return StoreSettings (REGSTR_SETTINGS_BASE, szPath, SETTINGS_KW, pData, cbData, wVer);
114 }
115
116
117 void ErasePreferences (LPTSTR pszCell, LPTSTR pszServer)
118 {
119    BOOL fWildcard = FALSE;
120    LPTSTR pszDelete;
121
122    // HKCU\Software\...\SVRMgr
123    //
124    TCHAR szPath[ MAX_PATH ];
125    lstrcpy (szPath, REGSTR_SETTINGS_PATH);
126
127    if (!pszCell)
128       pszDelete = PREFERENCES_KW;
129    else
130       {
131       lstrcat (szPath, TEXT("\\"));
132       lstrcat (szPath, PREFERENCES_KW);
133
134       if (!pszServer)
135          pszDelete = pszCell;
136       else
137          {
138          lstrcat (szPath, TEXT("\\"));
139          lstrcat (szPath, pszCell);
140          pszDelete = pszServer;
141          fWildcard = TRUE;
142          }
143       }
144
145    HKEY hk;
146    if (RegOpenKey (HKCU, szPath, &hk) == 0)
147       {
148       if (!fWildcard)
149          {
150          RegDeltreeKey (hk, pszDelete);
151          }
152       else
153          {
154          TCHAR szFound[ MAX_PATH ];
155          for (int ii = 0; RegEnumKey (hk, ii, szFound, MAX_PATH) == 0; ++ii)
156             {
157             if (lstrncmpi (szFound, pszDelete, lstrlen(pszDelete)))
158                continue;
159
160             if (RegDeltreeKey (hk, szFound))
161                ii = -1; // restart search
162             }
163          }
164
165       RegCloseKey (hk);
166       }
167 }
168
169
170 HKEY OpenSubsetsKey (LPTSTR pszCell, BOOL fCreate)
171 {
172    return OpenSubsetsSubKey (pszCell, NULL, fCreate);
173 }
174
175
176 HKEY OpenSubsetsSubKey (LPTSTR pszCell, LPTSTR pszSubset, BOOL fCreate)
177 {
178    // HKCU\Software\...\SVRMgr + \CellName
179    //
180    TCHAR szPath[ MAX_PATH ];
181    lstrcpy (szPath, REGSTR_SETTINGS_PREFS);
182    lstrcat (szPath, TEXT("\\"));
183
184    if (pszCell)
185       lstrcat (szPath, pszCell);
186    else if (g.lpiCell)
187       g.lpiCell->GetCellName (&szPath[ lstrlen(szPath) ]);
188
189    // HKCU\Software\...\SVRMgr\CellName + \"Server Subsets"
190    //
191    lstrcat (szPath, TEXT("\\"));
192    lstrcat (szPath, SUBSETS_KW);
193
194    // HKCU\Software\...\SVRMgr\CellName + \"Server Subsets" + \Subset
195    //
196    if (pszSubset)
197       {
198       lstrcat (szPath, TEXT("\\"));
199       lstrcat (szPath, pszSubset);
200       }
201
202    // Open or create that key.
203    //
204    HKEY hk = NULL;
205
206    if (fCreate)
207       {
208       if (pszSubset)  // destroy and recreate a subset key?
209          RegDeleteKey (HKCU, szPath);
210       if (fCreate != 2)  // okay, ugly hack: pass 2 to just delete the key
211          {
212          if (RegCreateKey (HKCU, szPath, &hk) != 0)
213             hk = NULL;
214          }
215       }
216    else
217       {
218       if (RegOpenKey (HKCU, szPath, &hk) != 0)
219          hk = NULL;
220       }
221
222    return hk;
223 }
224