2 * Copyright (C) 2010 Sansar Choinyambuu
4 * Copyright (C) secunet Security Networks AG
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 #include "pb_language_preference_msg.h"
19 #include <bio/bio_writer.h>
20 #include <bio/bio_reader.h>
21 #include <utils/debug.h>
23 typedef struct private_pb_language_preference_msg_t private_pb_language_preference_msg_t
;
26 * PB-Language-Preference message (see section 4.10 of RFC 5793)
29 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
30 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31 * | Language Preference (Variable Length) |
32 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
35 #define PB_LANG_PREFIX "Accept-Language: "
36 #define PB_LANG_PREFIX_LEN strlen(PB_LANG_PREFIX)
39 * Private data of a pb_language_preference_msg_t object.
42 struct private_pb_language_preference_msg_t
{
44 * Public pb_access_recommendation_msg_t interface.
46 pb_language_preference_msg_t
public;
56 chunk_t language_preference
;
64 METHOD(pb_tnc_msg_t
, get_type
, pen_type_t
,
65 private_pb_language_preference_msg_t
*this)
70 METHOD(pb_tnc_msg_t
, get_encoding
, chunk_t
,
71 private_pb_language_preference_msg_t
*this)
73 return this->encoding
;
76 METHOD(pb_tnc_msg_t
, build
, void,
77 private_pb_language_preference_msg_t
*this)
79 if (this->encoding
.ptr
)
83 this->encoding
= chunk_cat("cc",
84 chunk_create(PB_LANG_PREFIX
, PB_LANG_PREFIX_LEN
),
85 this->language_preference
);
88 METHOD(pb_tnc_msg_t
, process
, status_t
,
89 private_pb_language_preference_msg_t
*this, uint32_t *offset
)
93 if (this->encoding
.len
>= PB_LANG_PREFIX_LEN
&&
94 memeq(this->encoding
.ptr
, PB_LANG_PREFIX
, PB_LANG_PREFIX_LEN
))
96 lang
= chunk_skip(this->encoding
, PB_LANG_PREFIX_LEN
);
97 this->language_preference
= lang
.len
? chunk_clone(lang
) : chunk_empty
;
101 DBG1(DBG_TNC
, "language preference must be preceded by '%s'",
107 if (this->language_preference
.len
&&
108 this->language_preference
.ptr
[this->language_preference
.len
-1] == '\0')
110 DBG1(DBG_TNC
, "language preference must not be null terminated");
111 *offset
= PB_LANG_PREFIX_LEN
+ this->language_preference
.len
- 1;
118 METHOD(pb_tnc_msg_t
, destroy
, void,
119 private_pb_language_preference_msg_t
*this)
121 free(this->encoding
.ptr
);
122 free(this->language_preference
.ptr
);
126 METHOD(pb_language_preference_msg_t
, get_language_preference
, chunk_t
,
127 private_pb_language_preference_msg_t
*this)
129 return this->language_preference
;
135 pb_tnc_msg_t
*pb_language_preference_msg_create_from_data(chunk_t data
)
137 private_pb_language_preference_msg_t
*this;
142 .get_type
= _get_type
,
143 .get_encoding
= _get_encoding
,
148 .get_language_preference
= _get_language_preference
,
150 .type
= { PEN_IETF
, PB_MSG_LANGUAGE_PREFERENCE
},
151 .encoding
= chunk_clone(data
),
154 return &this->public.pb_interface
;
160 pb_tnc_msg_t
*pb_language_preference_msg_create(chunk_t language_preference
)
162 private_pb_language_preference_msg_t
*this;
167 .get_type
= _get_type
,
168 .get_encoding
= _get_encoding
,
173 .get_language_preference
= _get_language_preference
,
175 .type
= { PEN_IETF
, PB_MSG_LANGUAGE_PREFERENCE
},
176 .language_preference
= chunk_clone(language_preference
),
179 return &this->public.pb_interface
;