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