/******************************************************************************
|* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|* PARTICULAR PURPOSE.
|* 
|* Copyright 1995-2005 Nero AG. All Rights Reserved.
|*-----------------------------------------------------------------------------
|* NeroSDK / NeroAPI
|*
|* PROGRAM: APIRoboControl.h
|*
|* PURPOSE: Robo handling for NeroAPI
******************************************************************************/
#ifndef APIROBOCONTROL_H
#define APIROBOCONTROL_H

/* This file is responsible for associating Robos with drives etc.
 * You can associate a Robo with a drive by using NeroAssociateRobo()
 * with a device handle of a recorder */

#ifdef __cplusplus
extern "C" {
#endif

#include "NeroAPI.h"

typedef enum
{
   NCT_PORT_SERIAL,
     NCT_PORT_PARALLEL,
     NCT_PORT_USB
}
NERO_COMMNODE_TYPE;

typedef enum
{
   NEROAPI_ROBO_OK=0,
     NEROAPI_ROBO_NOTFOUND=1,
	 NEROAPI_ROBO_NOTSUPPORTED=2
}
NEROAPI_ROBO_ERROR;

/* Callback for label printing. Will be called by NeroAPI when it
 * is time to print the label. Must return TRUE if label was printed
 * sucessfully, FALSE otherwise. 
 * This callback is called from *within* the NeroRobo driver thread
 * so no GUI interaction is usually allowed (spawning a new process is
 * ok, though). 
 * This callback mustn't return until the print job is done */
typedef BOOL(*NeroPrintLabelCallback_t)(void *data);

typedef struct
{
   char  nrdiIdentifier[256];
   DWORD nrdiVersionNumber;
   char  nrdiDLLName[256];
} NERO_ROBO_DRIVER_INFO;

typedef struct
{
   DWORD nrdisNumDevInfos; /* number of following entries */
   NERO_ROBO_DRIVER_INFO nrdiDevInfos[1];
} NERO_ROBO_DRIVER_INFOS;



NEROAPI_API NERO_ROBO_DRIVER_INFOS * NADLL_ATTR NeroGetAvailableRoboDrivers();

/* associate a robo of specified type connected to specified port
 * with a device handle.
 * For now, this function will always return NEROAPI_ROBO_OK
 * as it doesn't actually do anything with the robo.
 * You can pass NULL instead of a printcallback in which case
 * printing will be disabled */
NEROAPI_API NEROAPI_ROBO_ERROR NADLL_ATTR NeroAssociateRobo(NERO_DEVICEHANDLE aDeviceHandle,	
						 const char *robo_identifier,
						 NERO_COMMNODE_TYPE port,
						 int portnum,
						 NeroPrintLabelCallback_t printcallback,
						 void *printcallback_data);

/* The following declarations describe an interface to set runtime options for the robo,
 * that is settings the robo won't remember over sessions. With this interface, the generic
 * control flow of the robo can be set. The function below will return NEROAPI_ROBO_NOTSUPPORTED
 * if a specific control flow option is not supported by the robo or otherwise not available */

typedef enum
{
	NERO_ROBO_FLAG_CLEANUP,// set this to TRUE in order to have the Robo cleanup itself
		                   // like removing any remaining CDs from the trays etc.
						   // Note that the resulting behaviour may sometimes look like a bad 
						   // control flow (the robo will try to remove CDs where there aren't
						   // any and so on). So you shouldn't use this option unless you're
						   // cleaning up after a hard server crash or have another good reason
						   // to do so
	NERO_ROBO_INSERTCD_RETRIES // This flag specifies how often Nero is to try to insert another
							   // CD from the input tray if the CD in the drive is unwritable
							   // The current default value for the number of retries is 5,
							   // a value of 0 means to try indefinitely
} NERO_ROBO_FLAG;

NEROAPI_API NEROAPI_ROBO_ERROR NADLL_ATTR NeroSetRoboFlag(NERO_DEVICEHANDLE aDeviceHandle,
														  NERO_ROBO_FLAG  eRoboFlag,
														  int iRoboValue);

																	   

#ifdef __cplusplus
}
#endif

#endif // APIROBOCONTROL_H