From 8a7831faf62daf131ca72ac8f6aea1528b077684 Mon Sep 17 00:00:00 2001 From: Fritz Elfert Date: Tue, 22 May 2001 21:19:20 +0000 Subject: More work on remote clipboard. --- lib/rclip.cc | 67 +++++++++++++++++++++++++++++++++++++++++++++++++---------- lib/rclip.h | 23 ++++++++++---------- lib/rfsv.h | 1 + lib/rfsv32.cc | 2 ++ lib/wprt.cc | 2 +- 5 files changed, 72 insertions(+), 23 deletions(-) diff --git a/lib/rclip.cc b/lib/rclip.cc index b8df5fe..6c55c39 100644 --- a/lib/rclip.cc +++ b/lib/rclip.cc @@ -82,14 +82,14 @@ getStatus(void) const char *rclip:: getConnectName(void) { - return "SYS$RCLIP"; + return "CLIPSVR.RSY"; } // // protected internals // bool rclip:: -sendCommand(enum commands cc, bufferStore & data) +sendCommand(enum commands cc) { if (status == rfsv::E_PSI_FILE_DISC) { reconnect(); @@ -99,7 +99,13 @@ sendCommand(enum commands cc, bufferStore & data) bool result; bufferStore a; a.addByte(cc); - a.addBuff(data); + switch (cc) { + case RCLIP_INIT: + a.addWord(0x100); + break; + case RCLIP_NOTIFY: + a.addByte(0); + } result = skt->sendBufferStore(a); if (!result) { reconnect(); @@ -111,31 +117,70 @@ sendCommand(enum commands cc, bufferStore & data) } Enum rclip:: -putData(bufferStore &) { +sendListen() { + if (sendCommand(RCLIP_LISTEN)) + return rfsv::E_PSI_GEN_NONE; + else + return rfsv::E_PSI_GEN_FAIL; +} + +Enum rclip:: +checkNotify() { + Enum ret; + + bufferStore a; + if ((ret = getResponse(a)) != rfsv::E_PSI_GEN_NONE) + cerr << "RCLIP ERR:" << a << endl; + else { + if (a.getLen() != 1) + ret = rfsv::E_PSI_GEN_FAIL; + if (a.getByte(0) != 0) + ret = rfsv::E_PSI_GEN_FAIL; + } + return ret; +} + +Enum rclip:: +waitNotify() { Enum ret; bufferStore a; - a.addWord(0); - sendCommand(RCLIP_INIT, a); + sendCommand(RCLIP_LISTEN); if ((ret = getResponse(a)) != rfsv::E_PSI_GEN_NONE) cerr << "RCLIP ERR:" << a << endl; else { - if (a.getLen() != 3) + if (a.getLen() != 1) ret = rfsv::E_PSI_GEN_FAIL; - if ((a.getByte(0) != 0) || (a.getWord(1) != 2)) + if (a.getByte(0) != 0) ret = rfsv::E_PSI_GEN_FAIL; } return ret; } Enum rclip:: -getData(bufferStore &buf) { +notify() { Enum ret; bufferStore a; - sendCommand(RCLIP_GET, buf); - if ((ret = getResponse(buf)) != rfsv::E_PSI_GEN_NONE) + sendCommand(RCLIP_NOTIFY); + if ((ret = getResponse(a)) != rfsv::E_PSI_GEN_NONE) + cerr << "RCLIP ERR:" << a << endl; + if (a.getLen() != 1) + ret = rfsv::E_PSI_GEN_FAIL; + if (a.getByte(0) != RCLIP_NOTIFY) + ret = rfsv::E_PSI_GEN_FAIL; + return ret; +} + +Enum rclip:: +initClipbd() { + Enum ret = rfsv::E_PSI_GEN_NONE; + bufferStore a; + + sendCommand(RCLIP_INIT); + if ((ret = getResponse(a)) != rfsv::E_PSI_GEN_NONE) cerr << "RCLIP ERR:" << a << endl; + cout << "RCLIP RESP: " << a << endl; return ret; } diff --git a/lib/rclip.h b/lib/rclip.h index 617f31b..9d3f54b 100644 --- a/lib/rclip.h +++ b/lib/rclip.h @@ -65,23 +65,24 @@ public: */ Enum getStatus(); - /** - * Get Remote ClipBoard Data - */ - Enum getData(bufferStore &buf); + Enum initClipbd(); - /** - * Put Data to Remote ClipBoard - */ - Enum putData(bufferStore &buf); + Enum sendListen(); + + Enum checkNotify(); + + Enum waitNotify(); + + Enum notify(); protected: /** * The possible commands. */ enum commands { - RCLIP_INIT = 0x0100, - RCLIP_GET = 0xf0f0, + RCLIP_INIT = 0x00, + RCLIP_NOTIFY = 0x08, + RCLIP_LISTEN = 0x04, }; /** @@ -109,7 +110,7 @@ protected: * * @returns true on success, false on failure. */ - bool sendCommand(enum commands cc, bufferStore &data); + bool sendCommand(enum commands cc); Enum getResponse(bufferStore &data); const char *getConnectName(); diff --git a/lib/rfsv.h b/lib/rfsv.h index ffa23fd..c054edb 100644 --- a/lib/rfsv.h +++ b/lib/rfsv.h @@ -102,6 +102,7 @@ public: PSI_O_EXCL = 00200, PSI_O_TRUNC = 01000, PSI_O_APPEND = 02000, + PSI_O_SHARE = 04000, }; /** diff --git a/lib/rfsv32.cc b/lib/rfsv32.cc index a28d2f2..f1718d2 100644 --- a/lib/rfsv32.cc +++ b/lib/rfsv32.cc @@ -211,6 +211,8 @@ opMode(const u_int32_t mode) ret |= (((mode & 03) == PSI_O_RDONLY) ? 0 : EPOC_OMODE_READ_WRITE); if (!ret) ret |= (mode & PSI_O_EXCL) ? 0 : EPOC_OMODE_SHARE_READERS; + if ((!ret) && (mode & PSI_O_SHARE)) + ret |= EPOC_OMODE_SHARE_ANY; return ret; } diff --git a/lib/wprt.cc b/lib/wprt.cc index 89d037f..bd87b8a 100644 --- a/lib/wprt.cc +++ b/lib/wprt.cc @@ -98,7 +98,7 @@ sendCommand(enum commands cc, bufferStore & data) } bool result; bufferStore a; - a.addByte(cc); + a.addWord(cc); a.addBuff(data); result = skt->sendBufferStore(a); if (!result) { -- cgit v1.2.3