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
14 #include <afs/param.h>
18 #include <WINNT/afsclass.h>
23 * DEFINITIONS ________________________________________________________________
29 * VARIABLES __________________________________________________________________
35 * PROTOTYPES _________________________________________________________________
41 * ROUTINES ___________________________________________________________________
46 SERVICE::SERVICE (LPSERVER lpServerParent, LPTSTR pszName)
48 m_lpiServer = lpServerParent->GetIdentifier();
49 m_lpiCell = m_lpiCell;
52 lstrcpy (m_szName, pszName);
54 m_fStatusOutOfDate = TRUE;
55 memset (&m_ss, 0x00, sizeof(SERVICESTATUS));
59 SERVICE::~SERVICE (void)
66 void SERVICE::SendDeleteNotifications (void)
68 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
72 void SERVICE::Close (void)
78 LPIDENT SERVICE::GetIdentifier (void)
80 if (m_lpiThis == NULL)
82 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
83 m_lpiThis = New2 (IDENT,(this));
91 void SERVICE::Invalidate (void)
93 if (!m_fStatusOutOfDate)
95 m_fStatusOutOfDate = TRUE;
96 NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
101 BOOL SERVICE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
106 if (m_fStatusOutOfDate)
108 m_fStatusOutOfDate = FALSE;
111 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
114 if ((lpServer = OpenServer (&status)) == NULL)
120 if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL)
125 if (!lstrcmp (m_szName, TEXT("BOS")))
127 memset (&ss, 0x00, sizeof(SERVICESTATUS));
128 AfsClass_UnixTimeToSystemTime (&ss.timeLastStart, 0);
129 AfsClass_UnixTimeToSystemTime (&ss.timeLastStop, 0);
130 AfsClass_UnixTimeToSystemTime (&ss.timeLastFail, 0);
134 ss.type = SERVICETYPE_SIMPLE;
135 ss.state = SERVICESTATE_RUNNING;
140 wp.wpBosProcessInfoGet.hServer = hBOS;
141 wp.wpBosProcessInfoGet.pszService = m_szName;
143 if (!Worker_DoTask (wtaskBosProcessInfoGet, &wp, &status))
147 memcpy (&ss, &wp.wpBosProcessInfoGet.ss, sizeof(SERVICESTATUS));
149 // Get the service's current state
151 wp.wpBosProcessExecutionStateGet.hServer = hBOS;
152 wp.wpBosProcessExecutionStateGet.pszService = m_szName;
153 wp.wpBosProcessExecutionStateGet.pszAuxStatus = ss.szAuxStatus;
154 if (!Worker_DoTask (wtaskBosProcessExecutionStateGet, &wp, &status))
155 ss.state = SERVICESTATE_STOPPED;
157 ss.state = wp.wpBosProcessExecutionStateGet.state;
159 // Get the service's notifier
161 ss.szNotifier[0] = TEXT('\0');
162 wp.wpBosProcessNotifierGet.hServer = hBOS;
163 wp.wpBosProcessNotifierGet.pszService = m_szName;
164 wp.wpBosProcessNotifierGet.pszNotifier = ss.szNotifier;;
165 Worker_DoTask (wtaskBosProcessNotifierGet, &wp, &status);
167 // Get the service's parameters
169 ss.szParams[0] = TEXT('\0');
171 WORKERPACKET wpBegin;
172 wpBegin.wpBosProcessParameterGetBegin.hServer = hBOS;
173 wpBegin.wpBosProcessParameterGetBegin.pszService = m_szName;
174 if (Worker_DoTask (wtaskBosProcessParameterGetBegin, &wpBegin, &status))
178 TCHAR szParam[ 256 ];
180 wpNext.wpBosProcessParameterGetNext.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
181 wpNext.wpBosProcessParameterGetNext.pszParam = szParam;
183 if (!Worker_DoTask (wtaskBosProcessParameterGetNext, &wpNext, &status))
185 if (status == ADMITERATORDONE)
192 if (ss.szParams[0] != TEXT('\0'))
193 lstrcat (ss.szParams, TEXT(" "));
194 lstrcat (ss.szParams, szParam);
198 wpDone.wpBosProcessParameterGetDone.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
199 Worker_DoTask (wtaskBosProcessParameterGetDone, &wpDone);
202 // Strip trailing CR/LF characters
204 size_t cch = lstrlen (ss.szAuxStatus);
205 while (cch && (ss.szAuxStatus[ cch-1 ] == TEXT('\r') || ss.szAuxStatus[ cch-1 ] == TEXT('\n')))
206 ss.szAuxStatus[ cch-- ] = TEXT('\0');
208 cch = lstrlen (ss.szParams);
209 while (cch && (ss.szParams[ cch-1 ] == TEXT('\r') || ss.szParams[ cch-1 ] == TEXT('\n')))
210 ss.szParams[ cch-- ] = TEXT('\0');
212 cch = lstrlen (ss.szNotifier);
213 while (cch && (ss.szNotifier[ cch-1 ] == TEXT('\r') || ss.szNotifier[ cch-1 ] == TEXT('\n')))
214 ss.szNotifier[ cch-- ] = TEXT('\0');
220 memcpy (&m_ss, &ss, sizeof(SERVICESTATUS));
223 lpServer->CloseBosObject();
230 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
239 void SERVICE::GetName (LPTSTR pszName)
241 lstrcpy (pszName, m_szName);
245 LPCELL SERVICE::OpenCell (ULONG *pStatus)
247 return m_lpiCell->OpenCell (pStatus);
251 LPSERVER SERVICE::OpenServer (ULONG *pStatus)
253 return m_lpiServer->OpenServer (pStatus);
258 BOOL SERVICE::GetStatus (LPSERVICESTATUS lpss, BOOL fNotify, ULONG *pStatus)
260 if (!RefreshStatus (fNotify, pStatus))
263 memcpy (lpss, &m_ss, sizeof(SERVICESTATUS));
268 PVOID SERVICE::GetUserParam (void)
270 return GetIdentifier()->GetUserParam();
274 void SERVICE::SetUserParam (PVOID pUserNew)
276 GetIdentifier()->SetUserParam (pUserNew);