187 lines
3.8 KiB
C
187 lines
3.8 KiB
C
|
/** _
|
||
|
** (_)_ __ __ ___ _ __ _ __
|
||
|
** | | ' \/ _/ _ \ ' \| ' \
|
||
|
** |_|_|_|_\__\___/_|_|_|_|_|_|
|
||
|
**
|
||
|
** Copyright (C) 2003-2005, Claudio Leite
|
||
|
** All rights reserved.
|
||
|
**
|
||
|
** Please see the file 'COPYING' for licensing information.
|
||
|
**/
|
||
|
|
||
|
#include "imcomm.h"
|
||
|
|
||
|
void buddy_online(void *h, const char *who);
|
||
|
void buddy_offline(void *h, const char *who);
|
||
|
void idleinfo(void *, const char *, unsigned long);
|
||
|
void error(void *h, int errornum);
|
||
|
void incoming_im(void *, const char *, const int, const char *);
|
||
|
char *strip_html(char *message);
|
||
|
|
||
|
void
|
||
|
incoming_im(void *handle, const char *who, const int automessage,
|
||
|
const char *message)
|
||
|
{
|
||
|
char *msg;
|
||
|
msg = strip_html((char *) message);
|
||
|
printf("[%s] %s\n", who, msg);
|
||
|
|
||
|
if (strcmp(msg, "quit now") == 0) {
|
||
|
#ifdef MACINTOSH_CLASSIC
|
||
|
mactcp_close(handle);
|
||
|
CloseResolver();
|
||
|
#endif
|
||
|
free(msg);
|
||
|
exit(0);
|
||
|
}
|
||
|
free(msg);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main(int argc, char *argv[])
|
||
|
{
|
||
|
void *handle;
|
||
|
|
||
|
#ifndef MACINTOSH_CLASSIC
|
||
|
fd_set readfs;
|
||
|
struct timeval tm;
|
||
|
|
||
|
tm.tv_sec = 2;
|
||
|
tm.tv_usec = 150000;
|
||
|
#endif
|
||
|
|
||
|
handle = imcomm_create_handle();
|
||
|
imcomm_register_callback(handle, IMCOMM_IM_SIGNON, buddy_online);
|
||
|
imcomm_register_callback(handle, IMCOMM_IM_SIGNOFF, buddy_offline);
|
||
|
imcomm_register_callback(handle, IMCOMM_IM_IDLEINFO, idleinfo);
|
||
|
imcomm_register_callback(handle, IMCOMM_ERROR, error);
|
||
|
imcomm_register_callback(handle, IMCOMM_IM_INCOMING, incoming_im);
|
||
|
imcomm_im_signon(handle, argv[1], argv[2]);
|
||
|
printf("Starting IMComm test program...\n");
|
||
|
|
||
|
while (1) {
|
||
|
#ifdef MACINTOSH_CLASSIC
|
||
|
imcomm_select(NULL, NULL, NULL, NULL, NULL);
|
||
|
#else
|
||
|
FD_ZERO(&readfs);
|
||
|
#if 0
|
||
|
FD_SET(fileno(stdin), &readfs);
|
||
|
#endif
|
||
|
imcomm_select(0, &readfs, NULL, NULL, &tm);
|
||
|
fflush(stdout);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
buddy_online(void *h, const char *who)
|
||
|
{
|
||
|
printf(">>> %s is now online\n", who);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
buddy_offline(void *h, const char *who)
|
||
|
{
|
||
|
printf("<<< %s is now offline\n", who);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
idleinfo(void *h, const char *who, unsigned long time)
|
||
|
{
|
||
|
printf("*** Idle: %s, %ld\n", who, time);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
error(void *h, int errornum)
|
||
|
{
|
||
|
printf("*** ");
|
||
|
|
||
|
switch (errornum) {
|
||
|
case IMCOMM_STATUS_CONNECTED:
|
||
|
printf("Connected.\n");
|
||
|
break;
|
||
|
case IMCOMM_ERROR_INVALID_LOGIN:
|
||
|
printf("Login failed.\n");
|
||
|
break;
|
||
|
case IMCOMM_ERROR_DISCONNECTED:
|
||
|
printf("Disconnected.\n");
|
||
|
break;
|
||
|
case IMCOMM_ERROR_OTHER_SIGNON:
|
||
|
printf
|
||
|
("You've been disconnected because you signed on at a different location.\n");
|
||
|
break;
|
||
|
case IMCOMM_STATUS_AUTHDONE:
|
||
|
printf("Authentication succeeded.\n");
|
||
|
break;
|
||
|
default:
|
||
|
printf("Unknown error type.\n");
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
strip_html(char *message)
|
||
|
{
|
||
|
char *temp;
|
||
|
int x, count, inhtml;
|
||
|
|
||
|
temp = malloc(strlen(message) + 1);
|
||
|
for (x = 0, count = 0, inhtml = 0; x < strlen(message); x++) {
|
||
|
if (message[x] == '&') {
|
||
|
if (x + 4 < strlen(message)) {
|
||
|
if (strncmp(message + x, "&", 5) == 0) {
|
||
|
temp[count] = '&';
|
||
|
count++;
|
||
|
x += 4;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
if (x + 5 < strlen(message)) {
|
||
|
if (strncmp(message + x, """, 6) == 0) {
|
||
|
temp[count] = '\"';
|
||
|
count++;
|
||
|
x += 5;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
if (x + 3 < strlen(message)) {
|
||
|
if (strncmp(message + x, "<", 4) == 0) {
|
||
|
temp[count] = '<';
|
||
|
count++;
|
||
|
x += 3;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
if (x + 3 < strlen(message)) {
|
||
|
if (strncmp(message + x, ">", 4) == 0) {
|
||
|
temp[count] = '>';
|
||
|
count++;
|
||
|
x += 3;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (message[x] == '<')
|
||
|
inhtml = 1;
|
||
|
if (inhtml) {
|
||
|
if (message[x] == '>')
|
||
|
inhtml = 0;
|
||
|
continue;
|
||
|
}
|
||
|
if (message[x] == '\n' || message[x] == '\r')
|
||
|
temp[count] = ' ';
|
||
|
else
|
||
|
temp[count] = message[x];
|
||
|
count++;
|
||
|
}
|
||
|
|
||
|
temp = realloc(temp, count + 1);
|
||
|
temp[count] = 0;
|
||
|
return temp;
|
||
|
}
|