aboutsummaryrefslogtreecommitdiff
path: root/src/gnunet_chat_contact.c
blob: 1fec6af5b3b236c843637fbe51bb82dd2cff771f (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
/*
 * @author Tobias Frisch
 * @file gnunet_chat_contact.c
 */

#include "gnunet_chat_lib.h"
#include "gnunet_chat_contact.h"
#include "gnunet_chat_handle.h"

struct GNUNET_CHAT_Contact*
contact_create (struct GNUNET_CHAT_Handle *handle)
{
  struct GNUNET_CHAT_Contact* contact = GNUNET_new(struct GNUNET_CHAT_Contact);

  contact->handle = handle;
  contact->context = context_create(handle, NULL); // TODO: check for existing context?

  contact->contact = NULL;
  contact->nick = NULL;

  if (!contact->context)
  {
    contact_destroy (contact);
    return NULL;
  }

  const struct GNUNET_HashCode *key = context_get_key(contact->context);

  const int result = GNUNET_CONTAINER_multihashmap_put(
      handle->contacts,
      key,
      contact,
      GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST
  );

  if (GNUNET_OK != result) {
    contact_destroy (contact);
    return NULL;
  }

  return contact;
}

void
contact_destroy (struct GNUNET_CHAT_Contact *contact)
{
  if (!contact->context)
    goto skip_context;

  struct GNUNET_CHAT_Handle *handle = contact->handle;
  const struct GNUNET_HashCode *key = context_get_key(contact->context);

  GNUNET_CONTAINER_multihashmap_remove(
      handle->contacts,
      key,
      contact
  );

  context_destroy(contact->context);

skip_context:
  if (contact->nick)
    GNUNET_free(contact->nick);
}

int
GNUNET_CHAT_contact_delete (struct GNUNET_CHAT_Contact *contact)
{
  if (!contact)
    return GNUNET_SYSERR;

  if (contact->context)
    GNUNET_MESSENGER_close_room(contact->context->room);

  contact_destroy(contact);
  return GNUNET_OK;
}

void
GNUNET_CHAT_contact_set_blocking (struct GNUNET_CHAT_Contact *contact,
				  int blocking)
{
  //TODO
}

int
GNUNET_CHAT_contact_is_blocking (const struct GNUNET_CHAT_Contact *contact)
{
  return GNUNET_NO;
}

void
GNUNET_CHAT_contact_set_name (struct GNUNET_CHAT_Contact *contact,
			      const char *name)
{
  if (!contact)
    return;

  if (contact->nick)
    GNUNET_free(contact->nick);

  contact->nick = name? GNUNET_strdup(name) : NULL;
}

const char*
GNUNET_CHAT_contact_get_name (const struct GNUNET_CHAT_Contact *contact)
{
  if (!contact)
    return NULL;

  if (contact->nick)
    return contact->nick;

  return GNUNET_MESSENGER_contact_get_name(contact->contact);
}

struct GNUNET_CHAT_Context*
GNUNET_CHAT_contact_get_context (struct GNUNET_CHAT_Contact *contact)
{
  if (!contact)
    return NULL;

  return contact->context;
}