/**
 * @author: Jeff Thompson
 * See COPYING for copyright and distribution information.
 */

#include <cstdlib>
#include <sstream>
#include <iostream>
#include <ndn-cpp/interest.hpp>
#include <ndn-cpp/data.hpp>
#include <ndn-cpp/face.hpp>

using namespace std;
using namespace ndn;
using namespace ptr_lib;

static int CallbackCount = 0;

void myOnData(const ptr_lib::shared_ptr<const Interest> &interest, const ptr_lib::shared_ptr<Data> &data)
{
  ++CallbackCount;
  cout << "Got data packet with name " << data->getName().to_uri() << endl;
  for (unsigned int i = 0; i < data->getContent().size(); ++i)
    cout << data->getContent()[i];
  cout << endl;  
}

void myOnTimeout(const ptr_lib::shared_ptr<const Interest> &interest)
{
  ++CallbackCount;
  cout << "Time out for interest " << interest->getName().toUri() << endl;    
}

int main(int argc, char** argv)
{
  try {
    Face face("E.hub.ndn.ucla.edu");
    
    Name name1("/ndn/ucla.edu/apps/ndn-js-test/hello.txt/level2/%FD%05%0B%16%7D%95%0E");    
    cout << "Express name  " << name1.toUri() << endl;
    face.expressInterest(name1, myOnData, myOnTimeout);
    
    Name name2("/ndn/ucla.edu/apps/lwndn-test/howdy.txt/%FD%05%05%E8%0C%CE%1D");
    cout << "Express name  " << name2.toUri() << endl;
    face.expressInterest(name2, myOnData, myOnTimeout);
    
    Name name3("/test/timeout");
    cout << "Express name  " << name3.toUri() << endl;
    face.expressInterest(name3, myOnData, myOnTimeout);

    // The main event loop.
    while (CallbackCount < 3) {
      face.processEvents();
      // We need to sleep for a few milliseconds so we don't use 100% of the CPU.
      usleep(10000);
    }
  } catch (std::exception &e) {
    cout << "exception: " << e.what() << endl;
  }
  return 0;
}
