home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
tmp9
/
ckoco5.c
< prev
next >
Wrap
C/C++ Source or Header
|
2011-07-19
|
6KB
|
212 lines
/* 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 videobuffer 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 */