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_WSTRING 00037 #define INCL_WSTRING 00038 /** @cond DEV */ 00039 00040 #include "base/util/ArrayElement.h" 00041 #include "base/globalsdef.h" 00042 00043 BEGIN_NAMESPACE 00044 00045 class ArrayList; 00046 class StringBuffer; 00047 00048 #define DEFAULT_DELIMITER (const WCHAR* )TEXT(" ") 00049 00050 /** 00051 * Awful implementation of a WString! 00052 */ 00053 class WString: public ArrayElement { 00054 public: 00055 // Constant value for an invalid pos (returned by find and rfind) 00056 static const size_t npos; 00057 00058 WString(const WCHAR* str = NULL, size_t len = npos); 00059 00060 WString(const WString &sb); 00061 00062 ~WString(); 00063 00064 WString& append(const WCHAR*); 00065 00066 WString& append(unsigned long u, bool sign = true); 00067 00068 WString& append(WString& s); 00069 00070 WString& append(WString* str); 00071 00072 WString& set(const WCHAR*); 00073 00074 /** 00075 * Release the string buffer. 00076 */ 00077 WString& reset(); 00078 00079 /** 00080 * Get the WCHAR array, same as the cast operator 00081 */ 00082 const WCHAR* getChars() const; 00083 inline const WCHAR* c_str() const { return s; }; 00084 00085 /** 00086 * Find the first occurrence of substring str. 00087 * 00088 * @return - the position or WString::npos if not found. 00089 */ 00090 size_t find(const WCHAR *str, size_t pos = 0) const; 00091 00092 /** 00093 * Find the first occurrence of substring str, using case insensitive compare. 00094 * 00095 * @return - the position or WString::npos if not found. 00096 */ 00097 size_t ifind(const WCHAR *str, size_t pos = 0) const; 00098 00099 /** 00100 * Replace the first occurrence of substring 'from' with string 'to'. 00101 * 00102 * @return - the position of the first token replaced or WString::npos if 00103 * not found. 00104 */ 00105 size_t replace(const WCHAR *from, const WCHAR *to, size_t pos = 0); 00106 /** 00107 * Replace all the occurrences of substring 'from' with string 'to'. 00108 * 00109 * @return - the number of tokens replaced 00110 */ 00111 int replaceAll(const WCHAR *from, const WCHAR *to, size_t pos = 0); 00112 00113 /** 00114 * Splits string on each occurrence of any of the characters in 00115 * delimiters. 00116 * 00117 * @return - the position or WString::npos if not found. 00118 */ 00119 ArrayList &split (ArrayList &tokens, 00120 const WCHAR *delimiters = DEFAULT_DELIMITER ) const; 00121 00122 /** 00123 * Joins all the tokens in the given ArrayList, using separator to 00124 * contatenate them, appending them to the WString 00125 * 00126 * @return - the WString 00127 */ 00128 WString& join(ArrayList &tokens, const WCHAR *separator); 00129 00130 /** 00131 * Return the substring between pos and pos+len. 00132 * If pos is greater then the string length, or len is 0, return an 00133 * empty string 00134 * If len is greater then the string length, the last is used. 00135 */ 00136 WString substr(size_t pos, size_t len = npos) const; 00137 00138 /** 00139 * Return the length of the string, or zero if the internal pointer 00140 * is NULL. 00141 */ 00142 unsigned long length() const; 00143 00144 /** 00145 * Reserve len amount of space for the string. 00146 */ 00147 void reserve(size_t len); 00148 00149 /** 00150 * Make the string upper case 00151 */ 00152 WString& upperCase() ; 00153 00154 /** 00155 * Make the string lower case 00156 */ 00157 WString& lowerCase() ; 00158 00159 /** 00160 * Perform case insensitive compare 00161 */ 00162 bool icmp(const WCHAR *sc) const ; 00163 00164 /** 00165 * True if the string is null or empty 00166 */ 00167 bool empty() const; 00168 00169 /** 00170 * True if the string is null 00171 */ 00172 bool null() const; 00173 00174 /** 00175 * Clone the string 00176 */ 00177 ArrayElement* clone() ; 00178 00179 /** 00180 * Class operators 00181 */ 00182 WString& operator= (const WCHAR* sc) ; 00183 WString& operator= (const WString& s) ; 00184 WString& operator= (const StringBuffer& s) ; 00185 WString& operator+= (const WCHAR* sc) ; 00186 WString& operator+= (const WString& s) ; 00187 WString& operator+= (const StringBuffer& s) ; 00188 bool operator== (const WCHAR* sc) const ; 00189 bool operator== (const WString& sb) const ; 00190 bool operator== (const StringBuffer& sb) const ; 00191 bool operator!= (const WCHAR* sc) const ; 00192 bool operator!= (const WString& s) const ; 00193 bool operator!= (const StringBuffer& sb) const ; 00194 00195 inline operator const WCHAR*() const { return s; } ; 00196 00197 private: 00198 WCHAR* s; 00199 size_t size; 00200 00201 // Allocator 00202 void getmem(size_t len); 00203 // Deallocator 00204 void freemem(); 00205 }; 00206 00207 WString operator+(const WString& x, const WCHAR *y); 00208 00209 00210 END_NAMESPACE 00211 00212 /** @endcond */ 00213 #endif 00214