コード例 #1
0
ファイル: f_chat.c プロジェクト: scljz/fetion
void SendInvite(struct fetion_account_data *sip,const gchar *who)
{
	gchar *body,*hdr,*fullto;
	const gchar *my_ip;
	gint my_port;
	struct fetion_buddy * buddy = NULL;
	if(strncmp("sip:", who, 4)==0)
		fullto = g_strdup_printf("T: %s\r\n", who);
	else 
		return;
	buddy = g_hash_table_lookup(sip->buddies,who);
	g_return_if_fail(buddy!=NULL);
	my_ip = purple_network_get_my_ip(sip->fd);
	my_port = purple_network_get_port_from_fd(sip->fd);
	purple_debug_info("fetion:","SendInvite:[%s:%d]\n",my_ip,my_port);
	hdr = g_strdup_printf("K: text/html-fragment\r\n"
			"K: multiparty\r\n"
			"K: nudge\r\n");	
	body = g_strdup_printf("v=0\r\n"
			"o=-0 0 IN %s:%d\r\n"
			"s=session\r\n"
			"c=IN IP4 %s:%d\r\n"
			"t=0 0\r\n"
			"m=message %d sip %s\r\n",
			my_ip,my_port,my_ip,my_port,my_port,sip->uri);

	purple_debug_info("fetion:","SendInvite:[%s]\n",body);
	send_sip_request(sip->gc,"I","",fullto,hdr,body,buddy->dialog,(TransCallback) SendInvite_cb);

	g_free(fullto);
	g_free(hdr);
	g_free(body);
}
コード例 #2
0
ファイル: f_chat.c プロジェクト: scljz/fetion
void process_incoming_invite(struct fetion_account_data *sip,struct sipmsg *msg)
{
	const gchar * to,*callid;	
	gchar * body;
	const gchar *my_ip;
	gint my_port;
	struct group_chat *g_chat;
	struct fetion_buddy * buddy =NULL;
	my_ip = purple_network_get_my_ip(sip->fd);
	my_port = purple_network_get_port_from_fd(sip->fd);
	purple_debug_info("fetion:","Invite:[%s:%d]\n",my_ip,my_port);
	body = g_strdup_printf("v=0\r\n"
			"o=-0 0 IN %s:%d\r\n"
			"s=session\r\n"
			"c=IN IP4 %s:%d\r\n"
			"t=0 0\r\n"
			"m=message %d sip %s\r\n",
			my_ip,my_port,my_ip,my_port,my_port,sip->uri);

	purple_debug_info("fetion:","Invite:answer[%s]\n",body);
	send_sip_response(sip->gc,msg,200,"OK",body);

	callid = sipmsg_find_header(msg,"I");
	to = sipmsg_find_header(msg,"F");
	if(strncmp(to,"sip:TG",6)!=0)
	{
		buddy = g_hash_table_lookup(sip->buddies,to);
		if(buddy==NULL)
		{
			buddy = g_new0(struct fetion_buddy, 1);
			buddy->name = g_strdup(to);
			g_hash_table_insert(sip->buddies, buddy->name, buddy);
		}
コード例 #3
0
static void no_upnp()
{
	char msg[100];
	snprintf(msg,100,"You must manually open the port %d on the router, if any",atoi(purple_value_get_string(port)));
	purple_notify_warning(the_plugin,"No upnp available","Port mapping",msg);
	const char* ip=purple_network_get_my_ip(-1);
	purple_debug_misc(PLUGIN_ID,"purple_network_get_my_ip(-1)=\"%s\"\n",ip);
	purple_value_set_string(server_ip,ip);
	start_direct_connection();
}
コード例 #4
0
ファイル: dcc_send.c プロジェクト: N8Fear/purple-facebook
static void
irc_dccsend_network_listen_cb(int sock, gpointer data)
{
    PurpleXfer *xfer = data;
    struct irc_xfer_send_data *xd;
    PurpleConnection *gc;
    struct irc_conn *irc;
    const char *arg[2];
    char *tmp;
    struct in_addr addr;
    unsigned short int port;

    xd = purple_xfer_get_protocol_data(xfer);
    xd->listen_data = NULL;

    if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL
            || purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_REMOTE) {
        g_object_unref(xfer);
        return;
    }

    xd = purple_xfer_get_protocol_data(xfer);
    gc = purple_account_get_connection(purple_xfer_get_account(xfer));
    irc = purple_connection_get_protocol_data(gc);

    g_object_unref(xfer);

    if (sock < 0) {
        purple_notify_error(gc, NULL, _("File Transfer Failed"),
                            _("Unable to open a listening port."),
                            purple_request_cpar_from_connection(gc));
        purple_xfer_cancel_local(xfer);
        return;
    }

    xd->fd = sock;

    port = purple_network_get_port_from_fd(sock);
    purple_debug_misc("irc", "port is %hu\n", port);
    /* Monitor the listening socket */
    purple_xfer_set_watcher(xfer, purple_input_add(sock, PURPLE_INPUT_READ,
                            irc_dccsend_send_connected, xfer));

    /* Send the intended recipient the DCC request */
    arg[0] = purple_xfer_get_remote_user(xfer);
    inet_aton(purple_network_get_my_ip(irc->fd), &addr);
    arg[1] = tmp = g_strdup_printf("\001DCC SEND \"%s\" %u %hu %" G_GOFFSET_FORMAT "\001",
                                   purple_xfer_get_filename(xfer), ntohl(addr.s_addr),
                                   port, purple_xfer_get_size(xfer));

    irc_cmd_privmsg(purple_connection_get_protocol_data(gc), "msg", NULL, arg);
    g_free(tmp);
}
コード例 #5
0
static gboolean
set_status_all()
{
   trace("status setting..");

   char *ip = purple_network_get_my_ip(-1);
   if (strcmp(str_myip, ip) != 0) {
      strcpy(str_myip, ip);
      myip = ip_atoi(ip);

      /* find the longest prefix rule */
      guint32 i=0;
      guint32 max_len = 0;
      guint32 fit = 0;
      gboolean found = FALSE;
      for (i=0; i<rule_cnt; i++){
         if (!found && rules[i].netmask == 0 ) {
            fit = i; found = TRUE; continue;
         }
         if ((rules[i].netmask > max_len) && \
               (((myip ^ rules[i].ip) & (~0 << (32-rules[i].netmask))) == 0)) {
            max_len = rules[i].netmask;
            fit = i;
            found = TRUE;
         }
      }
      if (found) {
         loc = rules[fit].status;
         trace("Found fit rules, %s", loc);
      }
      else loc = "";
   }

   GList *acnt = NULL, *head = NULL;
   head = acnt = purple_accounts_get_all_active();

   while (acnt != NULL) {
      if ((PurpleAccount *)acnt->data != NULL) {
         set_status (acnt->data, loc);
      }
      acnt = acnt->next;
   }

   if (head != NULL)
      g_list_free(head);

   trace("status set for all accounts");

   return TRUE;
}
コード例 #6
0
void
msn_dc_listen_socket_created_cb(int listenfd, gpointer data)
{
	MsnDirectConn *dc = data;

	if (purple_debug_is_verbose())
		purple_debug_info("msn", "msn_dc_listen_socket_created_cb %p\n", dc);

	g_return_if_fail(dc != NULL);

	dc->listen_data = NULL;

	if (listenfd != -1) {
		const char *ext_ip;
		const char *int_ip;
		int port;

		ext_ip = purple_network_get_my_ip(listenfd);
		int_ip = purple_network_get_local_system_ip(listenfd);
		port = purple_network_get_port_from_fd(listenfd);

		dc->listenfd = listenfd;
		dc->listenfd_handle = purple_input_add(
			listenfd,
			PURPLE_INPUT_READ,
			msn_dc_incoming_connection_cb,
			dc
		);
		dc->connect_timeout_handle = purple_timeout_add_seconds(
			DC_INCOMING_TIMEOUT,
			msn_dc_incoming_connection_timeout_cb,
			dc
		);

		if (strcmp(int_ip, ext_ip) != 0) {
			dc->msg_body = g_strdup_printf(
				"Bridge: TCPv1\r\n"
				"Listening: true\r\n"
				"%sNonce: {%s}\r\n"
				"IPv4External-Addrs: %s\r\n"
				"IPv4External-Port: %d\r\n"
				"IPv4Internal-Addrs: %s\r\n"
				"IPv4Internal-Port: %d\r\n"
				"\r\n",

				dc->nonce_type != DC_NONCE_PLAIN ? "Hashed-" : "",
				dc->nonce_hash,
				ext_ip,
				port,
				int_ip,
				port
			);

		} else {
			dc->msg_body = g_strdup_printf(
				"Bridge: TCPv1\r\n"
				"Listening: true\r\n"
				"%sNonce: {%s}\r\n"
				"IPv4External-Addrs: %s\r\n"
				"IPv4External-Port: %d\r\n"
				"\r\n",

				dc->nonce_type != DC_NONCE_PLAIN ? "Hashed-" : "",
				dc->nonce_hash,
				ext_ip,
				port
			);
		}

		if (dc->slpcall->wait_for_socket) {
			if (dc->send_connection_info_msg_cb != NULL)
				dc->send_connection_info_msg_cb(dc);

			dc->slpcall->wait_for_socket = FALSE;
		}
	}
}
コード例 #7
0
ファイル: peer.c プロジェクト: Tasssadar/libpurple
/**
 * We've just opened a listener socket, so we send the remote
 * user an ICBM and ask them to connect to us.
 */
static void
peer_connection_establish_listener_cb(int listenerfd, gpointer data)
{
	PeerConnection *conn;
	OscarData *od;
	PurpleConnection *gc;
	PurpleAccount *account;
	PurpleConversation *conv;
	char *tmp;
	FlapConnection *bos_conn;
	const char *listener_ip;
	const guchar *ip_atoi;
	unsigned short listener_port;

	conn = data;
	conn->listen_data = NULL;

	if (listenerfd < 0)
	{
		/* Could not open listener socket */
		peer_connection_trynext(conn);
		return;
	}

	od = conn->od;
	gc = od->gc;
	account = purple_connection_get_account(gc);
	conn->listenerfd = listenerfd;

	/* Watch for new connections on our listener socket */
	conn->watcher_incoming = purple_input_add(conn->listenerfd,
			PURPLE_INPUT_READ, peer_connection_listen_cb, conn);

	/* Send the "please connect to me!" ICBM */
	bos_conn = flap_connection_findbygroup(od, SNAC_FAMILY_ICBM);
	if (bos_conn == NULL)
	{
		/* Not good */
		peer_connection_trynext(conn);
		return;
	}

	if (bos_conn->gsc)
		listener_ip = purple_network_get_my_ip(bos_conn->gsc->fd);
	else
		listener_ip = purple_network_get_my_ip(bos_conn->fd);

	ip_atoi = purple_network_ip_atoi(listener_ip);
	if (ip_atoi == NULL) {
		/* Could not convert IP to 4 byte array--weird, but this does
		   happen for some users (#4829, Adium #15839).  Maybe they're
		   connecting with IPv6...?  Maybe through a proxy? */
		purple_debug_error("oscar", "Can't ask peer to connect to us "
				"because purple_network_ip_atoi(%s) returned NULL. "
				"fd=%d. is_ssl=%d\n",
				listener_ip ? listener_ip : "(null)",
				bos_conn->gsc ? bos_conn->gsc->fd : bos_conn->fd,
				bos_conn->gsc ? 1 : 0);
		peer_connection_trynext(conn);
		return;
	}

	listener_port = purple_network_get_port_from_fd(conn->listenerfd);

	if (conn->type == OSCAR_CAPABILITY_DIRECTIM)
	{
		aim_im_sendch2_odc_requestdirect(od,
				conn->cookie, conn->bn, ip_atoi,
				listener_port, ++conn->lastrequestnumber);

		/* Print a message to a local conversation window */
		conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, conn->bn);
		tmp = g_strdup_printf(_("Asking %s to connect to us at %s:%hu for "
				"Direct IM."), conn->bn, listener_ip, listener_port);
		purple_conversation_write(conv, NULL, tmp, PURPLE_MESSAGE_SYSTEM, time(NULL));
		g_free(tmp);
	}
	else if (conn->type == OSCAR_CAPABILITY_SENDFILE)
	{
		aim_im_sendch2_sendfile_requestdirect(od,
				conn->cookie, conn->bn,
				ip_atoi,
				listener_port, ++conn->lastrequestnumber,
				(const gchar *)conn->xferdata.name,
				conn->xferdata.size, conn->xferdata.totfiles);
	}
}
コード例 #8
0
ファイル: peer.c プロジェクト: bf4/pidgin-mac
/**
 * We've just opened a listener socket, so we send the remote
 * user an ICBM and ask them to connect to us.
 */
static void
peer_connection_establish_listener_cb(int listenerfd, gpointer data)
{
	PeerConnection *conn;
	OscarData *od;
	PurpleConnection *gc;
	PurpleAccount *account;
	PurpleConversation *conv;
	char *tmp;
	FlapConnection *bos_conn;
	const char *listener_ip;
	unsigned short listener_port;

	conn = data;
	conn->listen_data = NULL;

	if (listenerfd < 0)
	{
		/* Could not open listener socket */
		peer_connection_trynext(conn);
		return;
	}

	od = conn->od;
	gc = od->gc;
	account = purple_connection_get_account(gc);
	conn->listenerfd = listenerfd;

	/* Watch for new connections on our listener socket */
	conn->watcher_incoming = purple_input_add(conn->listenerfd,
			PURPLE_INPUT_READ, peer_connection_listen_cb, conn);

	/* Send the "please connect to me!" ICBM */
	bos_conn = flap_connection_findbygroup(od, SNAC_FAMILY_ICBM);
	if (bos_conn == NULL)
	{
		/* Not good */
		peer_connection_trynext(conn);
		return;
	}

	if (bos_conn->gsc)
		listener_ip = purple_network_get_my_ip(bos_conn->gsc->fd);
	else
		listener_ip = purple_network_get_my_ip(bos_conn->fd);
	listener_port = purple_network_get_port_from_fd(conn->listenerfd);
	if (conn->type == OSCAR_CAPABILITY_DIRECTIM)
	{
		aim_im_sendch2_odc_requestdirect(od,
				conn->cookie, conn->sn, purple_network_ip_atoi(listener_ip),
				listener_port, ++conn->lastrequestnumber);

		/* Print a message to a local conversation window */
		conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, conn->sn);
		tmp = g_strdup_printf(_("Asking %s to connect to us at %s:%hu for "
				"Direct IM."), conn->sn, listener_ip, listener_port);
		purple_conversation_write(conv, NULL, tmp, PURPLE_MESSAGE_SYSTEM, time(NULL));
		g_free(tmp);
	}
	else if (conn->type == OSCAR_CAPABILITY_SENDFILE)
	{
		aim_im_sendch2_sendfile_requestdirect(od,
				conn->cookie, conn->sn,
				purple_network_ip_atoi(listener_ip),
				listener_port, ++conn->lastrequestnumber,
				(const gchar *)conn->xferdata.name,
				conn->xferdata.size, conn->xferdata.totfiles);
	}
}
コード例 #9
0
STATIC_PROTO_INIT

gboolean
purple_core_init(const char *ui)
{
    PurpleCoreUiOps *ops;
    PurpleCore *core;

    g_return_val_if_fail(ui != NULL, FALSE);
    g_return_val_if_fail(purple_get_core() == NULL, FALSE);

#ifdef ENABLE_NLS
    bindtextdomain(PACKAGE, LOCALEDIR);
#endif
//VOXOX - JRT - 2009.04.11
#ifdef _WIN32
    wpurple_init();

#ifdef _DEBUG
//	_CrtSetDbgFlag( 0x20 );	//_CRTDBG_LEAK_CHECK_DF );//VOXOX - JRT - 2009.04.10 JRT-XXX
//	_CrtSetAllocHook( AllocHook );
#endif
#endif

    g_type_init();

    _core = core = g_new0(PurpleCore, 1);
    core->ui = g_strdup(ui);
    core->reserved = NULL;

    ops = purple_core_get_ui_ops();

    /* The signals subsystem is important and should be first. */
    purple_signals_init();

    purple_util_init();

    purple_signal_register(core, "uri-handler",
                           purple_marshal_BOOLEAN__POINTER_POINTER_POINTER,
                           purple_value_new(PURPLE_TYPE_BOOLEAN), 3,
                           purple_value_new(PURPLE_TYPE_STRING), /* Protocol */
                           purple_value_new(PURPLE_TYPE_STRING), /* Command */
                           purple_value_new(PURPLE_TYPE_BOXED, "GHashTable *")); /* Parameters */

    purple_signal_register(core, "quitting", purple_marshal_VOID, NULL, 0);

    /* The prefs subsystem needs to be initialized before static protocols
     * for protocol prefs to work. */
    purple_prefs_init();

    purple_debug_init();

    if (ops != NULL)
    {
        if (ops->ui_prefs_init != NULL)
            ops->ui_prefs_init();

        if (ops->debug_ui_init != NULL)
            ops->debug_ui_init();
    }

#ifdef HAVE_DBUS
    purple_dbus_init();
#endif

    purple_ciphers_init();
    purple_cmds_init();

    /* Since plugins get probed so early we should probably initialize their
     * subsystem right away too.
     */
    purple_plugins_init();

    /* Initialize all static protocols. */
    static_proto_init();

    purple_plugins_probe(G_MODULE_SUFFIX);

    /* The buddy icon code uses the imgstore, so init it early. */
    purple_imgstore_init();

    /* Accounts use status, buddy icons and connection signals, so
     * initialize these before accounts
     */
    purple_status_init();
    purple_buddy_icons_init();
    purple_connections_init();

    purple_accounts_init();
    purple_savedstatuses_init();
    purple_notify_init();
    purple_certificate_init();
    purple_conversations_init();
    purple_blist_init();
    purple_log_init();
    purple_network_init();
    purple_privacy_init();
    purple_pounces_init();
    purple_proxy_init();
    purple_dnsquery_init();
    purple_sound_init();
    purple_ssl_init();
    purple_stun_init();
    purple_xfers_init();
    purple_idle_init();
    purple_smileys_init();

    /*
     * Call this early on to try to auto-detect our IP address and
     * hopefully save some time later.
     */
    purple_network_get_my_ip(-1);

    if (ops != NULL && ops->ui_init != NULL)
        ops->ui_init();

    return TRUE;
}