[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:29921] smbfs in kioslave



本多です

KDEのsmbでfile名が正しく扱えるようにするpatchです。

# gnomeのほうはお任せして(追従できそうもない)、私はKDEが使えるように多少貢献したいと思います。

条件: smb.confで unix charsetがlocaleと同等に設定されている事(通常の設定ですね)

制約: host name, user nameが8bitsを使用していない事(手抜き。urlのこの部分を構成しなおす
のが面倒なのではしょりました。必要な方はpath nameと同様ですから挑戦してください)

patch: 
*1つは kdelibs のkio/kio以下の2 files(kremoteencoding.cppとkioslave.cpp).
これは以前投稿したものですが、
kioslave.cppの方はlocale関連はなくなりSIGPOLLの patchだけ残しています。
このSIGPOLL patchはもう必要ないのかもしれませんが試していません。
kremoteencoding.cppは必須です。
*もう1つは kdebase-runtimeのkioslave/smb以下の2filesです。

1) KDELIBS (kio/kio)
-----------------------------------------------------------------------------------
*** kremoteencoding.cpp.old	2009-07-15 14:39:50.000000000 +0900
--- kremoteencoding.cpp	2009-06-05 15:28:55.000000000 +0900
***************
*** 28,34 ****
--- 28,38 ----
  {
    public:
      KRemoteEncodingPrivate()
+ #ifdef	ORIGINAL_CODE
        : m_codec(0)
+ #else
+       : m_codec(QTextCodec::codecForLocale())
+ #endif
      {
      }
  
***************
*** 105,111 ****
--- 109,119 ----
      d->m_codec = QTextCodec::codecForName(name);
  
    if (d->m_codec == 0)
+ #ifdef	ORIGINAL_CODE
      d->m_codec = QTextCodec::codecForMib( 106 ); // fallback to UTF-8
+ #else
+     d->m_codec = QTextCodec::codecForLocale();
+ #endif
  
    if (d->m_codec == 0)
      d->m_codec = QTextCodec::codecForMib(4 /* latin-1 */);
*** slavebase.cpp.old	2009-07-15 14:40:33.000000000 +0900
--- slavebase.cpp	2009-07-14 21:26:49.000000000 +0900
***************
*** 62,67 ****
--- 62,70 ----
  extern "C" {
      static void sigsegv_handler(int sig);
      static void sigpipe_handler(int sig);
+ #ifndef	ORIGINAL_CODE
+     static void sigpoll_handler(int sig);
+ #endif
  }
  
  using namespace KIO;
***************
*** 185,191 ****
--- 188,198 ----
          KDE_signal(SIGALRM,&sigsegv_handler);
          KDE_signal(SIGFPE,&sigsegv_handler);
  #ifdef SIGPOLL
+ #ifdef	ORIGINAL_CODE
          KDE_signal(SIGPOLL, &sigsegv_handler);
+ #else
+         KDE_signal(SIGPOLL, &sigpoll_handler);
+ #endif
  #endif
  #ifdef SIGSYS
          KDE_signal(SIGSYS, &sigsegv_handler);
***************
*** 720,725 ****
--- 727,742 ----
      d->sentListEntries+=(uint)list.count();
  }
  
+ #ifndef	ORIGINAL_CODE
+ static void sigpoll_handler(int sig)
+ {
+     // char buffer[120];
+ 
+     // qsnprintf(buffer, sizeof(buffer), "kioslave: sigpoll called\n");
+     // write(2, buffer, strlen(buffer));
+     sigignore(SIGPOLL);
+ }
+ #endif
  static void sigsegv_handler(int sig)
  {
  #ifdef Q_OS_UNIX
----------------------------------------------------------------------------------------

2) KDEBASE-RUNTIME (kioslave/smb)

----------------------------------------------------------------------------------------
*** kio_smb_browse.cpp.old	2009-07-15 14:37:43.000000000 +0900
--- kio_smb_browse.cpp	2009-07-15 02:12:19.000000000 +0900
***************
*** 39,44 ****
--- 39,47 ----
  
  #include "kio_smb.h"
  #include "kio_smb_internal.h"
+ #ifndef	ORIGINAL_CODE
+ #include <kremoteencoding.h>
+ #endif
  
  using namespace KIO;
  
***************
*** 330,339 ****
--- 333,350 ----
  
             // Set name
             QString udsName;
+ #ifdef	ORIGINAL_CODE
             QString dirpName = QString::fromUtf8( dirp->name );
+ #else
+            QString dirpName = remoteEncoding()->decode(dirp->name);
+ #endif
             // We cannot trust dirp->commentlen has it might be with or 
without the NUL character
             // See KDE bug #111430 and Samba bug #3030
+ #ifdef	ORIGINAL_CODE
             QString comment = QString::fromUtf8( dirp->comment );
+ #else
+            QString comment = remoteEncoding()->decode(dirp->comment);
+ #endif
             if ( dirp->smbc_type == SMBC_SERVER || dirp->smbc_type == 
SMBC_WORKGROUP ) {
                 udsName = dirpName.toLower();
                 udsName[0] = dirpName.at( 0 ).toUpper();
*** kio_smb_internal.cpp.old	2009-07-15 14:38:03.000000000 +0900
--- kio_smb_internal.cpp	2009-07-15 14:27:04.000000000 +0900
***************
*** 84,91 ****
      if ( KUrl::url() == "smb:/" )
        m_surl = "smb://";
      else
        m_surl = KUrl::url( RemoveTrailingSlash ).toUtf8();
! 
      m_type = SMBURLTYPE_UNKNOWN;
      // update m_type
      (void)getType();
--- 84,123 ----
      if ( KUrl::url() == "smb:/" )
        m_surl = "smb://";
      else
+ #ifdef	ORIGINAL_CODE
        m_surl = KUrl::url( RemoveTrailingSlash ).toUtf8();
! #else
!     {
! 	// QTextStream out(stdout);
!         m_surl = KUrl::url( RemoveTrailingSlash ).toUtf8();
!         QString encoded_string = QString::fromUtf8(m_surl);
! 	// out << "start XXX = " << encoded_string << "\n";
! 
! 	encoded_string.remove(0,6);
! 
! 	QString s_host, s_path, s_data;
! 	int pos = encoded_string.indexOf("/");
! 	if (pos < 0)
! 		s_path = encoded_string;
! 	else
! 	{
! 		s_host = encoded_string.mid(0, pos);
! 		s_path = encoded_string.mid(pos);
! 	}
! 
! 	QStringList c_list = s_path.split("#");
! 	s_data = 
QString::fromUtf8(QByteArray::fromPercentEncoding(c_list[0].toUtf8()));
! 	// FIX ME: It's desireble to use remoteEncoding().encode() as a converter 
below. 
! 	// However, for this, We need to modify a large portion of codes. Hence 
! 	// toLocal8Bit() is used in a short time.
!         c_list[0] = 
QString::fromUtf8(s_data.toLocal8Bit().toPercentEncoding("/"));
! 
!         m_surl = "smb://";
! 	m_surl.append(s_host.toUtf8());
!         m_surl.append(c_list.join("#").toUtf8());
! 	// out << "encoded = " << m_surl << "\n";
!      }
! #endif 
      m_type = SMBURLTYPE_UNKNOWN;
      // update m_type
      (void)getType();
-----------------------------------------------------------------------------------------------------



[検索ページ] [メール一覧]
Plamo ML 公開システム