[PATCH v3 0/3] Let 'make DIRECTCONN=y' succeed.

0 views
Skip to first unread message

Octavio Alvarez

unread,
Dec 8, 2009, 3:21:47 AM12/8/09
to msn-...@googlegroups.com, Octavio Alvarez
This is version 3 of the patchset to allow make DIRECTCONN=y
to actually build.

Compared to v2, there is a new patch (#2/3) which fixes
more build problems for direct_conn.c.

I made sure #1/3 and #2/3 don't break the usual compilation
process without DIRECTCONN=y, so they should be appliable
separately if desired.

1/3 (build fixes) is cleaner than in v2.

Other than that, 1 and 3 are the same.

Octavio Alvarez (3):
directconn: build fixes.
directconn: let it build even with pn_peer_msg being opaque.
directconn: generic bug fixes

cvr/pn_direct_conn.c | 30 +++++++++++++++++++-----------
cvr/pn_direct_conn.h | 2 +-
cvr/pn_peer_link.c | 13 +++++++++++++
cvr/pn_peer_link.h | 4 ++++
cvr/pn_peer_msg.c | 30 +++++++++++++++++++++++++++---
cvr/pn_peer_msg.h | 14 ++++++++++++++
msn.c | 4 ++++
7 files changed, 82 insertions(+), 15 deletions(-)

Octavio Alvarez

unread,
Dec 8, 2009, 3:21:48 AM12/8/09
to msn-...@googlegroups.com, Octavio Alvarez
Based on previous patches from Felipe Contreras.
---
cvr/pn_direct_conn.c | 16 +++++++++-------
cvr/pn_direct_conn.h | 2 +-
cvr/pn_peer_link.c | 13 +++++++++++++
cvr/pn_peer_link.h | 4 ++++
cvr/pn_peer_msg.c | 6 +++---
msn.c | 4 ++++
6 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/cvr/pn_direct_conn.c b/cvr/pn_direct_conn.c
index 21459c6..96ed31b 100644
--- a/cvr/pn_direct_conn.c
+++ b/cvr/pn_direct_conn.c
@@ -23,6 +23,7 @@

#include "session.h"
#include "pn_peer_msg.h"
+#include "pn_peer_link.h"

#include "io/pn_node.h"

@@ -50,7 +51,7 @@ pn_direct_conn_send_handshake(struct pn_direct_conn *direct_conn)

link = direct_conn->link;

- peer_msg = pn_peer_msg_new(link);
+ peer_msg = pn_peer_msg_new();
peer_msg->flags = 0x100;

if (direct_conn->nonce != NULL)
@@ -408,7 +409,7 @@ pn_direct_conn_connect(struct pn_direct_conn *direct_conn, const char *host, int

pn_log ("begin");

- session = direct_conn->link->session;
+ session = pn_peer_link_get_session(direct_conn->link);

#if 0
if (session->http_method)
@@ -417,8 +418,9 @@ pn_direct_conn_connect(struct pn_direct_conn *direct_conn, const char *host, int
}
#endif

- direct_conn->connect_data = purple_proxy_connect(NULL, msn_session_get_account (session),
- host, port, direct_conn_connect_cb, direct_conn);
+ direct_conn->connect_data = purple_proxy_connect(NULL,
+ msn_session_get_user_data(session),
+ host, port, direct_conn_connect_cb, direct_conn);

pn_log ("end");

@@ -458,10 +460,10 @@ pn_direct_conn_new(struct pn_peer_link *link)

direct_conn->link = link;

- if (link->direct_conn != NULL)
+ if (pn_peer_link_get_directconn(link) != NULL)
pn_warning ("got_transresp: LEAK");

- link->direct_conn = direct_conn;
+ pn_peer_link_set_directconn(link, direct_conn);

pn_log ("end");

@@ -492,7 +494,7 @@ pn_direct_conn_destroy(struct pn_direct_conn *direct_conn)
if (direct_conn->nonce != NULL)
g_free(direct_conn->nonce);

- direct_conn->link->direct_conn = NULL;
+ pn_peer_link_set_directconn(direct_conn->link, NULL);

g_free(direct_conn);

diff --git a/cvr/pn_direct_conn.h b/cvr/pn_direct_conn.h
index 3d203da..38a5d63 100644
--- a/cvr/pn_direct_conn.h
+++ b/cvr/pn_direct_conn.h
@@ -44,7 +44,7 @@ struct pn_direct_conn {

int c;
struct _PurpleProxyConnectData *connect_data;
- PecanStream *stream;
+ PnStream *stream;
};

struct pn_direct_conn *pn_direct_conn_new(struct pn_peer_link *link);
diff --git a/cvr/pn_peer_link.c b/cvr/pn_peer_link.c
index 162c7db..f535a50 100644
--- a/cvr/pn_peer_link.c
+++ b/cvr/pn_peer_link.c
@@ -789,3 +789,16 @@ pn_peer_link_request_object(struct pn_peer_link *link,

g_free(msnobj_base64);
}
+
+struct pn_direct_conn *
+pn_peer_link_get_directconn(const struct pn_peer_link *link)
+{
+ return link->direct_conn;
+}
+
+void
+pn_peer_link_set_directconn(struct pn_peer_link *link,
+ struct pn_direct_conn *direct_conn)
+{
+ link->direct_conn = direct_conn;
+}
diff --git a/cvr/pn_peer_link.h b/cvr/pn_peer_link.h
index 66ccd67..92624b7 100644
--- a/cvr/pn_peer_link.h
+++ b/cvr/pn_peer_link.h
@@ -70,4 +70,8 @@ struct pn_peer_link *msn_session_find_peer_link(struct MsnSession *session,
struct pn_peer_link *msn_session_get_peer_link(struct MsnSession *session,
const char *username);

+struct pn_direct_conn *pn_peer_link_get_directconn(const struct pn_peer_link *link);
+void pn_peer_link_set_directconn(struct pn_peer_link *link,
+ struct pn_direct_conn *direct_conn);
+
#endif /* PN_PEERLINK_H */
diff --git a/cvr/pn_peer_msg.c b/cvr/pn_peer_msg.c
index 31bfb9a..2291a78 100644
--- a/cvr/pn_peer_msg.c
+++ b/cvr/pn_peer_msg.c
@@ -698,8 +698,8 @@ got_ok(struct pn_peer_call *call,

if (strcmp(type, "application/x-msnmsgr-sessionreqbody") == 0) {
#ifdef MSN_DIRECTCONN
- if (call->link->session->use_direct_conn &&
- call->type == PN_PEER_CALL_DC)
+ if (msn_session_get_bool(pn_peer_link_get_session(call->link),
+ "use_direct_conn"))
{
/* First let's try a DirectConnection. */

@@ -720,7 +720,7 @@ got_ok(struct pn_peer_call *call,
"ICF: false\r\n");

header = g_strdup_printf("INVITE MSNMSGR:%s MSNSLP/1.0",
- link->remote_user);
+ pn_peer_link_get_passport(link));

peer_msg = sip_new(call, 0, header, branch,
"application/x-msnmsgr-transreqbody",
diff --git a/msn.c b/msn.c
index 25c982d..67ebb44 100644
--- a/msn.c
+++ b/msn.c
@@ -906,8 +906,10 @@ login (PurpleAccount *account)
session->user_data = account;
msn_session_set_bool (session, "use_server_alias",
purple_account_get_bool (account, "use_server_alias", FALSE));
+#ifdef MSN_DIRECTCONN
msn_session_set_bool (session, "use_direct_conn",
purple_account_get_bool (account, "use_direct_conn", FALSE));
+#endif
msn_session_set_bool (session, "use_userdisplay",
purple_account_get_bool (account, "use_userdisplay", TRUE));

@@ -1844,8 +1846,10 @@ init_plugin (PurplePlugin *plugin)
option = purple_account_option_bool_new (_("Use server-side alias"), "use_server_alias", FALSE);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, option);

+#ifdef MSN_DIRECTCONN
option = purple_account_option_bool_new (_("Use direct connections"), "use_direct_conn", FALSE);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, option);
+#endif

option = purple_account_option_bool_new (_("Use user displays"), "use_userdisplay", TRUE);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, option);
--
1.6.5.3

Octavio Alvarez

unread,
Dec 8, 2009, 3:21:50 AM12/8/09
to msn-...@googlegroups.com, Octavio Alvarez
It wasn't actually working before.
---
cvr/pn_direct_conn.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/cvr/pn_direct_conn.c b/cvr/pn_direct_conn.c
index c782741..b9debff 100644
--- a/cvr/pn_direct_conn.c
+++ b/cvr/pn_direct_conn.c
@@ -196,6 +196,9 @@ pn_direct_conn_write(struct pn_direct_conn *direct_conn,
{
/* Let's write the data. */
status = pn_stream_write (direct_conn->stream, data, len, &tmp, NULL);
+
+ if (status == G_IO_STATUS_NORMAL)
+ pn_stream_flush (direct_conn->stream, NULL);
}

if (status == G_IO_STATUS_NORMAL)
@@ -302,6 +305,7 @@ read_cb(GIOChannel *source, GIOCondition condition, gpointer data)
{
pn_error ("failed to allocate memory for read");

+ pn_direct_conn_destroy(direct_conn);
return FALSE;
}

@@ -374,6 +378,8 @@ connect_cb(gpointer data, gint source, const gchar *error_message)
direct_conn->stream = pn_stream_new (fd);
channel = direct_conn->stream->channel;

+ g_io_channel_set_encoding (channel, NULL, NULL);
+
pn_info ("connected: %p", channel);
direct_conn->read_watch = g_io_add_watch (channel, G_IO_IN, read_cb, direct_conn);

--
1.6.5.3

Octavio Alvarez

unread,
Dec 8, 2009, 3:21:49 AM12/8/09
to msn-...@googlegroups.com, Octavio Alvarez
From: Octavio Alvarez <octavio...@caliente.com.mx>

I'm not convinced of this patch, as it just publishes functions
to modifying a parameter of an opaque structure instead of
making that functionality-based, but I think it is better to
allow the code to compile than not. We can fix things later as
they are currently broken anyway.
---
cvr/pn_direct_conn.c | 8 ++++----
cvr/pn_peer_msg.c | 24 ++++++++++++++++++++++++
cvr/pn_peer_msg.h | 14 ++++++++++++++
3 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/cvr/pn_direct_conn.c b/cvr/pn_direct_conn.c
index 96ed31b..c782741 100644
--- a/cvr/pn_direct_conn.c
+++ b/cvr/pn_direct_conn.c
@@ -52,7 +52,7 @@ pn_direct_conn_send_handshake(struct pn_direct_conn *direct_conn)
link = direct_conn->link;

peer_msg = pn_peer_msg_new();
- peer_msg->flags = 0x100;
+ pn_peer_msg_set_flags(peer_msg, 0x100);

if (direct_conn->nonce != NULL)
{
@@ -70,9 +70,9 @@ pn_direct_conn_send_handshake(struct pn_direct_conn *direct_conn)
t4 = GUINT16_TO_BE(t4);
t5 = GUINT64_TO_BE(t5);

- peer_msg->ack_id = t1;
- peer_msg->ack_sub_id = t2 | (t3 << 16);
- peer_msg->ack_size = t4 | t5;
+ pn_peer_msg_set_ack_id(peer_msg, t1);
+ pn_peer_msg_set_ack_sub_id(peer_msg, t2 | (t3 << 16));
+ pn_peer_msg_set_ack_size(peer_msg, t4 | t5);
}

g_free(direct_conn->nonce);
diff --git a/cvr/pn_peer_msg.c b/cvr/pn_peer_msg.c
index 2291a78..bea3766 100644
--- a/cvr/pn_peer_msg.c
+++ b/cvr/pn_peer_msg.c
@@ -896,3 +896,27 @@ pn_sip_recv(struct pn_peer_link *link,
return;
}
}
+
+void
+pn_peer_msg_set_flags(struct pn_peer_msg *peer_msg, const long flags)
+{
+ peer_msg->flags = flags;
+}
+
+void
+pn_peer_msg_set_ack_id(struct pn_peer_msg *peer_msg, const long ack_id)
+{
+ peer_msg->ack_id = ack_id;
+}
+
+void
+pn_peer_msg_set_ack_sub_id(struct pn_peer_msg *peer_msg, const long ack_sub_id)
+{
+ peer_msg->ack_sub_id = ack_sub_id;
+}
+
+void
+pn_peer_msg_set_ack_size(struct pn_peer_msg *peer_msg, const guint64 ack_size)
+{
+ peer_msg->ack_size = ack_size;
+}
diff --git a/cvr/pn_peer_msg.h b/cvr/pn_peer_msg.h
index d0c82a9..9096541 100644
--- a/cvr/pn_peer_msg.h
+++ b/cvr/pn_peer_msg.h
@@ -20,6 +20,8 @@
#ifndef PN_PEER_MSG_H
#define PN_PEER_MSG_H

+#include <glib.h>
+
struct pn_peer_call;
struct pn_peer_link;

@@ -54,4 +56,16 @@ void pn_sip_send_decline(struct pn_peer_call *call,
void pn_sip_send_bye(struct pn_peer_call *call,
const char *type);

+void pn_peer_msg_set_flags(struct pn_peer_msg *peer_msg,
+ const long flags);
+
+void pn_peer_msg_set_ack_id(struct pn_peer_msg *peer_msg,
+ const long ack_id);
+
+void pn_peer_msg_set_ack_sub_id(struct pn_peer_msg *peer_msg,
+ const long ack_sub_id);
+
+void pn_peer_msg_set_ack_size(struct pn_peer_msg *peer_msg,
+ const guint64 ack_size);
+
#endif /* PN_PEER_MSG_H */
--
1.6.5.3

Octavio Alvarez

unread,
Dec 8, 2009, 5:58:43 AM12/8/09
to msn-...@googlegroups.com, Octavio Alvarez

Octavio Alvarez

unread,
Dec 8, 2009, 6:02:12 AM12/8/09
to Octavio Alvarez, msn-...@googlegroups.com
On Tue, 08 Dec 2009 00:21:49 -0800, Octavio Alvarez
<alva...@alvarezp.ods.org> wrote:

> From: Octavio Alvarez <octavio.alvarez@...>
>

Got the wrong e-mail address there. I'm posting the correct one.

Sorry about the noise.

Felipe Contreras

unread,
Dec 12, 2009, 3:07:55 AM12/12/09
to Octavio Alvarez, msn-...@googlegroups.com
On Tue, Dec 8, 2009 at 10:21 AM, Octavio Alvarez
<alva...@alvarezp.ods.org> wrote:
> Based on previous patches from Felipe Contreras.

Perfect. Applied :)

--
Felipe Contreras

Felipe Contreras

unread,
Dec 12, 2009, 3:10:39 AM12/12/09
to Octavio Alvarez, msn-...@googlegroups.com
On Tue, Dec 8, 2009 at 12:58 PM, Octavio Alvarez
<alva...@alvarezp.ods.org> wrote:
> I'm not convinced of this patch, as it just publishes functions
> to modifying a parameter of an opaque structure instead of
> making that functionality-based, but I think it is better to
> allow the code to compile than not. We can fix things later as
> they are currently broken anyway.

I'm not convinced either, I think for now we should include
pn_peer_msg_priv.h which is not ideal, but better than the current
alternatives.

Good thing that you made these changes separately :)

--
Felipe Contreras

Felipe Contreras

unread,
Dec 12, 2009, 3:12:02 AM12/12/09
to Octavio Alvarez, msn-...@googlegroups.com
On Tue, Dec 8, 2009 at 10:21 AM, Octavio Alvarez
<alva...@alvarezp.ods.org> wrote:
> It wasn't actually working before.

You forgot to mention that the changes came originally from me. But
otherwise it's ok. Applied.

--
Felipe Contreras

Felipe Contreras

unread,
Dec 12, 2009, 3:24:53 AM12/12/09
to Octavio Alvarez, msn-...@googlegroups.com
On Tue, Dec 8, 2009 at 10:21 AM, Octavio Alvarez
<alva...@alvarezp.ods.org> wrote:
> This is version 3 of the patchset to allow make DIRECTCONN=y
> to actually build.
>
> Compared to v2, there is a new patch (#2/3) which fixes
> more build problems for direct_conn.c.
>
> I made sure #1/3 and #2/3 don't break the usual compilation
> process without DIRECTCONN=y, so they should be appliable
> separately if desired.
>
> 1/3 (build fixes) is cleaner than in v2.
>
> Other than that, 1 and 3 are the same.

I applied #1 and #3, I merely added your Signed-of-by line (try git
commit -s) and modified a bit the commit message of #3. For #2 I wrote
a simpler version which is not so clean, but good enough for now.

Thanks for the contribution :)

--
Felipe Contreras
Reply all
Reply to author
Forward
0 new messages