The Pubnub C-core library. It's home is on https://github.com/pubnub/c_core, this is a copy
Dependents: Pubnub_c_core_mbed2_pal Pubnub_c_core_mbed2_pal Pubnub_c_core_mbed2_pal2
Diff: pubnub_internal_common.h
- Revision:
- 0:d13755cfb705
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pubnub_internal_common.h Thu Nov 10 22:20:11 2016 +0000 @@ -0,0 +1,220 @@ +/* -*- c-file-style:"stroustrup"; indent-tabs-mode: nil -*- */ +#if !defined INC_PUBNUB_INTERNAL_COMMON +#define INC_PUBNUB_INTERNAL_COMMON + +#include "pubnub_config.h" +#include "pubnub_ccore.h" +#include "pubnub_netcore.h" +#include "pubnub_mutex.h" + +#if defined(PUBNUB_CALLBACK_API) +#include "pubnub_ntf_callback.h" +#endif + +#if !defined PUBNUB_PROXY_API +#define PUBNUB_PROXY_API 0 +#elif PUBNUB_PROXY_API +#include "pubnub_proxy.h" +#endif + +#include <stdint.h> + + +#if !defined PUBNUB_USE_ADNS +#define PUBNUB_USE_ADNS 0 +#endif + + +/** State of a Pubnub socket. Some states are specific to some + PALs. + */ +enum PBSocketState { + /** Socket idle - unused */ + STATE_NONE = 0, + /** ACK received on the socket */ + STATE_ACKED = 1, + /** Reading a number of octets */ + STATE_READ = 2, + /** Block reading of new data, even though we have an indicator + that there is data to read. + */ + STATE_BLOCKED_NEWDATA = 3, + /** All of the data that has arrived has been read */ + STATE_NEWDATA_EXHAUSTED = 4, + /** All of the data that was to be sent has been sent. */ + STATE_DATA_SENT = 6, + /** Reading a line */ + STATE_READ_LINE = 7 +}; + + +/** The Pubnub context + + @note Don't declare any members as `bool`, as there may be + alignment issues when this is included from both C and C++ + compilers, especially pre-C99 C compilers (like MSVC (at least + until MSVC 2013)). +*/ +struct pubnub_ { + struct pbcc_context core; + + /** Network communication state */ + enum pubnub_state state; + /** Type of current transaction */ + enum pubnub_trans trans; + + /** Pointer to the next data to be sent. */ + uint8_t const *sendptr; + + /** The number of bytes left to be sent. */ + uint16_t sendlen; + + /** The number of bytes left to be read. */ + uint16_t readlen; + + /** Pointer to next free byte in the read buffer*/ + uint8_t *ptr; + + /** Number of bytes left (empty) in the read buffer */ + uint16_t left; + + /** The state of the socket. */ + enum PBSocketState sock_state; + + /** Number of bytes to read - given by the user */ + unsigned len; + + /** Indicates whether we are receiving chunked or regular HTTP + * response + */ + uint16_t http_chunked; + + /** Last received HTTP (result) code */ + uint16_t http_code; + +#if defined PUBNUB_ORIGIN_SETTABLE + char const *origin; +#endif + +#if 0 + /** Process that started last transaction */ + struct process *initiator; + + uint8_t *readptr; /* Pointer to the next data to be read. */ +#endif + + struct pubnub_pal pal; + + struct pubnub_options { + /** Indicates whether to use blocking I/O. Ignored if + choosing between blocking and non-blocking is not supported + on a platform. Would be ifdef-ed out, but then it would be + possible for this struct to have no members which is + prohibited by the ISO C standard. + */ + bool use_blocking_io : 1; + +#if PUBNUB_USE_SSL + /** Should the PubNub client establish the connection to + * PubNub using SSL? */ + bool useSSL : 1; + /** When SSL is enabled, should PubNub client ignore all SSL + * certificate-handshake issues and still continue in SSL mode + * if it experiences issues handshaking across local proxies, + * firewalls, etc? + */ + bool ignoreSSL : 1; + /** When SSL is enabled, should the client fallback to a + + * non-SSL connection if it experiences issues handshaking + * across local proxies, firewalls, etc? + */ + bool fallbackSSL : 1; +#endif + } options; + +#if PUBNUB_THREADSAFE + pubnub_mutex_t monitor; +#endif + +#if PUBNUB_TIMERS_API + /** Duration of the transaction timeout, in milliseconds */ + int transaction_timeout_ms; + +#if defined(PUBNUB_CALLBACK_API) + struct pubnub_ *previous; + struct pubnub_ *next; + int timeout_left_ms; +#endif + +#endif + +#if defined(PUBNUB_CALLBACK_API) + pubnub_callback_t cb; + void *user_data; +#endif + +#if PUBNUB_PROXY_API + + /** The type (protocol) of the proxy to use */ + enum pubnub_proxy_type proxy_type; + + /** Hostname (address) of the proxy server to use */ + char proxy_hostname[PUBNUB_MAX_PROXY_HOSTNAME_LENGTH + 1]; + + /** The (TCP) port to use on the proxy. */ + uint16_t proxy_port; + + /** Indicates whether this is the "first" HTTP request - that is, + the `CONNECT` one. The first is sent to the proxy, while the + second (if the first succeeds) is sent to the "real" HTTP + server (to which the proxy established a "tunnel". + */ + bool proxy_tunnel_established; + + /** The saved path part of the URL for the Pubnub transaction. + */ + char proxy_saved_path[PUBNUB_BUF_MAXLEN]; + +#endif +}; + + + +/** Internal function, to be called when the outcome of a + REST call / transaction has been reached. +*/ +void pbntf_trans_outcome(pubnub_t *pb); + +int pbntf_init(void); + +int pbntf_got_socket(pubnub_t *pb, pb_socket_t socket); + +void pbntf_update_socket(pubnub_t *pb, pb_socket_t socket); + +void pbntf_lost_socket(pubnub_t *pb, pb_socket_t socket); + +int pbntf_enqueue_for_processing(pubnub_t *pb); + +int pbntf_requeue_for_processing(pubnub_t *pb); + +int pbntf_watch_in_events(pubnub_t *pb); +int pbntf_watch_out_events(pubnub_t *pb); + + +/** Internal function. Checks if the given pubnub context pointer + is valid. +*/ +bool pb_valid_ctx_ptr(pubnub_t const *pb); + +/** Internal function, only available in the "static" context + allocator. Gives a context with the given index. +*/ +pubnub_t *pballoc_get_ctx(unsigned idx); + +/** Internal function, the "bottom half" of pubnub_free(), which is + done asynchronously in the callback mode. */ +void pballoc_free_at_last(pubnub_t *pb); + + +#endif /* !defined INC_PUBNUB_INTERNAL_COMMON */