#include <exec/types.h>
#include <exec/lists.h>
#include <exec/nodes.h>
#include <exec/memory.h>
#include <exec/ports.h>
#include <exec/tasks.h>
#include <exec/alerts.h>
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <exec/execbase.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <dos/dostags.h>
#include <dos/datetime.h>
#include <dos/rdargs.h>
#include <utility/tagitem.h>
#include <utility/hooks.h>

#include <clib/exec_protos.h>
extern struct ExecBase *SysBase;

#include <pragmas/exec_libcall_lib.h>

#include <clib/dos_protos.h>
extern struct DosLibrary *DOSBase;

#include <pragmas/dos_lib.h>
#pragma tagcall DOSBase FPrintf 162 32103

#include <clib/utility_protos.h>
extern struct Library *UtilityBase;

#include <pragmas/utility_lib.h>

#include <libraries/OwnDevUnit.h>

#define USE_BUILTIN_MATH TRUE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdarg.h>
#include <ctype.h>
#include <math.h>
#include <clib/alib_protos.h>
#include <clib/pools_protos.h>

LONG __stdargs kprintf(STRPTR fmt,...);

typedef struct {
	struct MinNode ph_Node;
	struct SignalSemaphore ph_Sema;
	struct List ph_LockList;
	LONG ph_LogLevel;
	LONG ph_LogRetries;
	STRPTR ph_LogProgram;
	STRPTR ph_LogService;
	STRPTR ph_LogWho;
	struct List ph_ConfigList;
	struct MinList ph_ServiceList;
	struct MinList ph_AliasList;
} PagerHandle_t;

typedef struct {
	STRPTR svc_Name;
	STRPTR svc_Phone;
	BOOL svc_Use8N1;
	UBYTE svc_Password[16];
	ULONG svc_BaudRate;
	ULONG svc_MaxPageLen;
	BOOL svc_MultiBlock;
} PagerService_t;

typedef struct {
	struct MinNode psvc_Node;
	PagerHandle_t *psvc_Handle;
	ULONG psvc_UseCount;
	PagerService_t psvc_Service;
} PrivatePagerService_t;

typedef struct {
	STRPTR als_Name;
	STRPTR als_Service;
	STRPTR als_PIN;
	ULONG als_MaxMessageLen;
	ULONG als_MaxPageLen;	
} PagerAlias_t;

typedef struct {
	struct MinNode pals_Node;
	PagerHandle_t *pals_Handle;
	ULONG pals_UseCount;
	PagerAlias_t pals_Alias;
} PrivatePagerAlias_t;

typedef struct {
	struct Node ce_Node;
	PagerHandle_t *ce_Handle;
	ULONG ce_UseCount;
	UBYTE ce_Data[1];
} ConfigEntry_t;

/* global variables */

extern struct SignalSemaphore HandleListSema;
extern struct MinList HandleList;

extern struct SignalSemaphore poolSema;
extern APTR pool;

/* function prototypes */

void ULog(PagerHandle_t *ph, LONG level, STRPTR fmt, ...);

BOOL __saveds __asm LockFile(register __a0 PagerHandle_t *ph, register __a1 STRPTR fileName);
void __saveds __asm UnLockFile(register __a0 PagerHandle_t *ph, register __a1 STRPTR fileName);
void __saveds __asm UnLockFiles(register __a0 PagerHandle_t *ph);

void __saveds __asm FreePagerService(register __a0 PagerService_t *svc);

void __saveds __asm FreePagerAlias(register __a0 PagerAlias_t *als);

STRPTR __saveds __asm FindPagerConfig(register __a0 PagerHandle_t *ph, register __a1 STRPTR configEntryName);
STRPTR __saveds __asm FindPagerConfigDefault(register __a0 PagerHandle_t *ph, register __a1 STRPTR configEntryName, register __a2 STRPTR defValue);
void __saveds __asm FreePagerConfig(register __a0 STRPTR configEntry);
BOOL __saveds __asm PagerConfigYesNo(register __a0 STRPTR configEntry);

LONG __saveds __asm GetSequenceNumber(register __a0 PagerHandle_t *ph, register __d0 UWORD increment);
STRPTR __saveds __asm SequenceToName(register __a0 STRPTR buffer, register __d0 LONG sequenceNumber);

STRPTR __saveds __asm NameInSpool(register __a0 PagerHandle_t *ph, register __a1 STRPTR name);
void __saveds __asm FreeNameInSpool(register __a0 STRPTR name);
