/* C K O C O 5 . C */

/*
  Author: Frank da Cruz  (fdc@columbia.edu, FDCCU@CUVMA.BITNET),
            Columbia University Academic Information Systems, New York City.
          Jeffrey E Altman (jaltman@secure-endpoints.com)
            Secure Endpoints Inc., New York City

  Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New
  York.
*/

#ifndef NT
#include "ckcdeb.h"

#define INCL_WIN
#define INCL_VIO
#define INCL_ERRORS
#define INCL_DOSPROCESS
#define INCL_DOSSEMAPHORES
#define INCL_DOSDEVIOCTL
#define INCL_WINCLIPBOARD
#define INCL_DOSDATETIME
#define INCL_DOSMEMMGR
#include <os2.h>
#undef COMMENT                /* COMMENT is defined in os2.h */

#include "ckocon.h"
#include <stdio.h>
#include <stdlib.h>

extern int tnlm, tn_nlm;        /* Terminal newline mode, ditto for TELNET */
extern vscrn_t vscrn[];
extern enum markmodes markmodeflag ;
extern bool xprintff, printon ;
extern HAB hab ;

HMUX hmuxClipbrdSrv = 0 ;
HEV hevClipbrdGet  = 0 ;
HEV hevClipbrdPut = 0 ;
HEV hevClipbrdData = 0 ;
HEV hevClipbrdDone = 0 ;

APIRET
OpenClipboardServer( void )
{
    APIRET rc = 0 ;

    rc = DosOpenMutexSem( "\\SEM32\\CKERMIT\\CLIPBRD\\MUX", &hmuxClipbrdSrv ) ;
    if ( rc ) {
        return rc ;
        }

    rc = DosOpenEventSem( "\\SEM32\\CKERMIT\\CLIPBRD\\GET", &hevClipbrdGet ) ;
    if ( rc ) {
        DosCloseMutexSem( hmuxClipbrdSrv ) ;
        return rc ;
        }

    rc = DosOpenEventSem( "\\SEM32\\CKERMIT\\CLIPBRD\\DATA", &hevClipbrdData ) ;
    if ( rc ) {
        DosCloseMutexSem( hmuxClipbrdSrv ) ;
        DosCloseEventSem( hevClipbrdGet ) ;
        return rc ;
        }

    rc = DosOpenEventSem( "\\SEM32\\CKERMIT\\CLIPBRD\\DONE", &hevClipbrdDone ) ;
    if ( rc ) {
        DosCloseMutexSem( hmuxClipbrdSrv ) ;
        DosCloseEventSem( hevClipbrdGet ) ;
        DosCloseEventSem( hevClipbrdData ) ;
        return rc ;
        }

    rc = DosOpenEventSem( "\\SEM32\\CKERMIT\\CLIPBRD\\PUT", &hevClipbrdPut ) ;
    if ( rc ) {
        DosCloseMutexSem( hmuxClipbrdSrv ) ;
        DosCloseEventSem( hevClipbrdGet ) ;
        DosCloseEventSem( hevClipbrdData ) ;
        DosCloseEventSem( hevClipbrdDone ) ;
        return rc ;
        }
    return rc ;
}

APIRET
CloseClipboardServer( void )
{
    if ( hmuxClipbrdSrv )
        DosCloseMutexSem( hmuxClipbrdSrv ) ;
    if ( hevClipbrdGet )
        DosCloseEventSem( hevClipbrdGet ) ;
    if ( hevClipbrdPut )
        DosCloseEventSem( hevClipbrdPut ) ;
    if ( hevClipbrdData )
        DosCloseEventSem( hevClipbrdData ) ;
    if ( hevClipbrdDone )
        DosCloseEventSem( hevClipbrdDone ) ;

    hmuxClipbrdSrv = 0 ;
    hevClipbrdGet  = 0 ;
    hevClipbrdData = 0 ;
    hevClipbrdDone = 0 ;
    return 0 ;
}

void
SetPtrWait( void )
{
    WinSetPointer( HWND_DESKTOP,
        WinQuerySysPointer( HWND_DESKTOP, FALSE, SPTR_WAIT ) ) ;
}

void
SetPtrArrow( void )
{
    WinSetPointer( HWND_DESKTOP,
        WinQuerySysPointer( HWND_DESKTOP, FALSE, SPTR_ARROW ) ) ;
}

BOOL
PutTextToClipboardServer( PCHAR pString )
{
    ULONG postcount = 0 ;
    PCHAR pSharedMem = NULL ;
    APIRET rc = 0 ;

    if ( !hmuxClipbrdSrv && OpenClipboardServer() ) {
        debug( F100,"CLIP Server not available","",0);
        return FALSE ;
        }

    if ( rc = DosRequestMutexSem( hmuxClipbrdSrv, 1000 ) ) {
        debug( F101, "CLIP Request Mutex failed rc","",rc ) ;
        CloseClipboardServer() ;
        return FALSE ;
        }

    rc = DosGetNamedSharedMem( (PPVOID) &pSharedMem,
        "\\SHAREMEM\\CKERMIT\\CLIPBRD\\DATA",  PAG_WRITE ) ;
    debug( F101, "CLIP Get Named Shared RAM rc","",rc ) ;

    /* We now have exclusive access to the named shared memory */

    if ( !rc && pSharedMem ) {
        strncpy( pSharedMem, pString, 65535 ) ;
        pSharedMem[65534] = '\0' ;
        }

    /* Now signal the Clipboard Server that we have something for it to do */
    rc = DosPostEventSem( hevClipbrdPut ) ;
    debug( F101, "CLIP Post Put Sem rc","",rc ) ;

    /* Now wait for it to tell us it is done */
    rc = DosWaitEventSem( hevClipbrdDone, SEM_INDEFINITE_WAIT ) ;
    debug( F101, "CLIP Wait Done Sem rc","",rc ) ;
    rc = DosResetEventSem( hevClipbrdDone, &postcount ) ;

    rc = DosReleaseMutexSem( hmuxClipbrdSrv ) ;
    return TRUE ;
}

PCHAR
GetTextFromClipboardServer( void )
{
    ULONG postcount = 0 ;
    PCHAR pSharedMem = NULL ;
    PCHAR pString = NULL ;
    APIRET rc = 0 ;

    if ( !hmuxClipbrdSrv && OpenClipboardServer() ) {
        debug( F100,"CLIP Server not available","",0);
        return NULL ;
        }

    if ( rc = DosRequestMutexSem( hmuxClipbrdSrv, 1000 ) ) {
        debug( F101, "CLIP Request Mutex failed rc","",rc ) ;
        CloseClipboardServer() ;
        return NULL ;
        }

    rc = DosPostEventSem( hevClipbrdGet ) ;
    debug( F101, "CLIP Post Get Sem rc","",rc ) ;

    if ( rc = DosWaitEventSem( hevClipbrdData, 1000 ) ) {
        debug( F101, "CLIP Wait Data Sem failed rc","",0 ) ;
        rc = DosReleaseMutexSem( hmuxClipbrdSrv ) ;
        CloseClipboardServer();
        return NULL ;
        }

    rc = DosResetEventSem( hevClipbrdData, &postcount ) ;
    debug( F101, "CLIP Reset Data Sem rc","",rc ) ;

    rc = DosGetNamedSharedMem( (PPVOID) &pSharedMem,
        "\\SHAREMEM\\CKERMIT\\CLIPBRD\\DATA",  PAG_READ ) ;
    debug( F101, "CLIP Get Named Shared RAM rc","",rc ) ;

    if ( !rc && pSharedMem ) {
        pString = strdup( pSharedMem ) ;
        DosFreeMem( pSharedMem ) ;
        }

    rc = DosPostEventSem( hevClipbrdDone ) ;
    debug( F101, "CLIP Post Done Sem rc","",rc ) ;
    rc = DosReleaseMutexSem( hmuxClipbrdSrv ) ;
    return pString ;
}
#endif /* NT */


