/* This is just plain clipboard handling */


#include "snap.h"

IMPORT struct IOClipReq *ClipReq;

ULONG ReadClip(ClipReq, Buf, BufSize, Action)
struct IOClipReq *ClipReq;
STRPTR Buf;
ULONG BufSize;
SHORT Action;
{ 
    ULONG Length;
    ClipReq->io_Command = CMD_READ;
    ClipReq->io_Data = Buf;
    ClipReq->io_Length = BufSize-1L;       /* space for '\0' */
    if (Action == CLIP_FIRST) { 
        ClipReq->io_Offset = 0L;
        ClipReq->io_ClipID = 0L;
    }
    DoIO(ClipReq);
    Length = ClipReq->io_Actual;
    Buf[Length] = '\0';
    if (Action == CLIP_LAST) { 
        ClipReq->io_Command = CMD_READ;
        ClipReq->io_Data = NULL;
        ClipReq->io_Length = 1L;
        DoIO(ClipReq);                    /* Null read to terminate */
    }
    return(Length);
}

VOID WriteClip(ClipReq, Buf, BufSize, Action)
struct IOClipReq *ClipReq;
STRPTR Buf;
ULONG BufSize;
SHORT Action;
{ 
    if (Action == CLIP_FIRST) { 
        ClipReq->io_Offset = 0L;
        ClipReq->io_ClipID = 0L;
    }
    ClipReq->io_Command = CMD_WRITE;
    ClipReq->io_Data = Buf;
    ClipReq->io_Length = BufSize;
    DoIO(ClipReq);
    if (Action == CLIP_LAST) { 
        ClipReq->io_Command = CMD_UPDATE;
        DoIO(ClipReq);
    }
}

VOID SaveClip(SnapSpace, SnapSize)
UBYTE *SnapSpace;
ULONG SnapSize;
{ 
    ULONG Len;
    WriteClip(ClipReq, "FORM", 4L, CLIP_FIRST);
    Len = SnapSize+12;
    WriteClip(ClipReq, &Len, 4L, CLIP_CONT);
    WriteClip(ClipReq, "FTXT", 4L, CLIP_CONT);
    WriteClip(ClipReq, "CHRS", 4L, CLIP_CONT);
    Len = SnapSize;
    WriteClip(ClipReq, &Len, 4L, CLIP_CONT);
    WriteClip(ClipReq, SnapSpace, Len, CLIP_LAST);
}

UBYTE *FetchClip()
{ 
    UBYTE *SnapSpace = NULL;
    ULONG SnapSize;
    ULONG ID[2];
    (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_FIRST);    /* FORM */
    if (!strcmp((STRPTR)&ID, "FORM")) { 
        (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT);     /* size */
        (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT);     /* FTXT */
        if (!strcmp((STRPTR)&ID, "FTXT")) { 
            (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT);     /* CHRS */
            if (!strcmp((STRPTR)&ID, "CHRS")) { 
                (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT); /* #chars */
                SnapSize = ID[0];
                SnapSpace = AllocMem(SnapSize+5L, MEMF_PUBLIC|MEMF_CLEAR);
                *(ULONG *)SnapSpace = SnapSize+5L;               /* Save size */
                ReadClip(ClipReq, SnapSpace+4L, SnapSize+1L, CLIP_LAST);
            }
        }
    }
    return(SnapSpace);
}
