sdp_parse() 関数は、sdp_info パラメータの SDP 記述を解析し、sdp_session_t 構造体を生成します。len パラメータは、文字バッファー sdp_info の長さを指定します。この関数は、sdp_session_t 構造体に必要なメモリーを割り当てます。このメモリーを解放するには、sdp_free_session() 関数を呼び出します。
flags パラメータの値は、ゼロに設定する必要があります。flags パラメータの値がゼロでない場合、sdp_parse() 関数は失敗し、戻り値として EINVAL を返し、*session の値を NULL に設定します。
p_error パラメータは、解析エラーが発生したフィールドの値を取ります。このパラメータの値が NULL になることはありません。p_error パラメータの取り得る値は、次のリストのとおりです。
SDP_VERSION_ERROR 0x00000001 SDP_ORIGIN_ERROR 0x00000002 SDP_NAME_ERROR 0x00000004 SDP_INFO_ERROR 0x00000008 SDP_URI_ERROR 0x00000010 SDP_EMAIL_ERROR 0x00000020 SDP_PHONE_ERROR 0x00000040 SDP_CONNECTION_ERROR 0x00000080 SDP_BANDWIDTH_ERROR 0x00000100 SDP_TIME_ERROR 0x00000200 SDP_REPEAT_TIME_ERROR 0x00000400 SDP_ZONE_ERROR 0x00000800 SDP_KEY_ERROR 0x00001000 SDP_ATTRIBUTE_ERROR 0x00002000 SDP_MEDIA_ERROR 0x00004000 SDP_FIELDS_ORDER_ERROR 0x00008000 SDP_MISSING_FIELDS 0x00010000
SDP 構造体のフィールドの順序が誤っており、RFC 4556 に違反している場合、sdp_parse() 関数は p_error パラメータの値を SDP_FIELDS_ORDER_ERROR に設定します。SDP 構造体に必須のフィールドがなく、RFC 4556 に違反している場合、sdp_parse() 関数は p_error パラメータの値を SDP_MISSING_FIELDS に設定します。
sdp_parse() 関数は、解析エラーがあるフィールドを処理したあとも解析を続行しますが、解析エラーがあったフィールドは、結果として得られる sdp_session_t 構造体に含まれません。
戻り値: sdp_parse() 関数は、関数が正常に完了したときに 0 を返します。session 引数が無効である場合、sdp_parse() 関数は EINVAL を返します。sdp_info の解析中にメモリー割り当てに失敗した場合、sdp_parse() 関数は ENOMEM を返します。errno の値は、エラーが発生した場合でも変化しません。
この例で使用する SDP セッション構造体は次のとおりです。
v=0\r\n o=jdoe 23423423 234234234 IN IP4 192.168.1.1\r\n s=SDP seminar\r\n i=A seminar on the session description protocol\r\n e=test@host.com c=IN IP4 156.78.90.1\r\n t=2873397496 2873404696\r\n
sdp_parse_t() 関数を呼び出したあとで、結果として得られる sdp_session_t 構造体は次のとおりです。
session {
sdp_session_version = 1
s_version = 0
s_origin {
o_username = "jdoe"
o_id = 23423423ULL
o_version = 234234234ULL
o_nettype = "IN"
o_addrtype = "IP4"
o_address = "192.168.1.1"
}
s_name = "SDP seminar"
s_info = "A seminar on the session description protocol"
s_uri = (nil)
s_email {
value = "test@host.com"
next = (nil)
}
s_phone = (nil)
s_conn {
c_nettype = "IN"
c_addrtype = "IP4"
c_address = "156.78.90.1"
c_addrcount = 0
c_ttl = 0
c_next = (nil)
}
s_bw = (nil)
s_time {
t_start = 2873397496ULL
t_stop = 2873404696ULL
t_repeat = (nil)
t_next = (nil)
}
s_zone = (nil)
s_key = (nil)
s_attr = (nil)
s_media = (nil)
}