/* ----------------------------------------------------------------- */

/* clip.c - clipboard support code */

#include "general.h"

/* ----------------------------------------------------------------- */

#define C_COUNT 3

static UBYTE (*c_list[])(void) = {
         
         CreateClipPort,
         CreateClipRequest,
         OpenClipDevice

};

/* ----------------------------------------------------------------- */

struct MsgPort   *s_clip_port_p;

struct IOClipReq *s_clip_request_p;

static STACK     *s_resource_stack_p;



/* ----------------------------------------------------------------- */

UBYTE OpenClip(void)

{

UBYTE error_number=NO_ERROR;

if(!(s_resource_stack_p=CreateStack(void *))) error_number=NO_STACK; 
        
else  {

      /* attempt to allocate window resources... */

         error_number=AllocateResource(C_COUNT,c_list);                           

         if(!error_number)
         
            {
                           
                          
            }

     }

return(error_number);

} /* Logical end of this module */
  
/* ----------------------------------------------------------------- */

void CloseClip(void)

{  
        
while(!PopStack(s_resource_stack_p,g_function1)) g_function1(); 
 
       KillStack(s_resource_stack_p);
 
 
}
 
/* ----------------------------------------------------------------- */


UBYTE CreateClipPort(void)

{

UBYTE error_number=NO_ERROR;

if((s_clip_port_p=CreateMsgPort())==NULL) 


        error_number=ALLOCATION_ERROR;

else {
        
     g_function1=DeleteClipPort;
     
     PushStack(s_resource_stack_p,g_function1);

     }
         
return(error_number);

}

/* ----------------------------------------------------------------------- */

void DeleteClipPort(void)

{
        
DeleteMsgPort(s_clip_port_p);

}

/* ----------------------------------------------------------------------- */

UBYTE CreateClipRequest(void)
   
{

UBYTE error_number=NO_ERROR;

s_clip_request_p=(struct IOClipReq *) 
                   CreateIORequest(s_clip_port_p,sizeof(struct IOClipReq));

if (s_clip_request_p==NULL) error_number=ALLOCATION_ERROR;
                   
else {
          
      g_function1=DeleteClipRequest;
       
      PushStack(s_resource_stack_p,g_function1);

     }
        
return(error_number);
                
}

/* ----------------------------------------------------------------------- */

void DeleteClipRequest(void)

{

DeleteIORequest((struct IORequest *)s_clip_request_p);

}


/* ----------------------------------------------------------------------- */

UBYTE OpenClipDevice(void)

{

UBYTE error_number=NO_ERROR;


if((OpenDevice("clipboard.device",0,(struct IORequest *)s_clip_request_p,0))!=NULL) error_number=ALLOCATION_ERROR;

else {
        
      g_function1=CloseClipDevice;
       
      PushStack(s_resource_stack_p,g_function1);

     }
     
return(error_number);

}

/* ----------------------------------------------------------------------- */

void CloseClipDevice(void)

{

CloseDevice((struct IORequest *)s_clip_request_p); 
        
}

/* ----------------------------------------------------------------------- */
  
UBYTE WriteCurrentRecord(struct DatabaseHeader *header_p)

{

UBYTE i, field_length, newline, null, error_number=NO_ERROR;

ULONG count=0;

newline='\n';

null='\0';

s_clip_request_p->io_Offset=0; 

WriteToClip("FORM",4);

s_clip_request_p->io_Offset=8; /* allow space for chunksize */

error_number=WriteToClip("FTXT",4);

error_number=WriteToClip("CHRS",4);

s_clip_request_p->io_Offset=20; /* allow space for datasize */

for (i=0;i<g_database_header.dh_FieldCount;i++)

  {

  if(field_length=strlen(&g_current_node_p->ln_Field[i][0]))
  
     {
     
     error_number=WriteToClip(&g_current_node_p->ln_Field[i][0],(UBYTE)field_length);
     
     }
     
  error_number=WriteToClip(&newline,1); /* these are written for ALL fields */  
 
  }

count=s_clip_request_p->io_Offset-16; /* ie less the 4 iff fields */

if (s_clip_request_p->io_Offset & 1)  
   
    error_number=WriteToClip(&null,1); /* pad byte if needed */

s_clip_request_p->io_Offset=16;

error_number=WriteToClip((UBYTE *)&count,4); /* data size */

s_clip_request_p->io_Offset=4;

count+=12;

error_number=WriteToClip((UBYTE *)&count,4); /* data size */

s_clip_request_p->io_Command=CMD_UPDATE;

error_number=DoIO((struct IORequest *)s_clip_request_p);

return(error_number);

}

/* ----------------------------------------------------------------------- */
  
UBYTE WriteToClip(UBYTE *buffer_p, ULONG length)

{

UBYTE error_number=NO_ERROR;

s_clip_request_p->io_Command=CMD_WRITE;
   
s_clip_request_p->io_Data=(UBYTE *)buffer_p;

s_clip_request_p->io_Length=length;

error_number=DoIO((struct IORequest *)s_clip_request_p);

return(error_number);

}

/* ----------------------------------------------------------------------- */
