/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _SERVICE_H_INCLUDED_
#define _SERVICE_H_INCLUDED_

__APXBEGIN_DECLS

typedef struct APXSERVENTRY {
    WCHAR   szServiceName[SIZ_RESLEN];
    WCHAR   szObjectName[SIZ_RESLEN];
    WCHAR   szServiceDescription[SIZ_DESLEN];
    LPQUERY_SERVICE_CONFIGW lpConfig;
    BOOL					bDelayedStart;
    SERVICE_STATUS          stServiceStatus;
    SERVICE_STATUS_PROCESS  stStatusProcess;

} APXSERVENTRY, *LPAPXSERVENTRY;


APXHANDLE   apxCreateService(APXHANDLE hPool, DWORD dwOptions,
                             BOOL bManagerMode);

BOOL        apxServiceOpen(APXHANDLE hService, LPCWSTR szServiceName, DWORD dwOptions);


BOOL        apxServiceSetNames(APXHANDLE hService, LPCWSTR szImagePath,
                               LPCWSTR szDisplayName, LPCWSTR szDescription,
                               LPCWSTR szUsername, LPCWSTR szPassword);

BOOL        apxServiceSetOptions(APXHANDLE hService, LPCWSTR lpDependencies,
                                 DWORD dwServiceType, DWORD dwStartType,
                                 BOOL bDelayedStart, DWORD dwErrorControl);

BOOL        apxServiceControl(APXHANDLE hService, DWORD dwControl, UINT uMsg,
                              LPAPXFNCALLBACK fnControlCallback,
                              LPVOID lpCbData);
BOOL        apxServiceCheckStop(APXHANDLE hService);
BOOL        apxServiceInstall(APXHANDLE hService, LPCWSTR szServiceName,
                              LPCWSTR szDisplayName, LPCWSTR szImagePath,
                              LPCWSTR lpDependencies, DWORD dwServiceType,
                              DWORD dwStartType);

LPAPXSERVENTRY  apxServiceEntry(APXHANDLE hService, BOOL bRequeryStatus);

/** Delete te service
 * Stops the service if running
 */
BOOL        apxServiceDelete(APXHANDLE hService);

DWORD       apxGetMaxServiceTimeout(APXHANDLE hPool);

__APXEND_DECLS

#endif /* _SERVICE_H_INCLUDED_ */
