/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.slick.protocol.icq;
import java.util.*;
import junit.framework.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.ServerStoredDetails.GenericDetail;
import net.java.sip.communicator.util.*;
/**
* Testing of the user and account info. Tests fo reading , adding , replacing,
* removing and error handling.
* @author Damian Minkov
*/
public class TestOperationSetServerStoredInfo
extends TestCase
{
private static final Logger logger =
Logger.getLogger(TestOperationSetServerStoredInfo.class);
private IcqSlickFixture fixture = new IcqSlickFixture();
private OperationSetServerStoredAccountInfo
opSetServerStoredAccountInfo = null;
private OperationSetServerStoredContactInfo
opSetServerStoredContactInfo = null;
private OperationSetPresence opSetPresence = null;
public TestOperationSetServerStoredInfo(String name)
{
super(name);
}
/**
* Get a reference to the contact and account info operation sets.
* @throws Exception if this is not a good day.
*/
@Override
protected void setUp() throws Exception
{
super.setUp();
fixture.setUp();
Map<String, OperationSet> supportedOperationSets =
fixture.provider.getSupportedOperationSets();
if ( supportedOperationSets == null
|| supportedOperationSets.size() < 1)
throw new NullPointerException(
"No OperationSet implementations are supported by "
+"this ICQ implementation. ");
opSetServerStoredAccountInfo =
(OperationSetServerStoredAccountInfo)supportedOperationSets.get(
OperationSetServerStoredAccountInfo.class.getName());
opSetServerStoredContactInfo =
(OperationSetServerStoredContactInfo)supportedOperationSets.get(
OperationSetServerStoredContactInfo.class.getName());
//if the op set is null then the implementation doesn't offer a account info.
//operation set which is unacceptable for icq.
if (opSetServerStoredAccountInfo == null)
{
throw new NullPointerException(
"No implementation for Account Info was found");
}
//if the op set is null then the implementation doesn't offer a contact info.
//operation set which is unacceptable for icq.
if (opSetServerStoredContactInfo == null)
{
throw new NullPointerException(
"No implementation for Contact Info was found");
}
opSetPresence =
(OperationSetPresence)supportedOperationSets.get(
OperationSetPresence.class.getName());
//if the op set is null show that we're not happy.
if (opSetPresence == null)
{
throw new NullPointerException(
"An implementation of the ICQ service must provide an "
+ "implementation of at least one of the PresenceOperationSets");
}
}
@Override
protected void tearDown() throws Exception
{
super.tearDown();
fixture.tearDown();
}
/**
* Creates a test suite containing tests of this class in a specific order.
* We'll first execute tests beginning with the "test" prefix and then go to
* ordered tests. We first execute tests for reading info, then writing.
* Then the ordered tests - error handling and finaly for removing details
*
* @return Test a testsuite containing all tests to execute.
*/
public static Test suite()
{
TestSuite suite
= new TestSuite(TestOperationSetServerStoredInfo.class);
// error handling expects that all three languages are set.
// this is done in previous tests
// suite.addTest(new TestOperationSetServerStoredInfo("errorHandling"));
// the final one as we will remove some of the already set values
// suite.addTest(new TestOperationSetServerStoredInfo("removingItems"));
return suite;
}
/**
* Test reading info. changing info of the TesterAgen and checking
* it through the contactInfo operation set
*/
public void testReadInfo()
{
Object lock = new Object();
// make a random name. To be sure its not the value we used the last test
int suffix = (int)(Math.random()*100);
String lastName = "TesterAgent" + String.valueOf(suffix);
IcqSlickFixture.testerAgent.setUserInfoLastName(lastName);
// give the server time to change things
synchronized(lock)
{
try{
lock.wait(4000);}
catch (InterruptedException ex){}
}
// make the phonenumber also random
String phoneNumber = "+3591234" + suffix;
IcqSlickFixture.testerAgent.setUserInfoPhoneNumber(phoneNumber);
// give the server time to change things
synchronized(lock)
{
try{
lock.wait(4000);}
catch (InterruptedException ex){}
}
// Getting a random language index between 1 and 72 ,
// see spokenLanguages array
int lang1 = 1 + (int)(Math.random() * 72);
int lang2 = 1 + (int)(Math.random() * 72);
int lang3 = 1 + (int)(Math.random() * 72);
// setting this languages as spoken languages
IcqSlickFixture.testerAgent.setUserInfoLanguage(lang1, lang2, lang3);
// give the server time to change things
synchronized(lock)
{
try{
lock.wait(4000);}
catch (InterruptedException ex){}
}
// get a random country from countryIndexToLocaleString Array
// 232 is the count of the countries in this array
int countryRandom = 0 + (int)(Math.random() * 232);
int countryCode = ((Integer)countryIndexToLocaleString[countryRandom][0]).intValue();
String countryAbr = (String)countryIndexToLocaleString[countryRandom][1];
IcqSlickFixture.testerAgent.setUserInfoHomeCountry(countryCode);
// give the server time to change things
synchronized(lock)
{
try{
lock.wait(4000);}
catch (InterruptedException ex){}
}
Contact testerAgentContact
= opSetPresence.findContactByID(IcqSlickFixture.testerAgent.getIcqUIN());
// Get the last name info
Iterator<GenericDetail> iter =
opSetServerStoredContactInfo.
getDetails(testerAgentContact,
ServerStoredDetails.LastNameDetail.class);
while (iter.hasNext())
{
ServerStoredDetails.LastNameDetail item
= (ServerStoredDetails.LastNameDetail) iter.next();
assertEquals("The LastName we set is not set or not read properly"
, item.getName()
, lastName);
break;
}
// Get phone number info
iter =
opSetServerStoredContactInfo.
getDetails(testerAgentContact,
ServerStoredDetails.PhoneNumberDetail.class);
while (iter.hasNext())
{
ServerStoredDetails.PhoneNumberDetail item = (ServerStoredDetails.PhoneNumberDetail) iter.next();
assertEquals("The PhoneNumber we set is not set or not read properly"
, item.getNumber()
, phoneNumber);
break;
}
// get the spoken languages
iter =
opSetServerStoredContactInfo.
getDetails(testerAgentContact,
ServerStoredDetails.SpokenLanguageDetail.class);
List<Locale> spokenLanguagesServer = new ArrayList<Locale>();
while (iter.hasNext())
{
ServerStoredDetails.SpokenLanguageDetail item
= (ServerStoredDetails.SpokenLanguageDetail)iter.next();
spokenLanguagesServer.add(item.getLocale());
}
assertEquals("spoken languages must be 3 "
, 3
, spokenLanguagesServer.size());
assertTrue("Must contain langiage " + spokenLanguages[lang1],
spokenLanguagesServer.contains(spokenLanguages[lang1]));
assertTrue("Must contain langiage " + spokenLanguages[lang2],
spokenLanguagesServer.contains(spokenLanguages[lang2]));
assertTrue("Must contain langiage " + spokenLanguages[lang3],
spokenLanguagesServer.contains(spokenLanguages[lang3]));
// get home country code detail
iter =
opSetServerStoredContactInfo.
getDetails(testerAgentContact,
ServerStoredDetails.CountryDetail.class);
while (iter.hasNext())
{
ServerStoredDetails.CountryDetail item
= (ServerStoredDetails.CountryDetail) iter.next();
logger.info("read item value: " + item.getLocale().getDisplayCountry());
assertEquals("The Country we set is not set or not read properly"
, item.getLocale()
, new Locale("", countryAbr));
break;
}
}
/**
* Testing changing of the details.
* Changing the details from the account info operation set
* and checking the values retreived from TesterAgent
*/
public void testWriteInfo()
{
Object lock = new Object();
// first get the details if existing
ServerStoredDetails.LastNameDetail lastNameDetail = null;
ServerStoredDetails.PhoneNumberDetail phoneNumberDetail = null;
// Iterator iterSpokenLangDetails = null;
ServerStoredDetails.CountryDetail homeCountryDetail = null;
// Get Last name info detail
Iterator<GenericDetail> iter =
opSetServerStoredAccountInfo.
getDetails(ServerStoredDetails.LastNameDetail.class);
if (iter.hasNext())
lastNameDetail = (ServerStoredDetails.LastNameDetail) iter.next();
// Get phone number info
iter = opSetServerStoredAccountInfo.
getDetails(ServerStoredDetails.PhoneNumberDetail.class);
if (iter.hasNext())
phoneNumberDetail = (ServerStoredDetails.PhoneNumberDetail)
iter.next();
// Get spoken languages
// iterSpokenLangDetails = opSetServerStoredAccountInfo.
// getDetails(ServerStoredDetails.SpokenLanguageDetail.class);
// Get home country code detail
iter = opSetServerStoredAccountInfo.
getDetails(ServerStoredDetails.CountryDetail.class);
if (iter.hasNext())
homeCountryDetail = (ServerStoredDetails.CountryDetail) iter.
next();
// make a random name to be sure its different every test
int suffix = (int) (Math.random() * 100);
String newLastName = "TesterAgent" + String.valueOf(suffix);
// the phone number also random
String newPhoneNumber = "+3591234" + suffix;
// random languages - between 1 and 72
// int[] newLanguages =
// {
// (1 + (int) (Math.random() * 72)),
// (1 + (int) (Math.random() * 72)),
// (1 + (int) (Math.random() * 72))
// };
// the countries are between 0 and 232, see countryIndexToLocaleString,
// which lengthe is 232
int countryRandom = 0 + (int) (Math.random() * 232);
int newCountryCode = ( (Integer) countryIndexToLocaleString[
countryRandom][0]).intValue();
String newCountryAbr = (String) countryIndexToLocaleString[
countryRandom][1];
try
{
// now if existing replace detail or add if not
// using the new generated values
if (lastNameDetail != null)
{
assertTrue("Cannot set Detail LastName : " + newLastName,
opSetServerStoredAccountInfo.replaceDetail(
lastNameDetail,
new ServerStoredDetails.LastNameDetail(newLastName)));
}
else
{
opSetServerStoredAccountInfo.addDetail(
new ServerStoredDetails.LastNameDetail(newLastName));
}
// give time to server to change things
synchronized (lock)
{
try{
lock.wait(5000);}
catch (InterruptedException ex)
{}
}
if (phoneNumberDetail != null)
{
assertTrue("Cannot set Detail PhoneNumver : " +
newPhoneNumber,
opSetServerStoredAccountInfo.replaceDetail(
phoneNumberDetail,
new ServerStoredDetails.PhoneNumberDetail(
newPhoneNumber)));
}
else
{
opSetServerStoredAccountInfo.addDetail(
new ServerStoredDetails.PhoneNumberDetail(
newPhoneNumber));
}
// give time to server to change things
synchronized (lock)
{
try{
lock.wait(5000);}
catch (InterruptedException ex)
{}
}
if (homeCountryDetail != null)
{
assertTrue("Cannot set Detail Country : " + newCountryAbr,
opSetServerStoredAccountInfo.replaceDetail(
homeCountryDetail,
new ServerStoredDetails.CountryDetail(new Locale("",
newCountryAbr)))); ;
}
else
{
opSetServerStoredAccountInfo.addDetail(
new ServerStoredDetails.CountryDetail(new Locale("",
newCountryAbr)));
}
// give time to server to change things
synchronized (lock)
{
try{
lock.wait(5000);}
catch (InterruptedException ex)
{}
}
// int numberOfChangedLanguages = 0;
// while (iterSpokenLangDetails.hasNext())
// {
// ServerStoredDetails.SpokenLanguageDetail item =
// (ServerStoredDetails.SpokenLanguageDetail)
// iterSpokenLangDetails.next();
//
// // if we are here so there is language - replace it
// int newLang = newLanguages[numberOfChangedLanguages++];
//
// opSetServerStoredAccountInfo.replaceDetail(item,
// new ServerStoredDetails.SpokenLanguageDetail(
// spokenLanguages[newLang]));
//
// // give time to server to change things, as we change the languages one by one
// synchronized (lock)
// {
// try{
// lock.wait(10000);}
// catch (InterruptedException ex)
// {}
// }
// }
// // if not all languages set , set the rest. they are not existing,
// // so add them
// for (int i = numberOfChangedLanguages; i < 3; i++)
// {
// int newLang = newLanguages[numberOfChangedLanguages++];
//
// opSetServerStoredAccountInfo.addDetail(
// new ServerStoredDetails.SpokenLanguageDetail(
// spokenLanguages[newLang]));
//
// // give time to server to change things
// synchronized (lock)
// {
// try{
// lock.wait(10000);
// }
// catch (InterruptedException ex)
// {}
// }
// }
//
// // give time to server to change things
// synchronized (lock)
// {
// try
// {
// lock.wait(5000);
// }
// catch (InterruptedException ex)
// {}
// }
logger.trace("Finished Setting values!");
}
catch (ArrayIndexOutOfBoundsException ex)
{
throw new RuntimeException(
"Error setting detail! Max detail instances is reached!", ex);
}
catch (IllegalArgumentException ex)
{
throw new RuntimeException(
"Error setting detail! Detail max instances reached - cannot be set!", ex);
}
catch (OperationFailedException ex)
{
logger.error("", ex);
throw new RuntimeException(
"Error setting detail! Network Failure!", ex);
}
catch (ClassCastException ex)
{
throw new RuntimeException(
"Error setting detail! ", ex);
}
logger.trace("Proceeding to Testing values!");
// make the tests here
Hashtable<String, Object> userInfo = IcqSlickFixture.testerAgent.getUserInfo(fixture.ourUserID);
assertEquals("The LastName we set is not set or not read properly"
, newLastName
, userInfo.get(FullUserInfoCmd.LAST_NAME));
assertEquals("The PhoneNumber we set is not set or not read properly"
, newPhoneNumber
, userInfo.get(FullUserInfoCmd.PHONE_NUMBER));
List<?> languageCodes
= (ArrayList<?>) userInfo.get(FullUserInfoCmd.SPEAK_LANG);
ArrayList<Locale> languages = new ArrayList<Locale>();
// convert language codes to locales in the list
Iterator<?> languageCodeIter = languageCodes.iterator();
while (languageCodeIter.hasNext())
{
languages
.add(
spokenLanguages[
((Integer) languageCodeIter.next()).intValue()]);
}
// assertEquals("The number of spoken languages dowsn't match",
// newLanguages.length,
// languages.size());
//
// for (int i = 0; i < newLanguages.length; i++)
// {
// assertTrue("The Spoken Language we set is not set or " +
// "not read properly : " + newLanguages[i],
// languages.contains(spokenLanguages[newLanguages[i]]));
// }
assertEquals("The Country we set is not set or not read properly"
, new Integer(newCountryCode)
, userInfo.get(FullUserInfoCmd.HOME_COUNTRY));
}
/**
* Checking if the error handling works (all throw clauses in the methods)
* If max number of details is ok. Chacking of details classes.
*/
public void errorHandling()
{
Iterator<GenericDetail> iter =
opSetServerStoredAccountInfo.
getDetails(ServerStoredDetails.SpokenLanguageDetail.class);
ArrayList<GenericDetail> initialLanguages
= new ArrayList<GenericDetail>();
while (iter.hasNext())
initialLanguages.add(iter.next());
assertEquals("There must be 3 language details!", 3, initialLanguages.size());
try
{
opSetServerStoredAccountInfo.addDetail(new ServerStoredDetails.
SpokenLanguageDetail(null));
fail("As there is already reched the max instances of languages. Exception must be thrown");
}
catch (ArrayIndexOutOfBoundsException ex)
{}
catch (OperationFailedException ex)
{}
catch (IllegalArgumentException ex)
{}
DummyDetail dummyDetail = new DummyDetail();
try
{
assertFalse("This class is not supported!",
opSetServerStoredAccountInfo.isDetailClassSupported(dummyDetail.getClass()));
opSetServerStoredAccountInfo.addDetail(dummyDetail);
fail("As this class is not supperted. Exception must be thrown");
}
catch (ArrayIndexOutOfBoundsException ex)
{}
catch (OperationFailedException ex)
{}
catch (IllegalArgumentException ex)
{}
try
{
opSetServerStoredAccountInfo.replaceDetail(new ServerStoredDetails.
SpokenLanguageDetail(null),
dummyDetail);
fail("The parameters are from different classes. Exception must be thrown");
}
catch (OperationFailedException ex1)
{}
catch (ClassCastException ex1)
{}
}
/**
* Details used only for class checking when passing it to
* modification methods. As its not in the implementation
* ClassCastException must be thrown
*/
private class DummyDetail
extends ServerStoredDetails.NameDetail
{
DummyDetail()
{super("TestName", "mayName");}
}
/**
* Removing details from the account info operation set and checking
* if they are removed from the implementation and from the server.
* After removing detail - the next retreiving of the info updates all the
* details from the server
*/
public void removingItems()
{
Object lock = new Object();
try
{
Iterator<GenericDetail> iter =
opSetServerStoredAccountInfo.
getDetails(ServerStoredDetails.SpokenLanguageDetail.class);
List<GenericDetail> initialLanguages
= new ArrayList<GenericDetail>();
while (iter.hasNext())
initialLanguages.add(iter.next());
// now remove those languages
iter = initialLanguages.iterator();
while (iter.hasNext())
{
assertTrue(
"Error removing language!",
opSetServerStoredAccountInfo.removeDetail(iter.next()));
synchronized (lock)
{
try{
lock.wait(4000);
}
catch (InterruptedException ex)
{}
}
}
// give time to server
synchronized (lock){
try{
lock.wait(4000);
}
catch (InterruptedException ex)
{}
}
iter =
opSetServerStoredAccountInfo.
getDetails(ServerStoredDetails.SpokenLanguageDetail.class);
List<GenericDetail> languages = new ArrayList<GenericDetail>();
while (iter.hasNext())
languages.add(iter.next());
logger.trace("languages " + languages.size());
// there must be no languages after the last retrieve
assertEquals("There must be no language details!", 0, languages.size());
}
catch (OperationFailedException ex)
{
throw new RuntimeException(
"Error setting or retreiving detail! Network Failure!", ex);
}
}
// Indexes of countries as stored in the icq server
// and their corresponding locale strings
private static Object[][] countryIndexToLocaleString =
{
// {new Integer(0),""}, //not specified
{new Integer(1), "us"}, //USA
{new Integer(101), "ai"}, //Anguilla
{new Integer(102), "ag"}, //Antigua
{new Integer(1021), "ag"}, //Antigua & Barbuda
{new Integer(103), "bs"}, //Bahamas
{new Integer(104), "bb"}, //Barbados
{new Integer(105), "bm"}, //Bermuda
{new Integer(106), "vg"}, //British Virgin Islands
{new Integer(107), "ca"}, //Canada
{new Integer(108), "ky"}, //Cayman Islands
{new Integer(109), "dm"}, //Dominica
{new Integer(110), "do"}, //Dominican Republic
{new Integer(111), "gd"}, //Grenada
{new Integer(112), "jm"}, //Jamaica
{new Integer(113), "ms"}, //Montserrat
{new Integer(114), "kn"}, //Nevis
{new Integer(1141), "kn"}, //Saint Kitts and Nevis
{new Integer(115), "kn"}, //St. Kitts
{new Integer(116), "vc"}, //St. Vincent & the Grenadines
{new Integer(117), "tt"}, //Trinidad & Tobago
{new Integer(118), "tc"}, //Turks & Caicos Islands
{new Integer(120), "ag"}, //Barbuda
{new Integer(121), "pr"}, //Puerto Rico
{new Integer(122), "lc"}, //Saint Lucia
{new Integer(123), "vi"}, //Virgin Islands (USA)
{new Integer(178), "es"}, //Canary Islands ???
{new Integer(20), "eg"}, //Egypt
{new Integer(212), "ma"}, //Morocco
{new Integer(213), "dz"}, //Algeria
{new Integer(216), "tn"}, //Tunisia
{new Integer(218), "ly"}, //Libyan Arab Jamahiriya
{new Integer(220), "gm"}, //Gambia
{new Integer(221), "sn"}, //Senegal
{new Integer(222), "mr"}, //Mauritania
{new Integer(223), "ml"}, //Mali
{new Integer(224), "pg"}, //Guinea
{new Integer(225), "ci"}, //Cote d'Ivoire
{new Integer(226), "bf"}, //Burkina Faso
{new Integer(227), "ne"}, //Niger
{new Integer(228), "tg"}, //Togo
{new Integer(229), "bj"}, //Benin
{new Integer(230), "mu"}, //Mauritius
{new Integer(231), "lr"}, //Liberia
{new Integer(232), "sl"}, //Sierra Leone
{new Integer(233), "gh"}, //Ghana
{new Integer(234), "ng"}, //Nigeria
{new Integer(235), "td"}, //Chad
{new Integer(236), "cf"}, //Central African Republic
{new Integer(237), "cm"}, //Cameroon
{new Integer(238), "cv"}, //Cape Verde Islands
{new Integer(239), "st"}, //Sao Tome & Principe
{new Integer(240), "gq"}, //Equatorial Guinea
{new Integer(241), "ga"}, //Gabon
{new Integer(242), "cg"}, //Congo, (Rep. of the)
{new Integer(243), "cd"}, //Congo, Democratic Republic of
{new Integer(244), "ao"}, //Angola
{new Integer(245), "gw"}, //Guinea-Bissau
// {new Integer(246),""}, //Diego Garcia ???
// {new Integer(247),""}, //Ascension Island ???
{new Integer(248), "sc"}, //Seychelles
{new Integer(249), "sd"}, //Sudan
{new Integer(250), "rw"}, //Rwanda
{new Integer(251), "et"}, //Ethiopia
{new Integer(252), "so"}, //Somalia
{new Integer(253), "dj"}, //Djibouti
{new Integer(254), "ke"}, //Kenya
{new Integer(255), "tz"}, //Tanzania
{new Integer(256), "ug"}, //Uganda
{new Integer(257), "bi"}, //Burundi
{new Integer(258), "mz"}, //Mozambique
{new Integer(260), "zm"}, //Zambia
{new Integer(261), "mg"}, //Madagascar
// {new Integer(262),""}, //Reunion Island ???
{new Integer(263), "zw"}, //Zimbabwe
{new Integer(264), "na"}, //Namibia
{new Integer(265), "mw"}, //Malawi
{new Integer(266), "ls"}, //Lesotho
{new Integer(267), "bw"}, //Botswana
{new Integer(268), "sz"}, //Swaziland
{new Integer(269), "yt"}, //Mayotte Island
{new Integer(2691), "km"}, //Comoros
{new Integer(27), "za"}, //South Africa
{new Integer(290), "sh"}, //St. Helena
{new Integer(291), "er"}, //Eritrea
{new Integer(297), "aw"}, //Aruba
// {new Integer(298),""}, //Faeroe Islands ???
{new Integer(299), "gl"}, //Greenland
{new Integer(30), "gr"}, //Greece
{new Integer(31), "nl"}, //Netherlands
{new Integer(32), "be"}, //Belgium
{new Integer(33), "fr"}, //France
{new Integer(34), "es"}, //Spain
{new Integer(350), "gi"}, //Gibraltar
{new Integer(351), "pt"}, //Portugal
{new Integer(352), "lu"}, //Luxembourg
{new Integer(353), "ie"}, //Ireland
{new Integer(354), "is"}, //Iceland
{new Integer(355), "al"}, //Albania
{new Integer(356), "mt"}, //Malta
{new Integer(357), "cy"}, //Cyprus
{new Integer(358), "fi"}, //Finland
{new Integer(359), "bg"}, //Bulgaria
{new Integer(36), "hu"}, //Hungary
{new Integer(370), "lt"}, //Lithuania
{new Integer(371), "lv"}, //Latvia
{new Integer(372), "ee"}, //Estonia
{new Integer(373), "md"}, //Moldova, Republic of
{new Integer(374), "am"}, //Armenia
{new Integer(375), "by"}, //Belarus
{new Integer(376), "ad"}, //Andorra
{new Integer(377), "mc"}, //Monaco
{new Integer(378), "sm"}, //San Marino
{new Integer(379), "va"}, //Vatican City
{new Integer(380), "ua"}, //Ukraine
// {new Integer(381),""}, //Yugoslavia ???
{new Integer(3811), "cs"}, //Yugoslavia - Serbia
{new Integer(382), "cs"}, //Yugoslavia - Montenegro
{new Integer(385), "hr"}, //Croatia
{new Integer(386), "si"}, //Slovenia
{new Integer(387), "ba"}, //Bosnia & Herzegovina
{new Integer(389), "mk"}, //Macedonia (F.Y.R.O.M.)
{new Integer(39), "it"}, //Italy
{new Integer(40), "ro"}, //Romania
{new Integer(41), "ch"}, //Switzerland
{new Integer(4101), "li"}, //Liechtenstein
{new Integer(42), "cz"}, //Czech Republic
{new Integer(4201), "sk"}, //Slovakia
{new Integer(43), "at"}, //Austria
{new Integer(44), "gb"}, //United Kingdom
// {new Integer(441),""}, //Wales ???
// {new Integer(442),""}, //Scotland ???
{new Integer(45), "dk"}, //Denmark
{new Integer(46), "se"}, //Sweden
{new Integer(47), "no"}, //Norway
{new Integer(48), "pl"}, //Poland
{new Integer(49), "de"}, //Germany
// {new Integer(500),""}, //Falkland Islands ???
{new Integer(501), "bz"}, //Belize
{new Integer(502), "gt"}, //Guatemala
{new Integer(503), "sv"}, //El Salvador
{new Integer(504), "hn"}, //Honduras
{new Integer(505), "ni"}, //Nicaragua
{new Integer(506), "cr"}, //Costa Rica
{new Integer(507), "pa"}, //Panama
{new Integer(508), "pm"}, //St. Pierre & Miquelon
{new Integer(509), "ht"}, //Haiti
{new Integer(51), "pe"}, //Peru
{new Integer(52), "mx"}, //Mexico
{new Integer(53), "cu"}, //Cuba
{new Integer(54), "ar"}, //Argentina
{new Integer(55), "br"}, //Brazil
{new Integer(56), "cl"}, //Chile, Republic of
{new Integer(57), "co"}, //Colombia
{new Integer(58), "ve"}, //Venezuela
{new Integer(590), "gp"}, //Guadeloupe
{new Integer(5901), "an"}, //French Antilles
{new Integer(5902), "an"}, //Antilles
{new Integer(591), "bo"}, //Bolivia
{new Integer(592), "gy"}, //Guyana
{new Integer(593), "ec"}, //Ecuador
{new Integer(594), "gy"}, //French Guyana
{new Integer(595), "py"}, //Paraguay
{new Integer(596), "mq"}, //Martinique
{new Integer(597), "sr"}, //Suriname
{new Integer(598), "uy"}, //Uruguay
{new Integer(599), "an"}, //Netherlands Antilles
{new Integer(60), "my"}, //Malaysia
{new Integer(61), "au"}, //Australia
{new Integer(6101), "cc"}, //Cocos-Keeling Islands
{new Integer(6102), "cc"}, //Cocos (Keeling) Islands
{new Integer(62), "id"}, //Indonesia
{new Integer(63), "ph"}, //Philippines
{new Integer(64), "nz"}, //New Zealand
{new Integer(65), "sg"}, //Singapore
{new Integer(66), "th"}, //Thailand
// {new Integer(670),""}, //Saipan Island ???
// {new Integer(6701),""}, //Rota Island ???
// {new Integer(6702),""}, //Tinian Island ???
{new Integer(671), "gu"}, //Guam, US Territory of
{new Integer(672), "cx"}, //Christmas Island
{new Integer(6722), "nf"}, //Norfolk Island
{new Integer(673), "bn"}, //Brunei
{new Integer(674), "nr"}, //Nauru
{new Integer(675), "pg"}, //Papua New Guinea
{new Integer(676), "to"}, //Tonga
{new Integer(677), "sb"}, //Solomon Islands
{new Integer(678), "vu"}, //Vanuatu
{new Integer(679), "fj"}, //Fiji
{new Integer(680), "pw"}, //Palau
{new Integer(681), "wf"}, //Wallis & Futuna Islands
{new Integer(682), "ck"}, //Cook Islands
{new Integer(683), "nu"}, //Niue
{new Integer(684), "as"}, //American Samoa
{new Integer(685), "ws"}, //Western Samoa
{new Integer(686), "ki"}, //Kiribati
{new Integer(687), "nc"}, //New Caledonia
{new Integer(688), "tv"}, //Tuvalu
{new Integer(689), "pf"}, //French Polynesia
{new Integer(690), "tk"}, //Tokelau
{new Integer(691), "fm"}, //Micronesia, Federated States of
{new Integer(692), "mh"}, //Marshall Islands
{new Integer(7), "ru"}, //Russia
{new Integer(705), "kz"}, //Kazakhstan
{new Integer(706), "kg"}, //Kyrgyzstan
{new Integer(708), "tj"}, //Tajikistan
{new Integer(709), "tm"}, //Turkmenistan
{new Integer(711), "uz"}, //Uzbekistan
{new Integer(81), "jp"}, //Japan
{new Integer(82), "kr"}, //Korea, South
{new Integer(84), "vn"}, //Viet Nam
{new Integer(850), "kp"}, //Korea, North
{new Integer(852), "hk"}, //Hong Kong
{new Integer(853), "mo"}, //Macau
{new Integer(855), "kh"}, //Cambodia
{new Integer(856), "la"}, //Laos
{new Integer(86), "cn"}, //China
{new Integer(880), "bd"}, //Bangladesh
{new Integer(886), "tw"}, //Taiwan
{new Integer(90), "tr"}, //Turkey
{new Integer(91), "in"}, //India
{new Integer(92), "pk"}, //Pakistan
{new Integer(93), "af"}, //Afghanistan
{new Integer(94), "lk"}, //Sri Lanka
{new Integer(95), "mm"}, //Myanmar
{new Integer(960), "mv"}, //Maldives
{new Integer(961), "lb"}, //Lebanon
{new Integer(962), "jo"}, //Jordan
{new Integer(963), "sy"}, //Syrian Arab Republic
{new Integer(964), "iq"}, //Iraq
{new Integer(965), "kw"}, //Kuwait
{new Integer(966), "sa"}, //Saudi Arabia
{new Integer(967), "ye"}, //Yemen
{new Integer(968), "om"}, //Oman
{new Integer(971), "ae"}, //United Arabian Emirates
{new Integer(972), "il"}, //Israel
{new Integer(973), "bh"}, //Bahrain
{new Integer(974), "qa"}, //Qatar
{new Integer(975), "bt"}, //Bhutan
{new Integer(976), "mn"}, //Mongolia
{new Integer(977), "np"}, //Nepal
{new Integer(98), "ir"}, //Iran (Islamic Republic of)
{new Integer(994), "az"}, //Azerbaijan
{new Integer(995), "ge"} //Georgia
// {new Integer(9999),""}, //other
};
// the index in the array is the index stored in icq server
// the values are the corresponding locales
private static Locale spokenLanguages[] =
new Locale[]
{
null, // not specified
new Locale("ar"), // Arabic
new Locale("bh"), // LC_BHOJPURI Bhojpuri
new Locale("bg"), // LC_BULGARIAN Bulgarian
new Locale("my"), // LC_BURMESE Burmese
new Locale("zh", "hk"), // LC_CONTONESE Cantonese official in Hong Kong SAR and Macau SAR
new Locale("ca"), // LC_CATALAN Catalan
Locale.CHINA, // LC_CHINESE Chinese zh
new Locale("hr"), // LC_CROATIAN Croatian
new Locale("cs"), // LC_CZECH Czech
new Locale("da"), // LC_DANISH Danish
new Locale("nl"), // LC_DUTCH Dutch
new Locale("en"), // LC_ENGLISH English
new Locale("eo"), // LC_ESPERANTO Esperanto
new Locale("et"), // LC_ESTONIAN Estonian
new Locale("fa"), // LC_FARSI Farsi
new Locale("fi"), // LC_FINNISH Finnish
new Locale("fr"), // LC_FRENCH French
new Locale("gd"), // LC_GAELIC Gaelic
new Locale("de"), // LC_GERMAN German
new Locale("el"), // LC_GREEK Greek
new Locale("he"), // LC_HEBREW Hebrew
new Locale("hi"), // LC_HINDI Hindi
new Locale("hu"), // LC_HUNGARIAN Hungarian
new Locale("is"), // LC_ICELANDIC Icelandic
new Locale("id"), // LC_INDONESIAN Indonesian
new Locale("it"), // LC_ITALIAN Italian
new Locale("ja"), // LC_JAPANESE Japanese
new Locale("km"), // LC_KHMER Khmer
new Locale("ko"), // LC_KOREAN Korean
new Locale("lo"), // LC_LAO Lao
new Locale("lv"), // LC_LATVIAN Latvian
new Locale("lt"), // LC_LITHUANIAN Lithuanian
new Locale("ms"), // LC_MALAY Malay
new Locale("no"), // LC_NORWEGIAN Norwegian
new Locale("pl"), // LC_POLISH Polish
new Locale("pt"), // LC_PORTUGUESE Portuguese
new Locale("ro"), // LC_ROMANIAN Romanian
new Locale("ru"), // LC_RUSSIAN Russian
new Locale("sr"), // LC_SERBIAN Serbian
new Locale("sk"), // LC_SLOVAK Slovak
new Locale("sl"), // LC_SLOVENIAN Slovenian
new Locale("so"), // LC_SOMALI Somali
new Locale("es"), // LC_SPANISH Spanish
new Locale("sw"), // LC_SWAHILI Swahili
new Locale("sv"), // LC_SWEDISH Swedish
new Locale("tl"), // LC_TAGALOG Tagalog
new Locale("tt"), // LC_TATAR Tatar
new Locale("th"), // LC_THAI Thau
new Locale("tr"), // LC_TURKISH Turkish
new Locale("uk"), // LC_UKRAINIAN Ukarinian
new Locale("ur"), // LC_URDU Urdu
new Locale("vi"), // LC_VIETNAMESE Vietnamese
new Locale("yi"), // LC_YIDDISH Yiddish
new Locale("yo"), // LC_YORUBA Yoruba
new Locale("af"), // LC_AFRIKAANS Afriaans
new Locale("bs"), // LC_BOSNIAN Bosnian
new Locale("fa"), // LC_PERSIAN Persian
new Locale("sq"), // LC_ALBANIAN Albanian
new Locale("hy"), // LC_ARMENIAN Armenian
new Locale("pa"), // LC_PUNJABI Punjabi
new Locale("ch"), // LC_CHAMORRO Chamorro
new Locale("mn"), // LC_MONGOLIAN Mongolian
new Locale("zh"), // LC_MANDARIN Mandarin ???
Locale.TAIWAN, // LC_TAIWANESE Taiwanese ??? zh
new Locale("mk"), // LC_MACEDONIAN Macedonian
new Locale("sd"), // LC_SINDHI Sindhi
new Locale("cy"), // LC_WELSH Welsh
new Locale("az"), // LC_AZERBAIJANI Azerbaijani
new Locale("ku"), // LC_KURDISH Kurdish
new Locale("gu"), // LC_GUJARATI Gujarati
new Locale("ta"), // LC_TAMIL Tamil
new Locale("be"), // LC_BELORUSSIAN Belorussian
null // LC_OTHER 255 other
};
}