/* libzzwin
 *
 * This program is distributed under the GNU General Public License, version 2.
 * A copy of this license is included with this source.
 *
 * Copyright 2000-2006, Toni Thomsson <toni@tonjac.org> 
*/

#ifndef zz_nt_service_h
#define zz_nt_service_h

#include <winsock2.h>
#include <zz_string.h>
#include <zz_log.h>
#include <zz_win_exception.h>
#include <windows.h>

/*
    Description:
    Basklass för NT-tjänster

    Remarks:
    Använd ej direkt: subklassa !

    Author: 
    Toni Thomsson, toni@tonjac.org

    Library:
    libzzwin.lib

    Platform:
    win32
*/
class ZZ_API CzzNTService
{
public:

    /* 
        Description:
        Skapar ett NT-tjänst objekt

        Remarks:
        Använd ej direkt: subklassa !

        Throws:
        CzzWinException

        Example:
        #include "myservice.h"

        void _CRTAPI1 main( int argc, char** argv )
        {
             try
             {
                CMyService my( "myservice", "myservice", "My service", "" );

                // Switch args...
                ...

                // Install service
                my.Install();
                return;

                ...

                // Remove service
                my.Remove();
                return;

                ...

                // Debug
                my.Debug( argc, argv );
                return;

                ...

                // Start service
                my.Start();

            }
            catch( CzzException& e )
            {
                ...
            }

        }   
    */
    CzzNTService( const char* appname,      // IN, applikationsnamn
                    const char* svc,        // IN, tjänstnamn
                    const char* args,       // IN, argument
                    const char* display,    // IN, beskrivnings text
                    const char* dep,        // IN, beroendesträng, se SDK
                    const char* descr,      // IN, beskrivningssträng
                    DWORD starttype );

    CzzNTService( const char* appname,      // IN, applikationsnamn
                    const char* svc,        // IN, tjänstnamn
                    const char* args,       // IN, argument
                    const char* display,    // IN, beskrivnings text
                    const char* dep,        // IN, beroendesträng, se SDK
                    const char* descr       // IN, beskrivningssträng
                    );

    CzzNTService( const char* appname,      // IN, applikationsnamn
                    const char* svc,        // IN, tjänstnamn
                    const char* args,       // IN, argument
                    const char* display,    // IN, beskrivnings text
                    const char* dep         // IN, beroendesträng, se SDK
                    );

    virtual ~CzzNTService();

    /*
        Description:
        Installerar tjänsten i windows registry

        Remarks:
        Överlagringsbar

        Throws:
        CzzWinException
    */
    virtual void Install( void );

    /*
        Description:
        Tar bort tjänsten från windows registry

        Remarks:
        Överlagringsbar

        Throws:
        CzzWinException
    */
    virtual void Remove( void );

    /*
        Description:
        Startar i "debug-läge" vanlig konsol

        Remarks:
        Överlagringsbar

        Throws:
        CzzWinException
    */
    virtual void Debug( int argc,       // IN, antal argument
                        char** argv     // IN, argumentlista
                        );

    /*
        Description:
        Startar tjänsten

        Remarks:
        Överlagringsbar

        Throws:
        CzzWinException
    */
    virtual void Start( void );

    // Description: Tjänstnamn
    CzzString& GetServiceName( void ) { return m_ServiceName; };
    
    // Description: Applikationsnamn
    CzzString& GetAppName( void ) { return m_AppName; };

    // Description: Tjänstestatus, se SDK
    SERVICE_STATUS& GetStatus( void ) { return m_Status; };

    // Description: Logg
    CzzLog& GetLog( void ) { return m_Log; };
        
    /*
        Description:
        Anropas när tjänsten startas

        Remarks:
        Överlagringsbar
    */
    virtual void OnStart( int argc,         // IN, antal argument
                            char** argv     // IN, argumentlista
                            );

    /*
        Description:
        Anropas när tjänsten stoppas

        Remarks:
        Överlagringsbar
    */
    virtual void OnStop( void );

    // Description: Rapporterar status till SCM
    void ReportStatus( DWORD state, DWORD exitcode, DWORD waithint );

    // Description: Registrerar tjänsten
    void Register( void );

protected:
    
    void Init( void );
    void Exit( void );

    SERVICE_STATUS m_Status;
    SERVICE_STATUS_HANDLE m_Handle;
    CzzLog m_Log;
    CzzString m_AppName;
    CzzString m_ServiceName;
    CzzString m_Args;
    CzzString m_DisplayName;
    CzzString m_Description;
    CzzString m_Dependencies;
    bool m_Debug;
    DWORD m_Error;
    DWORD m_CheckPoint;
    DWORD m_StartType;  
    HANDLE m_StopEvent;

private:
    
    static CzzNTService* m_pThis;

    static BOOL WINAPI ConsoleHandler( DWORD type );
    static VOID WINAPI ControlHandler( DWORD code );
    static void WINAPI Entrypoint( DWORD argc, LPSTR* argv );
};

#endif // zz_nt_service_h