/*
 * Services.exe - include file
 *
 * Copyright 2007 Google (Mikolaj Zalewski)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef WINE_PROGRAMS_UTILS_H_
#define WINE_PROGRAMS_UTILS_H_

#include "wine/list.h"

struct scmdatabase
{
    HKEY root_key;
    LONG service_start_lock;
    struct list processes;
    struct list services;
    CRITICAL_SECTION cs;
};

struct process_entry
{
    struct list entry;
    struct scmdatabase *db;
    LONG ref_count;
    HANDLE process;
    HANDLE control_mutex;
    HANDLE control_pipe;
    HANDLE overlapped_event;
    HANDLE status_changed_event;
};

struct service_entry
{
    struct list entry;
    struct scmdatabase *db;
    LONG ref_count;                    /* number of references - if goes to zero and the service is deleted the structure will be freed */
    LPWSTR name;
    SERVICE_STATUS_PROCESS status;
    QUERY_SERVICE_CONFIGW config;
    DWORD preshutdown_timeout;
    LPWSTR description;
    LPWSTR dependOnServices;
    LPWSTR dependOnGroups;
    struct process_entry *process;
    BOOL force_shutdown;
    BOOL marked_for_delete;
    BOOL is_wow64;
};

extern struct scmdatabase *active_database;

/* SCM database functions */

struct service_entry *scmdatabase_find_service(struct scmdatabase *db, LPCWSTR name);
struct service_entry *scmdatabase_find_service_by_displayname(struct scmdatabase *db, LPCWSTR name);
DWORD scmdatabase_add_service(struct scmdatabase *db, struct service_entry *entry);

DWORD scmdatabase_lock_startup(struct scmdatabase *db);
void scmdatabase_unlock_startup(struct scmdatabase *db);

void scmdatabase_lock(struct scmdatabase *db);
void scmdatabase_unlock(struct scmdatabase *db);

/* Service functions */

DWORD service_create(LPCWSTR name, struct service_entry **entry);
BOOL validate_service_name(LPCWSTR name);
BOOL validate_service_config(struct service_entry *entry);
DWORD save_service_config(struct service_entry *entry);
void free_service_entry(struct service_entry *entry);
void release_service(struct service_entry *service);
void service_lock(struct service_entry *service);
void service_unlock(struct service_entry *service);
DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *service_argv);
void service_terminate(struct service_entry *service);

/* Process functions */

struct process_entry *grab_process(struct process_entry *process);
void release_process(struct process_entry *process);
BOOL process_send_command(struct process_entry *process, const void *data, DWORD size, DWORD *result);
void process_terminate(struct process_entry *process);

extern HANDLE g_hStartedEvent;

extern DWORD service_pipe_timeout;
extern DWORD service_kill_timeout;

DWORD RPC_Init(void);
DWORD events_loop(void);

/* from utils.c */
LPWSTR strdupW(LPCWSTR str);

BOOL check_multisz(LPCWSTR lpMultiSz, DWORD cbSize);

DWORD load_reg_string(HKEY hKey, LPCWSTR szValue, BOOL bExpand, LPWSTR *output);
DWORD load_reg_multisz(HKEY hKey, LPCWSTR szValue, BOOL bAllowSingle, LPWSTR *output);
DWORD load_reg_dword(HKEY hKey, LPCWSTR szValue, DWORD *output);

static inline LPCWSTR get_display_name(struct service_entry *service)
{
    return service->config.lpDisplayName ? service->config.lpDisplayName : service->name;
}

static inline BOOL is_marked_for_delete(struct service_entry *service)
{
    return service->marked_for_delete;
}

static inline DWORD mark_for_delete(struct service_entry *service)
{
    service->marked_for_delete = TRUE;
    return ERROR_SUCCESS;
}

#endif /*WINE_PROGRAMS_UTILS_H_*/
