diff options
author | Bertrand Jacquin (Beber) <beber@setibzh.com> | 2006-01-31 08:56:40 +0100 |
---|---|---|
committer | Bertrand Jacquin (Beber) <beber@setibzh.com> | 2006-01-31 08:56:40 +0100 |
commit | a0ee1d23a9b4cc0eb3507985254302e593d0465f (patch) | |
tree | 09b9494cf21bf1928f970bb1c74b6cd0df16331e /src | |
parent | erm, don'(t push a symlink (diff) | |
download | espik-a0ee1d23a9b4cc0eb3507985254302e593d0465f.tar.xz |
Missing files
Diffstat (limited to 'src')
-rw-r--r-- | src/espik_irc.c | 296 | ||||
-rw-r--r-- | src/espik_irc.h | 29 | ||||
-rw-r--r-- | src/espik_net.c | 181 | ||||
-rw-r--r-- | src/espik_net.h | 12 |
4 files changed, 518 insertions, 0 deletions
diff --git a/src/espik_irc.c b/src/espik_irc.c new file mode 100644 index 0000000..dbe962d --- /dev/null +++ b/src/espik_irc.c @@ -0,0 +1,296 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include <Ecore.h> +/*#include <Ecore_Con.h>*/ + +#include "espik_global.h" +#include "espik_irc.h" +#include "espik_error.h" +/*#include "espik_common_handler.h"*/ +#include "espik_net.h" +#include "espik_debug.h" +#include "espik.h" + +char* current_chan; + +typedef struct +{ + char* cmd_name; + char* (*format) (char *dest, char *msg); +} cmd_t; + +cmd_t cmd_tab[] = { + { "JOIN", irc_join }, + { "PART", irc_part }, + { "PRIVMSG", irc_privmsg }, + { "QUIT", irc_quit }, + { "RAW", irc_raw }, + { "NICK", irc_nick }, +/* { "ACTION", irc_action }, */ + { 0, 0 } +}; + +/* Cut the commandline in two string + * 1: The first word + * 2: The rest (without any trailer whitespace between firt and rest). + */ +char** separate_commandline (char *msg) +{ + unsigned int len; + char** two_words; + espik_enter(); + + /* Yes, do nothing, just get len ! */ + for (len = 0 ; msg[len] != ' ' && msg[len] != '\t' ; len++); + + two_words = malloc (2 * sizeof(char*)); + + msg[len] = '\0'; + two_words[0] = msg; + + do + { + two_words[1] = msg + ++len; + } + while (*two_words[1] == ' ' || *two_words[1] == '\t'); + + espik_leave(); + return (two_words); +} + +#if 0 +void string_upper (char *str) +{ + unsigned int len, i; + espik_enter(); + + len = strlen (str); + + for (i = 0; i < len; i++) + { + if (str[i] >= 0x61 && str[i] <= 0x7A) + str[i] -= 0x20; + } + espik_debug_print ("string_upper: %s", str); + espik_leave(); +} +#endif + +unsigned short sendmsg_len (char* msg) +{ + espik_enter(); + espik_leave(); + return (strlen (msg) + 2); +} + +buf_t make_buffer(int len) +{ + buf_t buf; + espik_enter(); + + buf.buf = malloc (len); + buf.len = len + 1; /* Alloc trailing \0 */ + + espik_leave(); + return (buf); +} + +char* irc_privmsg (char* chan, char* msg) +{ + buf_t out; + espik_enter(); + + out = make_buffer (strlen ("PRIVMSG") + 1 /* "PRIVMSG " */ + + strlen (chan) + 2 /* ":<channel> "*/ + + strlen (msg)); /* "<msg>EOF" */ + + snprintf (out.buf, out.len, "PRIVMSG %s :%s", chan, msg); + + free (msg); + espik_leave(); + return (out.buf); +} + +char* irc_join (char* chan __UNUSED__, char* msg) +{ + buf_t out; + espik_enter(); + + /* Could also by '&' and so one ... + * have to look on RFC, dev will be done with # only */ + if (msg[0] != '#') + { + espik_debug_print ("%s is not a channel", msg); + espik_debug_print ("Usage: /JOIN #channel"); + espik_leave(); + return (0); + } + + out = make_buffer (strlen ("JOIN") + 1 /* "JOIN " */ + + strlen (msg)); /* "<msg>EOF" */ + + snprintf (out.buf, out.len, "JOIN %s", msg); + + free (msg); + espik_leave(); + return (out.buf); +} + +char* irc_part (char* chan, char* msg) +{ + buf_t out; + espik_enter(); + + if (msg[0] != '#') + { + out = make_buffer (strlen ("PART") + 1 /* "PART " */ + + strlen (chan) + 2 /* ":<chan> " */ + + strlen (msg)); /* "<msg>EOF" */ + + snprintf (out.buf, out.len, "PART %s :%s", chan, msg); + } + else + { + char** sep; + + sep = separate_commandline (msg); + + out = make_buffer (strlen ("PART") + 1 /* "PART " */ + + strlen (sep[0]) + 2 /* ":<chan> "*/ + + strlen (sep[1])); /* "<msg>EOF"*/ + + snprintf (out.buf, out.len, "PART %s :%s", sep[0], sep[1]); + } + + free (msg); + espik_leave(); + return (out.buf); +} + +char* irc_quit (char* chan __UNUSED__, char* msg) +{ + buf_t out; + espik_enter(); + + out = make_buffer (strlen ("QUIT") + 2 /* "QUIT :" */ + + strlen (msg)); /* "<msg>EOF" */ + + snprintf (out.buf, out.len, "QUIT :%s", msg); + + espik_debug_print ("msg : %s\nout: %s", msg, out.buf); + + /* + espik_raw_send (out); + espik_con_shutdown (); + + irc_disconnect(sock); + */ + free (msg); + + espik_leave(); + return (out.buf); +} + +char* irc_raw (char* chan __UNUSED__, char* msg) +{ + espik_enter(); + espik_leave(); + return (msg); +} + +char* irc_nick (char* chan __UNUSED__, char* nick) +{ + espik_enter(); + buf_t out; + + out = make_buffer (strlen ("NICK") + 1 /* "NICK " */ + + strlen (nick)); /* "<nick>EOF" */ + + snprintf (out.buf, out.len, "NICK %s", nick); + + espik_debug_print ("NICK CHANGED REQUEST: %s", nick); + + espik_leave(); + return (out.buf); +} + +#if 0 +Ecore_Con_Server* irc_connect (char* host __UNUSED__, int port __UNUSED__) +{ + espik_enter(); + espik_leave(); + return (NULL); +} + +void irc_disconnect (Ecore_Con_Server *sock) +{ + espik_enter(); + espik_debug_print ("> irc_disconnect"); + ecore_main_loop_quit (); + espik_debug_print ("< irc_disconnect"); + espik_leave(); +} +#endif + +char* irc_send (char* msg) +{ + char* out; + espik_enter(); + + out = NULL; + + current_chan = "#e.fr"; + + if (msg[0] == '/') + { + char** cmd_and_message; + cmd_t* cmd; + + cmd_and_message = separate_commandline (msg + 1); + + /* + espik_debug_print ("irc_send: <separate_commandline"); + */ + + /* + string_upper (cmd_and_message[0]); + */ + + for (cmd = cmd_tab; cmd->cmd_name != 0; cmd++) + { + if ((strcasecmp (cmd_and_message[0], cmd->cmd_name)) == 0) + { + out = cmd->format (current_chan, + cmd_and_message[1]); + free (msg); + /* Why do job after found the good to do ? */ + break; + } + } + if (!out) + { + espik_debug_print ("%s is not a know command", + cmd_and_message[0]); + espik_leave(); + return (0); + } + } + else + { + out = irc_privmsg (current_chan, msg); + } + + if (!out) + { + free (msg); + espik_leave(); + return (0); + } + + espik_debug_print ("%s", out); + + espik_leave(); + return (out); +} diff --git a/src/espik_irc.h b/src/espik_irc.h new file mode 100644 index 0000000..5d72095 --- /dev/null +++ b/src/espik_irc.h @@ -0,0 +1,29 @@ +#ifndef HAVE_ESPIK_IRC_H +#define HAVE_ESPIK_IRC_H + +typedef struct +{ + char* buf; + int len; +} buf_t; + +unsigned short sendmsg_len (char*); +char* irc_send (char*); +char* irc_privmsg (char*, char *); + +/*char* irc_action (char *, char *);*/ +char* irc_join (char*, char*); +char* irc_part (char*, char*); +char* irc_quit (char*, char*); +char* irc_raw (char*, char*); +char* irc_nick(char*, char*); + +char** separate_commandline (char*); +buf_t make_buffer(int); +/*void string_upper (char*);*/ + +/*Ecore_Con_Server* irc_connect (char*, int);*/ +/*void irc_disconnect (Ecore_Con_Server*);*/ + + +#endif /* HAVE_ESPIK_IRC_H */ diff --git a/src/espik_net.c b/src/espik_net.c new file mode 100644 index 0000000..d56f070 --- /dev/null +++ b/src/espik_net.c @@ -0,0 +1,181 @@ +#include <string.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> + +#include "espik_global.h" +#include "espik_net.h" +#include "espik_common_handler.h" +#include "espik_error.h" +#include "espik_debug.h" +#include "espik_irc.h" +#include "espik.h" + +#include <Ecore.h> +#include <Ecore_Con.h> + +typedef int (*Handler_Func) (void* data, int ev_type, void* ev); + +static int ret_int; /* For debug */ +char connected = 0; + +Ecore_Con_Server* con_sock; + +Ecore_Event_Handler* ret; + +void espik_con_init (t_info serv_info) +{ + int nb_launch; + espik_enter(); + + nb_launch = ecore_con_init (); + + com_active = 0; + + /* + espik_debug_printf ("nb_launch = %d", nb_launch); + */ + + con_sock = ecore_con_server_connect (ECORE_CON_REMOTE_SYSTEM, + serv_info.server->host, + (int)serv_info.server->port, NULL); + if (!con_sock) + { + espik_debug_print ("ecore_con_server_connect failed " + "(ECORE_CON_REMOTE_SYSTEM)"); + exit (-1); + } + espik_free (con_sock); + + if (! (ret = ecore_event_handler_add (ECORE_CON_EVENT_SERVER_DATA, + (Handler_Func) server_data, NULL))) + { + espik_debug_print ("ecore_event_handler_add " + "(ECORE_CON_EVENT_SERVER_DATA)"); + exit (-1); + } + espik_free (ret); + + if (! (ret = ecore_event_handler_add (ECORE_CON_EVENT_SERVER_ADD, + (Handler_Func) espik_con_up, NULL))) + { + espik_debug_print ("ecore_event_handler_add " + "(ECORE_CON_EVENT_SERVER_ADD)"); + exit (-1); + } + espik_free (ret); + + if (! (ret = ecore_event_handler_add (ECORE_CON_EVENT_SERVER_DEL, + (Handler_Func) espik_con_shutdown, NULL))) + { + espik_debug_print ("ecore_event_handler_add " + "(ECORE_CON_EVENT_SERVER_DEL)"); + exit (-1); + } + espik_free (ret); + + espik_leave(); +} + +void send_login() +{ + espik_enter(); +// espik_debug_print ("<<<<<<<< DUMMMMY CODE >>>>>>>"); + + char *tmp, *tmp2; + + tmp = malloc ( strlen("NICK ") + + strlen (a_infos.client->nickname)); + tmp2 = malloc ( strlen("USER :") + + strlen(a_infos.client->nickname)*2 + + strlen (a_infos.client->realname) + + strlen (a_infos.server->host)); + + sprintf (tmp, "NICK %s", a_infos.client->nickname); + sprintf (tmp2, "USER %s %s %s: %s", a_infos.client->nickname, + a_infos.client->nickname, a_infos.server->host, + a_infos.client->realname); + + espik_debug_print("tmp: %s", tmp); + espik_raw_send (tmp); + espik_debug_print("tmp2: %s", tmp2); + espik_raw_send (tmp2); + espik_raw_send ("JOIN #e.fr"); + + com_active = 1; + +// espik_debug_print ("<<<<<<<< DUMMMMY CODE >>>>>>>"); + + free (tmp); + free (tmp2); + + connected++; + espik_leave(); +} + +void espik_con_up() +{ + espik_enter(); + printf ("Connected\n"); + espik_leave(); +} + +void espik_con_shutdown () +{ + espik_enter(); + + if (!connected) + espik_debug_print ("Unable to connect to server"); + + espik_debug_print ("ecore_con_server_del: %p", + ecore_con_server_del (con_sock)); + + ecore_con_shutdown (); + + /* + ecore_event_handler_del (handler_list.data); + ecore_event_handler_del (handler_list.up); + ecore_event_handler_del (handler_list.down); + */ + + ecore_main_loop_quit (); + espik_free (server_dns); + + espik_leave(); +} + +void espik_raw_send (const char *msg) +{ + buf_t buf; + espik_enter(); + + buf = make_buffer (strlen(msg) + 1); /* <MESSAGE>\r\n\0" */ + + snprintf (buf.buf, buf.len, "%s\r\n", msg); + /* Override trailing \0 */ + espik_debug_print("strlen(msg): %d", strlen(msg)); + espik_debug_print("buf.len: %d", buf.len); + buf.buf[buf.len-1] = '\n'; +// buf.buf[buf.len] = '\0'; + + espik_debug_print ("\n\nmsg(%d): %s\n\nout(%d-%d): %s\n", strlen(msg), msg, strlen(buf.buf), buf.len, buf.buf); + /* + printf ("out[len-3]: 0x%X\n", out[len - 3]); + printf ("out[len-2]: 0x%X\n", out[len - 2]); + printf ("out[len-1]: 0x%X\n", out[len - 1]); + */ + + int i; + for (i = 0 ; buf.buf[i] != 0 ; i++) + { + espik_debug_print ("buf.buf[%d]: '%d'", i, buf.buf[i]); + } + + + ret_int = ecore_con_server_send (con_sock, buf.buf, buf.len); + + espik_debug_print ("ret_int: %d", ret_int); + free (buf.buf); +// free (msg); + espik_leave(); +} diff --git a/src/espik_net.h b/src/espik_net.h new file mode 100644 index 0000000..a095ba9 --- /dev/null +++ b/src/espik_net.h @@ -0,0 +1,12 @@ +#ifndef HAVE_ESPIK_NET_H +#define HAVE_ESPIK_NET_H + +#include "espik.h" + +void espik_raw_send (const char*); +void espik_con_init (t_info); +void espik_con_up(); +void espik_con_shutdown (); +void send_login(); + +#endif /* HAVE_ESPIK_NET_H */ |