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 <afsconfig.h>
15 #include <afs/param.h>
20 #include <WINNT/afsclass.h>
25 * DEFINITIONS ________________________________________________________________
31 * VARIABLES __________________________________________________________________
37 * PROTOTYPES _________________________________________________________________
43 * ROUTINES ___________________________________________________________________
48 SERVICE::SERVICE (LPSERVER lpServerParent, LPTSTR pszName)
50 m_lpiServer = lpServerParent->GetIdentifier();
51 m_lpiCell = m_lpiCell;
54 lstrcpy (m_szName, pszName);
56 m_fStatusOutOfDate = TRUE;
57 memset (&m_ss, 0x00, sizeof(SERVICESTATUS));
61 SERVICE::~SERVICE (void)
68 void SERVICE::SendDeleteNotifications (void)
70 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
74 void SERVICE::Close (void)
80 LPIDENT SERVICE::GetIdentifier (void)
82 if (m_lpiThis == NULL)
84 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
85 m_lpiThis = New2 (IDENT,(this));
93 void SERVICE::Invalidate (void)
95 if (!m_fStatusOutOfDate)
97 m_fStatusOutOfDate = TRUE;
98 NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
103 BOOL SERVICE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
108 if (m_fStatusOutOfDate)
110 m_fStatusOutOfDate = FALSE;
113 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
116 if ((lpServer = OpenServer (&status)) == NULL)
122 if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL)
127 if (!lstrcmp (m_szName, TEXT("BOS")))
129 memset (&ss, 0x00, sizeof(SERVICESTATUS));
130 AfsClass_UnixTimeToSystemTime (&ss.timeLastStart, 0);
131 AfsClass_UnixTimeToSystemTime (&ss.timeLastStop, 0);
132 AfsClass_UnixTimeToSystemTime (&ss.timeLastFail, 0);
136 ss.type = SERVICETYPE_SIMPLE;
137 ss.state = SERVICESTATE_RUNNING;
142 wp.wpBosProcessInfoGet.hServer = hBOS;
143 wp.wpBosProcessInfoGet.pszService = m_szName;
145 if (!Worker_DoTask (wtaskBosProcessInfoGet, &wp, &status))
149 memcpy (&ss, &wp.wpBosProcessInfoGet.ss, sizeof(SERVICESTATUS));
151 // Get the service's current state
153 wp.wpBosProcessExecutionStateGet.hServer = hBOS;
154 wp.wpBosProcessExecutionStateGet.pszService = m_szName;
155 wp.wpBosProcessExecutionStateGet.pszAuxStatus = ss.szAuxStatus;
156 if (!Worker_DoTask (wtaskBosProcessExecutionStateGet, &wp, &status))
157 ss.state = SERVICESTATE_STOPPED;
159 ss.state = wp.wpBosProcessExecutionStateGet.state;
161 // Get the service's notifier
163 ss.szNotifier[0] = TEXT('\0');
164 wp.wpBosProcessNotifierGet.hServer = hBOS;
165 wp.wpBosProcessNotifierGet.pszService = m_szName;
166 wp.wpBosProcessNotifierGet.pszNotifier = ss.szNotifier;;
167 Worker_DoTask (wtaskBosProcessNotifierGet, &wp, &status);
169 // Get the service's parameters
171 ss.szParams[0] = TEXT('\0');
173 WORKERPACKET wpBegin;
174 wpBegin.wpBosProcessParameterGetBegin.hServer = hBOS;
175 wpBegin.wpBosProcessParameterGetBegin.pszService = m_szName;
176 if (Worker_DoTask (wtaskBosProcessParameterGetBegin, &wpBegin, &status))
180 TCHAR szParam[ 256 ];
182 wpNext.wpBosProcessParameterGetNext.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
183 wpNext.wpBosProcessParameterGetNext.pszParam = szParam;
185 if (!Worker_DoTask (wtaskBosProcessParameterGetNext, &wpNext, &status))
187 if (status == ADMITERATORDONE)
194 if (ss.szParams[0] != TEXT('\0'))
195 lstrcat (ss.szParams, TEXT(" "));
196 lstrcat (ss.szParams, szParam);
200 wpDone.wpBosProcessParameterGetDone.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
201 Worker_DoTask (wtaskBosProcessParameterGetDone, &wpDone);
204 // Strip trailing CR/LF characters
206 size_t cch = lstrlen (ss.szAuxStatus);
207 while (cch && (ss.szAuxStatus[ cch-1 ] == TEXT('\r') || ss.szAuxStatus[ cch-1 ] == TEXT('\n')))
208 ss.szAuxStatus[ cch-- ] = TEXT('\0');
210 cch = lstrlen (ss.szParams);
211 while (cch && (ss.szParams[ cch-1 ] == TEXT('\r') || ss.szParams[ cch-1 ] == TEXT('\n')))
212 ss.szParams[ cch-- ] = TEXT('\0');
214 cch = lstrlen (ss.szNotifier);
215 while (cch && (ss.szNotifier[ cch-1 ] == TEXT('\r') || ss.szNotifier[ cch-1 ] == TEXT('\n')))
216 ss.szNotifier[ cch-- ] = TEXT('\0');
222 memcpy (&m_ss, &ss, sizeof(SERVICESTATUS));
225 lpServer->CloseBosObject();
232 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
241 void SERVICE::GetName (LPTSTR pszName)
243 lstrcpy (pszName, m_szName);
247 LPCELL SERVICE::OpenCell (ULONG *pStatus)
249 return m_lpiCell->OpenCell (pStatus);
253 LPSERVER SERVICE::OpenServer (ULONG *pStatus)
255 return m_lpiServer->OpenServer (pStatus);
260 BOOL SERVICE::GetStatus (LPSERVICESTATUS lpss, BOOL fNotify, ULONG *pStatus)
262 if (!RefreshStatus (fNotify, pStatus))
265 memcpy (lpss, &m_ss, sizeof(SERVICESTATUS));
270 PVOID SERVICE::GetUserParam (void)
272 return GetIdentifier()->GetUserParam();
276 void SERVICE::SetUserParam (PVOID pUserNew)
278 GetIdentifier()->SetUserParam (pUserNew);