summaryrefslogtreecommitdiff
path: root/src/gnunet/social/guest.cpp
blob: d0afd240e75686a22cd9957bc693ba2e6dc0f0aa (plain) (blame)
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "guest.h"
#include <QDebug>

Guest::Guest (GNUNET_SOCIAL_App *app,
              GNUNET_SOCIAL_Ego *ego,
              const GNUNET_CRYPTO_EddsaPublicKey *placePubKey,
              const GNUNET_PeerIdentity *origin,
              uint32_t relayCount,
              const GNUNET_PeerIdentity *relays,
              const GNUNET_PSYC_Message *entryMsg,
              QObject *parent) : Place (parent)
{
  m_app = app;
  m_ego = ego;
  if (NULL == entryMsg)
  {
    GNUNET_PSYC_Environment *env = GNUNET_PSYC_env_create ();
#ifdef TESTING
    GNUNET_PSYC_env_add (env, GNUNET_PSYC_OP_ASSIGN, "_test_abc", "abc def", 7);
    GNUNET_PSYC_env_add (env, GNUNET_PSYC_OP_ASSIGN, "_test_abc_def", "abc def ghi", 11);
#endif
    entryMsg = GNUNET_PSYC_message_create ("_request_enter", env, NULL, 0);
  }

  m_guest =
    GNUNET_SOCIAL_guest_enter (m_app, ego, placePubKey,
                               GNUNET_PSYC_SLAVE_JOIN_NONE,
                               origin, 0, NULL,
                               entryMsg, createSlicer (),
                               recvLocalEnterCallback,
                               recvEntryDecisionCallback,
                               this);
  m_plc = GNUNET_SOCIAL_guest_get_place (m_guest);
  connectSignals ();
}


Guest::Guest (GNUNET_SOCIAL_App *app,
              GNUNET_SOCIAL_Ego *ego,
              GNUNET_SOCIAL_GuestConnection *gconn,
              QObject *parent) : Place (parent)
{
  m_app = app;
  m_ego = ego;
  m_guest =
    GNUNET_SOCIAL_guest_enter_reconnect (gconn,
                                         GNUNET_PSYC_SLAVE_JOIN_NONE,
                                         createSlicer (),
                                         recvLocalEnterCallback,
                                         this);
  m_plc = GNUNET_SOCIAL_guest_get_place (m_guest);
  connectSignals ();
}


Guest::~Guest ()
{
  GNUNET_SOCIAL_guest_disconnect (m_guest, NULL, NULL);
}


void
Guest::connectSignals ()
{
  connect (this, SIGNAL (talkRequestSignal ()),
           this, SLOT (talkRequest (QString)),
           Qt::QueuedConnection);
}

void
Guest::recvLocalEnterCallback (void *cls, int result,
                               const struct GNUNET_CRYPTO_EddsaPublicKey *placePubKey,
                               uint64_t max_message_id)
{
  GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
              "Guest entered to local place, result : %i.\n", result);

  Guest *guest = (Guest *) cls;
  guest->init (*placePubKey);
}


void
Guest::recvEntryDecisionCallback (void *cls, int is_admitted,
                                  const struct GNUNET_PSYC_Message *entry_msg)
{
  GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
              "Guest received entry decision: %d.\n", is_admitted);

  if (NULL != entry_msg)
  {
    struct GNUNET_PSYC_Environment *env = GNUNET_PSYC_env_create ();
    const char *method_name = NULL;
    const void *data = NULL;
    uint16_t data_size = 0;

    struct GNUNET_PSYC_MessageHeader *pmsg =
      GNUNET_PSYC_message_header_create_from_psyc (entry_msg);
    GNUNET_PSYC_message_parse (pmsg, &method_name, env, &data, &data_size);

    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%s\n%.*s\n", method_name, data_size,
                data);
    GNUNET_free (pmsg);
  }
}


void
Guest::talkRequest (Message *msg)
{
  if (m_inTransmit)
  {
    // FIXME: queue message
    qDebug () << "Host.announce: already in transmit";
    return;
  }

  m_inTransmit = true;
  m_tmitData = msg->data ().toStdString ();
  m_tmitSent = 0;

  GNUNET_PSYC_Environment *env = msg->getPsycEnv ();
  m_talk =
    GNUNET_SOCIAL_guest_talk (m_guest, msg->method ().toStdString ().c_str (),
                              env, notifyDataCallback, this,
                              GNUNET_SOCIAL_TALK_NONE);
  GNUNET_PSYC_env_destroy (env);
}


void
Guest::talkRequest (QString text)
{
  Message msg ("_converse", QList<Modifier *>(), text, 0);
  talkRequest (&msg);
}


void
Guest::talk (QString text)
{
  emit talkRequestSignal (text);
}