185 lines
3.4 KiB
C++
185 lines
3.4 KiB
C++
//
|
|
// Copyright (C) 1993-1997 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// MODULE: nmmgr.cpp
|
|
//
|
|
// PURPOSE: Implements the body of the service.
|
|
//
|
|
// FUNCTIONS:
|
|
// MNMServiceStart(DWORD dwArgc, LPTSTR *lpszArgv);
|
|
// MNMServiceStop( );
|
|
//
|
|
// COMMENTS: The functions implemented in nmmgr.c are
|
|
// prototyped in nmmgr.h
|
|
//
|
|
//
|
|
// AUTHOR: Claus Giloi
|
|
//
|
|
|
|
#include <precomp.h>
|
|
|
|
#define NMSRVC_TEXT "SalemSrvc"
|
|
|
|
// DEBUG only -- Define debug zone
|
|
#ifdef DEBUG
|
|
HDBGZONE ghZone = NULL;
|
|
static PTCHAR rgZones[] = {
|
|
NMSRVC_TEXT,
|
|
"Warning",
|
|
"Trace",
|
|
"Function"
|
|
};
|
|
#endif // DEBUG
|
|
|
|
|
|
extern DWORD g_dwMainThreadID;
|
|
|
|
//
|
|
// FUNCTION: MNMServiceStart
|
|
//
|
|
// PURPOSE: Actual code of the service
|
|
// that does the work.
|
|
//
|
|
// PARAMETERS:
|
|
// dwArgc - number of command line arguments
|
|
// lpszArgv - array of command line arguments
|
|
//
|
|
// RETURN VALUE:
|
|
// none
|
|
//
|
|
// COMMENTS:
|
|
//
|
|
VOID MNMServiceStart (DWORD dwArgc, LPTSTR *lpszArgv)
|
|
{
|
|
HRESULT hRet;
|
|
DWORD dwResult;
|
|
MSG msg;
|
|
DWORD dwError = NO_ERROR;
|
|
int i;
|
|
|
|
// Initialization
|
|
DBGINIT(&ghZone, rgZones);
|
|
InitDebugModule(NMSRVC_TEXT);
|
|
|
|
g_dwMainThreadID = GetCurrentThreadId();
|
|
|
|
DebugEntry(MNMServiceStart);
|
|
|
|
//
|
|
// report the status to the service control manager.
|
|
//
|
|
if (!ReportStatusToSCMgr( SERVICE_START_PENDING, NO_ERROR, 30000))
|
|
{
|
|
ERROR_OUT(("ReportStatusToSCMgr failed"));
|
|
dwError = GetLastError();
|
|
goto cleanup;
|
|
}
|
|
|
|
CoInitialize(NULL);
|
|
|
|
SetConsoleCtrlHandler(ServiceCtrlHandler, TRUE);
|
|
|
|
////////////////////////////////////////////////////////
|
|
//
|
|
// Service is now running, perform work until shutdown
|
|
//
|
|
|
|
if (!MNMServiceActivate())
|
|
{
|
|
ERROR_OUT(("Unable to activate service"));
|
|
goto cleanup;
|
|
}
|
|
|
|
while (GetMessage(&msg, NULL, 0, 0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
cleanup:
|
|
|
|
MNMServiceDeActivate();
|
|
|
|
DebugExitVOID(MNMServiceStart);
|
|
|
|
CoUninitialize();
|
|
|
|
g_dwMainThreadID = 0;
|
|
|
|
DBGDEINIT(&ghZone);
|
|
ExitDebugModule();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL MNMServiceActivate ( VOID )
|
|
{
|
|
DebugEntry(MNMServiceActivate);
|
|
|
|
|
|
HRESULT hRet = InitConfMgr();
|
|
if (FAILED(hRet))
|
|
{
|
|
ERROR_OUT(("ERROR %x initializing nmmanger", hRet));
|
|
return FALSE;
|
|
}
|
|
|
|
AddTaskbarIcon();
|
|
ReportStatusToSCMgr( SERVICE_RUNNING, NO_ERROR, 0);
|
|
|
|
DebugExitBOOL(MNMServiceActivate,TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL MNMServiceDeActivate ( VOID )
|
|
{
|
|
DebugEntry(MNMServiceDeActivate);
|
|
|
|
RemoveTaskbarIcon();
|
|
|
|
ReportStatusToSCMgr(SERVICE_PAUSED, NO_ERROR, 0);
|
|
|
|
//
|
|
// Leave Conference
|
|
//
|
|
|
|
if (NULL != g_pConference)
|
|
{
|
|
if ( FAILED(g_pConference->Leave()))
|
|
{
|
|
ERROR_OUT(("Conference Leave failed"));;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Free the conference
|
|
//
|
|
|
|
FreeConference();
|
|
|
|
//
|
|
// Free the AS interface
|
|
//
|
|
|
|
ASSERT(g_pAS);
|
|
UINT ret = g_pAS->Release();
|
|
g_pAS = NULL;
|
|
TRACE_OUT(("AS interface freed, ref %d after Release", ret));
|
|
|
|
|
|
// not to call FreeConfMfr imediately after FreeConference to avoid
|
|
// a bug in t120 will remove this sleep call after fix the bug in t120
|
|
FreeConfMgr();
|
|
|
|
ReportStatusToSCMgr( SERVICE_STOPPED, 0, 0);
|
|
|
|
DebugExitBOOL(MNMServiceDeActivate,TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|