diff options
| author | Mathieu Malaterre <mathieu.malaterre@gmail.com> | 2012-09-28 08:11:41 +0000 |
|---|---|---|
| committer | Mathieu Malaterre <mathieu.malaterre@gmail.com> | 2012-09-28 08:11:41 +0000 |
| commit | d518970039a19a2a9b6d2bdd592cc88a43897bbb (patch) | |
| tree | 57bac2cf7e63e9352228231062763baac627563c /src/lib/openjpip/imgsock_manager.c | |
| parent | 8363a6ab1e031bb4b2e40a92e56efd40fdab1aa1 (diff) | |
[trunk] Start FolderReorgProposal task
Update issue 177
Diffstat (limited to 'src/lib/openjpip/imgsock_manager.c')
| -rw-r--r-- | src/lib/openjpip/imgsock_manager.c | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/src/lib/openjpip/imgsock_manager.c b/src/lib/openjpip/imgsock_manager.c new file mode 100644 index 00000000..612cb378 --- /dev/null +++ b/src/lib/openjpip/imgsock_manager.c @@ -0,0 +1,209 @@ +/* + * $Id: imgsock_manager.c 54 2011-05-10 13:22:47Z kaori $ + * + * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2011, Professor Benoit Macq + * Copyright (c) 2010-2011, Kaori Hagihara + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "imgsock_manager.h" +#if _WIN32 +#define strncasecmp _strnicmp +#endif + +msgtype_t identify_clientmsg( SOCKET connected_socket) +{ + OPJ_SIZE_T receive_size; + char buf[BUF_LEN]; + static const char *magicid[] = { "JPIP-stream", "PNM request", "XML request", + "TID request", "CID request", "CID destroy", "SIZ request", "JP2 save", + "QUIT"}; + int i; + + receive_size = receive_line( connected_socket, buf); + + if( receive_size == 0){ + fprintf( stderr, "Error to receive the header of client message\n"); + return MSGERROR; + } + + for( i=0; i<NUM_OF_MSGTYPES; i++){ + if( strncasecmp( magicid[i], buf, strlen(magicid[i])) == 0){ + fprintf( stderr, "%s\n", magicid[i]); + return i; + } + } + + fprintf( stderr, "Cannot identify client message type %s\n", buf); + return MSGERROR; +} + +Byte_t * receive_JPIPstream( SOCKET connected_socket, char **target, char **tid, char **cid, OPJ_SIZE_T *streamlen) +{ + char buf[BUF_LEN]; + const char versionstring[] = "version 1.2"; + int idatalen; + OPJ_SIZE_T linelen, datalen; + Byte_t *jpipstream; + + *target = *cid = *tid = NULL; + + if((linelen = receive_line( connected_socket, buf)) == 0) + return NULL; + if( strncmp( versionstring, buf, strlen(versionstring))!=0){ + fprintf( stderr, "Wrong format\n"); + return NULL; + } + + if((linelen = receive_line( connected_socket, buf)) == 0) + return NULL; + + if( strstr( buf, "jp2")){ + /* register cid option*/ + *target = strdup( buf); + + if((linelen = receive_line( connected_socket, buf)) == 0) + return NULL; + if( strcmp( buf, "0") != 0) + *tid = strdup( buf); + + if((linelen = receive_line( connected_socket, buf)) == 0) + return NULL; + if( strcmp( buf, "0") != 0) + *cid = strdup( buf); + + if((linelen = receive_line( connected_socket, buf)) == 0) + return NULL; + } + + idatalen = atoi( buf); + if( idatalen < 0 ) + { + fprintf( stderr, "Receive Data: %d Bytes\n", idatalen); + return NULL; + } + datalen = (OPJ_SIZE_T)idatalen; + fprintf( stdout, "Receive Data: %lu Bytes\n", datalen); + + jpipstream = receive_stream( connected_socket, datalen); + + /* check EOR*/ + if( jpipstream[datalen-3] == 0x00 && ( jpipstream[datalen-2] == 0x01 || jpipstream[datalen-2] == 0x02)) + *streamlen = datalen -3; + else + *streamlen = datalen; + + return jpipstream; +} + +void send_XMLstream( SOCKET connected_socket, Byte_t *xmlstream, OPJ_SIZE_T length) +{ + Byte_t header[5]; + + header[0] = 'X'; + header[1] = 'M'; + header[2] = 'L'; + header[3] = (Byte_t)((length >> 8) & 0xff); + header[4] = (Byte_t)(length & 0xff); + + send_stream( connected_socket, header, 5); + send_stream( connected_socket, xmlstream, length); +} + +void send_IDstream( SOCKET connected_socket, const char *id, OPJ_SIZE_T idlen, const char *label); + +void send_CIDstream( SOCKET connected_socket, const char *cid, OPJ_SIZE_T cidlen) +{ + send_IDstream( connected_socket, cid, cidlen, "CID"); +} + +void send_TIDstream( SOCKET connected_socket, const char *tid, OPJ_SIZE_T tidlen) +{ + send_IDstream( connected_socket, tid, tidlen, "TID"); +} + +void send_IDstream( SOCKET connected_socket, const char *id, OPJ_SIZE_T idlen, const char *label) +{ + char header[4]; + + header[0] = label[0]; + header[1] = label[1]; + header[2] = label[2]; + header[3] = (char)(idlen & 0xff); + + send_stream( connected_socket, header, 4); + send_stream( connected_socket, id, idlen); +} + +void send_PNMstream( SOCKET connected_socket, Byte_t *pnmstream, unsigned int width, unsigned int height, unsigned int numofcomp, Byte_t maxval) +{ + OPJ_SIZE_T pnmlen = 0; + Byte_t header[7]; + + pnmlen = width*height*numofcomp; + + header[0] = 'P'; + header[1] = numofcomp==3 ? 6:5; + header[2] = (width >> 8) & 0xff; + header[3] = width & 0xff; + header[4] = (height >> 8) & 0xff; + header[5] = height & 0xff; + header[6] = maxval; + + send_stream( connected_socket, header, 7); + send_stream( connected_socket, pnmstream, pnmlen); +} + +void send_SIZstream( SOCKET connected_socket, unsigned int width, unsigned int height) +{ + Byte_t responce[9]; + + responce[0] = 'S'; + responce[1] = 'I'; + responce[2] = 'Z'; + responce[3] = (width >> 16) & 0xff; + responce[4] = (width >> 8) & 0xff; + responce[5] = width & 0xff; + responce[6] = (height >> 16) & 0xff; + responce[7] = (height >> 8) & 0xff; + responce[8] = height & 0xff; + + send_stream( connected_socket, responce, 9); +} + +void response_signal( SOCKET connected_socket, bool succeed) +{ + Byte_t code; + + if( succeed) + code = 1; + else + code = 0; + + send_stream( connected_socket, &code, 1); +} |
