Apologies for the length of this question.
Some background; I have an application in which the user for a telephone is emailed the call details (caller, length of call etc) after the call is completed. If a phone rings but the usual operator is not available, any other user may pick up the call. I would like the email to go to the user who picked up the call rather than the absent user who was called. However, I am struggling for a method to identify the user who picked up the call, from the SIP message header. I had hoped to idenify the user from one of two fields in the SIP message header associated with the GCEV_CONNECTED event: namely P-Asserted-Identity or Remote-Party-ID
Part of a TCP dump associated with the 200 OK message:
...
> Status-Line SIP/2.0 200 OK
> Message Header
> Via: SIP/2.0/UDP 192.168.80.50:5060;branch=z9hG4bk-36-d451-eb5ea87-f716a208
> From: "Ext 2910"<sip:2910@192.168.80.50>;tag=f7180638-3250a8c0-13c4-65014-36-3f373d36-36
> To: <sip:2902@192.168.100.10>;tag=749046~6986e0d9-4f9b-4be5-a059-e690e7e506af-18995125
Date: Tue, 19 Nov 2019 12:28:48 GMT
Call-ID: f7199e40-3250a8c0-13c4-65014-36-7e604f1-=36
> CSeq: 1 INVITE
Allow: INVITE, OPTIONS, INFO, BYE, CANCEL, ACK, PRACK, UPDATE, REFERE, SUBSCRIBE, NOTIFY
Allow-Events: presence
Supported: replaces
Supported: X-csco-srtp-fallback
Supported: Geolocation
> P-Asserted-Identity: "John Smith" <sip:2902@192.168.100.10>
> Remote-Party-ID: "John Smith" <sip:2902@192.168.100.10>;party=called;screen=yes;privacy=off
> Contact: <sip:2902@192.168.80.50:5060>
Content-Type: application/sdp
Content-Length: 274
Some bits of source code which are called on opening the virtual board(s), GlobalCall device(s), and on processing the GCEV_CONNECTED event:
//
int virtualBoardCreate (int boardCount, IP_VIRTBOARD *pVirtBoards)
{
...
for (int i = 0; i < boardCount; i++)
{
IP_VIRTBOARD *pVirtBoard = pVirtBoards
;
...
pVirtBoard->sip_signaling_port = 5060;
pVirtBoard->sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE | IP_SIP_MIME_ENABLE;
}
return 0;
}
//
int GlobalCallDeviceOnOpenEx (unsigned long DEVH)
{
...
GC_PARM_BLKP parmblkp = NULL;
if ((result = gc_util_insert_parm_ref (&parmblkp, IPSET_CONFIG, IPPARM_REGISTER_SIP_HEADER, strlen (pAllowEvents) + 1, pAllowEvents)) != GC_SUCCESS)
return result;
if ((result = gc_util_insert_parm_ref (&parmblkp, IPSET_CONFIG, IPPARM_REGISTER_SIP_HEADER, strlen (pPAssertedIdentity) + 1, pPAssertedIdentity)) != GC_SUCCESS)
return result;
if ((result = gc_util_insert_parm_ref (&parmblkp, IPSET_CONFIG, IPPARM_REGISTER_SIP_HEADER, strlen (pRemotePartyId) + 1, pRemotePartyId)) != GC_SUCCESS)
return result;
return 0;
}
//
const char *getSetIDText (int setID)
{
// convert numeric setID to text
...
}
//
const char *getParmIDText (int parmID)
{
// convert numeric parmID to text
...
}
//
int GlobalCallDeviceGcevConnected (const METAEVENT& metaevent)
{
GC_PARM_BLKP parmblkp ((GC_PARM_BLKP) metaevent.extevtdatap);
int parmctr = 0;
GC_PARM_DATA_EXT parm;
INIT_GC_PARM_DATA_EXT(&parm);
while ((gc_util_next_parm_ex (parmblkp, &parm)) == GC_SUCCESS)
{
printf ("\n");
switch (parm.set_ID)
{
case IPSET_SIP_MSGINFO:
printf ("parmctr : %i", parmctr++);
printf ("set_ID : %s", getSetIDText (parm.set_ID));
printf ("parm_ID : %s", getParmIDText (parm.parm_ID));
printf ("pData : %s", (char *) parm.pData);
break;
// all other known values of parm.set_ID catered for)
...
}
}
return 0;
}
The output text generated by the function GlobalCallDeviceGcevConnected above:
parmctr : 0
set_ID : IPSET_SDP
parm_ID : IPPARM_SDP_OFFER
pData : v=0
o=CiscoSystemsCCM-SIP 749223 1 IN IP4 192.168.100.10
s=SIP Call
c=IN IP4 192.168.100.10
b=TIAS:64000
b=AS:64
t=0 0
m=audio 24666 RTP/AVP 0 8 96 a=rtpmap:0 PCMU/8000
a=ptime:20
a=rtpmap:8 PCMA/8000
a=rtpmap:96 telephone-event/8000
a=fmtp:96 0-15
parmctr : 1
set_ID : IPSET_SIP_MSGINFO
parm_ID : IPPARM_CONTACT_URI
pData : sip:2902@192.168.100.10:5060^[0^P
parmctr : 2
set_ID : IPSET_SIP_MSGINFO
parm_ID : IPPARM_CALLID_HDR
pData : f7199e40-3250a8c0-13c4-65014-19-212ff6b3-19
parmctr : 3
set_ID : IPSET_SIP_MSGINFO
parm_ID : IPPARM_FROM
pData : "Ext 2910"<sip:2910@192.168.80.50>;tag=f7180638-3250a8c0-13c4-65014-19-afd3c09-19^[0^S
parmctr : 4
set_ID : IPSET_SIP_MSGINFO
parm_ID : IPPARM_TO
pData : <sip:2902@192.168.100.10>;tag=749223~6986e0d9-4f9b-4be5-a059-e690e7e506af-18995131
As can be seen, the fields I am interested in (P-Asserted-Identity and Remote-Party-ID are present in the SIP message header, but are not extracted into the IP parameter buffers.
I have referred to the manual globalcall_for_ip_hmp_v12.pdf, section 4.9 Setting and retrieving SIP Message Header Fields and to my alarm, in Section 4.9.4, Registering SIP Header Fields to be retrieved,
(pages 183-184), the two fields I want do not seem to be listed.
Have I missed something, or is there another method of retrieving a user's id from the SIP Message headers (or any other part of HMP / GlobalCall) ?
Regards