1 /*
2  * MsgTrans - Message Transport Framework for DLang. Based on TCP, WebSocket, UDP transmission protocol.
3  *
4  * Copyright (C) 2019 HuntLabs
5  *
6  * Website: https://www.msgtrans.org
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11 
12 module msgtrans.channel.tcp.TcpTransportSession;
13 
14 import msgtrans.Packet;
15 import msgtrans.MessageBuffer;
16 import msgtrans.channel.TransportSession;
17 import msgtrans.ee2e.message.MsgDefine;
18 import msgtrans.ee2e.crypto;
19 import msgtrans.ee2e.common;
20 import msgtrans.MessageTransportServer;
21 import hunt.net;
22 import hunt.String;
23 
24 import std.stdio;
25 import std.array;
26 
27 /**
28  *
29  */
30 class TcpTransportSession : TransportSession {
31     private Connection _conn = null;
32 
33     this(long id, Connection connection) {
34         _conn = connection;
35         super(id);
36     }
37 
38     override Object getAttribute(string key) {
39         return _conn.getAttribute(key);
40     }
41 
42     override void setAttribute(string key, Object value) {
43         _conn.setAttribute(key, value);
44     }
45 
46     override bool containsAttribute(string key) {
47         return _conn.containsAttribute(key);
48     }
49 
50 
51     override void send(MessageBuffer message) {
52         if (_conn.isConnected()) {
53 
54             if (MessageTransportServer.isEE2E && (message.id != MESSAGE.INITIATE  && message.id != MESSAGE.FINALIZE))
55             {
56                 peerkey_s peerkeys = cast(peerkey_s)(getAttribute("EE2E"));
57                 message = common.encrypted_encode(message,null, peerkeys);
58             }
59 
60             ubyte[][] buffers = Packet.encode(message);
61             foreach(ubyte[] data; buffers) {
62                 _conn.write(data);
63                 //writefln("data : %s",data);
64             }
65         }
66     }
67 
68     override void close() {
69         if (_conn !is null && _conn.getState() !is ConnectionState.Closed) {
70             _conn.close();
71         }
72     }
73 
74     override bool isConnected() {
75         return _conn.isConnected();
76     }
77 }