/**
 * PdaLink -- Connect Palm with Amiga
 *
 * Global header file
 *
 * (C) 1998-2000 Richard Körber <rkoerber@gmx.de>
 *
 *------------------------------------------------------------------
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * any later version.
 *
 * 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * You must not use this source code to gain profit of any kind!
 */


#ifndef PDALINK_GLOB_H
#define PDALINK_GLOB_H

//#define DEBUGOUT                /* Debug output? */

//#define SERDEBUG                /* Debug: Serial interface */
//#define SLPDEBUG                /* Debug: Serial Link Protocol */
//#define PADPDEBUG               /* Debug: Packet Assembly Disassembly Protocol */
//#define APIDEBUG                /* Debug: API */
//#define DLPDEBUG                /* Debug: DLP */
//#define FILEDEBUG               /* Debug: File */

#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/utility_protos.h>
#include <clib/rexxsyslib_protos.h>
//#include <clib/pdalink_protos.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/dos_pragmas.h>
#include <pragmas/utility_pragmas.h>
#include <pragmas/rexxsyslib_pragmas.h>
//#include <pragmas/pdalink_pragmas.h>

#include <exec/memory.h>
#include <exec/libraries.h>
#include <exec/semaphores.h>
#include <utility/tagitem.h>
#include <rexx/rxslib.h>
#include <rexx/errors.h>
#include <dos/dos.h>
#include <dos/dosasl.h>

#include "pdalink.h"
#include "pdalink_private.h"

#define max(a,b) ((a)>(b) ? (a) : (b))
#define min(a,b) ((a)<(b) ? (a) : (b))


struct Global
{
  UBYTE *slptrash;          /* Trash buffer for SLP */
  struct SignalSemaphore rexxHandleSemaphore;
  struct List rexxHandles;
  BOOL rexxHandleOK;
};

/*
**  P R O T O T Y P E S
*/
/*-- PL_Init.c --*/
extern struct DOSBase       *DOSBase;
extern struct Library       *UtilityBase;
extern struct Library       *SysBase;
extern struct Library       *RexxSysBase;
extern struct Library       *PdalinkBase;
extern struct Global         global;

/*-- PL_Socket.c --*/
extern __saveds __asm APTR PL_OpenSocket(register __a0 struct TagItem *taglist);
extern __saveds __asm int PL_Accept(register __a0 APTR socket, register __d0 ULONG timeout);
extern __saveds __asm int PL_Connect(register __a0 APTR socket);
extern __saveds __asm LONG PL_LastError(register __a0 APTR socket);
extern __saveds __asm ULONG PL_GetBaudRate(register __a0 APTR socket);
extern __saveds __asm LONG PL_Read(register __a0 APTR socket, register __a1 APTR buffer, register __d0 LONG size);
extern __saveds __asm LONG PL_Write(register __a0 APTR socket, register __a1 APTR buffer, register __d0 LONG size);
extern __saveds __asm LONG PL_Tickle(register __a0 APTR socket);
extern __saveds __asm void PL_CloseSocket(register __a0 APTR socket);
extern __saveds __asm void PL_Explain(register __a0 LONG error, register __a1 STRPTR buffer, register __d0 ULONG length);

/*-- PL_Serial.c --*/
extern int OpenPalmSerial(struct PL_Socket *sock, STRPTR device, ULONG unit, ULONG baud);
extern void ClosePalmSerial(struct PL_Socket *sock);
extern __saveds __asm int PL_RawSetRate(register __a0 APTR socket, register __d0 ULONG baud);
extern __saveds __asm LONG PL_RawRead(register __a0 APTR socket, register __a1 APTR buffer, register __d0 LONG length);
extern __saveds __asm LONG PL_RawWrite(register __a0 APTR socket, register __a1 APTR buffer, register __d0 LONG length);
extern __saveds __asm int PL_RawFlush(register __a0 APTR socket);

/*-- PL_SLP.c --*/
extern __saveds __asm LONG PL_SLPWrite(register __a0 APTR socket, register __a1 APTR buffer, register __d0 LONG length, register __a2 struct PL_SLP_Header *header, register __a3 struct PL_PADP_Header *padp);
extern __saveds __asm LONG PL_SLPRead(register __a0 APTR socket, register __a1 APTR buffer, register __d0 LONG length, register __a2 struct PL_SLP_Header *header, register __a3 struct PL_PADP_Header *padp);

/*-- PL_PADP.c --*/
extern __saveds __asm LONG PL_PADPWrite(register __a0 APTR socket, register __a1 APTR buffer, register __d0 LONG length, register __d1 UWORD type);
extern __saveds __asm LONG PL_PADPRead(register __a0 APTR socket, register __a1 APTR buffer, register __d0 LONG length);

/*-- PL_CMP.c --*/
extern __saveds __asm int PL_CMPAbort(register __a0 APTR socket, register __d0 UBYTE reason);
extern __saveds __asm int PL_CMPInit(register __a0 APTR socket, register __d0 ULONG rate);
extern __saveds __asm int PL_CMPWakeUp(register __a0 APTR socket, register __d0 ULONG maxrate);
extern __saveds __asm int PL_CMPRead(register __a0 APTR socket, register __d0 struct PL_CMP *cmp);

/*-- PL_DLP.c --*/
extern __saveds __asm void PL_DLPInit(register __a0 APTR socket);
extern __saveds __asm LONG PL_DLPWriteByte(register __a0 APTR socket, register __d0 BYTE bdata);
extern __saveds __asm LONG PL_DLPWriteWord(register __a0 APTR socket, register __d0 WORD wdata);
extern __saveds __asm LONG PL_DLPWriteLong(register __a0 APTR socket, register __d0 LONG ldata);
extern __saveds __asm LONG PL_DLPWrite(register __a0 APTR socket, register __a1 APTR packet, register __d0 LONG length);
extern __saveds __asm LONG PL_DLPSend(register __a0 APTR socket, register __d0 UBYTE cmd, register __d1 UBYTE arg);
extern __saveds __asm LONG PL_DLPRead(register __a0 APTR socket, register __a1 APTR buffer, register __d0 LONG length);
extern __saveds __asm int DLP_OpenConduit(register __a0 APTR socket);
extern __saveds __asm int DLP_EndOfSync(register __a0 APTR socket, register __d0 UWORD status);
extern __saveds __asm int DLP_GetSysTime(register __a0 APTR socket, register __a1 struct DLP_SysTime *time);
extern __saveds __asm int DLP_SetSysTime(register __a0 APTR socket, register __a1 struct DLP_SysTime *time);
extern __saveds __asm int DLP_GetStorageInfo(register __a0 APTR socket, register __d0 UBYTE cardno, register __a1 struct DLP_StorageInfo *info);
extern __saveds __asm int DLP_GetSysInfo(register __a0 APTR socket, register __a1 struct DLP_SysInfo *info);
extern __saveds __asm int DLP_GetDBInfo(register __a0 APTR socket, register __d0 UBYTE cardno, register __d1 UBYTE flags, register __d2 UWORD start, register __a1 struct DLP_DBInfo *info);
extern __saveds __asm LONG DLP_OpenDB(register __a0 APTR socket, register __d0 UBYTE cardno, register __d1 UBYTE mode, register __a1 STRPTR name);
extern __saveds __asm int DLP_DeleteDB(register __a0 APTR socket, register __d0 UBYTE cardno, register __a1 STRPTR name);
extern __saveds __asm LONG DLP_CreateDB(register __a0 APTR socket, register __d0 UBYTE cardno, register __d1 ULONG creator, register __d2 ULONG type, register __d3 UWORD flags, register __d4 UWORD version, register __a1 STRPTR name);
extern __saveds __asm int DLP_CloseDB(register __a0 APTR socket, register __d0 LONG handle);
extern __saveds __asm int DLP_CloseAllDB(register __a0 APTR socket);
extern __saveds __asm int DLP_ResetSystem(register __a0 APTR socket);
extern __saveds __asm int DLP_AddSyncLogEntry(register __a0 APTR socket, register __a1 STRPTR entry);
extern __saveds __asm LONG DLP_CountDBEntries(register __a0 APTR socket, register __d0 LONG handle);
extern __saveds __asm int DLP_MoveCategory(register __a0 APTR socket, register __d0 LONG handle, register __d1 UBYTE oldcat, register __d2 UBYTE newcat);
extern __saveds __asm int DLP_SetUserInfo(register __a0 APTR socket, register __a1 struct DLP_UserInfo *user);
extern __saveds __asm int DLP_GetUserInfo(register __a0 APTR socket, register __a1 struct DLP_UserInfo *user);
extern __saveds __asm int DLP_SetNetSyncInfo(register __a0 APTR socket, register __a1 struct DLP_NetSyncInfo *netsync);
extern __saveds __asm int DLP_GetNetSyncInfo(register __a0 APTR socket, register __a1 struct DLP_NetSyncInfo *netsync);
extern __saveds __asm int DLP_ResetLastSyncPC(register __a0 APTR socket);
extern __saveds __asm int DLP_ResetDBIndex(register __a0 APTR socket, register __d0 LONG handle);
extern __saveds __asm LONG DLP_GetRecordIDList(register __a0 APTR socket, register __d0 LONG handle, register __d1 BOOL sort, register __d2 UWORD start, register __d3 UWORD max, register __a1 ULONG *ids);
extern __saveds __asm int DLP_WriteRecord(register __a0 APTR socket, register __d0 LONG handle, register __d1 UBYTE flags, register __d2 ULONG id, register __d3 UBYTE catid, register __a1 APTR buffer, register __d4 UWORD length, register __a2 ULONG *newid);
extern __saveds __asm int DLP_DeleteRecord(register __a0 APTR socket, register __d0 LONG handle, register __d1 BOOL all, register __d2 ULONG id);
extern __saveds __asm int DLP_DeleteCategory(register __a0 APTR socket, register __d0 LONG handle, register __d1 UBYTE category);
extern __saveds __asm LONG DLP_ReadResourceByType(register __a0 APTR socket, register __d0 LONG handle, register __d1 ULONG type, register __d2 UWORD id, register __a1 APTR buffer, register __a2 UWORD *index, register __a3 UWORD *size);
extern __saveds __asm LONG DLP_ReadResourceByIndex(register __a0 APTR socket, register __d0 LONG handle, register __d1 UWORD index, register __a1 APTR buffer, register __a2 ULONG *type, register __a3 UWORD *id, register __d2 UWORD *size);
extern __saveds __asm int DLP_WriteResource(register __a0 APTR socket, register __d0 LONG handle, register __d1 ULONG type, register __d2 UWORD id, register __a1 APTR buffer, register __d3 UWORD length);
extern __saveds __asm int DLP_DeleteResource(register __a0 APTR socket, register __d0 LONG handle, register __d1 BOOL all, register __d2 ULONG restype, register __d3 UWORD resid);
extern __saveds __asm LONG DLP_ReadAppBlock(register __a0 APTR socket, register __d0 LONG handle, register __d1 UWORD offset, register __a1 APTR buffer, register __d2 UWORD length);
extern __saveds __asm int DLP_WriteAppBlock(register __a0 APTR socket, register __d0 LONG handle, register __a1 APTR buffer, register __d1 UWORD length);
extern __saveds __asm LONG DLP_ReadSortBlock(register __a0 APTR socket, register __d0 LONG handle, register __d1 UWORD offset, register __a1 APTR buffer, register __d2 UWORD length);
extern __saveds __asm int DLP_WriteSortBlock(register __a0 APTR socket, register __d0 LONG handle, register __a1 APTR buffer, register __d1 UWORD length);
extern __saveds __asm int DLP_CleanUpDatabase(register __a0 APTR socket, register __d0 LONG handle);
extern __saveds __asm int DLP_ResetSyncFlags(register __a0 APTR socket, register __d0 LONG handle);
extern __saveds __asm LONG DLP_ReadNextCatRecord(register __a0 APTR socket, register __d0 LONG handle, register __d1 UBYTE cat, register __a1 APTR buffer, register __a2 ULONG *id, register __a3 UWORD *index, register __d2 UWORD *size, register __d3 UBYTE *attr);
extern __saveds __asm LONG DLP_ReadAppPreference(register __a0 APTR socket, register __d0 ULONG creator, register __d1 UWORD id, register __d2 BOOL backup, register __d3 UWORD maxsize, register __a1 APTR buffer, register __a2 UWORD *size, register __a3 UWORD *version);
extern __saveds __asm int DLP_WriteAppPreference(register __a0 APTR socket, register __d0 ULONG creator, register __d1 UWORD id, register __d2 BOOL backup, register __d3 UWORD version, register __a1 APTR buffer, register __d4 UWORD length);
extern __saveds __asm LONG DLP_ReadNextModifiedCatRecord(register __a0 APTR socket, register __d0 LONG handle, register __d1 UBYTE cat, register __a1 APTR buffer, register __a2 ULONG *id, register __a3 UWORD *index, register __d2 UWORD *size, register __d3 UBYTE *attr);
extern __saveds __asm LONG DLP_ReadRecordByID(register __a0 APTR socket, register __d0 LONG handle, register __d1 ULONG id, register __a1 APTR buffer, register __a2 UWORD *index, register __a3 UWORD *size, register __d2 UBYTE *attr, register __d3 UBYTE *cat);
extern __saveds __asm LONG DLP_ReadRecordByIndex(register __a0 APTR socket, register __d0 LONG handle, register __d1 UWORD index, register __a1 APTR buffer, register __a2 ULONG *id, register __a3 UWORD *size, register __d2 UBYTE *attr, register __d3 UBYTE *cat);
extern __saveds __asm LONG DLP_UnpackCategoryAppInfo(register __a0 struct PL_CategoryAppInfo *cai, register __a1 APTR record, register __d0 LONG length);
extern __saveds __asm LONG DLP_PackCategoryAppInfo(register __a0 struct PL_CategoryAppInfo *cai, register __a1 APTR record, register __d0 LONG length);

/*-- PL_File.c --*/
extern __saveds __asm APTR PL_FileOpen(register __a0 STRPTR name, register __a1 struct DLP_DBInfo *ndbinfo);
extern __saveds __asm int PL_FileClose(register __a0 APTR fh);
extern __saveds __asm struct DLP_DBInfo *PL_FileGetDBInfo(register __a0 APTR fh);
extern __saveds __asm int PL_FileSetDBInfo(register __a0 APTR fh, register __a1 struct DLP_DBInfo *dbinfo);
extern __saveds __asm APTR PL_FileGetAppInfo(register __a0 APTR fh, register __a1 ULONG *size);
extern __saveds __asm int PL_FileSetAppInfo(register __a0 APTR fh, register __a1 APTR appinfo, register __d0 ULONG size);
extern __saveds __asm APTR PL_FileGetSortInfo(register __a0 APTR fh, register __a1 ULONG *size);
extern __saveds __asm int PL_FileSetSortInfo(register __a0 APTR fh, register __a1 APTR sortinfo, register __d0 ULONG size);
extern __saveds __asm APTR PL_FileReadResource(register __a0 APTR fh, register __d0 UWORD ix, register __a1 ULONG *size, register __a2 ULONG *type, register __a3 UWORD *id);
extern __saveds __asm int PL_FileAddResource(register __a0 APTR fh, register __a1 APTR buffer, register __d0 ULONG size, register __d1 ULONG type, register __d2 UWORD id);
extern __saveds __asm APTR PL_FileReadRecord(register __a0 APTR fh, register __d0 UWORD ix, register __a1 ULONG *size, register __a2 UBYTE *attr, register __a3 ULONG *uid);
extern __saveds __asm APTR PL_FileReadRecordID(register __a0 APTR fh, register __d0 ULONG uid, register __a1 ULONG *size, register __a2 UBYTE *attr, register __a3 UWORD *ix);
extern __saveds __asm int PL_FileAddRecord(register __a0 APTR fh, register __a1 APTR buffer, register __d0 ULONG size, register __d1 UBYTE attr, register __d2 ULONG uid);
extern __saveds __asm int PL_FileUsedID(register __a0 APTR fh, register __d0 ULONG uid);
extern __saveds __asm int PL_FileRetrieve(register __a0 APTR fh, register __a1 APTR socket, register __d0 UBYTE cardno);
extern __saveds __asm int PL_FileInstall(register __a0 APTR fh, register __a1 APTR socket, register __d0 UBYTE cardno);
extern __saveds __asm int PL_FileMerge(register __a0 APTR fh, register __a1 APTR socket, register __d0 UBYTE cardno);

/*-- PL_ARexx.c --*/
extern __saveds __asm LONG RexxCmd(register __a0 struct RexxMsg *rxmsg, register __a1 struct RexxArg **rxarg);
extern __saveds __asm void PL_AddRexxHandle(register __a0 STRPTR name, register __a1 APTR handle);
extern __saveds __asm APTR PL_FindRexxHandle(register __a0 STRPTR name);
extern __saveds __asm void PL_DeleteRexxHandle(register __a0 STRPTR name);

#endif

