/*
 * Copyright (C) Tildeslash Ltd. All rights reserved.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License version 3.
 *
 * This program 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * In addition, as a special exception, the copyright holders give
 * permission to link the code of portions of this program with the
 * OpenSSL library under certain conditions as described in each
 * individual source file, and distribute linked combinations
 * including the two.
 *
 * You must obey the GNU Affero General Public License in all respects
 * for all of the code used other than OpenSSL.  
 */


#ifndef PROCESS_INCLUDED
#define PROCESS_INCLUDED
#include <sys/types.h>
#include "io/InputStream.h"
#include "io/OutputStream.h"

/**
 * A <b>Process</b> represent an operating system process. A new Process 
 * object is created via Command_execute(). 
 * 
 * The sub-process represented by this Process does not have its own terminal 
 * or console. All its standard I/O (i.e. stdin, stdout, stderr) operations 
 * will be redirected to the parent process where they can be accessed using 
 * the streams obtained using the methods Process_getOutputStream(), 
 * Process_getInputStream(), and Process_getErrorStream(). Your program can 
 * then use these streams to feed input to and get output from the sub-process.
 * 
 * The sub-process continues executing until it stops or until either 
 * Process_free() is called or it is terminated with either Process_terminate()
 * or Process_kill().
 *
 * <h4>Environment</h4>
 * The Process does <em>not</em> inherit the environment from the calling 
 * process and has only a spartan PATH set by default; defined by 
 * Command_Path. Clients should call Command_setEnv() to set environment 
 * variables as needed <em>before</em> calling Command_execute()
 *
 * @see Command.h
 * @see http://www.mmonit.com/
 * @file
 */


#define T Process_T
typedef struct T *T;


/**
 * Destroy a Process object and free allocated resources. Clients
 * should call this method when they are done with the Process object.
 * This method will kill the sub-process represented by this Process
 * object if it is still running and close down stdio to the sub-process.
 * @param P a Process object reference
 */
void Process_free(T *P);


/** @name Properties */
//@{

/**
 * Returns the user id of the sub-process
 * @param P A Process object
 * @return The user id the sub-process
 */
uid_t Process_getUid(T P);


/**
 * Returns the group id of the sub-process
 * @param P A Process object
 * @return The group id the sub-process
 */
gid_t Process_getGid(T P);


/**
 * Returns the Process timeout. 
 * @param P A Process object
 * @return The number of seconds this Process has until exit before
 * the <code>onTimeout</code> handler is called if it is defined for
 * the Command. 0 means that there is no timeout.
 */
int Process_getTimeout(T P);


/**
 * Returns the working directory of the Process
 * @param P A Process object
 * @return The Process working directory
 */
const char *Process_getDir(T P);


/**
 * Returns the Process's identification number
 * @param P A Process object
 * @return The process identification number of the sub-process
 */
pid_t Process_getPid(T P);


/**
 * Causes the current thread to wait, if necessary, until the sub-process
 * represented by this Process object has terminated. This method returns
 * immediately if the sub-process has already terminated. If the sub-process
 * has not yet terminated, the calling thread will be blocked until the 
 * sub-process exits. By convention, the value 0 indicates normal termination.
 * @param P A Process object
 * @return The exit status of the sub-process or -1 if an error occur. 
 * Investigate errno for a description of the error
 */
int Process_waitFor(T P);


/**
 * Returns the Process exit status. If the sub-process is still running, this 
 * method returns -1, otherwise the sub-process exit status. By convention, 
 * the value 0 indicates normal termination. 
 * @param P A Process object
 * @return The exit status of the sub-process or -1 if the sub-process is still
 * running.
 */
int Process_exitStatus(T P);


/**
 * Returns true if the sub-process is running otherwise false
 * @param P A Process object
 * @return True if Process is running otherwise false
 */
int Process_isRunning(T P);


/**
 * Returns the output stream connected to the normal input of the sub-process. 
 * Output to the stream is piped into the standard input of the process 
 * represented by this Process object. 
 * @param P A Process object
 * @return The output stream connected to the normal input of the sub-process.
 */
OutputStream_T Process_getOutputStream(T P);


/**
 * Returns the input stream connected to the normal output of the sub-process. 
 * The stream obtains data piped from the standard output of the process 
 * represented by this Process object.
 * @param P A Process object
 * @return The input stream connected to the normal output of the sub-process.
 */
InputStream_T Process_getInputStream(T P);


/**
 * Returns the input stream connected to the error output of the sub-process. 
 * The stream obtains data piped from the error output of the process 
 * represented by this Process object. 
 * @param P A Process object
 * @return The input stream connected to the error output of the sub-process.
 */
InputStream_T Process_getErrorStream(T P);


//@}


/**
 * Destroy the sub-process. The sub-process is destroyed by sending
 * it a termination signal (SIGTERM)
 * @param P A Process object
 */
void Process_terminate(T P);


/**
 * Kill the sub-process. The sub-process is destroyed by sending
 * it a termination signal (SIGKILL). While SIGTERM may be blocked
 * by a process, SIGKILL can not be blocked and will kill the process
 * @param P A Process object
 */
void Process_kill(T P);


#undef T
#endif

