#include <proto/exec.h>
#include <exec/io.h>
#include <devices/clipboard.h>
#include <datatypes/textclass.h>

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "amiga/internal.h"

static struct IOClipReq *clipboardIO;

LONG CBOpen(LONG unit)
{
  struct MsgPort *m;
  LONG ret = FALSE;

  if((m = CreateMsgPort()))
  {
    if((clipboardIO = (struct IOClipReq *) CreateIORequest(m,
    sizeof(struct IOClipReq))))
    {
      if(!OpenDevice("clipboard.device", unit,
      (struct IORequest *) clipboardIO, 0))
        ret = TRUE;
      if(!ret)
        DeleteIORequest((struct IORequest *)clipboardIO);
    }
    if(!ret)
      DeleteMsgPort(m);
  }

  return ret;
}

void CBClose(void)
{
  if(clipboardIO)
  {
    CloseDevice((struct IORequest *)clipboardIO);
    DeleteMsgPort(clipboardIO->io_Message.mn_ReplyPort);
    DeleteIORequest((struct IORequest *)clipboardIO);
  }
}

void CBWrite(void *data, int length)
{
   clipboardIO->io_Command = CMD_WRITE;
   clipboardIO->io_Data = data;
   clipboardIO->io_Length = length;
   DoIO((struct IORequest *)clipboardIO);
}

void CBCut(double s)
{
  ULONG i, len;
  UBYTE buf[70];

  sprintf(buf, "%.15E", s);
  len = strlen(buf);

  clipboardIO->io_Offset = 0;
  clipboardIO->io_ClipID = 0;

  i = ID_FORM;
  CBWrite(&i, 4);

  i = len + 12;
  CBWrite(&i, 4);

  i = ID_FTXT;
  CBWrite(&i, 4);

  i = ID_CHRS;
  CBWrite(&i, 4);

  CBWrite(&len, 4);
  CBWrite(buf, len);

  clipboardIO->io_Command = CMD_UPDATE;
  DoIO((struct IORequest *)clipboardIO);
}

void CBRead(void *data, int length)
{
  clipboardIO->io_Command = CMD_READ;
  clipboardIO->io_Data = data;
  clipboardIO->io_Length = length;
  DoIO((struct IORequest *)clipboardIO);
}

BOOL CBPaste(double *s)
{
   int length;
   BOOL success = FALSE;
   ULONG check;

   clipboardIO->io_ClipID = 0;
   clipboardIO->io_Offset = 0;

   CBRead(&check, 4);
   if(check == ID_FORM)
   {
     CBRead(&check, 4);
     CBRead(&check, 4);
     if(check == ID_FTXT)
     {
       CBRead(&check, 4);
       if(check == ID_CHRS)
       {
         UBYTE string[70];

         CBRead(&length, 4);
         if(length > 69)
           length = 69;
	 CBRead(string, length);
	 string[length] = '\0';
	 *s = atof(string);
	 success = TRUE;
       }
     }
   }

   while(clipboardIO->io_Actual != 0)
      CBRead(NULL, 1 << 30);

   return(success);
}
