-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathqudpsocket_wrapper.h
More file actions
109 lines (99 loc) · 4.02 KB
/
Copy pathqudpsocket_wrapper.h
File metadata and controls
109 lines (99 loc) · 4.02 KB
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
#pragma once
#include "framework.h"
#include <QUdpSocket>
#include <QNetworkDatagram>
#include "qabstractsocket_wrapper.h"
#include "qtcpServer_wrapper.h"
#include "qnetworkdatagram_implement.h"
namespace shelllet {
namespace network {
template<typename T, bool> class QUdpSocketPrivate;
template<typename T, typename U, bool C>
class QUdpSocketWrapper : public QAbstractSocketWrapper<T, U, C> {
public:
template<bool M>
QUdpSocketWrapper(QUdpSocketPrivate<T, M>& d, const v8::FunctionCallbackInfo<v8::Value>& args)
: QAbstractSocketWrapper(d, args)
{
}
QUdpSocketWrapper(v8::Isolate* isolate, const v8::Local<v8::FunctionTemplate>& tpl) : QAbstractSocketWrapper(isolate, tpl) {}
QUdpSocketWrapper(v8::Isolate* isolate, const v8::Local<v8::ObjectTemplate>& proto) : QAbstractSocketWrapper(isolate, proto) {
tpl->PrototypeTemplate()->Set(isolate, "hasPendingDatagrams", v8::FunctionTemplate::New(isolate, HasPendingDatagrams));
tpl->PrototypeTemplate()->Set(isolate, "receiveDatagram", v8::FunctionTemplate::New(isolate, ReceiveDatagram));
tpl->PrototypeTemplate()->Set(isolate, "writeDatagram", v8::FunctionTemplate::New(isolate, WriteDatagram));
}
virtual ~QUdpSocketWrapper() {
}
private:
static void HasPendingDatagrams(const v8::FunctionCallbackInfo<v8::Value>& args)
{
V8_CREATE_LOCAL_CONTEXT_WITHOUT_LOCKER_BY_CALLBACK_INFO(args)
{
auto* p = convert::Object::UnWrap<QUdpSocketWrapper<T, U, C>>(args.This());
args.GetReturnValue().Set(p->d_func()->hasPendingDatagrams());
}
V8_CREATE_LOCAL_CONTEXT_END
}
static void WriteDatagram(const v8::FunctionCallbackInfo<v8::Value>& args)
{
V8_CREATE_LOCAL_CONTEXT_WITHOUT_LOCKER_BY_CALLBACK_INFO(args)
{
auto* p = convert::Object::UnWrap<QUdpSocketWrapper<T, U, C>>(args.This());
if (args.Length() > 0 && args[0]->IsObject()) {
auto* datagram = NetworkDatagram::FromValue(isolate, args[0]);
p->d_func()->writeDatagram(***datagram);
}
else if (args.Length() > 0 && args[0]->IsUint8Array()) {
v8::Local<v8::Uint8Array> array = v8::Local<v8::Uint8Array>::Cast(args[0]);
QByteArray datagram(array->Length(), '\0');
QHostAddress address;
quint16 port = 0;
array->CopyContents(datagram.data(), datagram.length());
if (args.Length() > 1 && args[1]->IsObject()) {
auto* p = HostAddress::FromValue(isolate, args[1]);
address = ***p;
}
if (args.Length() > 2 && args[2]->IsNumber()) {
port = args[2]->NumberValue(context).FromJust();
}
if (!address.isNull()) {
p->d_func()->writeDatagram(datagram, address, port);
}
}
else if (args.Length() > 0 && args[0]->IsString()) {
v8::String::Utf8Value datagram = { isolate, args[0] };
QHostAddress address;
quint16 port = 0;
if (args.Length() > 1 && args[1]->IsObject()) {
auto* p = HostAddress::FromValue(isolate, args[1]);
address = ***p;
return;
}
else if (args.Length() > 1 && args[1]->IsSymbol()) {
auto symbol = v8::Local<v8::Symbol>::Cast(args[1]);
v8::String::Utf8Value s = { isolate, symbol->Name() };
address = static_cast<QHostAddress::SpecialAddress>(std::stoi(*s));
}
if (args.Length() > 2 && args[2]->IsNumber()) {
port = args[2]->NumberValue(context).FromJust();
}
if (!address.isNull())
p->d_func()->writeDatagram(*datagram, datagram.length(), address, port);
}
}
V8_CREATE_LOCAL_CONTEXT_END
}
static void ReceiveDatagram(const v8::FunctionCallbackInfo<v8::Value>& args)
{
V8_CREATE_LOCAL_CONTEXT_WITHOUT_LOCKER_BY_CALLBACK_INFO(args)
{
auto* p = convert::Object::UnWrap<QUdpSocketWrapper<T, U, C>>(args.This());
QNetworkDatagram datagram = p->d_func()->receiveDatagram();
v8::Local<v8::Value> argv[] = { v8::External::New(isolate, &datagram) };
args.GetReturnValue().Set(convert::Object::Wrap(isolate, context, "NetworkDatagram", std::size(argv), argv));
}
V8_CREATE_LOCAL_CONTEXT_END
}
};
}
}