version 1.3, 2003/08/22 14:56:48
|
version 1.6, 2003/09/04 18:35:37
|
|
|
#include <Pegasus/Common/Tracer.h> | #include <Pegasus/Common/Tracer.h> |
#include <Pegasus/Common/MessageLoader.h> //l10n | #include <Pegasus/Common/MessageLoader.h> //l10n |
#include <cstring> | #include <cstring> |
|
#include <iostream> |
|
#include <cstdlib> |
//PEGASUS_USING_STD; | //PEGASUS_USING_STD; |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
|
|
if(i != PEG_NOT_FOUND){ // extract and store language and quality | if(i != PEG_NOT_FOUND){ // extract and store language and quality |
if(isValid(hdr.subString(0,i), validate_length)){ | if(isValid(hdr.subString(0,i), validate_length)){ |
language_tag = hdr.subString(0,i); | language_tag = hdr.subString(0,i); |
|
if(hdr.size() > i + 3) |
hdr.remove(0,i+3); // remove everything but the quality value | hdr.remove(0,i+3); // remove everything but the quality value |
|
else{ |
|
MessageLoaderParms parms("Common.LanguageParser.INVALID_QUALITY_VALUE", |
|
"AcceptLanguage contains an invalid quality value"); |
|
throw InvalidAcceptLanguageHeader(MessageLoader::getMessage(parms)); |
|
} |
} | } |
else{ | else{ |
//l10n | //l10n |
|
|
PEG_METHOD_ENTER(TRC_L10N, "LanguageParser::parseLanguageSubtags"); | PEG_METHOD_ENTER(TRC_L10N, "LanguageParser::parseLanguageSubtags"); |
Uint32 i; | Uint32 i; |
char separator = findSeparator(language_tag.getCString()); | char separator = findSeparator(language_tag.getCString()); |
|
|
while( (i = language_tag.find(Char16(separator))) != PEG_NOT_FOUND ){ | while( (i = language_tag.find(Char16(separator))) != PEG_NOT_FOUND ){ |
|
|
subtags.append(language_tag.subString(0,i)); | subtags.append(language_tag.subString(0,i)); |
language_tag.remove(0,i + 1); | language_tag.remove(0,i + 1); |
} | } |
|
|
Array<String> subtags; | Array<String> subtags; |
parseLanguageSubtags(subtags, language_tag); | parseLanguageSubtags(subtags, language_tag); |
if(subtags.size() > 0){ | if(subtags.size() > 0){ |
for(int i = 0; i < subtags.size(); i++){ |
for(Uint32 i = 0; i < subtags.size(); i++){ |
//length should be 8 or less AND all characters should be A-Z or a-z | //length should be 8 or less AND all characters should be A-Z or a-z |
if((validate_length && subtags[i].size() > 8) || !checkAlpha(subtags[i].getCString())) | if((validate_length && subtags[i].size() > 8) || !checkAlpha(subtags[i].getCString())) |
return false; | return false; |
|
|
| |
String LanguageParser::convertPrivateLanguageTag(String language_tag){ | String LanguageParser::convertPrivateLanguageTag(String language_tag){ |
// figure out if its a unix style locale or windows locale | // figure out if its a unix style locale or windows locale |
int i; |
Uint32 i; |
if(( i = language_tag.find("pegasus-")) != PEG_NOT_FOUND ){ | if(( i = language_tag.find("pegasus-")) != PEG_NOT_FOUND ){ |
language_tag = language_tag.subString(i+5); // capture the remainder of the string | language_tag = language_tag.subString(i+5); // capture the remainder of the string |
return String(replaceSeparator(language_tag.getCString(), '-')); | return String(replaceSeparator(language_tag.getCString(), '-')); |
|
|
} | } |
| |
Boolean LanguageParser::checkAlpha(CString _str){ | Boolean LanguageParser::checkAlpha(CString _str){ |
for(int i = 0; i < strlen(_str); i++) |
Uint32 length = (Uint32) strlen(_str); |
|
for(Uint32 i = 0; i < length; i++){ |
|
if (!(((_str[i] >= 'A') && (_str[i] <= 'Z')) || |
|
((_str[i] >= 'a') && (_str[i] <= 'z')))) |
|
return false; |
|
} |
|
return true; |
|
|
|
/*for(Uint32 i = 0; i < length; i++) |
if( !isalpha(_str[i]) ) | if( !isalpha(_str[i]) ) |
return false; | return false; |
|
return true;*/ |
|
} |
|
|
|
Boolean LanguageParser::checkAlphaNum(char c){ |
|
|
|
if (!(((c >= 'A') && (c <= 'Z')) || |
|
((c >= 'a') && (c <= 'z')) || |
|
((c >= '0') && (c <= '9')))) |
|
return false; |
|
|
return true; | return true; |
} | } |
| |
char LanguageParser::findSeparator(CString _str){ | char LanguageParser::findSeparator(CString _str){ |
for(int i = 0; i < strlen(_str); i++) |
Uint32 length = (Uint32) strlen(_str); |
if(!isalnum(_str[i])) |
for(Uint32 i = 0; i < length; i++) |
|
if(!checkAlphaNum(_str[i])) |
return _str[i]; | return _str[i]; |
return '\0'; | return '\0'; |
} | } |
| |
CString LanguageParser::replaceSeparator(CString _s, char new_sep){ | CString LanguageParser::replaceSeparator(CString _s, char new_sep){ |
char * _str = const_cast<char *>((const char*)_s); | char * _str = const_cast<char *>((const char*)_s); |
for(int i = 0; i < strlen(_str); i++) |
Uint32 length = (Uint32) strlen(_str); |
_str[i] = (!isalnum(_str[i])) ? new_sep : _str[i]; |
for(Uint32 i = 0; i < length; i++) |
|
_str[i] = (!checkAlphaNum(_str[i])) ? new_sep : _str[i]; |
return (String(_str)).getCString(); | return (String(_str)).getCString(); |
} | } |
| |