home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / ftes46b5.zip / ftes46b5 / src / clip_vio.cpp < prev    next >
C/C++ Source or Header  |  1997-05-30  |  3KB  |  104 lines

  1. /*    clip_vio.cpp
  2.  *
  3.  *    Copyright (c) 1994-1996, Marko Macek
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  */
  9.  
  10. // OS/2 does not allow VIO programs to use the clipboard :-(
  11.  
  12. #include "fte.h"
  13. #include "clip.h"
  14.  
  15. #define INCL_DOS
  16. #include <os2.h>
  17. #include <string.h>
  18. #include <stdlib.h>
  19.  
  20. #define SEM_PREFIX  "\\SEM32\\PMCLIPS\\"
  21. #define MEM_PREFIX  "\\SHAREMEM\\PMCLIPS\\"
  22.  
  23. #define CMD_GET  1
  24. #define CMD_PUT  2
  25.  
  26. static HMTX hmtxSyn;
  27. static HEV hevGet;
  28. static HEV hevPut;
  29. static HEV hevEnd;
  30.  
  31. int GetClipText(ClipData *cd) {
  32.     int rc;
  33.     ULONG PostCount;
  34.     char *mem;
  35.     
  36.     rc = DosOpenMutexSem(SEM_PREFIX "CLIPSYN", &hmtxSyn);
  37.     if (rc != 0) return -1;
  38.     rc = DosOpenEventSem(SEM_PREFIX "CLIPGET", &hevGet);
  39.     if (rc != 0) return -1;
  40. /*    rc = DosOpenEventSem(SEM_PREFIX "CLIPPUT", &hevPut);*/
  41. /*    if (rc != 0) return -1;*/
  42.     rc = DosOpenEventSem(SEM_PREFIX "CLIPEND", &hevEnd);
  43.     if (rc != 0) return -1;
  44.     
  45.     DosRequestMutexSem(hmtxSyn, SEM_INDEFINITE_WAIT);
  46.     DosResetEventSem(hevEnd, &PostCount);
  47.     DosPostEventSem(hevGet);
  48.     DosWaitEventSem(hevEnd, SEM_INDEFINITE_WAIT);
  49.     if (0 == DosGetNamedSharedMem((void **)&mem, MEM_PREFIX "CLIPDATA", PAG_READ | PAG_WRITE)) {
  50.         cd->fLen = *(ULONG*)mem;
  51.         cd->fChar = strdup(mem + 4);
  52.         DosFreeMem(mem);
  53.     } else {
  54.         cd->fLen = 0;
  55.         cd->fChar = 0;
  56.     }
  57.     DosPostEventSem(hevGet);
  58.     DosReleaseMutexSem(hmtxSyn);
  59. /*    DosCloseEventSem(hevPut);*/
  60.     DosCloseEventSem(hevGet);
  61.     DosCloseEventSem(hevEnd);
  62.     DosCloseMutexSem(hmtxSyn);
  63.     return 0;
  64. }
  65.  
  66. int PutClipText(ClipData *cd) {
  67.     int rc;
  68.     ULONG PostCount;
  69.     char *mem;
  70.     
  71.     rc = DosOpenMutexSem(SEM_PREFIX "CLIPSYN", &hmtxSyn);
  72.     if (rc != 0) return -1;
  73. /*    rc = DosOpenEventSem(SEM_PREFIX "CLIPGET", &hevGet);*/
  74. /*    if (rc != 0) return -1;*/
  75.     rc = DosOpenEventSem(SEM_PREFIX "CLIPPUT", &hevPut);
  76.     if (rc != 0) return -1;
  77.     rc = DosOpenEventSem(SEM_PREFIX "CLIPEND", &hevEnd);
  78.     if (rc != 0) return -1;
  79.     
  80.     DosRequestMutexSem(hmtxSyn, SEM_INDEFINITE_WAIT);
  81.     DosResetEventSem(hevEnd, &PostCount);
  82.     if (0 == DosAllocSharedMem((void **)&mem,
  83.                                MEM_PREFIX "CLIPDATA",
  84.                                cd->fLen + 5,
  85.                                PAG_COMMIT | PAG_READ | PAG_WRITE))
  86.     {
  87.         ULONG L = cd->fLen;
  88.         memcpy((void *)mem, (void *)&L, 4);
  89.         strcpy(mem + 4, cd->fChar);
  90.     }
  91.     DosPostEventSem(hevPut);
  92.     DosWaitEventSem(hevEnd, SEM_INDEFINITE_WAIT);
  93.     DosPostEventSem(hevPut);
  94.     DosReleaseMutexSem(hmtxSyn);
  95.     DosCloseEventSem(hevPut);
  96. /*    DosCloseEventSem(hevGet); */
  97.     DosCloseEventSem(hevEnd);
  98.     DosCloseMutexSem(hmtxSyn);
  99.     if (mem)
  100.     DosFreeMem(mem);
  101.     return 0;
  102.     
  103. }
  104.