// // 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 #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; }