プログラミングインタフェース

SDP API ユーティリティー関数

この節に示す関数は、SDP セッション構造体の解析と生成、既存セッションの複製、および既存セッションの文字列表現への変換を行います。

SDP セッション構造体の解析

int sdp_parse(const char *sdp_info, int len, int flags, sdp_session_t **session, uint_t *p_error);

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 の値は、エラーが発生した場合でも変化しません。


例 3–5 例: SDP セッション構造体の解析

この例で使用する 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)
}

既存の SDP セッション構造体の複製

sdp_session_t sdp_clone_session(const sdp_session_t *session);

sdp_clone_session() 関数は、session パラメータで識別される SDP セッション構造体と同一の新しい SDP セッション構造体を作成します。sdp_clone_session() 関数は、正常完了時に、複製されたセッション構造体を返します。sdp_clone_session() 関数は、失敗時に NULL を返します。

SDP セッション構造体の文字列への変換

char *sdp_session_to_str(const sdp_session_t *session, int *error);

sdp_session_to_str() 関数は、session パラメータで指定された SDP セッション構造体の文字列表現を返します。sdp_session_to_str() 関数は、各 SDP フィールドに文字列を追加する前に、フィールドの最後にキャリッジリターン/改行を追加します。

戻り値: sdp_session_to_str() 関数は、正常完了時に SDP セッション構造体の文字列表現を返します。それ以外の場合、sdp_session_to_str() 関数は NULL を返します。入力が NULL だった場合、sdp_session_to_str() 関数は EINVAL へのエラーポインタを返します。メモリー割り当てエラーが発生した場合、sdp_session_to_str() 関数は ENOMEM へのエラーポインタを返します。errno の値は、エラーが発生した場合でも変化しません。