From bded2b524ff2676473d0eaa541482e57eb2ac010 Mon Sep 17 00:00:00 2001
From: Sven Gestegard Robertz <sven.robertz@cs.lth.se>
Date: Fri, 22 Nov 2013 14:39:38 +0100
Subject: [PATCH] added client for labcomm/JGrafchart + test server

---
 examples/jgrafchart/Makefile     | 26 ++++++++++++
 examples/jgrafchart/client.c     | 61 ++++++++++++++++++++++++++++
 examples/jgrafchart/dec.c        | 51 ++++++++++++++++++++++++
 examples/jgrafchart/dec.h        |  9 +++++
 examples/jgrafchart/enc.c        | 44 +++++++++++++++++++++
 examples/jgrafchart/enc.h        |  8 ++++
 examples/jgrafchart/jg.lc        | 10 +++++
 examples/jgrafchart/testserver.c | 68 ++++++++++++++++++++++++++++++++
 8 files changed, 277 insertions(+)
 create mode 100644 examples/jgrafchart/Makefile
 create mode 100644 examples/jgrafchart/client.c
 create mode 100644 examples/jgrafchart/dec.c
 create mode 100644 examples/jgrafchart/dec.h
 create mode 100644 examples/jgrafchart/enc.c
 create mode 100644 examples/jgrafchart/enc.h
 create mode 100644 examples/jgrafchart/jg.lc
 create mode 100644 examples/jgrafchart/testserver.c

diff --git a/examples/jgrafchart/Makefile b/examples/jgrafchart/Makefile
new file mode 100644
index 0000000..76b097d
--- /dev/null
+++ b/examples/jgrafchart/Makefile
@@ -0,0 +1,26 @@
+#SAMPLENAME=foo
+LCFILE=jg
+LCDIR=../..
+LCC=java -jar ${LCDIR}/compiler/labComm.jar
+LCLIBDIR=${LCDIR}/lib/c
+AUX=enc.c dec.c
+
+client: client.c ${LCFILE}.c ${AUX} ${AUX:.c=.h}
+	${CC} -o $@ client.c ${AUX} ${LCFILE}.c -I${LCLIBDIR} -L${LCLIBDIR} -llabcomm
+
+testserver: testserver.c ${LCFILE}.c ${AUX} ${AUX:.c=.h}
+	${CC} -o $@ testserver.c ${AUX} ${LCFILE}.c -I${LCLIBDIR} -L${LCLIBDIR} -llabcomm
+	
+${LCFILE}.c : ${LCFILE}.lc
+	${LCC} -C ${LCFILE}.lc
+
+
+.PHONY: clean, runclient
+clean :
+	rm ${LCFILE}.c ${LCFILE}.h client testserver
+
+runclient : client
+	LD_LIBRARY_PATH=${LCLIBDIR} ./$< localhost 9999
+
+runserver : testserver
+	LD_LIBRARY_PATH=${LCLIBDIR} ./$< 9999
diff --git a/examples/jgrafchart/client.c b/examples/jgrafchart/client.c
new file mode 100644
index 0000000..b39d77c
--- /dev/null
+++ b/examples/jgrafchart/client.c
@@ -0,0 +1,61 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h> 
+
+#include "dec.h"
+#include "enc.h"
+
+void error(const char *msg)
+{
+    perror(msg);
+    exit(0);
+}
+
+void do_labcomm(int sockfd)
+{
+    void *enc = enc_init(sockfd);
+    void *dec = dec_init(sockfd, enc);
+    dec_run(dec);
+    dec_cleanup(dec);
+    enc_cleanup(enc);
+}
+
+int main(int argc, char *argv[])
+{
+    int sockfd, portno, n;
+    struct sockaddr_in serv_addr;
+    struct hostent *server;
+
+    char buffer[256];
+    if (argc < 3) {
+       fprintf(stderr,"usage %s hostname port\n", argv[0]);
+       exit(0);
+    }
+    portno = atoi(argv[2]);
+    sockfd = socket(AF_INET, SOCK_STREAM, 0);
+    if (sockfd < 0) 
+        error("ERROR opening socket");
+    server = gethostbyname(argv[1]);
+    if (server == NULL) {
+        fprintf(stderr,"ERROR, no such host\n");
+        exit(0);
+    }
+    bzero((char *) &serv_addr, sizeof(serv_addr));
+    serv_addr.sin_family = AF_INET;
+    bcopy((char *)server->h_addr, 
+         (char *)&serv_addr.sin_addr.s_addr,
+         server->h_length);
+    serv_addr.sin_port = htons(portno);
+    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
+        error("ERROR connecting");
+
+    do_labcomm(sockfd);
+
+    close(sockfd);
+    return 0;
+}
diff --git a/examples/jgrafchart/dec.c b/examples/jgrafchart/dec.c
new file mode 100644
index 0000000..f95dccc
--- /dev/null
+++ b/examples/jgrafchart/dec.c
@@ -0,0 +1,51 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <labcomm_fd_reader.h>
+#include <labcomm_default_error_handler.h>
+#include <labcomm_default_memory.h>
+#include <labcomm_default_scheduler.h>
+#include <stdio.h>
+#include "jg.h"
+
+static struct labcomm_encoder *encoder;
+
+static void handle_foo(jg_foo *v, void *context) {
+	printf("got foo: b=%f, e=%s, f=%d\n", v->b, v->e, v->f);
+	v->d = v->d+1;
+	labcomm_encode_jg_foo(encoder, v);
+	usleep(500000);
+	v->d = v->d+1;
+	labcomm_encode_jg_foo(encoder, v);
+}
+
+struct labcomm_decoder *dec_init(int fd, struct labcomm_encoder *e) {
+  struct labcomm_decoder *decoder;
+  encoder = e;
+  void  *context = NULL;
+
+  decoder = labcomm_decoder_new(labcomm_fd_reader_new(
+				  labcomm_default_memory, fd, 1), 
+				labcomm_default_error_handler, 
+				labcomm_default_memory,
+				labcomm_default_scheduler);
+  if (!decoder) { 
+    printf("Failed to allocate decoder %s:%d\n", __FUNCTION__, __LINE__);
+    return (void *)0;
+  }
+
+  labcomm_decoder_register_jg_foo(decoder, handle_foo, context);
+
+  return decoder;
+}
+
+
+void dec_run(struct labcomm_decoder *decoder) {
+  printf("Decoding:\n");
+  labcomm_decoder_run(decoder);
+  printf("--- End Of File ---:\n");
+}
+
+void dec_cleanup(struct labcomm_decoder *decoder) {
+  labcomm_decoder_free(decoder);
+}
diff --git a/examples/jgrafchart/dec.h b/examples/jgrafchart/dec.h
new file mode 100644
index 0000000..dd41897
--- /dev/null
+++ b/examples/jgrafchart/dec.h
@@ -0,0 +1,9 @@
+#include <labcomm_fd_reader.h>
+#include <labcomm_default_error_handler.h>
+#include <labcomm_default_memory.h>
+#include <labcomm_default_scheduler.h>
+#include <stdio.h>
+
+struct labcomm_decoder * dec_init(int fd, struct labcomm_encoder *e) ;
+void dec_run(struct labcomm_decoder *decoder) ;
+void dec_cleanup(struct labcomm_decoder *decoder) ;
diff --git a/examples/jgrafchart/enc.c b/examples/jgrafchart/enc.c
new file mode 100644
index 0000000..e00f458
--- /dev/null
+++ b/examples/jgrafchart/enc.c
@@ -0,0 +1,44 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <labcomm_fd_writer.h>
+#include <labcomm_default_error_handler.h>
+#include <labcomm_default_memory.h>
+#include <labcomm_default_scheduler.h>
+#include "jg.h"
+#include <stdio.h>
+
+struct labcomm_encoder *enc_init( int fd) {
+  struct labcomm_encoder *encoder;
+
+  encoder = labcomm_encoder_new(labcomm_fd_writer_new(
+				  labcomm_default_memory, fd, 1), 
+				labcomm_default_error_handler, 
+				labcomm_default_memory,
+				labcomm_default_scheduler);
+  labcomm_encoder_register_jg_foo(encoder);
+  return encoder;
+}
+
+void enc_run(struct labcomm_encoder * encoder) {
+	jg_foo v;
+
+	v.b = 17.17;
+	v.c = 1742;
+	v.d = 4217;
+	v.e = "hello";
+	v.f = 17;
+	v.g = 42;
+	v.h = 2;
+	v.i = 42.42;
+
+	labcomm_encode_jg_foo(encoder, &v);
+	usleep(500000);
+	v.f += 42;
+	v.h += 42017040;
+	labcomm_encode_jg_foo(encoder, &v);
+}
+
+void enc_cleanup(struct labcomm_encoder *encoder) {
+	labcomm_encoder_free(encoder);
+}
diff --git a/examples/jgrafchart/enc.h b/examples/jgrafchart/enc.h
new file mode 100644
index 0000000..48aef8c
--- /dev/null
+++ b/examples/jgrafchart/enc.h
@@ -0,0 +1,8 @@
+#include <labcomm_fd_writer.h>
+#include <labcomm_default_error_handler.h>
+#include <labcomm_default_memory.h>
+#include <labcomm_default_scheduler.h>
+
+struct labcomm_encoder *enc_init(int fd) ;
+void enc_run(struct labcomm_encoder *encoder) ;
+void enc_cleanup(struct labcomm_encoder *encoder) ;
diff --git a/examples/jgrafchart/jg.lc b/examples/jgrafchart/jg.lc
new file mode 100644
index 0000000..1ea2536
--- /dev/null
+++ b/examples/jgrafchart/jg.lc
@@ -0,0 +1,10 @@
+sample struct {
+  double b;
+  int c;
+  int d;
+  string e;
+  boolean f;
+  short g;
+  long h;
+  float i;
+} foo; 
diff --git a/examples/jgrafchart/testserver.c b/examples/jgrafchart/testserver.c
new file mode 100644
index 0000000..99911ec
--- /dev/null
+++ b/examples/jgrafchart/testserver.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h> 
+
+#include "dec.h"
+#include "enc.h"
+
+void error(const char *msg)
+{
+    perror(msg);
+    exit(0);
+}
+
+void do_labcomm(int sockfd)
+{
+    void *enc = enc_init(sockfd);
+    enc_run(enc);
+    enc_cleanup(enc);
+}
+
+int main(int argc, char *argv[])
+{
+    int sockfd, portno, n;
+    int newsockfd, clilen;
+    struct sockaddr_in serv_addr, cli_addr;
+    struct hostent *server;
+
+    char buffer[256];
+    if (argc < 2) {
+       fprintf(stderr,"usage %s port\n", argv[0]);
+       exit(0);
+    }
+    portno = atoi(argv[1]);
+    sockfd = socket(AF_INET, SOCK_STREAM, 0);
+    if (sockfd < 0) 
+        error("ERROR opening socket");
+
+    bzero((char *) &serv_addr, sizeof(serv_addr));
+
+    serv_addr.sin_addr.s_addr = INADDR_ANY;
+    serv_addr.sin_port = htons(portno);
+
+    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
+        perror("ERROR on binding");
+        exit(1);
+    }
+
+    listen(sockfd,2);
+    clilen = sizeof(cli_addr);
+
+   /* Accept actual connection from the client */
+    newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
+    if (newsockfd < 0) {
+        perror("ERROR on accept");
+       exit(1);
+    }
+
+    do_labcomm(newsockfd);
+
+    close(newsockfd);
+    close(sockfd);
+    return 0;
+}
-- 
GitLab