version 1.9, 2005/05/30 12:46:15
|
version 1.18, 2006/01/10 19:41:15
|
|
|
// | // |
// Author: Humberto Rivero (hurivero@us.ibm.com) | // Author: Humberto Rivero (hurivero@us.ibm.com) |
// | // |
// Modified By: Aruran, IBM (ashanmug@in.ibm.com) for Bug# 3697 |
// Modified By: Aruran, IBM (ashanmug@in.ibm.com) for Bug# 3697, 3698, 3699, 3700 |
|
// Aruran, IBM (ashanmug@in.ibm.com) for Bug# 3701, 3702, 3703 |
|
// Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com) |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
#include <Pegasus/Common/Config.h> | #include <Pegasus/Common/Config.h> |
#include <Pegasus/Common/String.h> | #include <Pegasus/Common/String.h> |
#include <Pegasus/Common/Array.h> | #include <Pegasus/Common/Array.h> |
|
#include <Pegasus/Common/AcceptLanguageList.h> |
#ifdef PEGASUS_USE_EXPERIMENTAL_INTERFACES |
#include <Pegasus/Common/ContentLanguageList.h> |
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
|
/** |
/** This class parses and validates AcceptLanguage OR ContentLanguage values |
This class parses and validates Accept-Language and Content-Language values |
* from the respective HTTP headers, and provides various utility functions |
from the respective HTTP headers, and provides utility functions to parse |
* to parse and manipulate language information |
and manipulate language information |
*/ | */ |
class PEGASUS_COMMON_LINKAGE LanguageParser{ |
class PEGASUS_COMMON_LINKAGE LanguageParser |
|
{ |
public: | public: |
| |
/** This member is used to represent an empty LanguageParser. Using this |
/** |
member avoids construction of an empty LanguageParser |
Builds an AcceptLanguageList object from an HTTP Accept-Language |
(e.g., LanguageParser()). |
header value. |
*/ |
@param acceptLanguageHeader A String containing an HTTP |
static const LanguageParser EMPTY; |
Accept-Language header value from which to build the AcceptLanguageList |
|
object. |
/** Parses the value portion of either an AcceptLanguage HTTP header or a |
@exception InvalidAcceptLanguageHeader if a syntax error is |
* ContentLanguage HTTP header, extracts the individual fields and stores |
encountered. |
* them in an array. |
|
* @param values Array<String>& where the individual fields are stored |
|
* @param hdr String the value portion of the HTTP Accept/ContentLanguage header |
|
*/ | */ |
void parseHdr(Array<String> &values, String hdr); |
static AcceptLanguageList parseAcceptLanguageHeader( |
|
const String& acceptLanguageHeader); |
| |
/** Parses an AcceptLanguage or ContentLanguage value from a header. |
/** |
* If a valid AcceptLanguage value is determined to contain a quality |
Builds a ContentLanguageList object from an HTTP Content-Language |
* value, then this quality once validated is returned. Otherwise -1 is returned. |
header value. |
* It is up to the caller to know in what context this call is being made, |
@param contentLanguageHeader A String containing an HTTP |
* that is: it is the callers responsibility to know whether |
Content-Language header value from which to build the |
* an AcceptLanguage or a ContentLanguage value is being parsed. |
ContentLanguageList object. |
* @param language String& where the valid language is stored |
@exception InvalidContentLanguageHeader if a syntax error is |
* @param hdr String the value being parsed and validated |
encountered. |
* @return Real32 if a valid quality found then 1 <=> 0, otherwise 1 |
|
* @exception throws ??? |
|
*/ | */ |
Real32 parseAcceptLanguageValue(String &language, String & hdr); |
static ContentLanguageList parseContentLanguageHeader( |
|
const String& contentLanguageHeader); |
| |
String parseContentLanguageValue(String & hdr); |
/** |
|
Validates the syntax of a language tag according to RFC 3066. |
|
Parses the language tag into language, country, and variant, if |
|
the language tag is formed using ISO codes (ISO 639 and ISO 3166). |
|
@param languageTagString The language tag string to parse and |
|
validate. |
|
@param language The returned language value parsed from the language |
|
tag, if applicable. |
|
@param country The returned country value parsed from the language |
|
tag, if applicable. |
|
@param variant The returned language variant value parsed from the |
|
language tag, if applicable. |
|
@exception Exception if the language tag is syntactically invalid. |
|
*/ |
|
static void parseLanguageTag( |
|
const String& languageTagString, |
|
String& language, |
|
String& country, |
|
String& variant); |
| |
/** | /** |
* Given a language ex: en-US-xx, |
Validates the syntax of an Accept-Language quality value. |
* returns the base of the language "en". |
@param quality A Real32 quality value to validate. |
* @param language String |
@exception Exception if the quality value is invalid. |
* @param separator Char16 the character that separates the various subtags |
|
* @return String base of the language parameter |
|
*/ | */ |
String getLanguage(String & language_tag); |
static void validateQualityValue(Real32 quality); |
|
|
String getCountry(String & language_tag); |
|
|
|
String getVariant(String & language_tag); |
|
|
|
private: |
|
| |
/** | /** |
* Fills the first position in the array with the most general part of |
Builds an HTTP Accept-Language header value from an AcceptLanguageList |
* the language String, each subsequent postion is the array gets more |
object. |
* and more detailed. For example: en-us-fooblah would be returned as |
@param acceptLanguages The AcceptLanguageList object to be encoded in |
* ["en"]["us"]["fooblah"] |
an HTTP Accept-Language header. |
* @param subtags Array<String>& array filled in with the root and subtags |
|
* @param language String the language to parse |
|
* @param separator Char16 the character that separates the various subtags |
|
* @return String the root of the language tag |
|
*/ | */ |
void parseLanguageSubtags(Array<String> &subtags, String language_tag); |
static String buildAcceptLanguageHeader( |
|
const AcceptLanguageList& acceptLanguages); |
| |
/** Breaks the language into its parts(subtags), then validates each part |
/** |
* according to the RFCs. |
Builds an HTTP Content-Language header value from a ContentLanguageList |
* @param s String language to be validated |
object. |
* @return Boolean |
@param contentLanguages The ContentLanguageList object to be encoded |
|
in an HTTP Content-Language header. |
*/ | */ |
Boolean isValid(String language_tag, Boolean length_check = true); |
static String buildContentLanguageHeader( |
|
const ContentLanguageList& contentLanguages); |
| |
/** Checks if the String has all characters in A-Z OR a-z range. |
/** |
* @param s String |
Returns the default accept languages based on environment settings. |
* @return Boolean |
ATTN: What is the behavior? This is only implemented if MESSAGES and |
|
ICU are used. |
*/ | */ |
Boolean checkAlpha(CString _str); |
static AcceptLanguageList getDefaultAcceptLanguages(); |
| |
CString replaceSeparator(CString _s, char new_sep = '-'); |
private: |
| |
char findSeparator(CString _str); |
/** |
|
Parses the value portion of an HTTP Accept-Language or Content-Language |
|
header into individual language elements. Comments and whitespace are |
|
removed. |
|
@param headerElements An array of Strings into which the language |
|
elements are stored. |
|
@param languageHeaderValue A String containing the value portion of |
|
an HTTP Accept-Language or Content-Language header. |
|
@exception Exception if a syntax error is encountered. |
|
*/ |
|
static void _parseLanguageHeader( |
|
const String& languageHeaderValue, |
|
Array<String>& languageElements); |
| |
String convertPrivateLanguageTag(String language_tag); |
/** |
|
Parses an AcceptLanguage or ContentLanguage value from a header. |
|
If a valid AcceptLanguage value is determined to contain a quality |
|
value, then this quality is validated and returned. Otherwise -1 is |
|
returned. It is up to the caller to know in what context this call |
|
is being made, that is: it is the callers responsibility to know |
|
whether an AcceptLanguage or a ContentLanguage value is being parsed. |
|
@param acceptLanguageHeaderElement String to be parsed into a |
|
language tag and quality value. The String must not contain comments |
|
or whitespace. |
|
@param languageTag String into which the parsed language tag is |
|
stored. |
|
@param quality Real32 into which the parsed quality value is stored. |
|
@exception Exception if a syntax error is encountered. |
|
*/ |
|
static void _parseAcceptLanguageElement( |
|
const String& acceptLanguageElement, |
|
String& languageTag, |
|
Real32& quality); |
| |
}; //end LanguageParser |
/** |
|
Fills the first position in the array with the most general part of |
|
the language String, each subsequent postion is the array gets more |
|
and more detailed. For example: en-us-fooblah would be returned as |
|
["en"]["us"]["fooblah"] |
|
@param subtags Array<String>& array filled in with the root and subtags |
|
@param languageTag String the language to parse |
|
@return String the root of the language tag |
|
@exception Exception if a syntax error is encountered. |
|
*/ |
|
static void _parseLanguageSubtags( |
|
Array<String>& subtags, |
|
const String& languageTagString); |
| |
PEGASUS_NAMESPACE_END |
/** |
|
Checks if a String represents a valid language tag primary subtag. |
|
A valid primary subtag contains 1 to 8 alphabetic characters. |
|
@param subtag The subtag String to validate. |
|
@return True if the String represents a valid language tag primary |
|
subtag; false otherwise. |
|
*/ |
|
static Boolean _isValidPrimarySubtagSyntax(const String& subtag); |
|
|
|
/** |
|
Checks if a String represents a valid language tag subtag. |
|
A valid primary subtag contains 1 to 8 alphanumeric characters. |
|
@param subtag The subtag String to validate. |
|
@return True if the String represents a valid language tag subtag; |
|
false otherwise. |
|
*/ |
|
static Boolean _isValidSubtagSyntax(const String& subtag); |
|
}; |
| |
#endif // PEGASUS_USE_EXPERIMENTAL_INTERFACES |
PEGASUS_NAMESPACE_END |
| |
#endif | #endif |