1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 25 // MARKER(update_precomp.py): autogen include statement, do not remove 26 #include "precompiled_sal.hxx" 27 #include <stdlib.h> 28 #include <rtl/ustring.hxx> 29 #include <rtl/strbuf.hxx> 30 #include <rtl/uri.hxx> 31 #include <osl/thread.h> 32 #include <osl/file.hxx> 33 34 #include "gtest/gtest.h" 35 36 // ----------------------------------------------------------------------------- 37 38 namespace Stringtest 39 { 40 rtl::OString toHex(unsigned char _c) 41 { 42 rtl::OStringBuffer sStrBuf; 43 static char cHex[] = "0123456789ABCDEF"; 44 45 int nhigh = int(_c) >> 4 & 0xf; 46 int nlow = int(_c) & 0xf; 47 sStrBuf.append( cHex[nhigh] ); 48 sStrBuf.append( cHex[nlow] ); 49 return sStrBuf.makeStringAndClear(); 50 } 51 52 rtl::OString escapeString(rtl::OString const& _sStr) 53 { 54 rtl::OStringBuffer sStrBuf; 55 sal_Int32 nLength = _sStr.getLength(); 56 for(int i=0;i<nLength;++i) 57 { 58 unsigned char c = (unsigned char)_sStr[i]; 59 if (c > 127) 60 { 61 sStrBuf.append("%"); 62 sStrBuf.append(toHex(c)); 63 } 64 else 65 { 66 sStrBuf.append((char)c); 67 } 68 } 69 return sStrBuf.makeStringAndClear(); 70 } 71 72 // ----------------------------------------------------------------------------- 73 74 class Convert : public ::testing::Test 75 { 76 protected: 77 rtl::OUString m_aStr; 78 public: 79 /* 80 rtl::OString toUTF8(rtl::OUString const& _suStr) 81 { 82 rtl::OString sStrAsUTF8 = rtl::OUStringToOString(_suStr, RTL_TEXTENCODING_UTF8); 83 printf("%s\n", escapeString(sStrAsUTF8).getStr()); 84 return sStrAsUTF8; 85 } 86 */ 87 rtl::OUString fromUTF8(rtl::OString const& _suStr) 88 { 89 rtl::OUString suStr = rtl::OStringToOUString(_suStr, RTL_TEXTENCODING_UTF8); 90 return suStr; 91 } 92 93 rtl::OString convertToOString(rtl::OUString const& _suStr) 94 { 95 return rtl::OUStringToOString(_suStr, osl_getThreadTextEncoding()/*RTL_TEXTENCODING_ASCII_US*/); 96 } 97 98 void showContent(rtl::OUString const& _suStr) 99 { 100 rtl::OString sStr = convertToOString(_suStr); 101 printf("%s\n", sStr.getStr()); 102 } 103 104 void toUTF8_mech(rtl::OUString const& _suStr, rtl_UriEncodeMechanism _eMechanism) 105 { 106 rtl::OUString suStr; 107 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassNone, _eMechanism, RTL_TEXTENCODING_UTF8); 108 showContent(suStr); 109 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUric, _eMechanism, RTL_TEXTENCODING_UTF8); 110 showContent(suStr); 111 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUricNoSlash, _eMechanism, RTL_TEXTENCODING_UTF8); 112 showContent(suStr); 113 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassRelSegment, _eMechanism, RTL_TEXTENCODING_UTF8); 114 showContent(suStr); 115 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassRegName, _eMechanism, RTL_TEXTENCODING_UTF8); 116 showContent(suStr); 117 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUserinfo, _eMechanism, RTL_TEXTENCODING_UTF8); 118 showContent(suStr); 119 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassPchar, _eMechanism, RTL_TEXTENCODING_UTF8); 120 showContent(suStr); 121 suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUnoParamValue, _eMechanism, RTL_TEXTENCODING_UTF8); 122 showContent(suStr); 123 } 124 125 void toUTF8(rtl::OUString const& _suStr) 126 { 127 printf("rtl_UriEncodeIgnoreEscapes \n"); 128 toUTF8_mech(_suStr, rtl_UriEncodeIgnoreEscapes); 129 printf("\n"); 130 printf("# rtl_UriEncodeKeepEscapes\n"); 131 toUTF8_mech(_suStr, rtl_UriEncodeKeepEscapes); 132 printf("\n"); 133 printf("# rtl_UriEncodeCheckEscapes\n"); 134 toUTF8_mech(_suStr, rtl_UriEncodeCheckEscapes); 135 printf("\n"); 136 } 137 138 // "%C3%84qypten"; 139 // testshl2 ../../../unxlngi4.pro/lib/libConvert.so "-onlyerrors" 140 // # Type: 'Directory' file name '%E6%89%8B%E6%9C%BA%E5%8F%B7%E7%A0%81' 141 // # Type: 'Directory' file name '%E6%9C%AA%E5%91%BD%E5%90%8Dzhgb18030' 142 // # Type: 'Regular file' file name '%E5%B7%A5%E4%BD%9C' 143 // # 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' 144 // ls 145 rtl::OString getFileTypeName(osl::FileStatus const& _aStatus) 146 { 147 rtl::OString sType; 148 if (_aStatus.isValid(osl_FileStatus_Mask_Type)) 149 { 150 osl::FileStatus::Type aType = _aStatus.getFileType(); 151 if (aType == osl::FileStatus::Directory) 152 { 153 sType = "Directory"; 154 } 155 else if (aType == osl::FileStatus::Regular) 156 { 157 sType = "Regular file"; 158 } 159 else if (aType == osl::FileStatus::Volume) 160 { 161 sType = "Volume"; 162 } 163 else if (aType == osl::FileStatus::Fifo) 164 { 165 sType = "Fifo"; 166 } 167 else if (aType == osl::FileStatus::Socket) 168 { 169 sType = "Socket"; 170 } 171 else if (aType == osl::FileStatus::Link) 172 { 173 sType = "Link"; 174 } 175 else if (aType == osl::FileStatus::Special) 176 { 177 sType = "Special"; 178 } 179 else if (aType == osl::FileStatus::Unknown) 180 { 181 sType = "Unknown"; 182 } 183 else 184 { 185 sType = "Not handled yet"; 186 } 187 } 188 else 189 { 190 sType = "ERROR: osl_FileStatus_Mask_Type not set for FileStatus!"; 191 } 192 return sType; 193 } 194 }; 195 196 TEST_F(Convert, test_FromUTF8_001) 197 { 198 // string --> ustring 199 rtl::OString sStrUTF8("h%C3%A4llo"); 200 rtl::OUString suStrUTF8 = rtl::OStringToOUString(sStrUTF8, RTL_TEXTENCODING_ASCII_US); 201 202 // UTF8 --> real ustring 203 rtl::OUString suStr_UriDecodeToIuri = rtl::Uri::decode(suStrUTF8, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8); 204 showContent(suStr_UriDecodeToIuri); 205 206 // string --> ustring 207 rtl::OString sStr("h\xE4llo"); 208 rtl::OUString suString = rtl::OStringToOUString(sStr, RTL_TEXTENCODING_ISO_8859_15); 209 210 ASSERT_TRUE(suString.equals(suStr_UriDecodeToIuri) == sal_True) << "Strings must be equal"; 211 212 // ustring --> ustring (UTF8) 213 rtl::OUString suStr2 = rtl::Uri::encode(suStr_UriDecodeToIuri, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8); 214 showContent(suStr2); 215 216 ASSERT_TRUE(suStr2.equals(suStrUTF8) == sal_True) << "Strings must be equal"; 217 // suStr should be equal to suStr2 218 } 219 220 // These tests were commented out in the pre-gtest code: 221 // TEST_F(Convert, test_UTF8_files) 222 // { 223 //#ifdef UNX 224 // rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///tmp/atestdir")); 225 //#else /* Windows */ 226 // rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///c:/temp/atestdir")); 227 //#endif 228 // osl::Directory aDir(suDirURL); 229 // aDir.open(); 230 // if (aDir.isOpen()) 231 // { 232 // osl::DirectoryItem aItem; 233 // osl::FileStatus aStatus(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes | osl_FileStatus_Mask_Type); 234 // while (aDir.getNextItem(aItem) == ::osl::FileBase::E_None) 235 // { 236 // if (osl::FileBase::E_None == aItem.getFileStatus(aStatus) && 237 // aStatus.isValid(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes)) 238 // { 239 // rtl::OString sType = getFileTypeName(aStatus); 240 // 241 // rtl::OUString suFilename = aStatus.getFileName(); 242 // // rtl::OUString suFullFileURL; 243 // 244 // rtl::OUString suStrUTF8 = rtl::Uri::encode(suFilename, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8); 245 // rtl::OString sStrUTF8 = convertToOString(suStrUTF8); 246 // printf("Type: '%s' file name '%s'\n", sType.getStr(), sStrUTF8.getStr()); 247 // } 248 // } 249 // aDir.close(); 250 // } 251 // else 252 // { 253 // rtl::OString sStr; 254 // sStr = rtl::OUStringToOString(suDirURL, osl_getThreadTextEncoding()); 255 // printf("can't open dir:'%s'\n", sStr.getStr()); 256 // } 257 // } 258 // 259 // TEST_F(Convert, test_FromUTF8) 260 // { 261 // rtl::OString sStr("h%C3%A4llo"); 262 // rtl::OUString suStr = rtl::OStringToOUString(sStr, osl_getThreadTextEncoding()); 263 // 264 //// rtl_UriEncodeIgnoreEscapes, 265 //// rtl_UriEncodeKeepEscapes, 266 //// rtl_UriEncodeCheckEscapes, 267 //// rtl::OUString suStr2 = rtl::Uri::encode(suStr, rtl_UriCharClassRegName, rtl_UriEncodeCheckEscapes, RTL_TEXTENCODING_UTF8); 268 // rtl::OUString suStr_UriDecodeNone = rtl::Uri::decode(suStr, rtl_UriDecodeNone, RTL_TEXTENCODING_UTF8); 269 // showContent(suStr_UriDecodeNone); 270 // toUTF8(suStr_UriDecodeNone); 271 // 272 // rtl::OUString suStr_UriDecodeToIuri = rtl::Uri::decode(suStr, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8); 273 // showContent(suStr_UriDecodeToIuri); 274 // toUTF8(suStr_UriDecodeToIuri); 275 // 276 // rtl::OUString suStr_UriDecodeWithCharset = rtl::Uri::decode(suStr, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8); 277 // showContent(suStr_UriDecodeWithCharset); 278 // toUTF8(suStr_UriDecodeWithCharset); 279 // } 280 } 281 282 int main(int argc, char **argv) 283 { 284 ::testing::InitGoogleTest(&argc, argv); 285 return RUN_ALL_TESTS(); 286 } 287