I've try the patch, with Windows Messenger 5.0. works only partially. When
user signed on, notification to others is ok, but the user can't see others
already online. And status message not getting through SER.
Ray
-----Original Message-----
From: serusers-bounces(a)iptel.org [mailto:serusers-bounces@lists.iptel.org] On
Behalf Of Klaus Darilion
Sent: Friday, May 28, 2004 11:39 PM
To: Jamey Hicks
Cc: Serusers; Dimitar Tachkov
Subject: Re: [Serusers] Re: problem for using the latest pa module
Hi Jamey!
Attached are the files which were modified by the student (Dimitre
Tachkov). At the end of the email, there is also a "cvs diff".
I will shortly explain what the project was: An IPAQ with a GPS receiver
received the GPS coordinates and they were transmitted with a PUBLISH to
the server. The coordnates received from the GPS receiver are in the
NMEA format:
$GPRMC,POS_UTC,POS_STAT,LAT,LAT_REF,LON,LON_REF,SPD,HDG,DATE,MAG_VAR,MAG_REF
*CC<cr><lf>
e.g.
$GPRMC,105759.180,A,2821.7359,N,01923.7878,E,0.00,,190404,,*0C
^^^^^x^^^^^ ^^^^y^^^^
x=28° 21.7359' (minutes)
y=...
The received x and y coordinates were put into the PUBLISH request in
between <x> and <y> tags:
PUBLISH sip:tachkov@methusalix.ict.tuwien.ac.at SIP/2.0
Via: SIP/2.0/UDP methusalix.ict.tuwien.ac.at:5060;rport
From:
sip:tachkov@methusalix.ict.tuwien.ac.at;tag=8343f82348d1022ace010a43c363e58f
To: sip:tachkov@methusalix.ixt.tuwien.ac.at
Call-ID: f8b9ac03ca12a9ddd03aa4ef368fa46c(a)methusalix.ict.tuwien.ac.at
CSeq: 3961 PUBLISH
Max-Forwards: 30
Event: presence
Accept: aplpication/cpim-pidf+xml
Expires: 50
User-Agent: SIP Example Tester
Content-Type: application/cpim-pidf+xml
Content-Length: 280
<?xml version="1.0" encoding="UTF-8"?>
<presence xmlns="urn:ietf:params:xml:ns:pidf"
entity="pres:tachkov@methusalix.ict.tuwien.ac.at">
<tuple id="sg89ae">
<status>
<basic>offline</basic>
<geopriv><location-info><civilAddress>
<x>01923.7878</x>
<y>2821.7359</y>
</civilAddress></location-info></geopriv>
</status>
<contact priority="0.8">Dimitar Tashkov</contact>
</tuple>
</presence>
So, I guess the module which processes this request was modified to
handle the x and y coordinates.
And now to the messenger part. I don't know the original problem with
Messenger, I only know that it works now (my student showed it to me).
Messenger transports the presence status in the msnsubstatus tags. This
was extended to transport the coordinates, as following (NOTIFY from
ser to messenger with content-type application/xpidf+xml):
<?xml version="1.0"?>
<!DOCTYPE presence PUBLIC "//IETF//DTD RFCxxxx XPIDF 1.0//EN"
"xpidf.dtd">
<presence>
<presentity
uri="sip:tachkov@methusalix.ict.tuwien.ac.at;method=SUBSCRIBE"/>
<atom id="9r28r49">
<address uri="sip:tachkov@methusalix.ict.tuwien.ac.at;user=ip"
priority="0,800000">
<status status="open">
<msnsubstatus substatus="online"/>
<note>1923.7878 2821.7359</note>
</status>
</address>
</atom>
</presence>
The <note> tag can be read and written with the RTC API.
A problem was the "offline" status. Sending a NOTIFY with
substatus="offline" does not work. To see a buddy as "offline" in
Messenger, ser has to send a NOTIFY with Expires: 0 and empty body:
NOTIFY sip:128.131.80.101:13359 SIP/2.0
Via: SIP/2.0/UDP 128.131.80.174;branch=z9hG4bK2101.825b6a47.0
To: "messenger"
<sip:messenger@methusalix.ict.tuwien.ac.at>;tag=2bbdb0d6-6a85
From:
<sip:tachkov@methusalix.ict.tuwien.ac.at>;tag=a6a1c5f60faecf035a1ae5b6e
CSeq: 1 NOTIFY
Call-ID: c0013a85-47fe-41b4-8369-e2de22fd17cf(a)128.131.80.101
Content-Length: 0
User-Agent: Sip EXpress router(0.8.13-dev-23-merged (i386/linux))
Event: presence
Content-Type: application/xpidf+xml
Subscription-State: terminated;reason=deactivated
Expires: 0
After this NOTIFY, Messenger tries to SUBSCRIBE again. Therefore, the
existing subscription must be terminated in ser after sending the NOTIFY
with Expires: 0. Therefore, the methodes
static inline int add_subs_state_hf(...)
tatic inline int create_headers(...)
were extended with a "flag" which signals if a NOTIFY with Expires: 0
should be sent.
Here some statements from the student about wrong implementations in the
pa module:
- It does not differentiate between application/cpim-pidf+xml and
application/pidf+xml
- ser didn't send a NOTIFY after a SUBSCRIBE message, only after
received PUBLISH requests.
- The espires header in the publish request is not interpreted.
- The header field "SIP-If-Match" is not implemented in the pa module.
Finally, the received coordinates are displayed on a modified kphone
(see the attached screenshot).
regards,
Klaus
cvs server: Diffing .
Index: notify.c
===================================================================
RCS file: /cvsroot/ser/sip_router/modules/pa/notify.c,v
retrieving revision 1.14
diff -r1.14 notify.c
120a121,125
// added from tachkov
#define EXPIRES_HEADER_0 "Expires: 0"
#define EXPIRES_HEADER_0_L (sizeof(EXPIRES_HEADER_0)-1)
// tachkov end
247c252
< static inline int add_subs_state_hf(str* _h, int _l, subs_state_t _s,
ss_reason_t _r, time_t _e)
---
static inline int add_subs_state_hf(str* _h, int _l,
subs_state_t _s,
ss_reason_t _r, time_t _e, int flag)
251,258c256,274
<
< if (_l < SUBSCRIPTION_STATE_L + subs_states[_s].len +
SS_EXPIRES_L +
< SS_REASON_L + reason[_r].len + CRLF_L) {
< paerrno = PA_SMALL_BUFFER;
< LOG(L_ERR, "add_subs_state_hf(): Buffer too small\n");
< return -1;
< }
<
---
// modified by tachkov (EXPIRES_HEADER_0_L)
if (flag) {
if (_l < SUBSCRIPTION_STATE_L + EXPIRES_HEADER_0_L +
subs_states[_s].len + SS_EXPIRES_L +
SS_REASON_L + reason[_r].len + CRLF_L) {
paerrno = PA_SMALL_BUFFER;
LOG(L_ERR, "add_subs_state_hf(): Buffer too small\n");
return -1;
}
}
else {
if (_l < SUBSCRIPTION_STATE_L + subs_states[_s].len +
SS_EXPIRES_L +
SS_REASON_L + reason[_r].len + CRLF_L) {
paerrno = PA_SMALL_BUFFER;
LOG(L_ERR, "add_subs_state_hf(): Buffer too small\n");
return -1;
}
}
279c295,299
< return 0;
---
// added from tachkov
if (flag)
str_append(_h, EXPIRES_HEADER_0 CRLF, EXPIRES_HEADER_0_L +
CRLF_L);
// tachkov end
return 0;
283c303
< static inline int create_headers(struct watcher* _w)
---
static inline int create_headers(struct watcher* _w,
int flag)
289,292c309,312
<
< if (add_event_hf(&headers, BUF_LEN, _w->accept) < 0) {
< LOG(L_ERR, "create_headers(): Error while adding Event
header field\n");
< return -1;
---
if (add_event_hf(&headers, BUF_LEN, _w->accept) < 0) {
LOG(L_ERR, "create_headers(): Error while adding Event header
field\n");
return -1;
296,297c316,317
< LOG(L_ERR, "create_headers(): Error while adding
Content-Type header field\n");
< return -2;
---
LOG(L_ERR, "create_headers(): Error while
adding Content-Type
header field\n");
return -2;
299c319
<
---
309,313c329,353
< if (add_subs_state_hf(&headers, BUF_LEN - headers.len, s,
SR_TIMEOUT, t) < 0) {
< LOG(L_ERR, "create_headers(): Error while adding
Subscription-State\n");
< return -3;
< }
<
---
// modified by tachkov
/*
if (!flag) {
if (add_subs_state_hf(&headers, BUF_LEN - headers.len, s,
SR_TIMEOUT,
t,0) < 0) {
LOG(L_ERR, "create_headers():
Error while adding
Subscription-State\n");
return -3;
}
}
else
str_append(&headers, EXPIRES_HEADER_0 CRLF, EXPIRES_HEADER_0_L
+
CRLF_L);
> */
> if (flag) {
> if (add_subs_state_hf(&headers, BUF_LEN - headers.len,
SS_TERMINATED, SR_DEACTIVATED, 0,1) < 0) {
LOG(L_ERR, "create_headers():
Error while adding
Subscription-State\n");
return -3;
}
}
else {
if (add_subs_state_hf(&headers, BUF_LEN - headers.len, s,
SR_TIMEOUT,
t,0) < 0) {
LOG(L_ERR, "create_headers():
Error while adding
Subscription-State\n");
> return -3;
}
> }
328c368,372
<
---
// modified by tachkov (by offline state don't
add body into NOTIFY
Request
// (Microsoft Messanger compatibillity)
int offline = 1;
if (tuple->state == PS_ONLINE) {
offline = 0;
345,348c389,400
< if (xpidf_add_address(&body, BUF_LEN - body.len,
&_p->uri, st) < 0) {
< LOG(L_ERR, "send_xpidf_notify():
xpidf_add_address failed\n");
< return -3;
< }
---
> // modified by tachkov
> //if (st != XPIDF_ST_CLOSED) {
> double _x = -1;
> double _y = -1;
> if (tuple->location.x) _x = tuple->location.x;
> if (tuple->location.y) _y = tuple->location.y;
> if (xpidf_add_address(&body,
BUF_LEN - body.len, &_p->uri,
_x, _y, st) < 0) {
LOG(L_ERR,
"send_xpidf_notify(): xpidf_add_address
failed\n");
return -3;
}
//}
351,352c403,404
< }
< if (end_xpidf_doc(&body, BUF_LEN - body.len) < 0) {
---
}
if (end_xpidf_doc(&body, BUF_LEN - body.len) < 0) {
355c407,408
< }
---
}
} // end create body
357c410,411
< if (create_headers(_w) < 0) {
---
// modified by tachkov
if (create_headers(_w,offline) < 0) {
362a417,436
> // added from tachkov
> int et = EVENT_PRESENCE; // can be changed & implemented to
process other events too
if (offline) {
if (et == EVENT_PRESENCE) {
if (remove_watcher(_p, _w) < 0) {
LOG(L_ERR, "send_xpidf_notify(): Error while deleting
winfo
watcher\n");
return -7;
}
}
else {
if (remove_winfo_watcher(_p, _w) < 0) {
LOG(L_ERR, "send_xpidf_notify(): Error while deleting
winfo
watcher\n");
> return -8;
> }
> }
> return -99;
> }
> // tachkov end
392c466,467
< if (create_headers(_w) < 0) {
---
// modified by tachkov
if (create_headers(_w,0) < 0) {
458c533,534
< if (create_headers(_w) < 0) {
---
// modified by tachkov
if (create_headers(_w,0) < 0) {
501c577,578
< if (create_headers(_w) < 0) {
---
// modified by tachkov
if (create_headers(_w,0) < 0) {
535c612,613
< if (create_headers(_w) < 0) {
---
// modified by tachkov
if (create_headers(_w,0) < 0) {
580c658,659
< if (create_headers(_w) < 0) {
---
// modified by tachkov
if (create_headers(_w,0) < 0) {
Index: pdomain.c
===================================================================
RCS file: /cvsroot/ser/sip_router/modules/pa/pdomain.c,v
retrieving revision 1.10
diff -r1.10 pdomain.c
164c164
< if (timer_presentity(ptr) < 0) {
---
if (timer_presentity(ptr, _d) < 0) {
Index: presentity.c
===================================================================
RCS file: /cvsroot/ser/sip_router/modules/pa/presentity.c,v
retrieving revision 1.11
diff -r1.11 presentity.c
463c463,464
< int timer_presentity(presentity_t* _p)
---
// modified by tachkov
int timer_presentity(presentity_t* _p, struct pdomain *_d)
493c494
< notify_watchers(_p);
---
notify_watchers(_p,_d);
588c589,590
< int notify_watchers(presentity_t* _p)
---
// modified by tachkov
int notify_watchers(presentity_t* _p, struct pdomain *_d)
593a596,597
// added & modified by tachkov
int remove = 0;
595c599,605
< send_notify(_p, ptr);
---
remove = 0;
remove = send_notify(_p, ptr);
if (remove == -99) {
if (!_p->watchers && !_p->winfo_watchers)
remove_presentity(_d, _p);
ptr->expires = 0; /* The watcher will be freed after
NOTIFY is sent
*/
}
759a770,771
Index: presentity.h
===================================================================
RCS file: /cvsroot/ser/sip_router/modules/pa/presentity.h,v
retrieving revision 1.10
diff -r1.10 presentity.h
120c120
< int timer_presentity(presentity_t* _p);
---
int timer_presentity(presentity_t* _p, struct pdomain
*_d);
163c163,164
< int notify_watchers(presentity_t* _p);
---
// modified by tachkov
int notify_watchers(presentity_t* _p, struct pdomain *_d);
Index: xpidf.c
===================================================================
RCS file: /cvsroot/ser/sip_router/modules/pa/xpidf.c,v
retrieving revision 1.7
diff -r1.7 xpidf.c
66c66
< #define PRESENTITY_START "<presentity uri=\""
---
#define PRESENTITY_START "<presentity
uri=\"sip:"
75c75
< #define ADDRESS_START "<address uri=\""
---
#define ADDRESS_START "<address
uri=\"sip:"
77c77
<
---
/*
79a80,85
> */
> // tachkov
> #define ADDRESS_END ";user=ip\" priority=\"0,800000\">"
> #define ADDRESS_END_L (sizeof(ADDRESS_END) - 1)
> // tachkov end
80a87
/*
88a96,118
> */
> // tachkov
> #define STATUS_OPEN "<status status=\"open\">\r\n"
> #define STATUS_OPEN_L (sizeof(STATUS_OPEN) - 1)
> #define STATUS_CLOSED "<status
status=\"closed\">\r\n"
> #define STATUS_CLOSED_L (sizeof(STATUS_CLOSED) - 1)
> #define STATUS_INUSE "<status
status=\"inuse\">\r\n"
> #define STATUS_INUSE_L (sizeof(STATUS_INUSE) - 1)
> #define MSNSUBSTATUS_ONLINE
"<msnsubstatus substatus=\"online\"/>\r\n"
> #define MSNSUBSTATUS_ONLINE_L (sizeof(MSNSUBSTATUS_ONLINE)-1)
> #define MSNSUBSTATUS_OFFLINE
"<msnsubstatus substatus=\"offline\"/>\r\n"
> #define MSNSUBSTATUS_OFFLINE_L (sizeof(MSNSUBSTATUS_OFFLINE)-1)
> #define NOTE_BEGIN
"<note>"
> #define NOTE_BEGIN_L (sizeof(NOTE_BEGIN)-1)
> #define NOTE_END
"</note>\r\n"
> #define NOTE_END_L (sizeof(NOTE_END)-1)
89a120,122
#define STATUS_END "</status>"
#define STATUS_END_L (sizeof(STATUS_END)-1)
// tachkov end
135c168,169
< int xpidf_add_address(str* _b, int _l, str* _addr, xpidf_status_t _st)
---
// modified by tachkov (x & y information will be
send too)
int xpidf_add_address(str* _b, int _l, str* _addr, double _x, double
_y,
xpidf_status_t _st)
140,144c174,191
< switch(_st) {
< case XPIDF_ST_OPEN: p = STATUS_OPEN; len = STATUS_OPEN_L;
break;
< case XPIDF_ST_CLOSED: p = STATUS_CLOSED; len = STATUS_CLOSED_L;
break;
< case XPIDF_ST_INUSE: p = STATUS_INUSE; len = STATUS_INUSE_L;
break;
< default: p = STATUS_CLOSED; len = STATUS_CLOSED_L;
break; /* Makes gcc happy */
---
> // tachkov
> int len_available = 0;
> char * available;
> // tachkov end
> switch(_st) { // modified by
tachkov
> case XPIDF_ST_OPEN: p = STATUS_OPEN; len = STATUS_OPEN_L;
available =
MSNSUBSTATUS_ONLINE; len_available = MSNSUBSTATUS_ONLINE_L;
break;
case XPIDF_ST_CLOSED: p = STATUS_CLOSED; len = STATUS_CLOSED_L;
available =
MSNSUBSTATUS_OFFLINE;
len_available = MSNSUBSTATUS_OFFLINE_L;
break;
case XPIDF_ST_INUSE: p = STATUS_INUSE; len = STATUS_INUSE_L;
available =
MSNSUBSTATUS_OFFLINE;
len_available = MSNSUBSTATUS_OFFLINE_L;
break;
default: p = STATUS_CLOSED; len
=
STATUS_CLOSED_L;
available =
MSNSUBSTATUS_OFFLINE; len_available = MSNSUBSTATUS_OFFLINE_L;
break;
/* Makes gcc
happy */
146a194,203
> // added from tachkov
> char buf_x[128];
> int len_x = 0;
> char buf_y[128];
> int len_y = 0;
> len_x = sprintf(buf_x,
"%.4f", _x);
> len_y = sprintf(buf_y, "%.4f", _y);
> // tachkov end
153c210,217
< len +
---
len +
len_available + // added from tachkov
NOTE_BEGIN_L + // added from tachkov
len_x + // added from tachkov
1 + // one space between x and y coords
len_y + // added from tachkov
NOTE_END_L + // added from tachkov
STATUS_END_L + // added from tachkov
169a234,242
// tachkov
str_append(_b,available, len_available);
str_append(_b,NOTE_BEGIN, NOTE_BEGIN_L);
str_append(_b,buf_x,len_x);
str_append(_b," ",1);
str_append(_b,buf_y,len_y);
str_append(_b,NOTE_END,NOTE_END_L);
str_append(_b,STATUS_END,STATUS_END_L);
// tachkov end
Index: xpidf.h
===================================================================
RCS file: /cvsroot/ser/sip_router/modules/pa/xpidf.h,v
retrieving revision 1.3
diff -r1.3 xpidf.h
58c58
< int xpidf_add_address(str* _b, int _l, str* _addr, xpidf_status_t _st);
---
int xpidf_add_address(str* _b, int _l, str* _addr,
double _x, double
_y, xpidf_status_t _st);
cvs server: Diffing doc