Author: carnold
Date: Fri Feb 15 01:02:24 2008
New Revision: 627977

URL: http://svn.apache.org/viewvc?rev=627977&view=rev
Log:
LOGCXX-241: File rework for non-ascii path names

Modified:
    logging/log4cxx/trunk/src/main/cpp/file.cpp
    logging/log4cxx/trunk/src/main/cpp/transcoder.cpp
    logging/log4cxx/trunk/src/main/include/log4cxx/file.h
    logging/log4cxx/trunk/src/main/include/log4cxx/helpers/transcoder.h
    logging/log4cxx/trunk/src/test/cpp/logunit.cpp

Modified: logging/log4cxx/trunk/src/main/cpp/file.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/file.cpp?rev=627977&r1=627976&r2=627977&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/file.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/file.cpp Fri Feb 15 01:02:24 2008
@@ -31,67 +31,64 @@
 }
 
 template<class S> 
-static LogString decodeLS(const S& src) {
+static LogString decodeLS(const S* src) {
     LogString dst;
-    Transcoder::decode(src, dst);
+    if (src != 0) {
+       Transcoder::decode(src, dst);
+    }
     return dst;
 }
 
 template<class S> 
-static std::string decodeOS(const S& src) {
-    LogString ls;
-    std::string os;
-    Transcoder::decode(src, ls);
-    Transcoder::encode(ls, os);
-    return os;
+static LogString decodeLS(const std::basic_string<S>& src) {
+    LogString dst;
+    Transcoder::decode(src, dst);
+    return dst;
 }
 
 
 File::File(const std::string& name1)
-  : name(decodeLS(name1)), osName(decodeOS(name1)) {
+  : path(decodeLS(name1)) {
 }
 
 File::File(const char* name1)
-  : name(decodeLS(name1)), osName(decodeOS(name1)) {
+  : path(decodeLS(name1)) {
 }
 
 #if LOG4CXX_WCHAR_T_API
 File::File(const std::wstring& name1)
-   : name(decodeLS(name1)), osName(decodeOS(name1)) {
+   : path(decodeLS(name1)) {
 }
 
 File::File(const wchar_t* name1)
-   : name(decodeLS(name1)), osName(decodeOS(name1)) {
+   : path(decodeLS(name1)) {
 }
 #endif
 
 #if LOG4CXX_UNICHAR_API
 File::File(const std::basic_string<UniChar>& name1)
-   : name(decodeLS(name1)), osName(decodeOS(name1)) {
+   : path(decodeLS(name1)) {
 }
 
 File::File(const UniChar* name1)
-   : name(decodeLS(name1)), osName(decodeOS(name1)) {
+   : path(decodeLS(name1)) {
 }
 #endif
 
 #if LOG4CXX_CFSTRING_API
 File::File(const CFStringRef& name1)
-   : name(), osName() {
-  Transcoder::decode(name1, this->name);
-  Transcoder::encode(this->name, osName);
+   : path(name1) {
 }
 #endif
 
 File::File(const File& src)
-  : name(src.name), osName(src.osName) {
+  : path(src.path) {
 }
 
 File& File::operator=(const File& src) {
   if (this == &src) return *this;
 
-  name.assign(src.name);
-  osName.assign(src.osName);
+  path.assign(src.path);
 
   return *this;
 }
@@ -102,66 +99,68 @@
 
 
 LogString File::getPath() const {
-    return name;
+    return path;
 }
 
 File& File::setPath(const LogString& newName) {
-    name.assign(newName);
-    osName.erase();
-    Transcoder::encode(newName, osName);
+    path.assign(newName);
     return *this;
 }
 
 LogString File::getName() const {
-    return name;
+    const logchar slashes[] = { 0x2F, 0x5C, 0 };
+    size_t lastSlash = path.find_last_of(slashes);
+    if (lastSlash != LogString::npos) {
+        return path.substr(lastSlash+1);
+    }
+    return path;
 }
 
-std::string File::getOSName() const {
-    return osName;
+char* File::getPath(Pool& p) const {
+    apr_pool_t* pool = reinterpret_cast<apr_pool_t*>(p.getAPRPool());
+    int style = APR_FILEPATH_ENCODING_UNKNOWN;
+    apr_filepath_encoding(&style, pool);
+    char* retval = NULL;
+    if (style == APR_FILEPATH_ENCODING_UTF8) {
+        retval = Transcoder::encodeUTF8(path, p);
+    } else {
+        retval = Transcoder::encode(path, p);
+    }
+    return retval;
 }
 
 log4cxx_status_t File::open(apr_file_t** file, int flags,
       int perm, Pool& p) const {
-    //
-    //   The trunction to MBCS can corrupt filenames
-    //       would be nice to be able to do something about
-    //       it here since we have both Unicode
-    //          and local code page file names
-    //
-    return apr_file_open(file, osName.c_str(), flags, perm, (apr_pool_t*) 
p.getAPRPool());
+    return apr_file_open(file, getPath(p), flags, perm, (apr_pool_t*) 
p.getAPRPool());
 }
 
 
 
 bool File::exists(Pool& p) const {
   apr_finfo_t finfo;
-  apr_status_t rv = apr_stat(&finfo, osName.c_str(),
+  apr_status_t rv = apr_stat(&finfo, getPath(p),
         0, (apr_pool_t*) p.getAPRPool());
   return rv == APR_SUCCESS;
 }
 
-std::string File::convertBackSlashes(const std::string& src) {
-  std::string::size_type pos = src.find('\\');
-  if (pos == std::string::npos) {
-    return src;
-  }
-  std::string mod(src);
-  while(pos != std::string::npos) {
-    mod[pos] = '/';
-    pos = mod.find('\\');
+char* File::convertBackSlashes(char* src) {
+  for(char* c = src; *c != 0; c++) {
+       if(*c == '\\') {
+               *c = '/';
+       }
   }
-  return mod;
+  return src;
 }
 
 bool File::deleteFile(Pool& p) const {
-  apr_status_t rv = apr_file_remove(convertBackSlashes(osName).c_str(),
+  apr_status_t rv = apr_file_remove(convertBackSlashes(getPath(p)),
         (apr_pool_t*) p.getAPRPool());
   return rv == APR_SUCCESS;
 }
 
 bool File::renameTo(const File& dest, Pool& p) const {
-  apr_status_t rv = apr_file_rename(convertBackSlashes(osName).c_str(),
-        convertBackSlashes(dest.getOSName()).c_str(),
+  apr_status_t rv = apr_file_rename(convertBackSlashes(getPath(p)),
+        convertBackSlashes(dest.getPath(p)),
         (apr_pool_t*) p.getAPRPool());
   return rv == APR_SUCCESS;
 }
@@ -169,7 +168,7 @@
 
 size_t File::length(Pool& pool) const {
   apr_finfo_t finfo;
-  apr_status_t rv = apr_stat(&finfo, osName.c_str(),
+  apr_status_t rv = apr_stat(&finfo, getPath(pool),
         APR_FINFO_SIZE, (apr_pool_t*) pool.getAPRPool());
   if (rv == APR_SUCCESS) {
     return (size_t) finfo.size;
@@ -180,7 +179,7 @@
 
 log4cxx_time_t File::lastModified(Pool& pool) const {
   apr_finfo_t finfo;
-  apr_status_t rv = apr_stat(&finfo, osName.c_str(),
+  apr_status_t rv = apr_stat(&finfo, getPath(pool),
         APR_FINFO_MTIME, (apr_pool_t*) pool.getAPRPool());
   if (rv == APR_SUCCESS) {
     return finfo.mtime;
@@ -195,13 +194,20 @@
     std::vector<LogString> filenames;
 
     apr_status_t stat = apr_dir_open(&dir, 
-        convertBackSlashes(osName).c_str(), 
+        convertBackSlashes(getPath(p)), 
         (apr_pool_t*) p.getAPRPool());
     if(stat == APR_SUCCESS) {
+        int style = APR_FILEPATH_ENCODING_UNKNOWN;
+        apr_filepath_encoding(&style, (apr_pool_t*) p.getAPRPool());
         stat = apr_dir_read(&entry, APR_FINFO_DIRENT, dir);
         while(stat == APR_SUCCESS) {
             if (entry.name != NULL) {
-               LOG4CXX_DECODE_CHAR(filename, entry.name);
+               LogString filename;
+               if(style == APR_FILEPATH_ENCODING_UTF8) {
+                  Transcoder::encodeUTF8(entry.name, filename);
+               } else {
+                   Transcoder::encode(entry.name, filename);
+               }
                filenames.push_back(filename);
             }
             stat = apr_dir_read(&entry, APR_FINFO_DIRENT, dir);
@@ -212,8 +218,8 @@
 }
 
 LogString File::getParent(Pool&) const {
-     LogString::size_type slashPos = name.rfind(LOG4CXX_STR('/'));
-     LogString::size_type backPos = name.rfind(LOG4CXX_STR('\\'));
+     LogString::size_type slashPos = path.rfind(LOG4CXX_STR('/'));
+     LogString::size_type backPos = path.rfind(LOG4CXX_STR('\\'));
      if (slashPos == LogString::npos) {
          slashPos = backPos;
      } else {
@@ -223,13 +229,13 @@
      }
      LogString parent;
      if (slashPos != LogString::npos && slashPos > 0) {
-          parent.assign(name, 0, slashPos);
+          parent.assign(path, 0, slashPos);
      }
      return parent;
 }
 
 bool File::mkdirs(Pool& p) const {
-     apr_status_t stat = 
apr_dir_make_recursive(convertBackSlashes(osName).c_str(),
+     apr_status_t stat = apr_dir_make_recursive(convertBackSlashes(getPath(p)),
           APR_OS_DEFAULT, (apr_pool_t*) p.getAPRPool());
      return stat == APR_SUCCESS;
 }

Modified: logging/log4cxx/trunk/src/main/cpp/transcoder.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/transcoder.cpp?rev=627977&r1=627976&r2=627977&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/transcoder.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/transcoder.cpp Fri Feb 15 01:02:24 2008
@@ -71,6 +71,17 @@
 #endif     
 }
 
+char* Transcoder::encodeUTF8(const LogString& src, Pool& p) {
+#if LOG4CXX_LOGCHAR_IS_UTF8
+     return apr_pstrndup(reinterpret_cast<apr_pool_t*>(p.getAPRPool()), 
src.data(), src.length());
+#else
+     std::string tmp;
+     encodeUTF8(src, tmp);
+     return apr_pstrndup(reinterpret_cast<apr_pool_t*>(p.getAPRPool()), 
tmp.data(), tmp.length());
+#endif     
+}
+
+
 void Transcoder::encodeUTF8(unsigned int sv, ByteBuffer& dst) {
     size_t bytes = encodeUTF8(sv, dst.current());
     dst.position(dst.position() + bytes);

Modified: logging/log4cxx/trunk/src/main/include/log4cxx/file.h
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/file.h?rev=627977&r1=627976&r2=627977&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/file.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/file.h Fri Feb 15 01:02:24 
2008
@@ -76,10 +76,9 @@
                     bool mkdirs(log4cxx::helpers::Pool& p) const;
 
                 private:
-                    LogString name;
-                    std::string osName;
-                    static std::string convertBackSlashes(const std::string& 
src);
-                    std::string getOSName() const;
+                    LogString path;
+                    static char* convertBackSlashes(char*);
+                    char* getPath(log4cxx::helpers::Pool& p) const;
                 };
 } // namespace log4cxx
 

Modified: logging/log4cxx/trunk/src/main/include/log4cxx/helpers/transcoder.h
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/helpers/transcoder.h?rev=627977&r1=627976&r2=627977&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/helpers/transcoder.h 
(original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/helpers/transcoder.h Fri Feb 
15 01:02:24 2008
@@ -49,6 +49,10 @@
        */
       static void encodeUTF8(const LogString& src, std::string& dst);
       /**
+       *    Converts the LogString to a UTF-8 string.
+       */
+      static char* encodeUTF8(const LogString& src, log4cxx::helpers::Pool& p);
+      /**
        *    Append UCS-4 code point to a byte buffer as UTF-8.
        */
       static void encodeUTF8(unsigned int sv, ByteBuffer& dst);

Modified: logging/log4cxx/trunk/src/test/cpp/logunit.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/test/cpp/logunit.cpp?rev=627977&r1=627976&r2=627977&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/test/cpp/logunit.cpp (original)
+++ logging/log4cxx/trunk/src/test/cpp/logunit.cpp Fri Feb 15 01:02:24 2008
@@ -25,7 +25,8 @@
 #include <stdlib.h>
 
 void initialize() {
-    const char* ctype = setlocale(LC_CTYPE, "");
+    setlocale(LC_CTYPE, "");
+    const char* ctype = setlocale(LC_CTYPE, 0);
     if (ctype == 0) {
         puts("LC_CTYPE: NULL");
     } else {


Reply via email to