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 BEGIN_NAMESPACE
00053 
00054 /*
00055  * Deletes the given char* [] buffer if it is not NULL
00056  * and sets the pointer to NULL
00057  *
00058  */
00059 void safeDelete(char*  p[]);
00060 
00061 void safeDel(char** p);
00062 
00069 void timestampToAnchor(unsigned long timestamp, char anchor[21]);
00070 
00074 unsigned long anchorToTimestamp(const char* anchor);
00075 
00076 char* stringdup(const char* s, size_t len = STRINGDUP_NOLEN) ;
00077 WCHAR* wstrdup(const WCHAR* s, size_t len = STRINGDUP_NOLEN);
00078 
00079 char*  strtolower(const char *s);
00080 
00081 char*  wcstoupper(const char *s);
00082 
00086 const char *brfind(const char *s1, const char *s2, size_t len=STRINGDUP_NOLEN) ;
00087 
00091 inline bool isEmpty(const char*  s) {
00092     return ((s == NULL) || (strlen(s) == 0));
00093 }
00094 
00098 inline bool isNotEmpty(const char*  s) {
00099     return (s && (strlen(s) > 0));
00100 }
00101 
00102 
00103 /*
00104 * compare two char array ignoring the case of the char
00105 */
00106 bool wcscmpIgnoreCase(const char*  p, const char*  q);
00107 
00108 /*
00109 * Converts a integer into a char*
00110 */
00111 char*  itow(int i);
00112 
00113 /*
00114 * Converts a integer into a char*
00115 */
00116 char*  ltow(long i);
00117 
00118 
00119 /*
00120 * Method to create the cred data given the username, password and nonce
00121 * It uses the calculateMD5 to calculate the MD5 using the alghoritm.
00122 */
00123 char*  MD5CredentialData(const char* userName, const char* password, const char* nonce);
00124 
00125 /*
00126 * Calculates the digest given the token and its lenght
00127 */
00128 char* calculateMD5(const void* token, int len, char* wdigest);
00129 
00130 /*
00131  * Return a filename composed by the system temp dir and the name given
00132  * in input. If the file exists, try to add a digit 0-9.
00133  * If this fails too, return NULL (there's must be something wrong in
00134  * the calling program)
00135  *
00136  * @param name - a file name, without path
00137  * @return - a full pathname, allocated with new[], or NULL on error
00138  */
00139 char *mkTempFileName(const char *name);
00140 
00141 /*
00142  * Write len bytes from buffer to the file 'filename'.
00143  *
00144  * @param name - the file name
00145  * @param buffer - pointer to the buffer to write
00146  * @param len - the number of bytes to write
00147  * @param binary - if true the file will be opened in binary mode
00148  *
00149  * @return - true if file is successfully saved
00150  */
00151 bool saveFile(const char *filename, const char *buffer, size_t len,
00152               bool binary = false );
00153 
00154 /*
00155  * Get the size of the file, in bytes
00156  *
00157  * @param f - the file to evaluate
00158  * @return - the length of the file
00159  */
00160 size_t fgetsize(FILE *f);
00161 
00168 bool fileExists(const char *pathname);
00169 
00170 /*
00171  * Read the content
00172  *
00173  * @param name - the file name
00174  * @param message (out) - new allocated buffer with the file content
00175  * @param len - length of the read content
00176  * @param binary - if true the file has to be opened in binary mode
00177  *
00178  * @return - true if file is succesfully read
00179  */
00180 bool readFile(const char* name, char **message, size_t *len, bool binary = false );
00181 
00191 char** readDir(char* name, int *count, bool onlyCount = false);
00192 
00201 bool removeFileInDir(const char* dir, const char* filename = NULL);
00202 
00208 unsigned long getFileModTime(const char* name);
00209 
00216 int createFolder(const char *path);
00217 
00218 long int getLenEncoding(const char*  s, const char* encoding);
00219 char *toMultibyte(const WCHAR *wc, const char *encoding = 0 );
00220 WCHAR *toWideChar(const char *mb, const char *encoding = 0 );
00221 
00222 
00223 // Wide Char Convert: inline function used to convert a wchar
00224 // in char, using a static buffer to store the converted string.
00225 //
00226 // BEWARE: the string is deleted and re-used at each call.
00227 inline const char *_wcc(const WCHAR *wc, const char *enc=0) {
00228     static char* encodeBuf = 0;
00229 
00230     if (encodeBuf){
00231         delete [] encodeBuf;
00232         encodeBuf = 0;
00233     }
00234     if (wc) {
00235         encodeBuf = toMultibyte(wc, enc);
00236     }
00237     return encodeBuf;
00238 }
00239 
00248 inline long calculateCRC(const void *s, size_t len) {
00249     
00250     if (len <= 0) {
00251         return 0;
00252     }
00253     static const unsigned long s_arrdwCrc32Table1[256] =
00254     {
00255         0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
00256         0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
00257         0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
00258         0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
00259         0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
00260         0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
00261         0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
00262         0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
00263         0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
00264         0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
00265         0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
00266         0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
00267         0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
00268         0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
00269         0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
00270         0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
00271 
00272         0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
00273         0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
00274         0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
00275         0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
00276         0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
00277         0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
00278         0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
00279         0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
00280         0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
00281         0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
00282         0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
00283         0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
00284         0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
00285         0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
00286         0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
00287         0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
00288 
00289         0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
00290         0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
00291         0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
00292         0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
00293         0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
00294         0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
00295         0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
00296         0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
00297         0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
00298         0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
00299         0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
00300         0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
00301         0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
00302         0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
00303         0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
00304         0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
00305 
00306         0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
00307         0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
00308         0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
00309         0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
00310         0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
00311         0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
00312         0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
00313         0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
00314         0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
00315         0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
00316         0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
00317         0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
00318         0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
00319         0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
00320         0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
00321         0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
00322     };
00323         
00324     unsigned long dwCrc32 = 0;
00325 
00326     unsigned char byte = 0;
00327 
00328     dwCrc32 = 0xFFFFFFFF;
00329 
00330     size_t i = 0;
00331     unsigned char* p = (unsigned char*) s;
00332 
00333     while (i < len) {
00334         byte = p[i];
00335         dwCrc32 = ((dwCrc32) >> 8) ^ s_arrdwCrc32Table1[(byte) ^ ((dwCrc32) & 0x000000FF)];        
00336         i++;
00337 
00338     }    
00339     dwCrc32 = ~dwCrc32;
00340     return dwCrc32;
00341 }
00342 
00348 inline long calculateCRC(const char* s) {
00349     
00350     return calculateCRC(s, strlen(s));
00351 }
00352 
00353 END_NAMESPACE
00354 
00356 #endif

Generated on Wed Jan 14 17:15:36 2009 for Funambol C++ Client Library by  doxygen 1.5.2