summaryrefslogtreecommitdiff
path: root/data.c
blob: f19075c46995e46e2e4319f33783736ec640b030 (plain)
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
144
145
146
147
148
149


#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

#include "gui.h"
#include "data.h"


static roster_item_t* roster = NULL;


/* check if JID is already in roster data structure */
bool is_jid_known(const char* jid) {

	roster_item_t* i;

	// iterate over all roster items
	for (i = roster; i != NULL; i=i->next) {
		if (strcmp(i->jid, jid) == 0) {
			return true;
		}
	}

	return false;

}

void data_add_roster_item(const char* jid, const char* subscription,
                          const char* name) {

	// FIXME handle roster updates
	if (is_jid_known(jid)) {
		return;
	}

	// allocate datastructures
	roster_item_t* item = malloc(sizeof(roster_item_t));
	chat_t* chat = malloc(sizeof(chat_t));

	// initialize chat
	chat->messages = NULL;
	chat->jid = malloc(sizeof(char)*strlen(jid));
	strcpy(chat->jid, jid);
	gui_add_chat_widget(chat);

	// initialize roster item
	if (name == NULL) {
		item->name = NULL;
	} else {
		item->name = malloc(sizeof(char)*strlen(name));
		strcpy(item->name, name);
	}
	item->jid = malloc(sizeof(char)*strlen(jid));
	strcpy(item->jid, jid);
	if (strcmp(subscription, "none") == 0) {
		item->sub = SUB_NONE;
	} else if (strcmp(subscription, "to") == 0) {
		item->sub = SUB_TO;
	} else if (strcmp(subscription, "from") == 0) {
		item->sub = SUB_FROM;
	} else if (strcmp(subscription, "both") == 0) {
		item->sub = SUB_BOTH;
	} else {
		fprintf(stderr, "Invalid subscription '%s'!\n", subscription);
		return;
	}
	item->chat = chat;
	item->next = NULL;
	gui_add_roster_item_widget(item);

	// add item to roster datastructure
	if (roster == NULL) {
		roster = item;
	} else {
		roster_item_t* current = roster;
		while (current->next != NULL)     // loop until end of linked list
			current = current->next;
		current->next = item;
	}

}

void data_add_incoming_message(const char* sender_jid, const char* content) {

	// TODO rework based on chat->jid
	// find correct chat
	chat_t* chat = NULL;
	roster_item_t* i;
	int bare_len;  // length of bare JID
	for (i = roster; i != NULL; i=i->next) {
		bare_len = strlen(i->jid);
		if (strncmp(i->jid, sender_jid, bare_len) == 0) {
			chat = i->chat;
			break;
		}
	}
	if (chat == NULL) {
		fprintf(stderr, "Could not find chat for message from '%s'!\n", sender_jid);
		return;
	}

	// initialize message_t
	message_t* msg = malloc(sizeof(message_t));
	msg->sender_jid = malloc(sizeof(char)*strlen(sender_jid));
	strcpy(msg->sender_jid, sender_jid);
	msg->content = malloc(sizeof(char)*strlen(content));
	strcpy(msg->content, content);
	msg->next = NULL;
	gui_add_message_widget(msg, i->chat);

	// find pointer to next message of chat
	message_t* m;
	for (m = chat->messages; m != NULL; m=m->next);

	// append message to chat
	m = msg;

	// TODO could be more correct to update chat->jid to full JID of just
	// received message so that future responses go to this ressource

}

void data_add_outgoing_message(const char* sender_jid, const char* content,
                               chat_t* chat) {

	// allocate and initialize message_t
	message_t* msg = malloc(sizeof(message_t));
	msg->sender_jid = malloc(sizeof(char)*strlen(sender_jid));
	strcpy(msg->sender_jid, sender_jid);
	msg->recipient_jid = malloc(sizeof(char)*strlen(chat->jid));
	strcpy(msg->recipient_jid, chat->jid);
	msg->content = malloc(sizeof(char)*strlen(content));
	strcpy(msg->content, content);
	msg->next = NULL;

	// find pointer to next message of chat and add this message
	message_t* m;
	for (m = chat->messages; m != NULL; m=m->next);
	m = msg;

	// TODO send this message via XMPP

	// create GUI widget for this message
	gui_add_message_widget(msg, chat);

}