diff options
Diffstat (limited to 'server/src/server.cc')
-rw-r--r-- | server/src/server.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/server/src/server.cc b/server/src/server.cc index 7f78f45..9d52369 100644 --- a/server/src/server.cc +++ b/server/src/server.cc @@ -26,6 +26,9 @@ */ #include "server.h" +// For XML +#include <config.h> + #include "tcpsocket.h" #include <errno.h> @@ -37,9 +40,65 @@ #include "configuration.h" +// For open, read and close +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> + + +/** +\section{Data transmission} +En transmission består af en række deltransmissioner som afhænger af +brugerens handling. +\begin{itemize} +\item Klienten beder om en XMLMakro by-name. +\item Serveren genererer makroen og sender den til klienten i en XML + stream. Forbindelsen lukkes efter end overførsel. +\item Brugeren udfylder input felterne og trykker på ``commit'' eller + ``abort'' knappen. +\item Hvis der blev trykket ``abort'' lukkes vinduet. +\item Hvis der blev trykket ``commit'' genereres et XML dokument på + klienten indeholdene alle input felternes navne og deres tilhørende + værdier. +\item Dette XML dokument sendes til serveren via en nyoprettet forbindelse. +\item Serveren producerer en plaintext klump som repræsenterer +\item Teksten sendes til klienten som appender til den PC-Praxis + journalfilen. +\item Klienten svarer til serveren at alt gik godt (eller det modsatte) og + makrovinduet lukkes. +\item Serveren lagrer dataene i en database hvis det gik godt. +\end{itemize} +*/ static void connection(Pentominos::TCPSocket &socket) { printf("Got connection...\n"); + + std::string macro_request; + + char inbuf[300]; // Must be at least 3 + memset(inbuf, 0, sizeof(inbuf)); // Ensure zero termination. + + // Get request. + while(socket.read(inbuf, sizeof(inbuf) - 1) == sizeof(inbuf) - 1) { + macro_request += inbuf; + memset(inbuf, 0, sizeof(inbuf)); // Ensure zero termination. + } + macro_request += inbuf; + + printf("Got request for [%s]\n", macro_request.c_str()); + + // Now handle the request. + char outbuf[3]; + int bytes; + + std::string macro = std::string(XML) + "/" + macro_request + ".xml"; + + int fd = open(macro.c_str(), O_RDONLY); + while((bytes = read(fd, outbuf, sizeof(outbuf))) ) { + socket.write(outbuf, bytes); + } + close(fd); } void server() |