2 * Copyright 2000, International Business Machines Corporation and others.
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
11 #include <afs/param.h>
15 #include <WINNT/afsclass.h>
20 * DEFINITIONS ________________________________________________________________
26 * VARIABLES __________________________________________________________________
32 * PROTOTYPES _________________________________________________________________
38 * ROUTINES ___________________________________________________________________
43 SERVICE::SERVICE (LPSERVER lpServerParent, LPTSTR pszName)
45 m_lpiServer = lpServerParent->GetIdentifier();
46 m_lpiCell = m_lpiCell;
49 lstrcpy (m_szName, pszName);
51 m_fStatusOutOfDate = TRUE;
52 memset (&m_ss, 0x00, sizeof(SERVICESTATUS));
56 SERVICE::~SERVICE (void)
63 void SERVICE::SendDeleteNotifications (void)
65 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
69 void SERVICE::Close (void)
75 LPIDENT SERVICE::GetIdentifier (void)
77 if (m_lpiThis == NULL)
79 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
80 m_lpiThis = New2 (IDENT,(this));
88 void SERVICE::Invalidate (void)
90 if (!m_fStatusOutOfDate)
92 m_fStatusOutOfDate = TRUE;
93 NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
98 BOOL SERVICE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
103 if (m_fStatusOutOfDate)
105 m_fStatusOutOfDate = FALSE;
108 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
111 if ((lpServer = OpenServer (&status)) == NULL)
117 if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL)
122 if (!lstrcmp (m_szName, TEXT("BOS")))
124 memset (&ss, 0x00, sizeof(SERVICESTATUS));
125 AfsClass_UnixTimeToSystemTime (&ss.timeLastStart, 0);
126 AfsClass_UnixTimeToSystemTime (&ss.timeLastStop, 0);
127 AfsClass_UnixTimeToSystemTime (&ss.timeLastFail, 0);
131 ss.type = SERVICETYPE_SIMPLE;
132 ss.state = SERVICESTATE_RUNNING;
137 wp.wpBosProcessInfoGet.hServer = hBOS;
138 wp.wpBosProcessInfoGet.pszService = m_szName;
140 if (!Worker_DoTask (wtaskBosProcessInfoGet, &wp, &status))
144 memcpy (&ss, &wp.wpBosProcessInfoGet.ss, sizeof(SERVICESTATUS));
146 // Get the service's current state
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;
154 ss.state = wp.wpBosProcessExecutionStateGet.state;
156 // Get the service's notifier
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);
164 // Get the service's parameters
166 ss.szParams[0] = TEXT('\0');
168 WORKERPACKET wpBegin;
169 wpBegin.wpBosProcessParameterGetBegin.hServer = hBOS;
170 wpBegin.wpBosProcessParameterGetBegin.pszService = m_szName;
171 if (Worker_DoTask (wtaskBosProcessParameterGetBegin, &wpBegin, &status))
175 TCHAR szParam[ 256 ];
177 wpNext.wpBosProcessParameterGetNext.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
178 wpNext.wpBosProcessParameterGetNext.pszParam = szParam;
180 if (!Worker_DoTask (wtaskBosProcessParameterGetNext, &wpNext, &status))
182 if (status == ADMITERATORDONE)
189 if (ss.szParams[0] != TEXT('\0'))
190 lstrcat (ss.szParams, TEXT(" "));
191 lstrcat (ss.szParams, szParam);
195 wpDone.wpBosProcessParameterGetDone.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
196 Worker_DoTask (wtaskBosProcessParameterGetDone, &wpDone);
199 // Strip trailing CR/LF characters
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');
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');
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');
217 memcpy (&m_ss, &ss, sizeof(SERVICESTATUS));
220 lpServer->CloseBosObject();
227 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
236 void SERVICE::GetName (LPTSTR pszName)
238 lstrcpy (pszName, m_szName);
242 LPCELL SERVICE::OpenCell (ULONG *pStatus)
244 return m_lpiCell->OpenCell (pStatus);
248 LPSERVER SERVICE::OpenServer (ULONG *pStatus)
250 return m_lpiServer->OpenServer (pStatus);
255 BOOL SERVICE::GetStatus (LPSERVICESTATUS lpss, BOOL fNotify, ULONG *pStatus)
257 if (!RefreshStatus (fNotify, pStatus))
260 memcpy (lpss, &m_ss, sizeof(SERVICESTATUS));
265 PVOID SERVICE::GetUserParam (void)
267 return GetIdentifier()->GetUserParam();
271 void SERVICE::SetUserParam (PVOID pUserNew)
273 GetIdentifier()->SetUserParam (pUserNew);