src/include/common/base/util/utils.h

00001 /*
00002  * Funambol is a mobile platform developed by Funambol, Inc. 
00003  * Copyright (C) 2003 - 2007 Funambol, Inc.
00004  * 
00005  * This program is free software; you can redistribute it and/or modify it under
00006  * the terms of the GNU Affero General Public License version 3 as published by
00007  * the Free Software Foundation with the addition of the following permission 
00008  * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
00009  * WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE 
00010  * WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.
00011  * 
00012  * This program is distributed in the hope that it will be useful, but WITHOUT
00013  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00014  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
00015  * details.
00016  * 
00017  * You should have received a copy of the GNU Affero General Public License 
00018  * along with this program; if not, see http://www.gnu.org/licenses or write to
00019  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
00020  * MA 02110-1301 USA.
00021  * 
00022  * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite 
00023  * 305, Redwood City, CA 94063, USA, or at email address info@funambol.com.
00024  * 
00025  * The interactive user interfaces in modified source and object code versions
00026  * of this program must display Appropriate Legal Notices, as required under
00027  * Section 5 of the GNU Affero General Public License version 3.
00028  * 
00029  * In accordance with Section 7(b) of the GNU Affero General Public License
00030  * version 3, these Appropriate Legal Notices must retain the display of the
00031  * "Powered by Funambol" logo. If the display of the logo is not reasonably 
00032  * feasible for technical reasons, the Appropriate Legal Notices must display
00033  * the words "Powered by Funambol".
00034  */
00035 
00036 #ifndef INCL_BASE_UTILS
00037 #define INCL_BASE_UTILS
00038 
00040 #include "base/globalsdef.h"
00041 #include "base/fscapi.h"
00042 #include "base/util/ArrayList.h"
00043 #include "base/md5.h"
00044 #include "base/base64.h"
00045 
00046 // Default len for stringdup (means: use source string len)
00047 #define STRINGDUP_NOLEN 0xFFFFFFFF
00048 
00049 #define B64_ENCODING        "b64"
00050 #define TEXT_PLAIN_ENCODING "text/plain"
00051 
00052 // the name of the repository
00053 #define CACHE_REP       "funambol_cache"
00054 
00055 BEGIN_NAMESPACE
00056 
00057 /*
00058  * Deletes the given char* [] buffer if it is not NULL
00059  * and sets the pointer to NULL
00060  *
00061  */
00062 void safeDelete(char*  p[]);
00063 
00064 void safeDel(char** p);
00065 
00072 void timestampToAnchor(unsigned long timestamp, char anchor[21]);
00073 
00077 unsigned long anchorToTimestamp(const char* anchor);
00078 
00079 char* stringdup(const char* s, size_t len = STRINGDUP_NOLEN) ;
00080 WCHAR* wstrdup(const WCHAR* s, size_t len = STRINGDUP_NOLEN);
00081 
00082 char*  strtolower(const char *s);
00083 
00084 char*  wcstoupper(const char *s);
00085 
00089 const char *brfind(const char *s1, const char *s2, size_t len=STRINGDUP_NOLEN) ;
00090 
00094 inline bool isEmpty(const char*  s) {
00095     return ((s == NULL) || (strlen(s) == 0));
00096 }
00097 
00101 inline bool isNotEmpty(const char*  s) {
00102     return (s && (strlen(s) > 0));
00103 }
00104 
00105 
00106 /*
00107 * compare two char array ignoring the case of the char
00108 */
00109 bool wcscmpIgnoreCase(const char*  p, const char*  q);
00110 
00111 /*
00112 * Converts a integer into a char*
00113 */
00114 char*  itow(int i);
00115 
00116 /*
00117 * Converts a integer into a char*
00118 */
00119 char*  ltow(long i);
00120 
00121 
00122 /*
00123 * Method to create the cred data given the username, password and nonce
00124 * It uses the calculateMD5 to calculate the MD5 using the alghoritm.
00125 */
00126 char*  MD5CredentialData(const char* userName, const char* password, const char* nonce);
00127 
00128 /*
00129 * Calculates the digest given the token and its lenght
00130 */
00131 char* calculateMD5(const void* token, int len, char* wdigest);
00132 
00133 /*
00134  * Return a filename composed by the system temp dir and the name given
00135  * in input. If the file exists, try to add a digit 0-9.
00136  * If this fails too, return NULL (there's must be something wrong in
00137  * the calling program)
00138  *
00139  * @param name - a file name, without path
00140  * @return - a full pathname, allocated with new[], or NULL on error
00141  */
00142 char *mkTempFileName(const char *name);
00143 
00144 /*
00145  * Write len bytes from buffer to the file 'filename'.
00146  *
00147  * @param name - the file name
00148  * @param buffer - pointer to the buffer to write
00149  * @param len - the number of bytes to write
00150  * @param binary - if true the file will be opened in binary mode
00151  *
00152  * @return - true if file is successfully saved
00153  */
00154 bool saveFile(const char *filename, const char *buffer, size_t len,
00155               bool binary = false );
00156 
00157 /*
00158  * Get the size of the file, in bytes
00159  *
00160  * @param f - the file to evaluate
00161  * @return - the length of the file
00162  */
00163 size_t fgetsize(FILE *f);
00164 
00165 /*
00166  * Read the content
00167  *
00168  * @param name - the file name
00169  * @param message (out) - new allocated buffer with the file content
00170  * @param len - length of the read content
00171  * @param binary - if true the file has to be opened in binary mode
00172  *
00173  * @return - true if file is succesfully read
00174  */
00175 bool readFile(const char* name, char **message, size_t *len, bool binary = false );
00176 
00186 char** readDir(char* name, int *count, bool onlyCount = false);
00187 
00196 bool removeFileInDir(const char* dir, const char* filename = NULL);
00197 
00203 unsigned long getFileModTime(const char* name);
00204 
00209 StringBuffer getCacheDirectory();
00210 
00211 long int getLenEncoding(const char*  s, const char* encoding);
00212 char *toMultibyte(const WCHAR *wc, const char *encoding = 0 );
00213 WCHAR *toWideChar(const char *mb, const char *encoding = 0 );
00214 
00215 
00216 // Wide Char Convert: inline function used to convert a wchar
00217 // in char, using a static buffer to store the converted string.
00218 //
00219 // BEWARE: the string is deleted and re-used at each call.
00220 inline const char *_wcc(const WCHAR *wc, const char *enc=0) {
00221     static char* encodeBuf = 0;
00222 
00223     if (encodeBuf){
00224         delete [] encodeBuf;
00225         encodeBuf = 0;
00226     }
00227     if (wc) {
00228         encodeBuf = toMultibyte(wc, enc);
00229     }
00230     return encodeBuf;
00231 }
00232 
00241 inline long calculateCRC(const void *s, size_t len) {
00242     
00243     if (len <= 0) {
00244         return 0;
00245     }
00246     static const unsigned long s_arrdwCrc32Table1[256] =
00247     {
00248         0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
00249         0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
00250         0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
00251         0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
00252         0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
00253         0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
00254         0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
00255         0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
00256         0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
00257         0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
00258         0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
00259         0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
00260         0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
00261         0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
00262         0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
00263         0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
00264 
00265         0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
00266         0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
00267         0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
00268         0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
00269         0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
00270         0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
00271         0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
00272         0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
00273         0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
00274         0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
00275         0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
00276         0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
00277         0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
00278         0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
00279         0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
00280         0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
00281 
00282         0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
00283         0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
00284         0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
00285         0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
00286         0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
00287         0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
00288         0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
00289         0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
00290         0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
00291         0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
00292         0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
00293         0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
00294         0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
00295         0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
00296         0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
00297         0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
00298 
00299         0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
00300         0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
00301         0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
00302         0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
00303         0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
00304         0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
00305         0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
00306         0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
00307         0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
00308         0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
00309         0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
00310         0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
00311         0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
00312         0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
00313         0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
00314         0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
00315     };
00316         
00317     unsigned long dwCrc32 = 0;
00318 
00319     unsigned char byte = 0;
00320 
00321     dwCrc32 = 0xFFFFFFFF;
00322 
00323     size_t i = 0;
00324     unsigned char* p = (unsigned char*) s;
00325 
00326     while (i < len) {
00327         byte = p[i];
00328         dwCrc32 = ((dwCrc32) >> 8) ^ s_arrdwCrc32Table1[(byte) ^ ((dwCrc32) & 0x000000FF)];        
00329         i++;
00330 
00331     }    
00332     dwCrc32 = ~dwCrc32;
00333     return dwCrc32;
00334 }
00335 
00341 inline long calculateCRC(const char* s) {
00342     
00343     return calculateCRC(s, strlen(s));
00344 }
00345 
00346 END_NAMESPACE
00347 
00349 #endif

Generated on Fri Jul 25 15:04:15 2008 for Funambol C++ Client Library by  doxygen 1.5.1