windows-file-versioning-20030619
[openafs.git] / src / WINNT / afsclass / c_svc.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/afsclass.h>
16 #include "internal.h"
17
18
19 /*
20  * DEFINITIONS ________________________________________________________________
21  *
22  */
23
24
25 /*
26  * VARIABLES __________________________________________________________________
27  *
28  */
29
30
31 /*
32  * PROTOTYPES _________________________________________________________________
33  *
34  */
35
36
37 /*
38  * ROUTINES ___________________________________________________________________
39  *
40  */
41
42
43 SERVICE::SERVICE (LPSERVER lpServerParent, LPTSTR pszName)
44 {
45    m_lpiServer = lpServerParent->GetIdentifier();
46    m_lpiCell = m_lpiCell;
47    m_lpiThis = NULL;
48
49    lstrcpy (m_szName, pszName);
50
51    m_fStatusOutOfDate = TRUE;
52    memset (&m_ss, 0x00, sizeof(SERVICESTATUS));
53 }
54
55
56 SERVICE::~SERVICE (void)
57 {
58    if (m_lpiThis)
59       m_lpiThis->m_cRef --;
60 }
61
62
63 void SERVICE::SendDeleteNotifications (void)
64 {
65    NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
66 }
67
68
69 void SERVICE::Close (void)
70 {
71    AfsClass_Leave();
72 }
73
74
75 LPIDENT SERVICE::GetIdentifier (void)
76 {
77    if (m_lpiThis == NULL)
78       {
79       if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
80          m_lpiThis = New2 (IDENT,(this));
81       m_lpiThis->m_cRef ++;
82       }
83
84    return m_lpiThis;
85 }
86
87
88 void SERVICE::Invalidate (void)
89 {
90    if (!m_fStatusOutOfDate)
91       {
92       m_fStatusOutOfDate = TRUE;
93       NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
94       }
95 }
96
97
98 BOOL SERVICE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
99 {
100    BOOL rc = TRUE;
101    DWORD status = 0;
102
103    if (m_fStatusOutOfDate)
104       {
105       m_fStatusOutOfDate = FALSE;
106
107       if (fNotify)
108          NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
109
110       LPSERVER lpServer;
111       if ((lpServer = OpenServer (&status)) == NULL)
112          rc = FALSE;
113       else
114          {
115          PVOID hCell;
116          PVOID hBOS;
117          if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL)
118             rc = FALSE;
119          else
120             {
121             SERVICESTATUS ss;
122             if (!lstrcmp (m_szName, TEXT("BOS")))
123                {
124                memset (&ss, 0x00, sizeof(SERVICESTATUS));
125                AfsClass_UnixTimeToSystemTime (&ss.timeLastStart, 0);
126                AfsClass_UnixTimeToSystemTime (&ss.timeLastStop, 0);
127                AfsClass_UnixTimeToSystemTime (&ss.timeLastFail, 0);
128                ss.nStarts = 1;
129                ss.dwErrLast = 0;
130                ss.dwSigLast = 0;
131                ss.type = SERVICETYPE_SIMPLE;
132                ss.state = SERVICESTATE_RUNNING;
133                }
134             else
135                {
136                WORKERPACKET wp;
137                wp.wpBosProcessInfoGet.hServer = hBOS;
138                wp.wpBosProcessInfoGet.pszService = m_szName;
139
140                if (!Worker_DoTask (wtaskBosProcessInfoGet, &wp, &status))
141                   rc = FALSE;
142                else
143                   {
144                   memcpy (&ss, &wp.wpBosProcessInfoGet.ss, sizeof(SERVICESTATUS));
145
146                   // Get the service's current state
147                   //
148                   wp.wpBosProcessExecutionStateGet.hServer = hBOS;
149                   wp.wpBosProcessExecutionStateGet.pszService = m_szName;
150                   wp.wpBosProcessExecutionStateGet.pszAuxStatus = ss.szAuxStatus;
151                   if (!Worker_DoTask (wtaskBosProcessExecutionStateGet, &wp, &status))
152                      ss.state = SERVICESTATE_STOPPED;
153                   else
154                      ss.state = wp.wpBosProcessExecutionStateGet.state;
155
156                   // Get the service's notifier
157                   //
158                   ss.szNotifier[0] = TEXT('\0');
159                   wp.wpBosProcessNotifierGet.hServer = hBOS;
160                   wp.wpBosProcessNotifierGet.pszService = m_szName;
161                   wp.wpBosProcessNotifierGet.pszNotifier = ss.szNotifier;;
162                   Worker_DoTask (wtaskBosProcessNotifierGet, &wp, &status);
163
164                   // Get the service's parameters
165                   //
166                   ss.szParams[0] = TEXT('\0');
167
168                   WORKERPACKET wpBegin;
169                   wpBegin.wpBosProcessParameterGetBegin.hServer = hBOS;
170                   wpBegin.wpBosProcessParameterGetBegin.pszService = m_szName;
171                   if (Worker_DoTask (wtaskBosProcessParameterGetBegin, &wpBegin, &status))
172                      {
173                      for (;;)
174                         {
175                         TCHAR szParam[ 256 ];
176                         WORKERPACKET wpNext;
177                         wpNext.wpBosProcessParameterGetNext.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
178                         wpNext.wpBosProcessParameterGetNext.pszParam = szParam;
179
180                         if (!Worker_DoTask (wtaskBosProcessParameterGetNext, &wpNext, &status))
181                            {
182                            if (status == ADMITERATORDONE)
183                               status = 0;
184                            else
185                               rc = FALSE;
186                            break;
187                            }
188
189                         if (ss.szParams[0] != TEXT('\0'))
190                            lstrcat (ss.szParams, TEXT(" "));
191                         lstrcat (ss.szParams, szParam);
192                         }
193
194                      WORKERPACKET wpDone;
195                      wpDone.wpBosProcessParameterGetDone.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
196                      Worker_DoTask (wtaskBosProcessParameterGetDone, &wpDone);
197                      }
198
199                   // Strip trailing CR/LF characters
200                   //
201                   size_t cch = lstrlen (ss.szAuxStatus);
202                   while (cch && (ss.szAuxStatus[ cch-1 ] == TEXT('\r') || ss.szAuxStatus[ cch-1 ] == TEXT('\n')))
203                      ss.szAuxStatus[ cch-- ] = TEXT('\0');
204
205                   cch = lstrlen (ss.szParams);
206                   while (cch && (ss.szParams[ cch-1 ] == TEXT('\r') || ss.szParams[ cch-1 ] == TEXT('\n')))
207                      ss.szParams[ cch-- ] = TEXT('\0');
208
209                   cch = lstrlen (ss.szNotifier);
210                   while (cch && (ss.szNotifier[ cch-1 ] == TEXT('\r') || ss.szNotifier[ cch-1 ] == TEXT('\n')))
211                      ss.szNotifier[ cch-- ] = TEXT('\0');
212                   }
213                }
214
215             if (rc)
216                {
217                memcpy (&m_ss, &ss, sizeof(SERVICESTATUS));
218                }
219
220             lpServer->CloseBosObject();
221             }
222
223          lpServer->Close();
224          }
225
226       if (fNotify)
227          NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
228       }
229
230    if (pStatus && !rc)
231       *pStatus = status;
232    return TRUE;
233 }
234
235
236 void SERVICE::GetName (LPTSTR pszName)
237 {
238    lstrcpy (pszName, m_szName);
239 }
240
241
242 LPCELL SERVICE::OpenCell (ULONG *pStatus)
243 {
244    return m_lpiCell->OpenCell (pStatus);
245 }
246
247
248 LPSERVER SERVICE::OpenServer (ULONG *pStatus)
249 {
250    return m_lpiServer->OpenServer (pStatus);
251 }
252
253
254
255 BOOL SERVICE::GetStatus (LPSERVICESTATUS lpss, BOOL fNotify, ULONG *pStatus)
256 {
257    if (!RefreshStatus (fNotify, pStatus))
258       return FALSE;
259
260    memcpy (lpss, &m_ss, sizeof(SERVICESTATUS));
261    return TRUE;
262 }
263
264
265 PVOID SERVICE::GetUserParam (void)
266 {
267    return GetIdentifier()->GetUserParam();
268 }
269
270
271 void SERVICE::SetUserParam (PVOID pUserNew)
272 {
273    GetIdentifier()->SetUserParam (pUserNew);
274 }
275