aboutsummaryrefslogtreecommitdiffstats
path: root/ncpd/linkchan.cc
diff options
context:
space:
mode:
authorFritz Elfert <felfert@to.com>2001-05-22 21:56:49 +0000
committerFritz Elfert <felfert@to.com>2001-05-22 21:56:49 +0000
commitec3b548646d8739c35e2a66379e921b3438fe367 (patch)
treeee135f860bdfd95b1796468872fbead343587476 /ncpd/linkchan.cc
parent8a7831faf62daf131ca72ac8f6aea1528b077684 (diff)
downloadplptools-ec3b548646d8739c35e2a66379e921b3438fe367.tar.gz
plptools-ec3b548646d8739c35e2a66379e921b3438fe367.tar.bz2
plptools-ec3b548646d8739c35e2a66379e921b3438fe367.zip
- Added support for extended sequence numbers (incoming only)
- Changed the behavior on initial connect to support the Clipboard-Server and to meet the doc in http://www.thouky.co.uk/software/psifs/plp.html: All services except SYS$RFSV now perform registration and connect is done when the Psion returned RegisterAck. Then the connect can use the service name as presented by the Psion's RegisterAck.
Diffstat (limited to 'ncpd/linkchan.cc')
-rw-r--r--ncpd/linkchan.cc165
1 files changed, 88 insertions, 77 deletions
diff --git a/ncpd/linkchan.cc b/ncpd/linkchan.cc
index 21ec39f..b95ec64 100644
--- a/ncpd/linkchan.cc
+++ b/ncpd/linkchan.cc
@@ -1,29 +1,29 @@
-// $Id$
-//
-// PLP - An implementation of the PSION link protocol
-//
-// Copyright (C) 1999 Philip Proudman
-// Modifications for plptools:
-// Copyright (C) 1999 Fritz Elfert <felfert@to.com>
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// e-mail philip.proudman@btinternet.com
-
+/*-*-c++-*-
+ * $Id$
+ *
+ * This file is part of plptools.
+ *
+ * Copyright (C) 1999 Philip Proudman <philip.proudman@btinternet.com>
+ * Copyright (C) 1999-2001 Fritz Elfert <felfert@to.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
#include <stream.h>
#include <iomanip>
+#include <string>
#include "linkchan.h"
#include "bufferstore.h"
@@ -31,90 +31,101 @@
linkChan::linkChan(ncp * _ncpController):channel(_ncpController)
{
- registerSer = 0x1234;
- ncpConnect();
+ registerSer = 0x1234;
+ ncpConnect();
}
void linkChan::
ncpDataCallback(bufferStore & a)
{
- int len = a.getLen();
- if (verbose & LINKCHAN_DEBUG_LOG) {
- cout << "linkchan: << msg ";
- if (verbose & LINKCHAN_DEBUG_DUMP)
- cout << a << endl;
- else
- cout << len << endl;
- }
- if ((len > 7) && (a.getByte(0) == 1)) {
- unsigned int ser = a.getWord(1);
- int res = a.getWord(3);
- // int dontknow = a.getWord(5);
- const char *srvName = a.getString(7);
- bufferArray newStack;
- bufferStore se;
+ int len = a.getLen();
+ if (verbose & LINKCHAN_DEBUG_LOG) {
+ cout << "linkchan: << msg ";
+ if (verbose & LINKCHAN_DEBUG_DUMP)
+ cout << a << endl;
+ else
+ cout << len << endl;
+ }
- if (verbose & LINKCHAN_DEBUG_LOG)
- cout << "linkchan: received registerAck: ser=0x" << hex << setw(4)
- << setfill(0) << ser << " res=" << res << " srvName=\""
- << srvName << "\"" << endl;
+ if ((len >= 5) && (a.getByte(0) == 1)) {
+ char srvName[20];
+ unsigned int ser = a.getWord(1);
+ int res = a.getWord(3);
+ // int dontknow = a.getWord(5);
+ bufferArray newStack;
+ bufferStore se;
+
+
+ strncpy(srvName, a.getString(7), 17);
+ if (verbose & LINKCHAN_DEBUG_LOG)
+ cout << "linkchan: received registerAck: ser=0x" << hex << setw(4)
+ << setfill(0) << ser << " res=" << res << " srvName=\""
+ << srvName << "\"" << endl;
- while (!registerStack.empty()) {
- se = registerStack.pop();
- if (se.getWord(0) == ser) {
- if (verbose & LINKCHAN_DEBUG_LOG)
- cout << "linkchan: found ser=0x" << hex << setw(4) <<
- setfill(0) << se.getWord(0) <<
- " on stack -> callBack to waiting chan" << endl;
- ncpDoRegisterAck((int)se.getWord(2));
- } else
- newStack += se;
- }
- registerStack = newStack;
- return;
+ while (!registerStack.empty()) {
+ se = registerStack.pop();
+ if (se.getWord(0) == ser) {
+ if (verbose & LINKCHAN_DEBUG_LOG)
+ cout << "linkchan: found ser=0x" << hex << setw(4) <<
+ setfill(0) << se.getWord(0) <<
+ " on stack -> callBack to waiting chan" << endl;
+ if (strlen(srvName) < 4)
+ strcat(srvName, ".*");
+ ncpDoRegisterAck((int)se.getWord(2), srvName);
+ } else
+ newStack += se;
}
- cerr << "linkchan: unknown message " << a.getByte(0) << endl;
+ registerStack = newStack;
+ return;
+ }
+ cerr << "linkchan: unknown message " << a.getByte(0) << endl;
}
char *linkChan::
-getNcpConnectName()
+getNcpRegisterName()
{
- return "LINK";
+ return "LINK";
}
void linkChan::
ncpConnectAck()
{
- if (verbose & LINKCHAN_DEBUG_LOG)
- cout << "linkchan: << cack" << endl;
+ if (verbose & LINKCHAN_DEBUG_LOG)
+ cout << "linkchan: << cack" << endl;
}
void linkChan::
ncpConnectTerminate()
{
- if (verbose & LINKCHAN_DEBUG_LOG)
- cout << "linkchan: << ctrm" << endl;
- terminateWhenAsked();
+ if (verbose & LINKCHAN_DEBUG_LOG)
+ cout << "linkchan: << ctrm" << endl;
+ terminateWhenAsked();
}
void linkChan::
ncpConnectNak()
{
- ncpConnectTerminate();
+ ncpConnectTerminate();
}
void linkChan::
Register(channel *ch)
{
- bufferStore a;
- bufferStore stack;
+ bufferStore a;
+ bufferStore stack;
- stack.addWord(registerSer);
- stack.addWord(ch->getNcpChannel());
- registerStack += stack;
- a.addByte(0);
- a.addWord(registerSer++);
- a.addString(ch->getNcpConnectName());
- a.addByte(0);
- ncpSend(a);
+ stack.addWord(registerSer);
+ stack.addWord(ch->getNcpChannel());
+ registerStack += stack;
+ a.addByte(0);
+ a.addWord(registerSer++);
+ a.addString(ch->getNcpRegisterName());
+ a.addByte(0);
+ ncpSend(a);
}
+
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * End:
+ */