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>
19 #include <WINNT/afsclass.h>
24 * DEFINITIONS ________________________________________________________________
30 * VARIABLES __________________________________________________________________
36 * PROTOTYPES _________________________________________________________________
42 * ROUTINES ___________________________________________________________________
47 SERVICE::SERVICE (LPSERVER lpServerParent
, LPTSTR pszName
)
49 m_lpiServer
= lpServerParent
->GetIdentifier();
50 m_lpiCell
= m_lpiCell
;
53 lstrcpy (m_szName
, pszName
);
55 m_fStatusOutOfDate
= TRUE
;
56 memset (&m_ss
, 0x00, sizeof(SERVICESTATUS
));
60 SERVICE::~SERVICE (void)
67 void SERVICE::SendDeleteNotifications (void)
69 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy
, GetIdentifier());
73 void SERVICE::Close (void)
79 LPIDENT
SERVICE::GetIdentifier (void)
81 if (m_lpiThis
== NULL
)
83 if ((m_lpiThis
= IDENT::FindIdent (this)) == NULL
)
84 m_lpiThis
= New2 (IDENT
,(this));
92 void SERVICE::Invalidate (void)
94 if (!m_fStatusOutOfDate
)
96 m_fStatusOutOfDate
= TRUE
;
97 NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate
, GetIdentifier());
102 BOOL
SERVICE::RefreshStatus (BOOL fNotify
, ULONG
*pStatus
)
107 if (m_fStatusOutOfDate
)
109 m_fStatusOutOfDate
= FALSE
;
112 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin
, GetIdentifier());
115 if ((lpServer
= OpenServer (&status
)) == NULL
)
121 if ((hBOS
= lpServer
->OpenBosObject (&hCell
, &status
)) == NULL
)
126 if (!lstrcmp (m_szName
, TEXT("BOS")))
128 memset (&ss
, 0x00, sizeof(SERVICESTATUS
));
129 AfsClass_UnixTimeToSystemTime (&ss
.timeLastStart
, 0);
130 AfsClass_UnixTimeToSystemTime (&ss
.timeLastStop
, 0);
131 AfsClass_UnixTimeToSystemTime (&ss
.timeLastFail
, 0);
135 ss
.type
= SERVICETYPE_SIMPLE
;
136 ss
.state
= SERVICESTATE_RUNNING
;
141 wp
.wpBosProcessInfoGet
.hServer
= hBOS
;
142 wp
.wpBosProcessInfoGet
.pszService
= m_szName
;
144 if (!Worker_DoTask (wtaskBosProcessInfoGet
, &wp
, &status
))
148 memcpy (&ss
, &wp
.wpBosProcessInfoGet
.ss
, sizeof(SERVICESTATUS
));
150 // Get the service's current state
152 wp
.wpBosProcessExecutionStateGet
.hServer
= hBOS
;
153 wp
.wpBosProcessExecutionStateGet
.pszService
= m_szName
;
154 wp
.wpBosProcessExecutionStateGet
.pszAuxStatus
= ss
.szAuxStatus
;
155 if (!Worker_DoTask (wtaskBosProcessExecutionStateGet
, &wp
, &status
))
156 ss
.state
= SERVICESTATE_STOPPED
;
158 ss
.state
= wp
.wpBosProcessExecutionStateGet
.state
;
160 // Get the service's notifier
162 ss
.szNotifier
[0] = TEXT('\0');
163 wp
.wpBosProcessNotifierGet
.hServer
= hBOS
;
164 wp
.wpBosProcessNotifierGet
.pszService
= m_szName
;
165 wp
.wpBosProcessNotifierGet
.pszNotifier
= ss
.szNotifier
;;
166 Worker_DoTask (wtaskBosProcessNotifierGet
, &wp
, &status
);
168 // Get the service's parameters
170 ss
.szParams
[0] = TEXT('\0');
172 WORKERPACKET wpBegin
;
173 wpBegin
.wpBosProcessParameterGetBegin
.hServer
= hBOS
;
174 wpBegin
.wpBosProcessParameterGetBegin
.pszService
= m_szName
;
175 if (Worker_DoTask (wtaskBosProcessParameterGetBegin
, &wpBegin
, &status
))
179 TCHAR szParam
[ 256 ];
181 wpNext
.wpBosProcessParameterGetNext
.hEnum
= wpBegin
.wpBosProcessParameterGetBegin
.hEnum
;
182 wpNext
.wpBosProcessParameterGetNext
.pszParam
= szParam
;
184 if (!Worker_DoTask (wtaskBosProcessParameterGetNext
, &wpNext
, &status
))
186 if (status
== ADMITERATORDONE
)
193 if (ss
.szParams
[0] != TEXT('\0'))
194 lstrcat (ss
.szParams
, TEXT(" "));
195 lstrcat (ss
.szParams
, szParam
);
199 wpDone
.wpBosProcessParameterGetDone
.hEnum
= wpBegin
.wpBosProcessParameterGetBegin
.hEnum
;
200 Worker_DoTask (wtaskBosProcessParameterGetDone
, &wpDone
);
203 // Strip trailing CR/LF characters
205 size_t cch
= lstrlen (ss
.szAuxStatus
);
206 while (cch
&& (ss
.szAuxStatus
[ cch
-1 ] == TEXT('\r') || ss
.szAuxStatus
[ cch
-1 ] == TEXT('\n')))
207 ss
.szAuxStatus
[ cch
-- ] = TEXT('\0');
209 cch
= lstrlen (ss
.szParams
);
210 while (cch
&& (ss
.szParams
[ cch
-1 ] == TEXT('\r') || ss
.szParams
[ cch
-1 ] == TEXT('\n')))
211 ss
.szParams
[ cch
-- ] = TEXT('\0');
213 cch
= lstrlen (ss
.szNotifier
);
214 while (cch
&& (ss
.szNotifier
[ cch
-1 ] == TEXT('\r') || ss
.szNotifier
[ cch
-1 ] == TEXT('\n')))
215 ss
.szNotifier
[ cch
-- ] = TEXT('\0');
221 memcpy (&m_ss
, &ss
, sizeof(SERVICESTATUS
));
224 lpServer
->CloseBosObject();
231 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd
, GetIdentifier(), ((rc
) ? 0 : status
));
240 void SERVICE::GetName (LPTSTR pszName
)
242 lstrcpy (pszName
, m_szName
);
246 LPCELL
SERVICE::OpenCell (ULONG
*pStatus
)
248 return m_lpiCell
->OpenCell (pStatus
);
252 LPSERVER
SERVICE::OpenServer (ULONG
*pStatus
)
254 return m_lpiServer
->OpenServer (pStatus
);
259 BOOL
SERVICE::GetStatus (LPSERVICESTATUS lpss
, BOOL fNotify
, ULONG
*pStatus
)
261 if (!RefreshStatus (fNotify
, pStatus
))
264 memcpy (lpss
, &m_ss
, sizeof(SERVICESTATUS
));
269 PVOID
SERVICE::GetUserParam (void)
271 return GetIdentifier()->GetUserParam();
275 void SERVICE::SetUserParam (PVOID pUserNew
)
277 GetIdentifier()->SetUserParam (pUserNew
);