Mercurial > pidgin.yaz
diff src/protocols/icq/util.c @ 2086:424a40f12a6c
[gaim-migrate @ 2096]
moving protocols from plugins/ to src/protocols. making it so that you can select which protocols are compiled statically.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Tue, 31 Jul 2001 01:00:39 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/protocols/icq/util.c Tue Jul 31 01:00:39 2001 +0000 @@ -0,0 +1,513 @@ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + +/* + * $Id: util.c 2096 2001-07-31 01:00:39Z warmenhoven $ + * + * Copyright (C) 1998-2001, Denis V. Dmitrienko <denis@null.net> and + * Bill Soudan <soudan@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include <stdlib.h> +#include <ctype.h> + +#include "icqlib.h" +#include "stdpackets.h" + +/* + * This list of countries should be sorted according to country code. + * When adding new country, please preserve the order! + */ +icq_ArrayType icq_Countries[] = { + {"USA",1}, + {"Russia",7}, + {"Egypt",20}, + {"South Africa",27}, + {"Greece",30}, + {"Netherlands",31}, + {"Belgium",32}, + {"France",33}, + {"Monaco",33}, + {"Spain",34}, + {"Hungary",36}, + {"Yugoslavia",38}, + {"Italy",39}, + {"San Marino",39}, + {"Vatican City",39}, + {"Romania",40}, + {"Liechtenstein",41}, + {"Switzerland",41}, + {"Czech Republic",42}, + {"Austria",43}, + {"UK",44}, + {"Denmark",45}, + {"Sweden",46}, + {"Norway",47}, + {"Poland",48}, + {"Germany",49}, + {"Peru",51}, + {"Mexico",52}, + {"Guantanomo Bay",53}, + {"Argentina",54}, + {"Brazil",55}, + {"Chile",56}, + {"Columbia",57}, + {"Venezuela",58}, + {"Malaysia",60}, + {"Australia",61}, + {"Indonesia",62}, + {"Philippines",63}, + {"New Zealand",64}, + {"Singapore",65}, + {"Thailand",66}, + {"Japan",81}, + {"South Korea",82}, + {"Vietnam",84}, + {"China",86}, + {"Turkey",90}, + {"India",91}, + {"Pakistan",92}, + {"Sri Lanka",94}, + {"Iran",98}, + {"Canada",107}, + {"Morocco",212}, + {"Algeria",213}, + {"Tunisia",216}, + {"Libya",218}, + {"Senegal",221}, + {"Mali",223}, + {"Ivory Coast",225}, + {"Liberia",231}, + {"Ghana",233}, + {"Nigeria",234}, + {"Cameroon",237}, + {"Gabon",241}, + {"Zaire",243}, + {"Ethiopia",251}, + {"Kenya",254}, + {"Tanzania",255}, + {"Zimbabwe",263}, + {"Namibia",264}, + {"Malawi",265}, + {"Aruba",297}, + {"Portugal",351}, + {"Luxembourg",352}, + {"Ireland",353}, + {"Iceland",354}, + {"Malta",356}, + {"Cyprus",357}, + {"Finland",358}, + {"Bulgaria",359}, + {"Ukraine",380}, + {"Belize",501}, + {"Guatemala",502}, + {"El Salvador",503}, + {"Honduras",504}, + {"Nicaragua",505}, + {"Costa Rice",506}, + {"Panama",507}, + {"Haiti",509}, + {"Guadeloupe",590}, + {"Bolivia",591}, + {"Guyana",592}, + {"Ecuador",593}, + {"Paraguay",595}, + {"French Antilles",596}, + {"Suriname",597}, + {"Uruguay",598}, + {"Netherlands Antilles",599}, + {"Saipan",670}, + {"Saipan",670}, + {"Guam",671}, + {"Papua New Guinea",675}, + {"Fiji",679}, + {"American Samoa",684}, + {"New Caledonia",687}, + {"French Polynesia",689}, + {"Hong Kong",852}, + {"Trinidad and Tobago",868}, + {"Bangladesh",880}, + {"Taiwan",886}, + {"Jordan",962}, + {"Iraq",964}, + {"Kuwait",965}, + {"Saudia Arabia",966}, + {"Yemen",967}, + {"Oman",968}, + {"United Arab Emirates",971}, + {"Israel",972}, + {"Bahrain",973}, + {"Qatar",974}, + {"Nepal",977}, + {"Slovak Republic",4201}, + {"Not entered",0xffff}, +}; + +icq_ArrayType icq_MetaOccupation[] = { + {"Academic", 1}, + {"Administrative", 2}, + {"Art/Entertainment", 3}, + {"College Student", 4}, + {"Computers", 5}, + {"Community & Social", 6}, + {"Education", 7}, + {"Engineering", 8}, + {"Financial Services", 9}, + {"Government", 10}, + {"High School Student", 11}, + {"Home", 12}, + {"ICQ - Providing Help", 13}, + {"Law", 14}, + {"Managerial", 15}, + {"Manufacturing", 16}, + {"Medical/Health", 17}, + {"Military", 18}, + {"Non-Government Organization", 19}, + {"Professional", 20}, + {"Retail", 21}, + {"Retired", 22}, + {"Science & Research", 23}, + {"Sports", 24}, + {"Technical", 25}, + {"University Student", 26}, + {"Web Building", 27}, + {"Other Services", 99}, +}; + +icq_ArrayType icq_MetaPastBackgrounds[] = { + {"Elementary School", 300}, + {"High School", 301}, + {"College", 302}, + {"University", 303}, + {"Military", 304}, + {"Past Work Place", 305}, + {"Past Organization", 306}, + {"Other", 399}, +}; + +icq_ArrayType icq_MetaAffiliations[] = { + {"Alumni Org.", 200}, + {"Charity Org.", 201}, + {"Club/Social Org.", 202}, + {"Community Org.", 203}, + {"Cultural Org.", 204}, + {"Fan Clubs", 205}, + {"Fraternity/Sorority", 206}, + {"Hobbyists Org.", 207}, + {"International Org.", 208}, + {"Nature and Environment Org.", 209}, + {"Professional Org.", 210}, + {"Scientific/Technical Org.", 211}, + {"Self Improvement Group", 212}, + {"Spiritual/Religious Org.", 213}, + {"Sports Org.", 214}, + {"Support Org.", 215}, + {"Trade and Business Org.", 216}, + {"Union", 217}, + {"Voluntary Org.", 218}, + {"Other", 299}, +}; + +icq_ArrayType icq_MetaLanguages[] = { + {"Not Entered", 0}, + {"Arabic", 1}, + {"Bhojpuri", 2}, + {"Bulgarian", 3}, + {"Burmese", 4}, + {"Cantonese", 5}, + {"Catalan", 6}, + {"Chinese", 7}, + {"Croatian", 8}, + {"Czech", 9}, + {"Danish", 10}, + {"Dutch", 11}, + {"English", 12}, + {"Esperanto", 13}, + {"Estonian", 14}, + {"Farsi", 15}, + {"Finnish", 16}, + {"French", 17}, + {"Gaelic", 18}, + {"German", 19}, + {"Greek", 20}, + {"Hebrew", 21}, + {"Hindi", 22}, + {"Hungarian", 23}, + {"Icelandic", 24}, + {"Indonesian", 25}, + {"Italian", 26}, + {"Japanese", 27}, + {"Khmer", 28}, + {"Korean", 29}, + {"Lao", 30}, + {"Latvian", 31}, + {"Lithuanian", 32}, + {"Malay", 33}, + {"Norwegian", 34}, + {"Polish", 35}, + {"Portuguese", 36}, + {"Romanian", 37}, + {"Russian", 38}, + {"Serbian", 39}, + {"Slovak", 40}, + {"Slovenian", 41}, + {"Somali", 42}, + {"Spanish", 43}, + {"Swahili", 44}, + {"Swedish", 45}, + {"Tagalog", 46}, + {"Tatar", 47}, + {"Thai", 48}, + {"Turkish", 49}, + {"Ukrainian", 50}, + {"Urdu", 51}, + {"Vietnamese", 52}, + {"Yiddish", 53}, + {"Yoruba", 54}, + {"Afrikaans", 55}, + {"Bosnian", 56}, + {"Persian", 57}, + {"Albanian", 58}, + {"Armenian", 59}, + {"Punjabi", 60}, + {"Chamorro", 61}, + {"Mongolian", 62}, + {"Mandarin", 63}, + {"Taiwaness", 64}, + {"Macedonian", 65}, + {"Sindhi", 66}, + {"Welsh", 67}, +}; + +icq_ArrayType icq_Genders[] = { + {"Not Specified", 0}, + {"Female", 1}, + {"Male", 2}, +}; + +void hex_dump(char *data, long size) +{ + long i; + long x; + int r=1; + char d[32]; + unsigned char bfr[64]; + for(i=0, x=0;;i++) + { + if(i<size) + { + if(x==0) + printf("%04lx: ", i); +#ifdef _WIN32 + sprintf(d, "%08x", data[i]); +#else + snprintf(d, 9, "%08x", data[i]); +#endif + printf("%c%c ", d[6], d[7]); + bfr[x]=data[i]; + if(bfr[x]<0x20) + bfr[x]='.'; + if(bfr[x]>0x7f) + bfr[x]='.'; + } + else + { + if(x==0) + break; + else + { + printf(" "); + bfr[x]=' '; + r=0; + } + } + x++; + if(!(x<16)) + { + bfr[x]=0; + printf("%s\n", bfr); + x=0; + if(!r) + break; + } + } +} + +/* simple mapping for udp status->tcp status translation function */ +struct icq_TCPStatusRec +{ + unsigned long udp_status; + long tcp_status; +} icq_TCPStatusMap[] = { + { STATUS_OFFLINE , 0 }, + { STATUS_ONLINE , ICQ_TCP_STATUS_ONLINE }, + { STATUS_INVISIBLE , ICQ_TCP_STATUS_INVISIBLE }, + { STATUS_NA , ICQ_TCP_STATUS_NA }, + { STATUS_FREE_CHAT , ICQ_TCP_STATUS_FREE_CHAT }, + { STATUS_OCCUPIED , ICQ_TCP_STATUS_OCCUPIED }, + { STATUS_AWAY , ICQ_TCP_STATUS_AWAY }, + { STATUS_DND , ICQ_TCP_STATUS_DND }, +}; + +long icq_TCPXlateStatus(unsigned long udp_status) +{ + unsigned int i; + for(i=0;i<sizeof(icq_TCPStatusMap)/sizeof(struct icq_TCPStatusRec);i++) + if(icq_TCPStatusMap[i].udp_status==udp_status) + return icq_TCPStatusMap[i].tcp_status; + /* warning: "couldn't find tcp status for %d, assuming 0", udp_status */ + return 0; +} + +void icq_FmtLog(icq_Link *icqlink, int level, const char *fmt, ...) +{ + char buffer[2048]; + va_list ap; + va_start(ap, fmt); + + if(!icqlink) + return; +#ifdef _MSVC_ + _vsnprintf(buffer, 1024, fmt, ap); +#else + (void)vsnprintf(buffer, 1024, fmt, ap); +#endif + va_end(ap); + + if(icqlink->icq_Log && icq_LogLevel>=level) + (*icqlink->icq_Log)(icqlink, time(0L), level, buffer); +} + +/** + * Following functions used by qsort and bsearch to + * compare 2 pointers to icq_ArrayType object. + */ +int array_code_compare(const void *x, const void *y) +{ + return ((icq_ArrayType*)x)->code - ((icq_ArrayType*)y)->code; +} + +const char *icq_GetCountryName(unsigned short code) +{ + icq_ArrayType *res,key; + + key.code=code; + res=bsearch(&key, icq_Countries, sizeof(icq_Countries)/sizeof(icq_ArrayType), + sizeof(icq_ArrayType), array_code_compare); + + return res?res->name:"Unknown"; +} + +const char *icq_GetMetaOccupationName(unsigned short code) +{ + icq_ArrayType *res,key; + + key.code=code; + res=bsearch(&key, icq_MetaOccupation, sizeof(icq_MetaOccupation)/sizeof(icq_ArrayType), + sizeof(icq_ArrayType), array_code_compare); + + return res?res->name:"Unknown"; +} + +const char *icq_GetMetaBackgroundName(unsigned short code) +{ + icq_ArrayType *res,key; + + key.code=code; + res=bsearch(&key, icq_MetaPastBackgrounds, sizeof(icq_MetaPastBackgrounds)/sizeof(icq_ArrayType), + sizeof(icq_ArrayType), array_code_compare); + + return res?res->name:"Unknown"; +} + +const char *icq_GetMetaAffiliationName(unsigned short code) +{ + icq_ArrayType *res,key; + + key.code=code; + res=bsearch(&key, icq_MetaAffiliations, sizeof(icq_MetaAffiliations)/sizeof(icq_ArrayType), + sizeof(icq_ArrayType), array_code_compare); + + return res?res->name:"Unknown"; +} + +const char *icq_GetMetaLanguageName(unsigned short code) +{ + icq_ArrayType *res,key; + + key.code=code; + res=bsearch(&key, icq_MetaLanguages, sizeof(icq_MetaLanguages)/sizeof(icq_ArrayType), + sizeof(icq_ArrayType), array_code_compare); + + return res?res->name:"Unknown"; +} + +/******************************************** +returns a string describing the status or +a "Error" if no such string exists +*********************************************/ +const char *icq_ConvertStatus2Str(unsigned long status) +{ + if((unsigned long)STATUS_OFFLINE == status) /* this because -1 & 0x01FF is not -1 */ + return "Offline"; + + if((status & STATUS_INVISIBLE) == STATUS_INVISIBLE) + return "Invisible"; + else if((status & STATUS_FREE_CHAT) == STATUS_FREE_CHAT) + return "Free for chat"; + else if((status & STATUS_DND) == STATUS_DND) + return "Do not disturb"; + else if((status & STATUS_OCCUPIED) == STATUS_OCCUPIED) + return "Occupied"; + else if((status & STATUS_NA) == STATUS_NA) + return "Not available"; + else if((status & STATUS_AWAY) == STATUS_AWAY) + return "Away"; + else if(!(status & 0x01FF)) + return "Online"; + else + return "Error"; +} + +int icq_SplitFields(icq_List *strList, const char *str) +{ + char *tmpBuf, *tmp, *ptr; + int count = 0; + + tmpBuf = (char*)malloc(strlen(str)+1); + strcpy(tmpBuf, str); + ptr = tmpBuf; + + while(ptr) + { + char *p; + tmp = strchr(ptr, 0xFE); + if(tmp != 0L) + { + *tmp = 0; + tmp++; + } + count++; + p = (char *)malloc(strlen(ptr)+1); + strcpy(p, ptr); + icq_ListEnqueue(strList, p); + ptr = tmp; + } + + free(tmpBuf); + return count; +}