Change-Id: Iffed3602456f5306711c65f06c873c58d4086e11 Signed-off-by: Stefan Reinauer <reinauer@google.com> Reviewed-on: http://review.coreboot.org/363 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
		
			
				
	
	
		
			186 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Public Domain Curses */
 | 
						|
 | 
						|
#include "pdcos2.h"
 | 
						|
 | 
						|
RCSID("$Id: pdcclip.c,v 1.33 2008/07/14 04:24:51 wmcbrine Exp $")
 | 
						|
 | 
						|
/*man-start**************************************************************
 | 
						|
 | 
						|
  Name:                                                         clipboard
 | 
						|
 | 
						|
  Synopsis:
 | 
						|
        int PDC_getclipboard(char **contents, long *length);
 | 
						|
        int PDC_setclipboard(const char *contents, long length);
 | 
						|
        int PDC_freeclipboard(char *contents);
 | 
						|
        int PDC_clearclipboard(void);
 | 
						|
 | 
						|
  Description:
 | 
						|
        PDC_getclipboard() gets the textual contents of the system's
 | 
						|
        clipboard. This function returns the contents of the clipboard
 | 
						|
        in the contents argument. It is the responsibilitiy of the
 | 
						|
        caller to free the memory returned, via PDC_freeclipboard().
 | 
						|
        The length of the clipboard contents is returned in the length
 | 
						|
        argument.
 | 
						|
 | 
						|
        PDC_setclipboard copies the supplied text into the system's
 | 
						|
        clipboard, emptying the clipboard prior to the copy.
 | 
						|
 | 
						|
        PDC_clearclipboard() clears the internal clipboard.
 | 
						|
 | 
						|
  Return Values:
 | 
						|
        indicator of success/failure of call.
 | 
						|
        PDC_CLIP_SUCCESS        the call was successful
 | 
						|
        PDC_CLIP_MEMORY_ERROR   unable to allocate sufficient memory for
 | 
						|
                                the clipboard contents
 | 
						|
        PDC_CLIP_EMPTY          the clipboard contains no text
 | 
						|
        PDC_CLIP_ACCESS_ERROR   no clipboard support
 | 
						|
 | 
						|
  Portability                                X/Open    BSD    SYS V
 | 
						|
        PDC_getclipboard                        -       -       -
 | 
						|
        PDC_setclipboard                        -       -       -
 | 
						|
        PDC_freeclipboard                       -       -       -
 | 
						|
        PDC_clearclipboard                      -       -       -
 | 
						|
 | 
						|
**man-end****************************************************************/
 | 
						|
 | 
						|
int PDC_getclipboard(char **contents, long *length)
 | 
						|
{
 | 
						|
#ifndef EMXVIDEO
 | 
						|
    HMQ hmq;
 | 
						|
    HAB hab;
 | 
						|
    PTIB ptib;
 | 
						|
    PPIB ppib;
 | 
						|
    ULONG ulRet;
 | 
						|
    long len;
 | 
						|
    int rc;
 | 
						|
#endif
 | 
						|
    PDC_LOG(("PDC_getclipboard() - called\n"));
 | 
						|
 | 
						|
#ifndef EMXVIDEO
 | 
						|
    DosGetInfoBlocks(&ptib, &ppib);
 | 
						|
    ppib->pib_ultype = 3;
 | 
						|
    hab = WinInitialize(0);
 | 
						|
    hmq = WinCreateMsgQueue(hab, 0);
 | 
						|
 | 
						|
    if (!WinOpenClipbrd(hab))
 | 
						|
    {
 | 
						|
        WinDestroyMsgQueue(hmq);
 | 
						|
        WinTerminate(hab);
 | 
						|
        return PDC_CLIP_ACCESS_ERROR;
 | 
						|
    }
 | 
						|
 | 
						|
    rc = PDC_CLIP_EMPTY;
 | 
						|
 | 
						|
    ulRet = WinQueryClipbrdData(hab, CF_TEXT);
 | 
						|
 | 
						|
    if (ulRet)
 | 
						|
    {
 | 
						|
        len = strlen((char *)ulRet);
 | 
						|
        *contents = malloc(len + 1);
 | 
						|
 | 
						|
        if (!*contents)
 | 
						|
            rc = PDC_CLIP_MEMORY_ERROR;
 | 
						|
        else
 | 
						|
        {
 | 
						|
            strcpy((char *)*contents, (char *)ulRet);
 | 
						|
            *length = len;
 | 
						|
            rc = PDC_CLIP_SUCCESS;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    WinCloseClipbrd(hab);
 | 
						|
    WinDestroyMsgQueue(hmq);
 | 
						|
    WinTerminate(hab);
 | 
						|
 | 
						|
    return rc;
 | 
						|
#else
 | 
						|
    return PDC_CLIP_ACCESS_ERROR;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
int PDC_setclipboard(const char *contents, long length)
 | 
						|
{
 | 
						|
#ifndef EMXVIDEO
 | 
						|
    HAB hab;
 | 
						|
    PTIB ptib;
 | 
						|
    PPIB ppib;
 | 
						|
    ULONG ulRC;
 | 
						|
    PSZ szTextOut = NULL;
 | 
						|
    int rc;
 | 
						|
#endif
 | 
						|
    PDC_LOG(("PDC_setclipboard() - called\n"));
 | 
						|
 | 
						|
#ifndef EMXVIDEO
 | 
						|
    DosGetInfoBlocks(&ptib, &ppib);
 | 
						|
    ppib->pib_ultype = 3;
 | 
						|
    hab = WinInitialize(0);
 | 
						|
 | 
						|
    if (!WinOpenClipbrd(hab))
 | 
						|
    {
 | 
						|
        WinTerminate(hab);
 | 
						|
        return PDC_CLIP_ACCESS_ERROR;
 | 
						|
    }
 | 
						|
 | 
						|
    rc = PDC_CLIP_MEMORY_ERROR;
 | 
						|
 | 
						|
    ulRC = DosAllocSharedMem((PVOID)&szTextOut, NULL, length + 1,
 | 
						|
                             PAG_WRITE | PAG_COMMIT | OBJ_GIVEABLE);
 | 
						|
 | 
						|
    if (ulRC == 0)
 | 
						|
    {
 | 
						|
        strcpy(szTextOut, contents);
 | 
						|
        WinEmptyClipbrd(hab);
 | 
						|
 | 
						|
        if (WinSetClipbrdData(hab, (ULONG)szTextOut, CF_TEXT, CFI_POINTER))
 | 
						|
            rc = PDC_CLIP_SUCCESS;
 | 
						|
        else
 | 
						|
        {
 | 
						|
            DosFreeMem(szTextOut);
 | 
						|
            rc = PDC_CLIP_ACCESS_ERROR;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    WinCloseClipbrd(hab);
 | 
						|
    WinTerminate(hab);
 | 
						|
 | 
						|
    return rc;
 | 
						|
#else
 | 
						|
    return PDC_CLIP_ACCESS_ERROR;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
int PDC_freeclipboard(char *contents)
 | 
						|
{
 | 
						|
    PDC_LOG(("PDC_freeclipboard() - called\n"));
 | 
						|
 | 
						|
    if (contents)
 | 
						|
        free(contents);
 | 
						|
 | 
						|
    return PDC_CLIP_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
int PDC_clearclipboard(void)
 | 
						|
{
 | 
						|
#ifndef EMXVIDEO
 | 
						|
    HAB hab;
 | 
						|
    PTIB ptib;
 | 
						|
    PPIB ppib;
 | 
						|
#endif
 | 
						|
    PDC_LOG(("PDC_clearclipboard() - called\n"));
 | 
						|
 | 
						|
#ifndef EMXVIDEO
 | 
						|
    DosGetInfoBlocks(&ptib, &ppib);
 | 
						|
    ppib->pib_ultype = 3;
 | 
						|
    hab = WinInitialize(0);
 | 
						|
 | 
						|
    WinEmptyClipbrd(hab);
 | 
						|
 | 
						|
    WinCloseClipbrd(hab);
 | 
						|
    WinTerminate(hab);
 | 
						|
 | 
						|
    return PDC_CLIP_SUCCESS;
 | 
						|
#else
 | 
						|
    return PDC_CLIP_ACCESS_ERROR;
 | 
						|
#endif
 | 
						|
}
 |