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