nt-makefile-clean-targets-20010917
[openafs.git] / src / WINNT / afsapplib / al_error.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 <WINNT/afsapplib.h>
16
17 /*
18  * PROTOTYPES _________________________________________________________________
19  *
20  */
21
22 void cdecl vErrorDialog (BOOL fFatal, DWORD dwStatus, LONG idError, LPTSTR pszFmt, va_list arg);
23
24 BOOL CALLBACK Error_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
25
26 void OnCreateErrorDialog (WPARAM wp, LPARAM lp);
27
28
29 /*
30  * ERROR DIALOGS ______________________________________________________________
31  *
32  */
33
34 typedef struct
35    {
36    BOOL fFatal;
37    LPTSTR pszError;
38    DWORD dwError;
39    } ERRORPARAMS;
40
41 void cdecl ErrorDialog (DWORD dwStatus, LPTSTR pszError, LPTSTR pszFmt, ...)
42 {
43    va_list arg;
44    va_start (arg, pszFmt);
45    vErrorDialog (FALSE, dwStatus, (LONG)pszError, pszFmt, arg);
46 }
47
48 void cdecl ErrorDialog (DWORD dwStatus, int idsError, LPTSTR pszFmt, ...)
49 {
50    va_list arg;
51    va_start (arg, pszFmt);
52    vErrorDialog (FALSE, dwStatus, (LONG)idsError, pszFmt, arg);
53 }
54
55 void cdecl FatalErrorDialog (DWORD dwStatus, LPTSTR pszError, LPTSTR pszFmt, ...)
56 {
57    va_list arg;
58    va_start (arg, pszFmt);
59    vErrorDialog (TRUE, dwStatus, (LONG)pszError, pszFmt, arg);
60 }
61
62 void cdecl FatalErrorDialog (DWORD dwStatus, int idsError, LPTSTR pszFmt, ...)
63 {
64    va_list arg;
65    va_start (arg, pszFmt);
66    vErrorDialog (TRUE, dwStatus, (LONG)idsError, pszFmt, arg);
67 }
68
69
70 void cdecl vErrorDialog (BOOL fFatal, DWORD dwStatus, LONG idError, LPTSTR pszFmt, va_list arg)
71 {
72    ERRORPARAMS *lpep = New (ERRORPARAMS);
73    lpep->fFatal = fFatal;
74    lpep->pszError = vFormatString (idError, pszFmt, arg);
75    lpep->dwError = dwStatus;
76
77    if (!AfsAppLib_GetMainWindow())
78       {
79       OnCreateErrorDialog (0, (LPARAM)lpep);
80       }
81    else
82       {
83       PostMessage (AfsAppLib_GetMainWindow(), WM_CREATE_ERROR_DIALOG, 0, (LPARAM)lpep);
84       }
85 }
86
87
88 void ImmediateErrorDialog (DWORD dwStatus, int idsError, LPTSTR pszFmt, ...)
89 {
90    va_list arg;
91    va_start (arg, pszFmt);
92
93    ERRORPARAMS *lpep = New (ERRORPARAMS);
94    lpep->fFatal = FALSE;
95    lpep->pszError = vFormatString (idsError, pszFmt, arg);
96    lpep->dwError = dwStatus;
97
98    ModalDialogParam (IDD_APPLIB_ERROR, NULL, (DLGPROC)Error_DlgProc, (LPARAM)lpep);
99
100    FreeString (lpep->pszError);
101    Delete (lpep);
102 }
103
104 void ImmediateErrorDialog (DWORD dwStatus, LPTSTR pszError, LPTSTR pszFmt, ...)
105 {
106    va_list arg;
107    va_start (arg, pszFmt);
108
109    ERRORPARAMS *lpep = New (ERRORPARAMS);
110    lpep->fFatal = FALSE;
111    lpep->pszError = vFormatString (pszError, pszFmt, arg);
112    lpep->dwError = dwStatus;
113
114    ModalDialogParam (IDD_APPLIB_ERROR, NULL, (DLGPROC)Error_DlgProc, (LPARAM)lpep);
115
116    FreeString (lpep->pszError);
117    Delete (lpep);
118 }
119
120
121 void OnCreateErrorDialog (WPARAM wp, LPARAM lp)
122 {
123    ERRORPARAMS *lpep = (ERRORPARAMS*)lp;
124
125    ModalDialogParam (IDD_APPLIB_ERROR, NULL, (DLGPROC)Error_DlgProc, (LPARAM)lpep);
126
127    if (lpep->fFatal)
128       {
129       PostQuitMessage (0);
130       }
131
132    FreeString (lpep->pszError);
133    Delete (lpep);
134 }
135
136
137 BOOL CALLBACK Error_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
138 {
139    switch (msg)
140       {
141       case WM_INITDIALOG:
142          TCHAR szApplication[ cchNAME ];
143          AfsAppLib_GetAppName (szApplication);
144          if (szApplication[0] != TEXT('\0'))
145             {
146             TCHAR szTitle[ cchRESOURCE ];
147             GetWindowText (hDlg, szTitle, cchRESOURCE);
148             lstrcat (szTitle, TEXT(" - "));
149             lstrcat (szTitle, szApplication);
150             SetWindowText (hDlg, szTitle);
151             }
152
153          ERRORPARAMS *lpep;
154          if ((lpep = (ERRORPARAMS *)lp) == NULL)
155             {
156             TCHAR szError[ cchRESOURCE ];
157             AfsAppLib_TranslateError (szError, ERROR_NOT_ENOUGH_MEMORY);
158             SetDlgItemText (hDlg, IDC_ERROR_STATUS, szError);
159             }
160          else
161             {
162             SetDlgItemText (hDlg, IDC_ERROR_DESC, lpep->pszError);
163
164             if (lpep->dwError == 0)
165                {
166                RECT rDesc;
167                GetRectInParent (GetDlgItem (hDlg, IDC_ERROR_DESC), &rDesc);
168
169                RECT rStatus;
170                GetRectInParent (GetDlgItem (hDlg, IDC_ERROR_STATUS), &rStatus);
171
172                SetWindowPos (GetDlgItem (hDlg, IDC_ERROR_DESC), NULL,
173                              0, 0, cxRECT(rDesc), rStatus.bottom -rDesc.top,
174                              SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
175
176                ShowWindow (GetDlgItem (hDlg, IDC_ERROR_STATUS), SW_HIDE);
177                }
178             else
179                {
180                TCHAR szCode[ cchRESOURCE ];
181                GetDlgItemText (hDlg, IDC_ERROR_STATUS, szCode, cchRESOURCE);
182
183                LPTSTR pszStatus = FormatString (szCode, TEXT("%e"), lpep->dwError);
184                SetDlgItemText (hDlg, IDC_ERROR_STATUS, pszStatus);
185                FreeString (pszStatus);
186                }
187             }
188          break;
189
190       case WM_COMMAND:
191          switch (LOWORD(wp))
192             {
193             case IDOK:
194             case IDCANCEL:
195                EndDialog (hDlg, LOWORD(wp));
196                break;
197             }
198          break;
199       }
200
201    return FALSE;
202 }
203