// Copyright (c) 2014, The Monero Project // // 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. // // 3. Neither the name of the copyright holder nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // 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 HOLDER 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. // // Parts of this file are originally copyright (c) 2006-2013, Andrey N. Sabelnikov #ifndef _LEVIN_BASE_H_ #define _LEVIN_BASE_H_ #include "net_utils_base.h" #define LEVIN_SIGNATURE 0x0101010101012101LL //Bender's nightmare namespace epee { namespace levin { #pragma pack(push) #pragma pack(1) struct bucket_head { uint64_t m_signature; uint64_t m_cb; bool m_have_to_return_data; uint32_t m_command; int32_t m_return_code; uint32_t m_reservedA; //probably some flags in future uint32_t m_reservedB; //probably some check sum in future }; #pragma pack(pop) #pragma pack(push) #pragma pack(1) struct bucket_head2 { uint64_t m_signature; uint64_t m_cb; bool m_have_to_return_data; uint32_t m_command; int32_t m_return_code; uint32_t m_flags; uint32_t m_protocol_version; }; #pragma pack(pop) #define LEVIN_DEFAULT_TIMEOUT_PRECONFIGURED 0 #define LEVIN_DEFAULT_MAX_PACKET_SIZE 100000000 //100MB by default #define LEVIN_PACKET_REQUEST 0x00000001 #define LEVIN_PACKET_RESPONSE 0x00000002 #define LEVIN_PROTOCOL_VER_0 0 #define LEVIN_PROTOCOL_VER_1 1 template struct levin_commands_handler { virtual int invoke(int command, const std::string& in_buff, std::string& buff_out, t_connection_context& context)=0; virtual int notify(int command, const std::string& in_buff, t_connection_context& context)=0; virtual void callback(t_connection_context& context){}; virtual void on_connection_new(t_connection_context& context){}; virtual void on_connection_close(t_connection_context& context){}; }; #define LEVIN_OK 0 #define LEVIN_ERROR_CONNECTION -1 #define LEVIN_ERROR_CONNECTION_NOT_FOUND -2 #define LEVIN_ERROR_CONNECTION_DESTROYED -3 #define LEVIN_ERROR_CONNECTION_TIMEDOUT -4 #define LEVIN_ERROR_CONNECTION_NO_DUPLEX_PROTOCOL -5 #define LEVIN_ERROR_CONNECTION_HANDLER_NOT_DEFINED -6 #define LEVIN_ERROR_FORMAT -7 #define DESCRIBE_RET_CODE(code) case code: return #code; inline const char* get_err_descr(int err) { switch(err) { DESCRIBE_RET_CODE(LEVIN_OK); DESCRIBE_RET_CODE(LEVIN_ERROR_CONNECTION); DESCRIBE_RET_CODE(LEVIN_ERROR_CONNECTION_NOT_FOUND); DESCRIBE_RET_CODE(LEVIN_ERROR_CONNECTION_DESTROYED); DESCRIBE_RET_CODE(LEVIN_ERROR_CONNECTION_TIMEDOUT); DESCRIBE_RET_CODE(LEVIN_ERROR_CONNECTION_NO_DUPLEX_PROTOCOL); DESCRIBE_RET_CODE(LEVIN_ERROR_CONNECTION_HANDLER_NOT_DEFINED); DESCRIBE_RET_CODE(LEVIN_ERROR_FORMAT); default: return "unknown code"; } } } } #endif //_LEVIN_BASE_H_