[[diary/Kojima]]

・Nexus 7とMTP(その3)

とりあえず日本語のファイル名をUTF8にすることでgMTPから
Nexus 7へファイルを送ることはできるようになったのだけど,
やっぱり一々UTF8なファイル名のリンクを貼るのは面倒なので,
gMTPのソースコードをイジってみるか,と考えた.

この手のエラーは,たいていGTK/GLIBレベルでのファイル名操作の手抜き
(GTK/GLIBの内部で処理する際の文字コードはUTF8になっている必要があるけど,
ファイルシステム上ではlocale依存なので,
GTK/GLIBレベルに持ち込む前にg_filename_to_utf8()で変換してやる必要がある.
locale=UTF8な場合のみ,この処理を省いてもエラーにならない)だろう,
と見当をつけて,gMTPのソースコードを眺めてみたら,mtp.c のこのあたりが怪しそうだ.

 658     filename_stripped = basename(filename);
 659     displayProgressBar(_("File Upload"));
 660     setProgressFilename(g_strdup(filename_stripped));

コピー処理等のプログレスバーを表示する setProgressFilename() も
表示するファイル名はUTF8である必要があるけど,
このコードではfilenameのlocaleを考慮せずにbasename()で切り出して,
g_strdup()しているだけっぽい.

filename_strippedを手掛りに,もう少し見ていくと,
ファイルをアップロードすると思わしい処理にもこういう部分があった.

 779         // Generic file upload.
 780         genfile = LIBMTP_new_file_t();
 781         genfile->filesize = filesize;
 782         genfile->filename = g_strdup(filename_stripped);
 783         genfile->filetype = find_filetype(filename_stripped);
 784         genfile->parent_id = currentFolderID;

この genfile->filename をUTF8にしてやればよさそうなので,
こんな感じのパッチにしてみた.

 -        genfile->filename = g_strdup(filename_stripped);
 +        // genfile->filename = g_strdup(filename_stripped);
 +       genfile->filename = g_filename_to_utf8(filename_stripped, -1, NULL, NULL, &error);

あちこちに散在する g_strdup()でfilename_strippedを操作している部分も
同様に g_filename_to_utf8()を介して操作するようにイジってみたら,
どうやらEUC-JPなファイルもそのまま転送できるようになったっぽい.

#ref("gmtp03.png")

このパッチではファイル名のみをUTF8にしているので,
パスの途中にEUC-JPな文字コードがあるとうまく行かない感じだったり,
ダウンロードしてきたファイル名をlocaleに変換するような処理はgMTPにないので,
libmtpのレベルで操作する必要がありそうだったりするのだけど,
とりあえず手元の目的は果したので,そう深く追求しないことにする(苦笑

とりあえずこのパッチをあてたgMTPを使うことで,
手元のPC上のファイルを自由にNexus 7上に送ることができるようになったので,
「らじる☆らじる」の録音スクリプトで録音した語学講座の音声データと,

#ref("Screenshot1.jpg")

自炊したテキストをNexus 7上に持っていて,

#ref("Screenshot2.jpg")

Nexus 7上での「どこでも語学教室」が可能になった :-)

音声データをバックグラウンドで流しながら画像データを閲覧できるのか,
というあたりを少し心配していたのだけど,
Nexus 7のGoogle謹製の"Music"という音楽プレイヤーは,
再生を開始するとそのままバックグラウンドで動き続けるので,
表でコミックビューワー(今は"ComittoN"がお気に入り)を使って
自炊テキストを問題なく表示できた.

これで通勤中にも語学が勉強できる,と言いたいところだけど,
最近は田舎に引きこもっているので,通勤時間が無いのであった(苦笑
- ちなみにNexus 7でスクリーンショットを取るには、電源ボタンとボリューム下げを同時押しすれば、 Pictures/Screenshots/ の下にPNG形式でスクリーンショットが撮れるらしい。 -- [[kojima]] &new{2013-01-11 (金) 23:53:14};
- 同時に押すタイミングがなかなか難しいですよね(^_^;)>Nexus7 -- [[TenForward]] &new{2013-01-12 (土) 18:35:33};
- 興味ある人のために、現状でのgMTPをPlamo-test以下に置いときます。ftp://plamo.linet.gr.jp/pub/Plamo-test/for-5.0/x86_64/gmtp-1.3.4-x86_64-P1.txz  上述のようにEUC-JPなファイル名を転送するのに必要最低限の機能しか直してないので、それを理解した上で使いたい人のみお使いくださいませ。 -- [[kojima]] &new{2013-01-13 (日) 16:18:00};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS