・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なファイルもそのまま転送できるようになったっぽい.
このパッチではファイル名のみをUTF8にしているので, パスの途中にEUC-JPな文字コードがあるとうまく行かない感じだったり, ダウンロードしてきたファイル名をlocaleに変換するような処理はgMTPにないので, libmtpのレベルで操作する必要がありそうだったりするのだけど, とりあえず手元の目的は果したので,そう深く追求しないことにする(苦笑
とりあえずこのパッチをあてたgMTPを使うことで, 手元のPC上のファイルを自由にNexus 7上に送ることができるようになったので, 「らじる☆らじる」の録音スクリプトで録音した語学講座の音声データと,
自炊したテキストをNexus 7上に持っていて,
Nexus 7上での「どこでも語学教室」が可能になった :-)
音声データをバックグラウンドで流しながら画像データを閲覧できるのか, というあたりを少し心配していたのだけど, Nexus 7のGoogle謹製の"Music"という音楽プレイヤーは, 再生を開始するとそのままバックグラウンドで動き続けるので, 表でコミックビューワー(今は"ComittoN"がお気に入り)を使って 自炊テキストを問題なく表示できた.
これで通勤中にも語学が勉強できる,と言いたいところだけど, 最近は田舎に引きこもっているので,通勤時間が無いのであった(苦笑