1*1c60b9acSAndroid Build Coastguard Worker /* 2*1c60b9acSAndroid Build Coastguard Worker * libwebsockets - small server side websockets and web server implementation 3*1c60b9acSAndroid Build Coastguard Worker * 4*1c60b9acSAndroid Build Coastguard Worker * Copyright (C) 2020 Andy Green <[email protected]> 5*1c60b9acSAndroid Build Coastguard Worker * 6*1c60b9acSAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy 7*1c60b9acSAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to 8*1c60b9acSAndroid Build Coastguard Worker * deal in the Software without restriction, including without limitation the 9*1c60b9acSAndroid Build Coastguard Worker * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10*1c60b9acSAndroid Build Coastguard Worker * sell copies of the Software, and to permit persons to whom the Software is 11*1c60b9acSAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions: 12*1c60b9acSAndroid Build Coastguard Worker * 13*1c60b9acSAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in 14*1c60b9acSAndroid Build Coastguard Worker * all copies or substantial portions of the Software. 15*1c60b9acSAndroid Build Coastguard Worker * 16*1c60b9acSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*1c60b9acSAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*1c60b9acSAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19*1c60b9acSAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*1c60b9acSAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21*1c60b9acSAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22*1c60b9acSAndroid Build Coastguard Worker * IN THE SOFTWARE. 23*1c60b9acSAndroid Build Coastguard Worker * 24*1c60b9acSAndroid Build Coastguard Worker * C++ classes for Secure Streams 25*1c60b9acSAndroid Build Coastguard Worker */ 26*1c60b9acSAndroid Build Coastguard Worker 27*1c60b9acSAndroid Build Coastguard Worker #include <map> 28*1c60b9acSAndroid Build Coastguard Worker #include <set> 29*1c60b9acSAndroid Build Coastguard Worker #include <list> 30*1c60b9acSAndroid Build Coastguard Worker #include <string> 31*1c60b9acSAndroid Build Coastguard Worker #include <vector> 32*1c60b9acSAndroid Build Coastguard Worker #include <exception> 33*1c60b9acSAndroid Build Coastguard Worker 34*1c60b9acSAndroid Build Coastguard Worker #include "libwebsockets.h" 35*1c60b9acSAndroid Build Coastguard Worker 36*1c60b9acSAndroid Build Coastguard Worker class lss; 37*1c60b9acSAndroid Build Coastguard Worker 38*1c60b9acSAndroid Build Coastguard Worker /* 39*1c60b9acSAndroid Build Coastguard Worker * Exception subclass for lss-specific issues 40*1c60b9acSAndroid Build Coastguard Worker */ 41*1c60b9acSAndroid Build Coastguard Worker 42*1c60b9acSAndroid Build Coastguard Worker class lssException : public std::exception 43*1c60b9acSAndroid Build Coastguard Worker { 44*1c60b9acSAndroid Build Coastguard Worker private: 45*1c60b9acSAndroid Build Coastguard Worker std::string details; 46*1c60b9acSAndroid Build Coastguard Worker public: lssException(std::string _details)47*1c60b9acSAndroid Build Coastguard Worker lssException(std::string _details) { details = _details; } ~lssException()48*1c60b9acSAndroid Build Coastguard Worker ~lssException() throw() { } what() const49*1c60b9acSAndroid Build Coastguard Worker virtual const char *what() const throw() { return details.c_str(); } 50*1c60b9acSAndroid Build Coastguard Worker }; 51*1c60b9acSAndroid Build Coastguard Worker 52*1c60b9acSAndroid Build Coastguard Worker typedef struct lssbuf { 53*1c60b9acSAndroid Build Coastguard Worker uint8_t *buf; 54*1c60b9acSAndroid Build Coastguard Worker size_t len; 55*1c60b9acSAndroid Build Coastguard Worker } lssbuf_t; 56*1c60b9acSAndroid Build Coastguard Worker 57*1c60b9acSAndroid Build Coastguard Worker class lssAc 58*1c60b9acSAndroid Build Coastguard Worker { 59*1c60b9acSAndroid Build Coastguard Worker private: 60*1c60b9acSAndroid Build Coastguard Worker struct lwsac *ac; 61*1c60b9acSAndroid Build Coastguard Worker struct lwsac *iter; lssAc()62*1c60b9acSAndroid Build Coastguard Worker lssAc() { ac = NULL; } ~lssAc()63*1c60b9acSAndroid Build Coastguard Worker ~lssAc() { lwsac_free(&ac); } 64*1c60b9acSAndroid Build Coastguard Worker 65*1c60b9acSAndroid Build Coastguard Worker public: 66*1c60b9acSAndroid Build Coastguard Worker void append(lssbuf_t *lb); 67*1c60b9acSAndroid Build Coastguard Worker void start(bool atomic); 68*1c60b9acSAndroid Build Coastguard Worker int get(lssbuf_t *lb); 69*1c60b9acSAndroid Build Coastguard Worker }; 70*1c60b9acSAndroid Build Coastguard Worker 71*1c60b9acSAndroid Build Coastguard Worker /* 72*1c60b9acSAndroid Build Coastguard Worker * Fixed userdata priv used with ss creation... userdata lives in the lss 73*1c60b9acSAndroid Build Coastguard Worker * subclasses' members 74*1c60b9acSAndroid Build Coastguard Worker */ 75*1c60b9acSAndroid Build Coastguard Worker 76*1c60b9acSAndroid Build Coastguard Worker class lssPriv 77*1c60b9acSAndroid Build Coastguard Worker { 78*1c60b9acSAndroid Build Coastguard Worker public: 79*1c60b9acSAndroid Build Coastguard Worker struct lws_ss_handle *m_ss; 80*1c60b9acSAndroid Build Coastguard Worker void *m_plss; 81*1c60b9acSAndroid Build Coastguard Worker }; 82*1c60b9acSAndroid Build Coastguard Worker 83*1c60b9acSAndroid Build Coastguard Worker #define userobj_to_lss(uo) ((lss *)(((lssPriv *)userobj)->m_plss)) 84*1c60b9acSAndroid Build Coastguard Worker 85*1c60b9acSAndroid Build Coastguard Worker /* 86*1c60b9acSAndroid Build Coastguard Worker * The completion callback... it's called once, and state will be one of 87*1c60b9acSAndroid Build Coastguard Worker * 88*1c60b9acSAndroid Build Coastguard Worker * LWSSSCS_QOS_ACK_REMOTE: it completed OK 89*1c60b9acSAndroid Build Coastguard Worker * LWSSSCS_DESTROYING: we didn't complete 90*1c60b9acSAndroid Build Coastguard Worker * LWSSSCS_ALL_RETRIES_FAILED: " 91*1c60b9acSAndroid Build Coastguard Worker * LWSSSCS_QOS_NACK_REMOTE: " 92*1c60b9acSAndroid Build Coastguard Worker */ 93*1c60b9acSAndroid Build Coastguard Worker 94*1c60b9acSAndroid Build Coastguard Worker typedef int (*lsscomp_t)(lss *lss, lws_ss_constate_t state, void *arg); 95*1c60b9acSAndroid Build Coastguard Worker 96*1c60b9acSAndroid Build Coastguard Worker /* 97*1c60b9acSAndroid Build Coastguard Worker * Base class for Secure Stream objects 98*1c60b9acSAndroid Build Coastguard Worker */ 99*1c60b9acSAndroid Build Coastguard Worker 100*1c60b9acSAndroid Build Coastguard Worker class lss 101*1c60b9acSAndroid Build Coastguard Worker { 102*1c60b9acSAndroid Build Coastguard Worker public: 103*1c60b9acSAndroid Build Coastguard Worker lss(lws_ctx_t _ctx, std::string _uri, lsscomp_t _comp, bool _psh, 104*1c60b9acSAndroid Build Coastguard Worker lws_sscb_rx rx, lws_sscb_tx tx, lws_sscb_state state); 105*1c60b9acSAndroid Build Coastguard Worker virtual ~lss(); 106*1c60b9acSAndroid Build Coastguard Worker int call_completion(lws_ss_constate_t state); 107*1c60b9acSAndroid Build Coastguard Worker 108*1c60b9acSAndroid Build Coastguard Worker lsscomp_t comp; 109*1c60b9acSAndroid Build Coastguard Worker struct lws_ss_handle *m_ss; 110*1c60b9acSAndroid Build Coastguard Worker uint64_t rxlen; 111*1c60b9acSAndroid Build Coastguard Worker lws_usec_t us_start; 112*1c60b9acSAndroid Build Coastguard Worker 113*1c60b9acSAndroid Build Coastguard Worker private: 114*1c60b9acSAndroid Build Coastguard Worker lws_ctx_t ctx; 115*1c60b9acSAndroid Build Coastguard Worker char *uri; 116*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_t pol; 117*1c60b9acSAndroid Build Coastguard Worker bool comp_done; 118*1c60b9acSAndroid Build Coastguard Worker }; 119*1c60b9acSAndroid Build Coastguard Worker 120*1c60b9acSAndroid Build Coastguard Worker /* 121*1c60b9acSAndroid Build Coastguard Worker * Subclass of lss for atomic messages on heap 122*1c60b9acSAndroid Build Coastguard Worker */ 123*1c60b9acSAndroid Build Coastguard Worker 124*1c60b9acSAndroid Build Coastguard Worker class lssMsg : public lss 125*1c60b9acSAndroid Build Coastguard Worker { 126*1c60b9acSAndroid Build Coastguard Worker public: 127*1c60b9acSAndroid Build Coastguard Worker lssMsg(lws_ctx_t _ctx, lsscomp_t _comp, std::string _uri); 128*1c60b9acSAndroid Build Coastguard Worker virtual ~lssMsg(); 129*1c60b9acSAndroid Build Coastguard Worker }; 130*1c60b9acSAndroid Build Coastguard Worker 131*1c60b9acSAndroid Build Coastguard Worker /* 132*1c60b9acSAndroid Build Coastguard Worker * Subclass of lss for file transactions 133*1c60b9acSAndroid Build Coastguard Worker */ 134*1c60b9acSAndroid Build Coastguard Worker 135*1c60b9acSAndroid Build Coastguard Worker class lssFile : public lss 136*1c60b9acSAndroid Build Coastguard Worker { 137*1c60b9acSAndroid Build Coastguard Worker public: 138*1c60b9acSAndroid Build Coastguard Worker lssFile(lws_ctx_t _ctx, std::string _uri, std::string _path, 139*1c60b9acSAndroid Build Coastguard Worker lsscomp_t _comp, bool _psh); 140*1c60b9acSAndroid Build Coastguard Worker virtual ~lssFile(); 141*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t write(const uint8_t *buf, size_t len, int flags); 142*1c60b9acSAndroid Build Coastguard Worker 143*1c60b9acSAndroid Build Coastguard Worker std::string path; 144*1c60b9acSAndroid Build Coastguard Worker 145*1c60b9acSAndroid Build Coastguard Worker private: 146*1c60b9acSAndroid Build Coastguard Worker lws_filefd_type fd; 147*1c60b9acSAndroid Build Coastguard Worker bool push; 148*1c60b9acSAndroid Build Coastguard Worker }; 149