-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathqpurple.cpp
More file actions
187 lines (156 loc) · 6.45 KB
/
qpurple.cpp
File metadata and controls
187 lines (156 loc) · 6.45 KB
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <QMap>
#include "qpurple.h"
#include "qpurpleionotifier.h"
#include "qpurpletimer.h"
namespace QPurple {
// unique handle for our input events (QPurpleIONotifiers and QPurpleTimers)
unsigned int unique_handle = 0;
QMap< int , QPurpleIONotifier* > notifierMap;
QMap< int , QPurpleTimer* > timerMap;
// Event loop functions
static guint qt_input_add(gint fd, PurpleInputCondition condition, PurpleInputFunction function,
gpointer data)
{
PurpleGLibIOClosure *closure = g_new0(PurpleGLibIOClosure, 1);
int handle;
closure->function = function;
closure->data = data;
// modified from the nullclient source to integrate with Qt
handle = unique_handle++; // this will be unique, certainly
notifierMap[handle] = new QPurpleIONotifier(fd, closure, condition);
return handle;
}
static gboolean qt_input_remove(guint handle) {
int toReturn = 0;
QPurpleIONotifier *tmp = notifierMap.take(handle);
if (!tmp->defaultConstructed) {
toReturn = 1;
delete tmp; }
return toReturn;
}
static guint qt_timer_add(guint interval, GSourceFunc function, gpointer data) {
int handle = unique_handle++;
timerMap[handle] = new QPurpleTimer(function, data, interval);
return handle;
}
static guint qt_timer_add_seconds(guint interval, GSourceFunc function, gpointer data) {
return qt_timer_add(interval * 1000,function, data);
}
static gboolean qt_timer_remove(guint handle) {
int toReturn = 0;
QPurpleTimer *tmp = timerMap.take(handle);
if (!tmp->defaultConstructed) { // we removed something
toReturn = 1;
delete tmp; }
return toReturn;
}
static PurpleEventLoopUiOps qt_eventloops =
{
qt_timer_add,
qt_timer_remove,
qt_input_add,
qt_input_remove,
NULL,
qt_timer_add_seconds,
/* padding */
NULL,
NULL,
NULL
};
static void
qt_write_conv(PurpleConversation *conv, const char *who, const char *alias,
const char *message, PurpleMessageFlags flags, time_t mtime)
{
printf("(%s) %s %s: %s\n", purple_conversation_get_name(conv),
purple_utf8_strftime("(%H:%M:%S)", localtime(&mtime)),
who, message);
}
static PurpleConversationUiOps null_conv_uiops =
{
NULL, /* create_conversation */
NULL, /* destroy_conversation */
NULL, /* write_chat */
NULL, /* write_im */
qt_write_conv, /* write_conv */
NULL, /* chat_add_users */
NULL, /* chat_rename_user */
NULL, /* chat_remove_users */
NULL, /* chat_update_user */
NULL, /* present */
NULL, /* has_focus */
NULL, /* custom_smiley_add */
NULL, /* custom_smiley_write */
NULL, /* custom_smiley_close */
NULL, /* send_confirm */
NULL,
NULL,
NULL,
NULL
};
static void
qt_ui_init(void)
{
/**
* This should initialize the UI components for all the modules. Here we
* just initialize the UI for conversations.
*/
purple_conversations_set_ui_ops(&null_conv_uiops);
}
static PurpleCoreUiOps null_core_uiops =
{
NULL,
NULL,
qt_ui_init,
NULL,
/* padding */
NULL,
NULL,
NULL,
NULL
};
static void
_init_libpurple(void)
{
/* Set a custom user directory (optional) */
purple_util_set_user_dir(CUSTOM_USER_DIRECTORY);
/* We do not want any debugging for now to keep the noise to a minimum. */
purple_debug_set_enabled(FALSE);
/* Set the core-uiops, which is used to
* - initialize the ui specific preferences.
* - initialize the debug ui.
* - initialize the ui components for all the modules.
* - uninitialize the ui components for all the modules when the core terminates.
*/
purple_core_set_ui_ops(&null_core_uiops);
/* Set the uiops for the eventloop. If your client is glib-based, you can safely
* copy this verbatim. */
purple_eventloop_set_ui_ops(&qt_eventloops);
/* Set path to search for plugins. The core (libpurple) takes care of loading the
* core-plugins, which includes the protocol-plugins. So it is not essential to add
* any path here, but it might be desired, especially for ui-specific plugins. */
purple_plugins_add_search_path(CUSTOM_PLUGIN_PATH);
/* Now that all the essential stuff has been set, let's try to init the core. It's
* necessary to provide a non-NULL name for the current ui to the core. This name
* is used by stuff that depends on this ui, for example the ui-specific plugins. */
if (!purple_core_init(UI_ID)) {
/* Initializing the core failed. Terminate. */
fprintf(stderr,
"libpurple initialization failed. Dumping core.\n"
"Please report this!\n");
abort();
}
/* Create and load the buddylist. */
purple_set_blist(purple_blist_new());
purple_blist_load();
/* Load the preferences. */
purple_prefs_load();
/* Load the desired plugins. The client should save the list of loaded plugins in
* the preferences using purple_plugins_save_loaded(PLUGIN_SAVE_PREF) */
purple_plugins_load_saved(PLUGIN_SAVE_PREF);
/* Load the pounces. */
//purple_pounces_load();
}
}
void qpurple_init() {
QPurple::_init_libpurple();
}