blob: aa438bcfddb355ad0ed88569dd98ea762cca6438 [file] [log] [blame]
Jeff Thompsonfcf347d2013-07-15 11:30:44 -07001/**
2 * @author: Jeff Thompson
3 * See COPYING for copyright and distribution information.
4 */
5
6#include <stdexcept>
Jeff Thompsonb9e3c8e2013-08-02 11:42:51 -07007#include "../face.hpp"
Jeff Thompson5e275b42013-07-16 19:10:11 -07008#include "../c/util/ndn_realloc.h"
Jeff Thompson53412192013-08-06 13:35:50 -07009#include "tcp-transport.hpp"
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070010
11using namespace std;
12
13namespace ndn {
14
Jeff Thompsonb9e3c8e2013-08-02 11:42:51 -070015void TcpTransport::connect(Face &face)
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070016{
17 ndn_Error error;
Jeff Thompson94ddc272013-08-08 14:17:38 -070018 if ((error = ndn_TcpTransport_connect(&transport_, (char *)face.getHost(), face.getPort())))
Jeff Thompson0cb7aee2013-07-16 16:18:06 -070019 throw std::runtime_error(ndn_getErrorString(error));
Jeff Thompsonb002f902013-07-16 18:07:18 -070020
21 // TODO: This belongs in the socket listener.
Jeff Thompson5e275b42013-07-16 19:10:11 -070022 const unsigned int initialLength = 1000;
Jeff Thompsonb002f902013-07-16 18:07:18 -070023 // Automatically cast ndn_ to (struct ndn_ElementListener *)
Jeff Thompsonf0fea002013-07-30 17:22:42 -070024 ndn_BinaryXmlElementReader_init
Jeff Thompsonb9e3c8e2013-08-02 11:42:51 -070025 (&elementReader_, &face, (unsigned char *)malloc(initialLength), initialLength, ndn_realloc);
Jeff Thompson0cb7aee2013-07-16 16:18:06 -070026
27 // TODO: Properly indicate connected status.
Jeff Thompsonb9e3c8e2013-08-02 11:42:51 -070028 face_ = &face;
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070029}
30
Jeff Thompsonb605b5d2013-07-30 15:12:56 -070031void TcpTransport::send(const unsigned char *data, unsigned int dataLength)
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070032{
33 ndn_Error error;
Jeff Thompson94ddc272013-08-08 14:17:38 -070034 if ((error = ndn_TcpTransport_send(&transport_, (unsigned char *)data, dataLength)))
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070035 throw std::runtime_error(ndn_getErrorString(error));
36}
37
Jeff Thompson432c8be2013-08-09 16:16:08 -070038void TcpTransport::processEvents()
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070039{
Jeff Thompson432c8be2013-08-09 16:16:08 -070040 int receiveIsReady;
41 ndn_Error error;
42 if ((error = ndn_TcpTransport_receiveIsReady(&transport_, &receiveIsReady)))
43 throw std::runtime_error(ndn_getErrorString(error));
44 if (!receiveIsReady)
45 return;
Jeff Thompson7ed97c72013-07-16 17:56:41 -070046
Jeff Thompson432c8be2013-08-09 16:16:08 -070047 unsigned char buffer[8000];
48 unsigned int nBytes;
49 if ((error = ndn_TcpTransport_receive(&transport_, buffer, sizeof(buffer), &nBytes)))
50 throw std::runtime_error(ndn_getErrorString(error));
51
52 ndn_BinaryXmlElementReader_onReceivedData(&elementReader_, buffer, nBytes);
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070053}
54
Jeff Thompson57963882013-08-05 16:01:25 -070055void TcpTransport::close()
56{
57 ndn_Error error;
Jeff Thompson94ddc272013-08-08 14:17:38 -070058 if ((error = ndn_TcpTransport_close(&transport_)))
Jeff Thompson57963882013-08-05 16:01:25 -070059 throw std::runtime_error(ndn_getErrorString(error));
60}
61
Jeff Thompsona00f4eb2013-08-12 12:36:48 -070062TcpTransport::~TcpTransport()
63{
64 if (elementReader_.partialData.array)
65 // Free the memory allocated in connect.
66 free(elementReader_.partialData.array);
67}
68
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070069}