94 lines
2.4 KiB
C
94 lines
2.4 KiB
C
#include <ctype.h>
|
|
#include <math.h>
|
|
#include <errno.h>
|
|
#include "ascon.h"
|
|
#include "ascon.i"
|
|
#include "dynstring.h"
|
|
#include "cnvrt.h"
|
|
|
|
/*
|
|
* this is a driver for connection to an other sea (or sics) server
|
|
*
|
|
* Markus Zolliker June 2012
|
|
*
|
|
*/
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
int SeaClientHandler(Ascon *a) {
|
|
int ret;
|
|
char chr;
|
|
int tmo;
|
|
char *line;
|
|
int result;
|
|
|
|
switch (a->state) {
|
|
case AsconWriteStart:
|
|
line = GetCharArray(a->wrBuffer);
|
|
if (strncasecmp(line, "fulltransact", 12) == 0) {
|
|
a->readState = 0;
|
|
} else if (strncasecmp(line, "transact", 8) == 0) {
|
|
a->readState = 1;
|
|
} else if (strstr(line, "\ntransAct ") != 0) {
|
|
a->readState = 1;
|
|
} else {
|
|
a->readState = 2;
|
|
}
|
|
a->lineCount = 0; /* used as position to beginning of line */
|
|
break;
|
|
case AsconReading:
|
|
result = AsconBaseHandler(a);
|
|
if (result == 0)
|
|
return 0;
|
|
chr = a->lastChar;
|
|
if (chr == '\n') {
|
|
line = GetCharArray(a->rdBuffer) + a->lineCount;
|
|
switch (a->readState) {
|
|
case 0:
|
|
if (strncmp(line, "TRANSACTIONSTART", 16) == 0) {
|
|
a->readState = 1;
|
|
DynStringClear(a->rdBuffer);
|
|
}
|
|
break;
|
|
case 1:
|
|
if (strncmp(line, "TRANSACTIONFINISHED", 19) == 0) {
|
|
a->state = AsconReadDone;
|
|
if (a->lineCount > 0) {
|
|
a->lineCount--;
|
|
}
|
|
DynStringShorten(a->rdBuffer, a->lineCount);
|
|
}
|
|
break;
|
|
case 2:
|
|
a->state = AsconReadDone;
|
|
DynStringBackspace(a->rdBuffer);
|
|
break;
|
|
}
|
|
a->lineCount = GetDynStringLength(a->rdBuffer); /* set position of new line */
|
|
}
|
|
return 1;
|
|
}
|
|
return AsconBaseHandler(a);
|
|
}
|
|
/*----------------------------------------------------------------------------*/
|
|
static int SeaClientInit(Ascon * a, SConnection * con, int argc, char *argv[])
|
|
{
|
|
a->hostport = strdup(argv[1]);
|
|
if (argc > 2) {
|
|
a->timeout = atof(argv[2]);
|
|
} else {
|
|
a->timeout = 5.0;
|
|
}
|
|
a->sendTerminator = strdup("\n");
|
|
return 1;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
void AddSeaClientProtocol()
|
|
{
|
|
static AsconProtocol seaclientprot;
|
|
seaclientprot.name = "seaclient";
|
|
seaclientprot.handler = SeaClientHandler;
|
|
seaclientprot.init = SeaClientInit;
|
|
AsconInsertProtocol(&seaclientprot);
|
|
}
|