windows-build-updates-20030314
[openafs.git] / src / WINNT / afssvrmgr / set_clone.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 "set_clone.h"
17 #include "propcache.h"
18
19
20 /*
21  * DEFINITIONS ________________________________________________________________
22  *
23  */
24
25
26 /*
27  * PROTOTYPES _________________________________________________________________
28  *
29  */
30
31 BOOL CALLBACK Filesets_Clone_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
32 void Filesets_Clone_OnInitDialog (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp);
33
34 BOOL CALLBACK Filesets_Clonesys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
35 void Filesets_Clonesys_OnInitDialog (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp);
36 void Filesets_Clonesys_OnOK (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp);
37 void Filesets_Clonesys_OnSelect (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp);
38 void Filesets_Clonesys_OnSelectServer (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp);
39 void Filesets_Clonesys_OnEndTask_EnumServers (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp);
40 void Filesets_Clonesys_OnEndTask_EnumAggregs (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp);
41
42
43 /*
44  * ROUTINES ___________________________________________________________________
45  *
46  */
47
48 void Filesets_Clone (LPIDENT lpi)
49 {
50    LPSET_CLONESYS_PARAMS pcsp = New (SET_CLONESYS_PARAMS);
51    memset (pcsp, 0x00, sizeof(SET_CLONESYS_PARAMS));
52    pcsp->lpi = (lpi == NULL) ? g.lpiCell : lpi;
53
54    int rc;
55    if (pcsp->lpi && pcsp->lpi->fIsFileset())
56       rc = ModalDialogParam (IDD_SET_CLONE, NULL, (DLGPROC)Filesets_Clone_DlgProc, (LPARAM)pcsp);
57    else
58       rc = ModalDialogParam (IDD_SET_CLONESYS, NULL, (DLGPROC)Filesets_Clonesys_DlgProc, (LPARAM)pcsp);
59
60    if ((rc != IDOK) || (!pcsp->lpi))
61       {
62       Delete (pcsp);
63       }
64    else if (pcsp->lpi->fIsFileset()) // clone one fileset?
65       {
66       StartTask (taskSET_CLONE, NULL, pcsp->lpi);
67       Delete (pcsp);
68       }
69    else // or clone lots of filesets?
70       {
71       StartTask (taskSET_CLONESYS, NULL, pcsp);
72       // don't delete pcsp--it'll be freed by the StartTask handler
73       }
74 }
75
76
77
78 BOOL CALLBACK Filesets_Clone_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
79 {
80    if (AfsAppLib_HandleHelp (IDD_SET_CLONE, hDlg, msg, wp, lp))
81       return TRUE;
82
83    if (msg == WM_INITDIALOG)
84       SetWindowLong (hDlg, DWL_USER, lp);
85
86    LPSET_CLONESYS_PARAMS pcsp = (LPSET_CLONESYS_PARAMS)GetWindowLong (hDlg, DWL_USER);
87
88    if (pcsp != NULL)
89       {
90       switch (msg)
91          {
92          case WM_INITDIALOG:
93             PropCache_Add (pcSET_CLONE, NULL, hDlg);
94             Filesets_Clone_OnInitDialog (hDlg, pcsp);
95             break;
96
97          case WM_COMMAND:
98             switch (LOWORD(wp))
99                {
100                case IDOK:
101                case IDCANCEL:
102                   EndDialog (hDlg, LOWORD(wp));
103                   break;
104                }
105             break;
106
107          case WM_DESTROY:
108             PropCache_Delete (pcSET_CLONE, NULL);
109             break;
110          }
111       }
112
113    return FALSE;
114 }
115
116
117 void Filesets_Clone_OnInitDialog (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp)
118 {
119    TCHAR szServer[ cchNAME ];
120    TCHAR szAggregate[ cchNAME ];
121    TCHAR szFileset[ cchNAME ];
122    pcsp->lpi->GetServerName (szServer);
123    pcsp->lpi->GetAggregateName (szAggregate);
124    pcsp->lpi->GetFilesetName (szFileset);
125
126    TCHAR szText[ cchRESOURCE ];
127    GetDlgItemText (hDlg, IDC_CLONE_DESC, szText, cchRESOURCE);
128
129    LPTSTR pszText = FormatString (szText, TEXT("%s%s%s"), szServer, szAggregate, szFileset);
130    SetDlgItemText (hDlg, IDC_CLONE_DESC, pszText);
131    FreeString (pszText);
132 }
133
134
135 BOOL CALLBACK Filesets_Clonesys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
136 {
137    if (AfsAppLib_HandleHelp (IDD_SET_CLONESYS, hDlg, msg, wp, lp))
138       return TRUE;
139
140    if (msg == WM_INITDIALOG)
141       SetWindowLong (hDlg, DWL_USER, lp);
142
143    LPSET_CLONESYS_PARAMS pcsp = (LPSET_CLONESYS_PARAMS)GetWindowLong (hDlg, DWL_USER);
144
145    if (pcsp != NULL)
146       {
147       switch (msg)
148          {
149          case WM_INITDIALOG:
150             PropCache_Add (pcSET_CLONE, NULL, hDlg);
151             Filesets_Clonesys_OnInitDialog (hDlg, pcsp);
152             break;
153
154          case WM_ENDTASK:
155             LPTASKPACKET ptp;
156             if ((ptp = (LPTASKPACKET)lp) != NULL)
157                {
158                if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX)
159                   {
160                   Filesets_Clonesys_OnEndTask_EnumServers (hDlg, pcsp);
161                   }
162                else if (ptp->idTask == taskAGG_ENUM_TO_COMBOBOX)
163                   {
164                   Filesets_Clonesys_OnEndTask_EnumAggregs (hDlg, pcsp);
165                   }
166                FreeTaskPacket (ptp);
167                }
168             break;
169
170          case WM_COMMAND:
171             switch (LOWORD(wp))
172                {
173                case IDOK:
174                   Filesets_Clonesys_OnOK (hDlg, pcsp);
175                   EndDialog (hDlg, IDOK);
176                   break;
177
178                case IDCANCEL:
179                   EndDialog (hDlg, IDCANCEL);
180                   break;
181
182                case IDC_CLONE_ALL:
183                case IDC_CLONE_SOME:
184                case IDC_CLONE_SVR_LIMIT:
185                case IDC_CLONE_AGG_LIMIT:
186                case IDC_CLONE_PREFIX_LIMIT:
187                   Filesets_Clonesys_OnSelect (hDlg, pcsp);
188                   break;
189
190                case IDC_CLONE_SVR:
191                   if (HIWORD(wp) == CBN_SELCHANGE)
192                      {
193                      Filesets_Clonesys_OnSelectServer (hDlg, pcsp);
194                      }
195                   break;
196                }
197             break;
198
199          case WM_DESTROY:
200             PropCache_Delete (pcSET_CLONE, NULL);
201             break;
202          }
203       }
204
205    return FALSE;
206 }
207
208
209 void Filesets_Clonesys_OnInitDialog (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp)
210 {
211    CheckDlgButton (hDlg, IDC_CLONE_ALL,   pcsp->lpi->fIsCell());
212    CheckDlgButton (hDlg, IDC_CLONE_SOME, !pcsp->lpi->fIsCell());
213    CheckDlgButton (hDlg, IDC_CLONE_SVR_LIMIT, !pcsp->lpi->fIsCell());
214    CheckDlgButton (hDlg, IDC_CLONE_AGG_LIMIT, pcsp->lpi->fIsAggregate());
215
216    pcsp->fEnumedServers = FALSE;
217    pcsp->fEnumedAggregs = FALSE;
218    Filesets_Clonesys_OnSelect (hDlg, pcsp);
219
220    LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET);
221    lpp->hCombo = GetDlgItem (hDlg, IDC_CLONE_SVR);
222    lpp->lpiSelect = (pcsp->lpi && !pcsp->lpi->fIsCell()) ? pcsp->lpi->GetServer() : NULL;
223    StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp);
224 }
225
226
227 void Filesets_Clonesys_OnOK (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp)
228 {
229    if (IsDlgButtonChecked (hDlg, IDC_CLONE_ALL))
230       {
231       pcsp->lpi = g.lpiCell;
232       pcsp->fUsePrefix = FALSE;
233       pcsp->szPrefix[0] = TEXT('\0');
234       }
235    else // (IsDlgButtonChecked (hDlg, IDC_CLONE_SOME))
236       {
237       if (IsDlgButtonChecked (hDlg, IDC_CLONE_AGG_LIMIT))
238          pcsp->lpi = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_CLONE_AGG));
239       else if (IsDlgButtonChecked (hDlg, IDC_CLONE_SVR_LIMIT))
240          pcsp->lpi = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_CLONE_SVR));
241       else
242          pcsp->lpi = g.lpiCell;
243
244       pcsp->fUsePrefix = IsDlgButtonChecked (hDlg, IDC_CLONE_PREFIX_LIMIT);
245       GetDlgItemText (hDlg, IDC_CLONE_PREFIX, pcsp->szPrefix, MAX_PATH);
246
247       if (pcsp->fUsePrefix && (pcsp->szPrefix[0] == TEXT('!')))
248          {
249          TCHAR szPrefixNoBang[ cchRESOURCE ];
250          lstrcpy (szPrefixNoBang, &pcsp->szPrefix[1]);
251          lstrcpy (pcsp->szPrefix, szPrefixNoBang);
252          pcsp->fExcludePrefix = TRUE;
253          }
254       }
255 }
256
257
258 void Filesets_Clonesys_OnSelect (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp)
259 {
260    BOOL fCloneAll = (IsDlgButtonChecked (hDlg, IDC_CLONE_ALL)) ? TRUE : FALSE;
261
262    EnableWindow (GetDlgItem (hDlg, IDC_CLONE_SVR_LIMIT), !fCloneAll);
263    EnableWindow (GetDlgItem (hDlg, IDC_CLONE_AGG_LIMIT), !fCloneAll);
264    EnableWindow (GetDlgItem (hDlg, IDC_CLONE_PREFIX_LIMIT), !fCloneAll);
265
266    if (fCloneAll)
267       {
268       CheckDlgButton (hDlg, IDC_CLONE_SVR_LIMIT, FALSE);
269       CheckDlgButton (hDlg, IDC_CLONE_AGG_LIMIT, FALSE);
270       CheckDlgButton (hDlg, IDC_CLONE_PREFIX_LIMIT, FALSE);
271       }
272
273    BOOL fEnable;
274
275    fEnable = IsDlgButtonChecked (hDlg, IDC_CLONE_SVR_LIMIT) && pcsp->fEnumedServers;
276    EnableWindow (GetDlgItem (hDlg, IDC_CLONE_SVR), fEnable);
277
278    fEnable = IsDlgButtonChecked (hDlg, IDC_CLONE_SVR_LIMIT);
279    EnableWindow (GetDlgItem (hDlg, IDC_CLONE_AGG_LIMIT), fEnable);
280    if (!fEnable)
281       CheckDlgButton (hDlg, IDC_CLONE_AGG_LIMIT, FALSE);
282
283    fEnable &= IsDlgButtonChecked (hDlg, IDC_CLONE_AGG_LIMIT) && pcsp->fEnumedAggregs;
284    EnableWindow (GetDlgItem (hDlg, IDC_CLONE_AGG), fEnable);
285
286    fEnable = IsDlgButtonChecked (hDlg, IDC_CLONE_PREFIX_LIMIT);
287    EnableWindow (GetDlgItem (hDlg, IDC_CLONE_PREFIX), fEnable);
288
289    fEnable = TRUE;
290    if (IsDlgButtonChecked (hDlg, IDC_CLONE_SVR_LIMIT) && !pcsp->fEnumedServers)
291       fEnable = FALSE;
292    if (IsDlgButtonChecked (hDlg, IDC_CLONE_AGG_LIMIT) && !pcsp->fEnumedAggregs)
293       fEnable = FALSE;
294    EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
295 }
296
297
298 void Filesets_Clonesys_OnSelectServer (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp)
299 {
300    pcsp->fEnumedAggregs = FALSE;
301    Filesets_Clonesys_OnSelect (hDlg, pcsp);
302
303    LPAGG_ENUM_TO_COMBOBOX_PACKET lpp = New (AGG_ENUM_TO_COMBOBOX_PACKET);
304    lpp->hCombo = GetDlgItem (hDlg, IDC_CLONE_AGG);
305    lpp->lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_CLONE_SVR));
306    lpp->lpiSelect = (pcsp->lpi->fIsAggregate() && (pcsp->lpi->GetServer() == lpp->lpiServer)) ? pcsp->lpi : NULL;
307    StartTask (taskAGG_ENUM_TO_COMBOBOX, hDlg, lpp);
308 }
309
310
311 void Filesets_Clonesys_OnEndTask_EnumServers (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp)
312 {
313    pcsp->fEnumedServers = TRUE;
314    Filesets_Clonesys_OnSelectServer (hDlg, pcsp);
315 }
316
317
318 void Filesets_Clonesys_OnEndTask_EnumAggregs (HWND hDlg, LPSET_CLONESYS_PARAMS pcsp)
319 {
320    pcsp->fEnumedAggregs = TRUE;
321    Filesets_Clonesys_OnSelect (hDlg, pcsp);
322 }
323