1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 29 // MARKER(update_precomp.py): autogen include statement, do not remove 30 #include "precompiled_sal.hxx" 31 #include <stdlib.h> 32 #include <rtl/ustring.hxx> 33 #include <rtl/strbuf.hxx> 34 #include <rtl/uri.hxx> 35 #include <osl/thread.h> 36 #include <osl/file.hxx> 37 38 #include <testshl/simpleheader.hxx> 39 40 // ----------------------------------------------------------------------------- 41 42 namespace Stringtest 43 { 44 rtl::OString toHex(unsigned char _c) 45 { 46 rtl::OStringBuffer sStrBuf; 47 static char cHex[] = "0123456789ABCDEF"; 48 49 int nhigh = int(_c) >> 4 & 0xf; 50 int nlow = int(_c) & 0xf; 51 sStrBuf.append( cHex[nhigh] ); 52 sStrBuf.append( cHex[nlow] ); 53 return sStrBuf.makeStringAndClear(); 54 } 55 56 rtl::OString escapeString(rtl::OString const& _sStr) 57 { 58 rtl::OStringBuffer sStrBuf; 59 sal_Int32 nLength = _sStr.getLength(); 60 for(int i=0;i<nLength;++i) 61 { 62 unsigned char c = (unsigned char)_sStr[i]; 63 if (c > 127) 64 { 65 sStrBuf.append("%"); 66 sStrBuf.append(toHex(c)); 67 } 68 else 69 { 70 sStrBuf.append((char)c); 71 } 72 } 73 return sStrBuf.makeStringAndClear(); 74 } 75 76 // ----------------------------------------------------------------------------- 77 78 class Convert : public CppUnit::TestFixture 79 { 80 rtl::OUString m_aStr; 81 public: 82 /* 83 rtl::OString toUTF8(rtl::OUString const& _suStr) 84 { 85 rtl::OString sStrAsUTF8 = rtl::OUStringToOString(_suStr, RTL_TEXTENCODING_UTF8); 86 t_print("%s\n", escapeString(sStrAsUTF8).getStr()); 87 return sStrAsUTF8; 88 } 89 */ 90 rtl::OUString fromUTF8(rtl::OString const& _suStr) 91 { 92 rtl::OUString suStr = rtl::OStringToOUString(_suStr, RTL_TEXTENCODING_UTF8); 93 return suStr; 94 } 95 96 rtl::OString convertToOString(rtl::OUString const& _suStr) 97 { 98 return rtl::OUStringToOString(_suStr, osl_getThreadTextEncoding()/*RTL_TEXTENCODING_ASCII_US*/); 99 } 100 101 void showContent(rtl::OUString const& _suStr) 102 { 103 rtl::OString sStr = convertToOString(_suStr); 104 t_print("%s\n", sStr.getStr()); 105 } 106 107 void toUTF8_mech(rtl::OUString const& _suStr, rtl_UriEncodeMechanism _eMechanism) 108 { 109 rtl::OUString suStr; 110 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassNone, _eMechanism, RTL_TEXTENCODING_UTF8); 111 showContent(suStr); 112 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUric, _eMechanism, RTL_TEXTENCODING_UTF8); 113 showContent(suStr); 114 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUricNoSlash, _eMechanism, RTL_TEXTENCODING_UTF8); 115 showContent(suStr); 116 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassRelSegment, _eMechanism, RTL_TEXTENCODING_UTF8); 117 showContent(suStr); 118 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassRegName, _eMechanism, RTL_TEXTENCODING_UTF8); 119 showContent(suStr); 120 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUserinfo, _eMechanism, RTL_TEXTENCODING_UTF8); 121 showContent(suStr); 122 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassPchar, _eMechanism, RTL_TEXTENCODING_UTF8); 123 showContent(suStr); 124 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUnoParamValue, _eMechanism, RTL_TEXTENCODING_UTF8); 125 showContent(suStr); 126 } 127 128 void toUTF8(rtl::OUString const& _suStr) 129 { 130 t_print("rtl_UriEncodeIgnoreEscapes \n"); 131 toUTF8_mech(_suStr, rtl_UriEncodeIgnoreEscapes); 132 t_print("\n"); 133 t_print("# rtl_UriEncodeKeepEscapes\n"); 134 toUTF8_mech(_suStr, rtl_UriEncodeKeepEscapes); 135 t_print("\n"); 136 t_print("# rtl_UriEncodeCheckEscapes\n"); 137 toUTF8_mech(_suStr, rtl_UriEncodeCheckEscapes); 138 t_print("\n"); 139 } 140 141 void test_FromUTF8_001() 142 { 143 // string --> ustring 144 rtl::OString sStrUTF8("h%C3%A4llo"); 145 rtl::OUString suStrUTF8 = rtl::OStringToOUString(sStrUTF8, RTL_TEXTENCODING_ASCII_US); 146 147 // UTF8 --> real ustring 148 rtl::OUString suStr_UriDecodeToIuri = rtl::Uri::decode(suStrUTF8, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8); 149 showContent(suStr_UriDecodeToIuri); 150 151 // string --> ustring 152 rtl::OString sStr("h\xE4llo"); 153 rtl::OUString suString = rtl::OStringToOUString(sStr, RTL_TEXTENCODING_ISO_8859_15); 154 155 CPPUNIT_ASSERT_MESSAGE("Strings must be equal", suString.equals(suStr_UriDecodeToIuri) == sal_True); 156 157 // ustring --> ustring (UTF8) 158 rtl::OUString suStr2 = rtl::Uri::encode(suStr_UriDecodeToIuri, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8); 159 showContent(suStr2); 160 161 CPPUNIT_ASSERT_MESSAGE("Strings must be equal", suStr2.equals(suStrUTF8) == sal_True); 162 // suStr should be equal to suStr2 163 } 164 165 // "%C3%84qypten"; 166 // testshl2 ../../../unxlngi4.pro/lib/libConvert.so "-onlyerrors" 167 // # Type: 'Directory' file name '%E6%89%8B%E6%9C%BA%E5%8F%B7%E7%A0%81' 168 // # Type: 'Directory' file name '%E6%9C%AA%E5%91%BD%E5%90%8Dzhgb18030' 169 // # Type: 'Regular file' file name '%E5%B7%A5%E4%BD%9C' 170 // # Type: 'Regular file' file name '%E4%BA%8C%E6%89%8B%E6%88%BF%E4%B9%B0%E5%8D%96%E5%90%88%E5%90%8C%E8%8D%89%E7%A8%BF.doc' 171 // ls 172 rtl::OString getFileTypeName(osl::FileStatus const& _aStatus) 173 { 174 rtl::OString sType; 175 if (_aStatus.isValid(osl_FileStatus_Mask_Type)) 176 { 177 osl::FileStatus::Type aType = _aStatus.getFileType(); 178 if (aType == osl::FileStatus::Directory) 179 { 180 sType = "Directory"; 181 } 182 else if (aType == osl::FileStatus::Regular) 183 { 184 sType = "Regular file"; 185 } 186 else if (aType == osl::FileStatus::Volume) 187 { 188 sType = "Volume"; 189 } 190 else if (aType == osl::FileStatus::Fifo) 191 { 192 sType = "Fifo"; 193 } 194 else if (aType == osl::FileStatus::Socket) 195 { 196 sType = "Socket"; 197 } 198 else if (aType == osl::FileStatus::Link) 199 { 200 sType = "Link"; 201 } 202 else if (aType == osl::FileStatus::Special) 203 { 204 sType = "Special"; 205 } 206 else if (aType == osl::FileStatus::Unknown) 207 { 208 sType = "Unknown"; 209 } 210 else 211 { 212 sType = "Not handled yet"; 213 } 214 } 215 else 216 { 217 sType = "ERROR: osl_FileStatus_Mask_Type not set for FileStatus!"; 218 } 219 return sType; 220 } 221 222 223 void test_UTF8_files() 224 { 225 #ifdef UNX 226 rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///tmp/atestdir")); 227 #else /* Windows */ 228 rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///c:/temp/atestdir")); 229 #endif 230 osl::Directory aDir(suDirURL); 231 aDir.open(); 232 if (aDir.isOpen()) 233 { 234 osl::DirectoryItem aItem; 235 osl::FileStatus aStatus(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes | osl_FileStatus_Mask_Type); 236 while (aDir.getNextItem(aItem) == ::osl::FileBase::E_None) 237 { 238 if (osl::FileBase::E_None == aItem.getFileStatus(aStatus) && 239 aStatus.isValid(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes)) 240 { 241 rtl::OString sType = getFileTypeName(aStatus); 242 243 rtl::OUString suFilename = aStatus.getFileName(); 244 // rtl::OUString suFullFileURL; 245 246 rtl::OUString suStrUTF8 = rtl::Uri::encode(suFilename, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8); 247 rtl::OString sStrUTF8 = convertToOString(suStrUTF8); 248 t_print("Type: '%s' file name '%s'\n", sType.getStr(), sStrUTF8.getStr()); 249 } 250 } 251 aDir.close(); 252 } 253 else 254 { 255 rtl::OString sStr; 256 sStr = rtl::OUStringToOString(suDirURL, osl_getThreadTextEncoding()); 257 t_print("can't open dir:'%s'\n", sStr.getStr()); 258 } 259 } 260 261 void test_FromUTF8() 262 { 263 rtl::OString sStr("h%C3%A4llo"); 264 rtl::OUString suStr = rtl::OStringToOUString(sStr, osl_getThreadTextEncoding()); 265 266 // rtl_UriEncodeIgnoreEscapes, 267 // rtl_UriEncodeKeepEscapes, 268 // rtl_UriEncodeCheckEscapes, 269 // rtl::OUString suStr2 = rtl::Uri::encode(suStr, rtl_UriCharClassRegName, rtl_UriEncodeCheckEscapes, RTL_TEXTENCODING_UTF8); 270 rtl::OUString suStr_UriDecodeNone = rtl::Uri::decode(suStr, rtl_UriDecodeNone, RTL_TEXTENCODING_UTF8); 271 showContent(suStr_UriDecodeNone); 272 toUTF8(suStr_UriDecodeNone); 273 274 rtl::OUString suStr_UriDecodeToIuri = rtl::Uri::decode(suStr, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8); 275 showContent(suStr_UriDecodeToIuri); 276 toUTF8(suStr_UriDecodeToIuri); 277 278 rtl::OUString suStr_UriDecodeWithCharset = rtl::Uri::decode(suStr, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8); 279 showContent(suStr_UriDecodeWithCharset); 280 toUTF8(suStr_UriDecodeWithCharset); 281 } 282 283 CPPUNIT_TEST_SUITE( Convert ); 284 CPPUNIT_TEST( test_FromUTF8_001 ); 285 // CPPUNIT_TEST( test_UTF8_files ); 286 // CPPUNIT_TEST( test_FromUTF8 ); 287 CPPUNIT_TEST_SUITE_END( ); 288 }; 289 290 } 291 292 293 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( Stringtest::Convert, "Stringtest" ); 294 295 // LLA: doku anpassen!!! 296 297 NOADDITIONAL; 298