PageRenderTime 59ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtSockets.cpp

https://gitlab.com/sloshedpuppie/LetsGoRetro
C++ | 664 lines | 432 code | 86 blank | 146 comment | 20 complexity | 09ae8b6eb165def533f4b687a95b3b01 MD5 | raw file
  1. /*****************************************************************
  2. |
  3. | Neptune - Sockets :: WinRT Implementation
  4. |
  5. | (c) 2001-2012 Gilles Boccon-Gibod
  6. | Author: Gilles Boccon-Gibod (bok@bok.net)
  7. |
  8. ****************************************************************/
  9. /*----------------------------------------------------------------------
  10. | includes
  11. +---------------------------------------------------------------------*/
  12. #include "NptWinRtPch.h"
  13. using namespace Platform;
  14. using namespace Windows::Foundation;
  15. using namespace Windows::Foundation::Collections;
  16. using namespace Windows::Networking;
  17. using namespace Windows::Networking::Sockets;
  18. using namespace Windows::Storage::Streams;
  19. using namespace Concurrency;
  20. /*----------------------------------------------------------------------
  21. | logging
  22. +---------------------------------------------------------------------*/
  23. NPT_SET_LOCAL_LOGGER("neptune.sockets.winrt")
  24. /*----------------------------------------------------------------------
  25. | constants
  26. +---------------------------------------------------------------------*/
  27. const DWORD NPT_WINRT_SOCKET_DEFAULT_READ_TIMEOUT = 30000;
  28. const DWORD NPT_WINRT_SOCKET_DEFAULT_WRITE_TIMEOUT = 30000;
  29. /*----------------------------------------------------------------------
  30. | NPT_WinRtTcpClientSocket
  31. +---------------------------------------------------------------------*/
  32. class NPT_WinRtTcpClientSocket : public NPT_SocketInterface
  33. {
  34. public:
  35. // constructors and destructor
  36. NPT_WinRtTcpClientSocket();
  37. virtual ~NPT_WinRtTcpClientSocket();
  38. // NPT_SocketInterface methods
  39. NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true);
  40. NPT_Result Connect(const NPT_SocketAddress& address, NPT_Timeout timeout);
  41. NPT_Result GetInputStream(NPT_InputStreamReference& stream);
  42. NPT_Result GetOutputStream(NPT_OutputStreamReference& stream);
  43. NPT_Result GetInfo(NPT_SocketInfo& info);
  44. NPT_Result SetReadTimeout(NPT_Timeout timeout);
  45. NPT_Result SetWriteTimeout(NPT_Timeout timeout);
  46. NPT_Result Cancel(bool shutdown);
  47. protected:
  48. StreamSocket^ m_Socket;
  49. HostName^ m_RemoteHostName;
  50. HANDLE m_WaitEvent;
  51. NPT_Timeout m_ReadTimeout;
  52. NPT_Timeout m_WriteTimeout;
  53. };
  54. /*----------------------------------------------------------------------
  55. | NPT_WinRtSocketInputStream
  56. +---------------------------------------------------------------------*/
  57. class NPT_WinRtSocketInputStream : public NPT_InputStream
  58. {
  59. public:
  60. // constructors and destructor
  61. NPT_WinRtSocketInputStream(StreamSocket^ socket, NPT_Timeout timeout);
  62. virtual ~NPT_WinRtSocketInputStream();
  63. // NPT_InputStream methods
  64. NPT_Result Read(void* buffer,
  65. NPT_Size bytes_to_read,
  66. NPT_Size* bytes_read);
  67. NPT_Result Seek(NPT_Position offset);
  68. NPT_Result Tell(NPT_Position& where);
  69. NPT_Result GetSize(NPT_LargeSize& size);
  70. NPT_Result GetAvailable(NPT_LargeSize& available);
  71. private:
  72. StreamSocket^ m_Socket;
  73. IInputStream^ m_InputStream;
  74. DataReader^ m_Reader;
  75. HANDLE m_WaitEvent;
  76. NPT_Timeout m_Timeout;
  77. };
  78. /*----------------------------------------------------------------------
  79. | NPT_WinRtSocketOutputStream
  80. +---------------------------------------------------------------------*/
  81. class NPT_WinRtSocketOutputStream : public NPT_OutputStream
  82. {
  83. public:
  84. // constructors and destructor
  85. NPT_WinRtSocketOutputStream(StreamSocket^ socket, NPT_Timeout timeout);
  86. virtual ~NPT_WinRtSocketOutputStream();
  87. // NPT_OutputStream methods
  88. NPT_Result Write(const void* buffer,
  89. NPT_Size bytes_to_write,
  90. NPT_Size* bytes_written);
  91. NPT_Result Seek(NPT_Position offset);
  92. NPT_Result Tell(NPT_Position& where);
  93. NPT_Result Flush();
  94. private:
  95. StreamSocket^ m_Socket;
  96. IOutputStream^ m_OutputStream;
  97. DataWriter^ m_Writer;
  98. HANDLE m_WaitEvent;
  99. NPT_Timeout m_Timeout;
  100. };
  101. /*----------------------------------------------------------------------
  102. | StringFromUTF8
  103. +---------------------------------------------------------------------*/
  104. static String^
  105. StringFromUTF8(const char* utf)
  106. {
  107. unsigned int utf_len = NPT_StringLength(utf);
  108. unsigned int wide_len = utf_len;
  109. wchar_t* wide = new wchar_t[wide_len+1];
  110. int result = MultiByteToWideChar(CP_UTF8,
  111. 0,
  112. utf,
  113. utf_len+1,
  114. wide,
  115. wide_len+1);
  116. String^ str;
  117. if (result) {
  118. str = ref new String(wide);
  119. } else {
  120. str = ref new String();
  121. }
  122. delete[] wide;
  123. return str;
  124. }
  125. /*----------------------------------------------------------------------
  126. | TranslateHResult
  127. +---------------------------------------------------------------------*/
  128. static NPT_Result
  129. TranslateHResult(HResult result)
  130. {
  131. switch (HRESULT_FACILITY(result.Value)) {
  132. case FACILITY_WIN32:
  133. switch (HRESULT_CODE(result.Value)) {
  134. case WSAHOST_NOT_FOUND:
  135. return NPT_ERROR_HOST_UNKNOWN;
  136. case WSAETIMEDOUT:
  137. return NPT_ERROR_TIMEOUT;
  138. case WSAECONNREFUSED:
  139. return NPT_ERROR_CONNECTION_REFUSED;
  140. case WSAEWOULDBLOCK:
  141. return NPT_ERROR_WOULD_BLOCK;
  142. case WSAECONNABORTED:
  143. return NPT_ERROR_CONNECTION_ABORTED;
  144. case WSAECONNRESET:
  145. case WSAENETRESET:
  146. return NPT_ERROR_CONNECTION_RESET;
  147. case WSAEADDRINUSE:
  148. return NPT_ERROR_ADDRESS_IN_USE;
  149. case WSAENETDOWN:
  150. return NPT_ERROR_NETWORK_DOWN;
  151. case WSAENETUNREACH:
  152. return NPT_ERROR_NETWORK_UNREACHABLE;
  153. case WSAEINTR:
  154. return NPT_ERROR_INTERRUPTED;
  155. case WSAENOTCONN:
  156. return NPT_ERROR_NOT_CONNECTED;
  157. default:
  158. return NPT_FAILURE;
  159. }
  160. break;
  161. /* TODO: map error codes */
  162. default:
  163. return NPT_FAILURE;
  164. }
  165. }
  166. /*----------------------------------------------------------------------
  167. | WaitForAsyncAction
  168. +---------------------------------------------------------------------*/
  169. static NPT_Result
  170. WaitForAsyncAction(IAsyncAction^ action,
  171. HANDLE wait_event,
  172. DWORD timeout = INFINITE)
  173. {
  174. NPT_Result result = NPT_ERROR_INTERNAL;
  175. NPT_LOG_FINEST("waiting for async action...");
  176. ResetEvent(wait_event);
  177. action->Completed = ref new AsyncActionCompletedHandler
  178. ([&](IAsyncAction^ action_, AsyncStatus status) {
  179. switch (status) {
  180. case AsyncStatus::Canceled:
  181. result = NPT_ERROR_TIMEOUT;
  182. break;
  183. case AsyncStatus::Completed:
  184. result = NPT_SUCCESS;
  185. break;
  186. case AsyncStatus::Error:
  187. NPT_LOG_FINE_1("AsyncAction error %x", action_->ErrorCode.Value);
  188. result = TranslateHResult(action_->ErrorCode);
  189. break;
  190. default:
  191. result = NPT_ERROR_INTERNAL;
  192. break;
  193. }
  194. SetEvent(wait_event);
  195. });
  196. DWORD wait_result = WaitForSingleObjectEx(wait_event, timeout, FALSE);
  197. if (wait_result != WAIT_OBJECT_0) {
  198. NPT_LOG_FINE("action timed out, canceling...");
  199. action->Cancel();
  200. WaitForSingleObjectEx(wait_event, INFINITE, FALSE);
  201. }
  202. NPT_LOG_FINEST("done waiting for async action");
  203. return result;
  204. }
  205. /*----------------------------------------------------------------------
  206. | WaitForAsyncOperation
  207. +---------------------------------------------------------------------*/
  208. static NPT_Result
  209. WaitForAsyncOperation(IAsyncOperation<unsigned int>^ operation,
  210. HANDLE wait_event,
  211. unsigned int& return_value,
  212. DWORD timeout = INFINITE)
  213. {
  214. NPT_Result result = NPT_ERROR_INTERNAL;
  215. NPT_LOG_FINEST("waiting for async operation...");
  216. return_value = 0;
  217. ResetEvent(wait_event);
  218. operation->Completed = ref new AsyncOperationCompletedHandler<unsigned int>
  219. ([&](IAsyncOperation<unsigned int>^ operation_, AsyncStatus status) {
  220. switch (status) {
  221. case AsyncStatus::Canceled:
  222. result = NPT_ERROR_TIMEOUT;
  223. break;
  224. case AsyncStatus::Completed:
  225. return_value = operation_->GetResults();
  226. result = NPT_SUCCESS;
  227. break;
  228. case AsyncStatus::Error:
  229. NPT_LOG_FINE_1("AsyncOperation error %x", operation_->ErrorCode.Value);
  230. result = TranslateHResult(operation_->ErrorCode);
  231. break;
  232. default:
  233. result = NPT_ERROR_INTERNAL;
  234. break;
  235. }
  236. operation_->Close();
  237. SetEvent(wait_event);
  238. });
  239. DWORD wait_result = WaitForSingleObjectEx(wait_event, timeout, FALSE);
  240. if (wait_result != WAIT_OBJECT_0) {
  241. NPT_LOG_FINE("operation timed out, canceling...");
  242. operation->Cancel();
  243. WaitForSingleObjectEx(wait_event, INFINITE, FALSE);
  244. }
  245. NPT_LOG_FINEST("done waiting for async operation");
  246. return result;
  247. }
  248. /*----------------------------------------------------------------------
  249. | NPT_WinRtSocketInputStream::NPT_WinRtSocketInputStream
  250. +---------------------------------------------------------------------*/
  251. NPT_WinRtSocketInputStream::NPT_WinRtSocketInputStream(StreamSocket^ socket,
  252. NPT_Timeout timeout) :
  253. m_Socket(socket),
  254. m_Timeout(timeout)
  255. {
  256. m_InputStream = socket->InputStream;
  257. m_Reader = ref new DataReader(m_InputStream);
  258. m_Reader->InputStreamOptions = InputStreamOptions::Partial;
  259. m_WaitEvent = CreateEventExW(NULL, L"", 0, EVENT_ALL_ACCESS);
  260. }
  261. /*----------------------------------------------------------------------
  262. | NPT_WinRtSocketInputStream::~NPT_WinRtSocketInputStream
  263. +---------------------------------------------------------------------*/
  264. NPT_WinRtSocketInputStream::~NPT_WinRtSocketInputStream()
  265. {
  266. m_Reader->DetachStream();
  267. CloseHandle(m_WaitEvent);
  268. }
  269. /*----------------------------------------------------------------------
  270. | NPT_WinRtSocketInputStream::Read
  271. +---------------------------------------------------------------------*/
  272. NPT_Result
  273. NPT_WinRtSocketInputStream::Read(void* buffer,
  274. NPT_Size bytes_to_read,
  275. NPT_Size* bytes_read)
  276. {
  277. // init and shortcut
  278. if (bytes_read) *bytes_read = 0;
  279. if (bytes_to_read == 0) return NPT_SUCCESS;
  280. NPT_LOG_FINER_1("reading %d bytes", bytes_to_read);
  281. auto operation = m_Reader->LoadAsync(bytes_to_read);
  282. unsigned int return_value = 0;
  283. NPT_Result result = WaitForAsyncOperation(operation, m_WaitEvent, return_value, m_Timeout);
  284. if (NPT_SUCCEEDED(result)) {
  285. if (return_value) {
  286. unsigned int bytes_available = m_Reader->UnconsumedBufferLength;
  287. Array<unsigned char>^ bytes = ref new Array<unsigned char>(bytes_available);
  288. m_Reader->ReadBytes(bytes);
  289. NPT_CopyMemory(buffer, bytes->Data, bytes_available);
  290. if (bytes_read) *bytes_read = bytes_available;
  291. return NPT_SUCCESS;
  292. } else {
  293. return NPT_ERROR_EOS;
  294. }
  295. }
  296. return result;
  297. }
  298. /*----------------------------------------------------------------------
  299. | NPT_WinRtSocketInputStream::Seek
  300. +---------------------------------------------------------------------*/
  301. NPT_Result
  302. NPT_WinRtSocketInputStream::Seek(NPT_Position offset)
  303. {
  304. return NPT_ERROR_NOT_SUPPORTED;
  305. }
  306. /*----------------------------------------------------------------------
  307. | NPT_WinRtSocketInputStream::Tell
  308. +---------------------------------------------------------------------*/
  309. NPT_Result
  310. NPT_WinRtSocketInputStream::Tell(NPT_Position& where)
  311. {
  312. where = 0;
  313. return NPT_ERROR_NOT_SUPPORTED;
  314. }
  315. /*----------------------------------------------------------------------
  316. | NPT_WinRtSocketInputStream::GetSize
  317. +---------------------------------------------------------------------*/
  318. NPT_Result
  319. NPT_WinRtSocketInputStream::GetSize(NPT_LargeSize& size)
  320. {
  321. size = 0;
  322. return NPT_ERROR_NOT_SUPPORTED;
  323. }
  324. /*----------------------------------------------------------------------
  325. | NPT_WinRtSocketInputStream::GetAvailable
  326. +---------------------------------------------------------------------*/
  327. NPT_Result
  328. NPT_WinRtSocketInputStream::GetAvailable(NPT_LargeSize& available)
  329. {
  330. available = 0;
  331. return NPT_SUCCESS;
  332. }
  333. /*----------------------------------------------------------------------
  334. | NPT_WinRtSocketOutputStream::NPT_WinRtSocketOutputStream
  335. +---------------------------------------------------------------------*/
  336. NPT_WinRtSocketOutputStream::NPT_WinRtSocketOutputStream(StreamSocket^ socket,
  337. NPT_Timeout timeout) :
  338. m_Socket(socket),
  339. m_Timeout(timeout)
  340. {
  341. m_OutputStream = socket->OutputStream;
  342. m_Writer = ref new DataWriter(m_OutputStream);
  343. m_WaitEvent = CreateEventExW(NULL, L"", 0, EVENT_ALL_ACCESS);
  344. }
  345. /*----------------------------------------------------------------------
  346. | NPT_WinRtSocketOutputStream::~NPT_WinRtSocketOutputStream
  347. +---------------------------------------------------------------------*/
  348. NPT_WinRtSocketOutputStream::~NPT_WinRtSocketOutputStream()
  349. {
  350. m_Writer->DetachStream();
  351. CloseHandle(m_WaitEvent);
  352. }
  353. /*----------------------------------------------------------------------
  354. | NPT_WinRtSocketOutputStream::Write
  355. +---------------------------------------------------------------------*/
  356. NPT_Result
  357. NPT_WinRtSocketOutputStream::Write(const void* buffer,
  358. NPT_Size bytes_to_write,
  359. NPT_Size* bytes_written)
  360. {
  361. NPT_LOG_FINER_1("writing %d bytes", bytes_to_write);
  362. Array<unsigned char>^ bytes = ref new Array<unsigned char>(bytes_to_write);
  363. NPT_CopyMemory(bytes->Data, buffer, bytes_to_write);
  364. m_Writer->WriteBytes(bytes);
  365. auto operation = m_Writer->StoreAsync();
  366. unsigned int return_value = 0;
  367. NPT_Result result = WaitForAsyncOperation(operation, m_WaitEvent, return_value, m_Timeout);
  368. if (bytes_written) *bytes_written = return_value;
  369. return NPT_SUCCESS;
  370. }
  371. /*----------------------------------------------------------------------
  372. | NPT_WinRtSocketOutputStream::Seek
  373. +---------------------------------------------------------------------*/
  374. NPT_Result
  375. NPT_WinRtSocketOutputStream::Seek(NPT_Position offset)
  376. {
  377. return NPT_ERROR_NOT_SUPPORTED;
  378. }
  379. /*----------------------------------------------------------------------
  380. | NPT_WinRtSocketOutputStream::Tell
  381. +---------------------------------------------------------------------*/
  382. NPT_Result
  383. NPT_WinRtSocketOutputStream::Tell(NPT_Position& where)
  384. {
  385. where = 0;
  386. return NPT_ERROR_NOT_SUPPORTED;
  387. }
  388. /*----------------------------------------------------------------------
  389. | NPT_WinRtSocketOutputStream
  390. +---------------------------------------------------------------------*/
  391. NPT_Result
  392. NPT_WinRtSocketOutputStream::Flush()
  393. {
  394. return NPT_SUCCESS;
  395. }
  396. /*----------------------------------------------------------------------
  397. | NPT_WinRtTcpClientSocket::NPT_WinRtTcpClientSocket
  398. +---------------------------------------------------------------------*/
  399. NPT_WinRtTcpClientSocket::NPT_WinRtTcpClientSocket() :
  400. m_ReadTimeout(NPT_WINRT_SOCKET_DEFAULT_READ_TIMEOUT),
  401. m_WriteTimeout(NPT_WINRT_SOCKET_DEFAULT_WRITE_TIMEOUT)
  402. {
  403. m_Socket = ref new StreamSocket();
  404. m_WaitEvent = CreateEventExW(NULL, L"", 0, EVENT_ALL_ACCESS);
  405. }
  406. /*----------------------------------------------------------------------
  407. | NPT_WinRtTcpClientSocket::NPT_WinRtTcpClientSocket
  408. +---------------------------------------------------------------------*/
  409. NPT_WinRtTcpClientSocket::~NPT_WinRtTcpClientSocket()
  410. {
  411. CloseHandle(m_WaitEvent);
  412. }
  413. /*----------------------------------------------------------------------
  414. | NPT_WinRtTcpClientSocket::Bind
  415. +---------------------------------------------------------------------*/
  416. NPT_Result
  417. NPT_WinRtTcpClientSocket::Bind(const NPT_SocketAddress& address, bool reuse_address)
  418. {
  419. return NPT_ERROR_NOT_IMPLEMENTED;
  420. }
  421. /*----------------------------------------------------------------------
  422. | NPT_WinRtTcpClientSocket::Connect
  423. +---------------------------------------------------------------------*/
  424. NPT_Result
  425. NPT_WinRtTcpClientSocket::Connect(const NPT_SocketAddress& address, NPT_Timeout timeout)
  426. {
  427. try {
  428. NPT_LOG_FINE_1("connecting to %s", address.GetIpAddress().m_HostName.GetChars());
  429. m_RemoteHostName = ref new HostName(StringFromUTF8(address.GetIpAddress().m_HostName.GetChars()));
  430. String^ remote_service = ref new String();
  431. NPT_String port = NPT_String::FromIntegerU(address.GetPort());
  432. IAsyncAction^ connection = m_Socket->ConnectAsync(m_RemoteHostName, StringFromUTF8(port.GetChars()));
  433. // wait for the connection to be established
  434. NPT_Result result = WaitForAsyncAction(connection, m_WaitEvent, timeout);
  435. if (NPT_FAILED(result)) {
  436. NPT_LOG_FINE_1("connection failed (%d)", result);
  437. } else {
  438. NPT_LOG_FINE("connected");
  439. }
  440. return result;
  441. } catch (Exception^ e) {
  442. NPT_LOG_FINE("exception caught");
  443. return NPT_FAILURE;
  444. }
  445. }
  446. /*----------------------------------------------------------------------
  447. | NPT_WinRtTcpClientSocket::GetInputStream
  448. +---------------------------------------------------------------------*/
  449. NPT_Result
  450. NPT_WinRtTcpClientSocket::GetInputStream(NPT_InputStreamReference& stream)
  451. {
  452. stream = new NPT_WinRtSocketInputStream(m_Socket, m_ReadTimeout);
  453. return NPT_SUCCESS;
  454. }
  455. /*----------------------------------------------------------------------
  456. | NPT_WinRtTcpClientSocket::GetOutputStream
  457. +---------------------------------------------------------------------*/
  458. NPT_Result
  459. NPT_WinRtTcpClientSocket::GetOutputStream(NPT_OutputStreamReference& stream)
  460. {
  461. stream = new NPT_WinRtSocketOutputStream(m_Socket, m_WriteTimeout);
  462. return NPT_SUCCESS;
  463. }
  464. /*----------------------------------------------------------------------
  465. | NPT_WinRtTcpClientSocket::GetInfo
  466. +---------------------------------------------------------------------*/
  467. NPT_Result
  468. NPT_WinRtTcpClientSocket::GetInfo(NPT_SocketInfo& info)
  469. {
  470. return NPT_SUCCESS;
  471. }
  472. /*----------------------------------------------------------------------
  473. | NPT_WinRtTcpClientSocket::SetReadTimeout
  474. +---------------------------------------------------------------------*/
  475. NPT_Result
  476. NPT_WinRtTcpClientSocket::SetReadTimeout(NPT_Timeout timeout)
  477. {
  478. m_ReadTimeout = timeout;
  479. return NPT_SUCCESS;
  480. }
  481. /*----------------------------------------------------------------------
  482. | NPT_WinRtTcpClientSocket::SetWriteTimeout
  483. +---------------------------------------------------------------------*/
  484. NPT_Result
  485. NPT_WinRtTcpClientSocket::SetWriteTimeout(NPT_Timeout timeout)
  486. {
  487. m_WriteTimeout = timeout;
  488. return NPT_SUCCESS;
  489. }
  490. /*----------------------------------------------------------------------
  491. | NPT_WinRtTcpClientSocket::Cancel
  492. +---------------------------------------------------------------------*/
  493. NPT_Result
  494. NPT_WinRtTcpClientSocket::Cancel(bool shutdown)
  495. {
  496. return NPT_SUCCESS;
  497. }
  498. /*----------------------------------------------------------------------
  499. | NPT_Socket::~NPT_Socket
  500. +---------------------------------------------------------------------*/
  501. NPT_Socket::~NPT_Socket()
  502. {
  503. delete m_SocketDelegate;
  504. }
  505. /*----------------------------------------------------------------------
  506. | NPT_UdpSocket::NPT_UdpSocket
  507. +---------------------------------------------------------------------*/
  508. NPT_UdpSocket::NPT_UdpSocket(NPT_Flags flags)
  509. {
  510. m_SocketDelegate = NULL;
  511. m_UdpSocketDelegate = NULL;
  512. }
  513. /*----------------------------------------------------------------------
  514. | NPT_UdpSocket::NPT_UdpSocket
  515. +---------------------------------------------------------------------*/
  516. NPT_UdpSocket::NPT_UdpSocket(NPT_UdpSocketInterface* delegate) :
  517. m_UdpSocketDelegate(delegate)
  518. {
  519. }
  520. /*----------------------------------------------------------------------
  521. | NPT_UdpSocket::~NPT_UdpSocket
  522. +---------------------------------------------------------------------*/
  523. NPT_UdpSocket::~NPT_UdpSocket()
  524. {
  525. m_UdpSocketDelegate = NULL;
  526. m_SocketDelegate = NULL;
  527. }
  528. /*----------------------------------------------------------------------
  529. | NPT_UdpMulticastSocket::NPT_UdpMulticastSocket
  530. +---------------------------------------------------------------------*/
  531. NPT_UdpMulticastSocket::NPT_UdpMulticastSocket(NPT_Flags flags) :
  532. NPT_UdpSocket((NPT_UdpSocketInterface*)0)
  533. {
  534. m_SocketDelegate = NULL;
  535. m_UdpSocketDelegate = NULL;
  536. m_UdpMulticastSocketDelegate = NULL;
  537. }
  538. /*----------------------------------------------------------------------
  539. | NPT_UdpMulticastSocket::~NPT_UdpMulticastSocket
  540. +---------------------------------------------------------------------*/
  541. NPT_UdpMulticastSocket::~NPT_UdpMulticastSocket()
  542. {
  543. m_SocketDelegate = NULL;
  544. m_UdpSocketDelegate = NULL;
  545. m_UdpMulticastSocketDelegate = NULL;
  546. }
  547. /*----------------------------------------------------------------------
  548. | NPT_TcpClientSocket::NPT_TcpClientSocket
  549. +---------------------------------------------------------------------*/
  550. NPT_TcpClientSocket::NPT_TcpClientSocket(NPT_Flags flags) :
  551. NPT_Socket(NULL)
  552. {
  553. m_SocketDelegate = new NPT_WinRtTcpClientSocket();
  554. }
  555. /*----------------------------------------------------------------------
  556. | NPT_TcpClientSocket::NPT_TcpClientSocket
  557. +---------------------------------------------------------------------*/
  558. NPT_TcpClientSocket::~NPT_TcpClientSocket()
  559. {
  560. delete m_SocketDelegate;
  561. m_SocketDelegate = NULL;
  562. }
  563. /*----------------------------------------------------------------------
  564. | NPT_TcpServerSocket::NPT_TcpServerSocket
  565. +---------------------------------------------------------------------*/
  566. NPT_TcpServerSocket::NPT_TcpServerSocket(NPT_Flags flags)
  567. {
  568. m_SocketDelegate = NULL;
  569. m_TcpServerSocketDelegate = NULL;
  570. }
  571. /*----------------------------------------------------------------------
  572. | NPT_TcpServerSocket::NPT_TcpServerSocket
  573. +---------------------------------------------------------------------*/
  574. NPT_TcpServerSocket::~NPT_TcpServerSocket()
  575. {
  576. m_SocketDelegate = NULL;
  577. m_TcpServerSocketDelegate = NULL;
  578. }