diff plugins/icq/util.c @ 1152:201ec77f3a60

[gaim-migrate @ 1162] icq. whoop de doo committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Tue, 28 Nov 2000 02:22:42 +0000
parents
children 0a766047b4fd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/icq/util.c	Tue Nov 28 02:22:42 2000 +0000
@@ -0,0 +1,541 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+$Id: util.c 1162 2000-11-28 02:22:42Z warmenhoven $
+$Log$
+Revision 1.1  2000/11/28 02:22:42  warmenhoven
+icq. whoop de doo
+
+Revision 1.32  2000/07/22 16:49:32  denis
+Trinidad and Tobago country was added.
+
+Revision 1.31  2000/07/21 16:51:20  denis
+All languages, possible in original icq were added.
+Occupation array fixed.
+
+Revision 1.30  2000/07/20 09:58:59  denis
+Occupation table corrected to comply with original ICQ.
+
+Revision 1.29  2000/07/04 07:25:29  pcadach
+icq_FmtLog() crashed when it receives NULL at link argument.
+
+Revision 1.28  2000/06/30 13:59:43  denis
+Slovak Republic country code fixed.
+
+Revision 1.27  2000/06/25 17:00:32  denis
+icq_MetaOccupation[], icq_MetaPastBackgrounds[],
+icq_MetaAffiliations[] and icq_MetaLanguages[] arrays were added along
+with icq_GetMetaOccupationName(), icq_GetMetaBackgroundName(),
+icq_GetMetaAffiliationName() and icq_GetMetaLanguageName() functions
+to access them.
+
+Revision 1.26  2000/05/21 17:42:51  denis
+Bulgaria country code was added. Thanks to
+"Napalm Death" <napalmbox@hotmail.com>
+
+Revision 1.25  2000/05/03 18:29:15  denis
+Callbacks have been moved to the ICQLINK structure.
+
+Revision 1.24  2000/04/10 16:36:04  denis
+Some more Win32 compatibility from Guillaume Rosanis <grs@mail.com>
+
+Revision 1.23  2000/04/05 14:37:02  denis
+Applied patch from "Guillaume R." <grs@mail.com> for basic Win32
+compatibility.
+
+Revision 1.22  2000/03/31 12:49:15  nofate
+remove static variable
+
+Revision 1.21  1999/11/11 15:10:33  guruz
+- Added Base for Webpager Messages. Please type "make fixme"
+- Removed Segfault when kicq is started the first time
+
+Revision 1.20  1999/10/07 18:01:40  denis
+Cleanups.
+
+Revision 1.19  1999/09/29 17:16:45  denis
+Cleanups.
+
+Revision 1.18  1999/07/18 20:24:27  bills
+removed old byte order and contact list functions
+
+Revision 1.17  1999/07/16 15:46:03  denis
+Cleaned up.
+
+Revision 1.16  1999/07/16 12:04:49  denis
+Status support changed.
+
+Revision 1.15  1999/07/12 15:13:46  cproch
+- added definition of ICQLINK to hold session-specific global variabled
+  applications which have more than one connection are now possible
+- changed nearly every function defintion to support ICQLINK parameter
+
+Revision 1.14  1999/04/17 19:20:35  bills
+removed *_link entries from icq_ContactItem, including cleanup/init code
+
+Revision 1.13  1999/04/14 15:06:51  denis
+Cleanups for "strict" compiling (-ansi -pedantic)
+
+*/
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#include "icqtypes.h"
+#include "icq.h"
+#include "icqlib.h"
+#include "stdpackets.h"
+#include "util.h"
+#include "stdarg.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},
+};
+
+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(ICQLINK *link, int level, const char *fmt, ...)
+{
+  char buffer[2048];
+  va_list ap;
+  va_start(ap, fmt);
+  
+  if(!link)
+    return;
+#ifdef _MSVC_
+  _vsnprintf(buffer, 1024, fmt, ap);
+#else
+  (void)vsnprintf(buffer, 1024, fmt, ap);
+#endif
+  va_end(ap);
+
+  if(link->icq_Log && icq_LogLevel>=level)
+    (*link->icq_Log)(link, 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";
+}