/* This file is part of libmicrospdy Copyright Copyright (C) 2012 Andrey Uzunov 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 3 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, see . */ /** * @file microspdy/internal.h * @brief internal functions and macros for the framing layer * @author Andrey Uzunov */ #ifndef INTERNAL_H_H #define INTERNAL_H_H #include "platform.h" #include "microspdy.h" /** * size of read buffers for each connection * must be at least the size of SPDY_MAX_SUPPORTED_FRAME_SIZE */ #define SPDYF_BUFFER_SIZE 8192 /** * initial size of window for each stream (this is for the data * within data frames that can be handled) */ #define SPDYF_INITIAL_WINDOW_SIZE 65536 /** * number of frames written to the socket at once. After X frames * everything should be run again. In this way the application can * response to more important requests while a big file is still * being transmitted to the client */ #define SPDYF_NUM_SENT_FRAMES_AT_ONCE 10 /** * Handler for fatal errors. */ extern SPDY_PanicCallback spdyf_panic; /** * Closure argument for "mhd_panic". */ extern void *spdyf_panic_cls; /** * Trigger 'panic' action based on fatal errors. * * @param msg error message (const char *) */ #define SPDYF_PANIC(msg) \ spdyf_panic (spdyf_panic_cls, __FILE__, __LINE__, msg) /** * Asserts the validity of an expression. * * @param expr (bool) * @param msg message to print on error (const char *) */ #define SPDYF_ASSERT(expr, msg) \ if(!(expr)){\ SPDYF_PANIC(msg);\ abort();\ } /** * Convert 24 bit integer from host byte order to network byte order. * * @param n input value (int32_t) * @return converted value (uint32_t) */ #if HAVE_BIG_ENDIAN #define HTON24(n) n #else #define HTON24(n) (((((uint32_t)(n) & 0xFF)) << 16)\ | (((uint32_t)(n) & 0xFF00))\ | ((((uint32_t)(n) & 0xFF0000)) >> 16)) #endif /** * Convert 24 bit integer from network byte order to host byte order. * * @param n input value (int32_t) * @return converted value (uint32_t) */ #if HAVE_BIG_ENDIAN #define NTOH24(n) n #else #define NTOH24(n) (((((uint32_t)(n) & 0xFF)) << 16)\ | (((uint32_t)(n) & 0xFF00))\ | ((((uint32_t)(n) & 0xFF0000)) >> 16)) #endif /** * Convert 31 bit integer from network byte order to host byte order. * * @param n input value (int32_t) * @return converted value (uint32_t) */ #if HAVE_BIG_ENDIAN #define NTOH31(n) n #else #define NTOH31(n) (((((uint32_t)(n) & 0x7F)) << 24) | \ ((((uint32_t)(n) & 0xFF00)) << 8) | \ ((((uint32_t)(n) & 0xFF0000)) >> 8) | \ ((((uint32_t)(n) & 0xFF000000)) >> 24)) #endif /** * Convert 31 bit integer from host byte order to network byte order. * * @param n input value (int32_t) * @return converted value (uint32_t) */ #if HAVE_BIG_ENDIAN #define HTON31(n) n #else #define HTON31(n) (((((uint32_t)(n) & 0xFF)) << 24) | \ ((((uint32_t)(n) & 0xFF00)) << 8) | \ ((((uint32_t)(n) & 0xFF0000)) >> 8) | \ ((((uint32_t)(n) & 0x7F000000)) >> 24)) #endif /** * Print formatted debug value. * * @param fmt format (const char *) * @param ... args for format */ #define SPDYF_DEBUG(fmt, ...) do { \ fprintf (stdout, "%s\n%u: ",__FILE__, __LINE__);\ fprintf(stdout,fmt,##__VA_ARGS__);\ fprintf(stdout,"\n");\ fflush(stdout); } while (0) /** * Print stream for debuging. * * @param strm (void *) * @param size (int) */ #define SPDYF_PRINT_STREAM(strm, size) do { \ int ___i;\ for(___i=0;___i