1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
|
/*
** ClanLib SDK
** Copyright (c) 1997-2005 The ClanLib Team
**
** This software is provided 'as-is', without any express or implied
** warranty. In no event will the authors be held liable for any damages
** arising from the use of this software.
**
** Permission is granted to anyone to use this software for any purpose,
** including commercial applications, and to alter it and redistribute it
** freely, subject to the following restrictions:
**
** 1. The origin of this software must not be misrepresented; you must not
** claim that you wrote the original software. If you use this software
** in a product, an acknowledgment in the product documentation would be
** appreciated but is not required.
** 2. Altered source versions must be plainly marked as such, and must not be
** misrepresented as being the original software.
** 3. This notice may not be removed or altered from any source distribution.
**
** Note: Some of the libraries ClanLib may link to may have additional
** requirements or restrictions.
**
** File Author(s):
**
** Magnus Norddahl
** (if your name is missing here, please add it)
*/
#ifndef header_netcomputer_generic
#define header_netcomputer_generic
#if _MSC_VER > 1000
#pragma once
#endif
#include "API/Core/System/mutex.h"
#include "API/Core/System/thread.h"
#include "API/Core/System/event_trigger.h"
#include "API/Network/Socket/socket.h"
#include "API/Network/NetSession/netpacket.h"
#include <map>
#include <string>
#include <queue>
class CL_NetStream_Generic;
class CL_NetSession_Generic;
class CL_NetPacket_Generic;
class CL_NetPacket;
class CL_EventListener;
class CL_NetComputer_Generic
{
//! Construction:
public:
//: Sync connect constructor.
CL_NetComputer_Generic(
const CL_Socket &tcp_sock,
CL_NetSession_Generic *netsession,
bool server,
const std::string &server_port);
//: ASync connect constructor.
CL_NetComputer_Generic(
const std::string &hostname,
const std::string &port,
CL_NetSession_Generic *netsession);
virtual ~CL_NetComputer_Generic();
//! Attributes:
public:
//: Return current reference count.
int get_ref() const;
CL_Thread const & get_thread_handle() const;
//: TCP socket connection to the network computer.
CL_Socket tcp_sock;
//: If true, UDP connection has been established
bool udp_available;
//: UDP IP/Port pair for the remote network computer.
CL_IPAddress udp_address;
//; Cached dest address of remote computer.
//: (we cache it because it seems linux forget about the dest peer when a
//: socket is closed)
CL_IPAddress address;
//: True if computer has disconnected.
bool disconnected;
//: String describing reason why computer was disconnected.
std::string disconnect_reason;
//: Pointer to netsession owner of netcomputer.
CL_NetSession_Generic *netsession;
//: Syncronized data access to netcomputer.
CL_Mutex mutex;
//! Operations:
public:
//: Increase reference count.
void add_ref();
//: Decrease reference count. Delete object if reaching zero.
int release_ref();
//: Received udp packet.
void received_udp_packet(CL_NetPacket &packet);
//: Send packet to computer.
void send_packet(const std::string &packet_channel, CL_NetPacket_Generic *packet);
//: Send packet to computer using udp.
void send_packet_udp(const std::string &packet_channel, CL_NetPacket_Generic *packet);
//: Send stream connect packet to computer. Returns the channel_id of the new connection.
int send_stream_connect(const std::string &stream_channel, CL_NetStream_Generic *stream);
//: Send stream message to computer.
void send_stream_message(unsigned int channel_id, const std::string &data);
//: Send stream close message to computer.
void send_stream_close(int channel_id);
//: Disconnects from everything
void disconnect(std::string reason);
//: Shuts down the netcomputer instance.
//- <p>Used by CL_NetSession_Generic to close down all connections when the netsession is destroyed.</p>
void do_shutdown();
//! Implementation:
private:
//: Send udp info to computer.
void send_udp_info();
//: Worker thread for this netcomputer. Basically calls update_socket() on activity.
void worker_thread();
//: Updates socket. Dispatches new available data and writes queued data to socket.
void update_socket();
//: Bytes left of current data transfer chunk.
int data_left;
//: Netstream receiving current data transfer.
CL_NetStream_Generic *netstream;
//: Netpacket receiving current data transfer.
CL_NetPacket netpacket;
//: Netpacket destination for current data transfer.
int dest_netpacket_atom;
//: Atom map used to map from strings to atom ints.
std::map<std::string, int> local_atoms;
//: Next free local atom.
int local_atom_counter;
//: Atom map used to map from atom ints to strings.
std::map<int, std::string> remote_atoms;
//: Queue of messages to be sent across reliable TCP socket.
std::queue<std::string> send_tcp_queue;
//: Data sent position in topmost send queue message.
int send_pos;
//: Reference counter.
int ref;
//: Basic message types used over socket.
enum
{
cmd_create_atom = 0,
cmd_udp_info,
cmd_udp_connect,
cmd_netstream_connect = 32,
cmd_netstream_msg,
cmd_netstream_closed,
cmd_netpacket_msg = 64,
};
//: Asyncronous connect. If true, the worker thread will do the socket
//: connect. Otherwise the connect has already been done from the main
//: thread.
bool async_boot;
//: Asyncronous connect. Hostname to connect to.
std::string async_hostname;
//: Asyncrounous connect. Port used in connect.
std::string async_port;
//: Worker thread handle.
CL_Thread thread;
//: Trigger that will wake up sockets worker thread.
CL_EventTrigger wakeup_trigger;
//: List of channel connections currently active over this connection.
std::map<int, CL_NetStream_Generic *> streams;
//: Local stream channel ID counter.
int channel_id_counter;
//: If true, worker thread is asked to shut itself down.
volatile bool shutdown;
//: If true, this netcomputer generic object acts as the server in udp connect sequence.
bool server;
//: Port that server is listening on.
std::string server_port;
//: Connect secret to be sent to server in response to a cmd_udp_info.
unsigned short udp_connect_secret;
//: To allow CL_NetSession_Generic to access the message types for UDP connection
friend class CL_NetSession_Generic;
};
#endif
|