2009年7月15日

[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();
-----------------------------------------------------------------------------------------------------

投稿者 xml-rpc : 2009年7月15日 14:55
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/86670
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。