libphoto2 gp_file関連

gp_file関連関数の取り扱いについての覚書。

概要

ファイルへの保存、読み込み関連の関数。

保存先としては以下の3種類あり、それらを抽象的に取り扱えるようにラッピングしている感じ。

  1. メモリ内に保存しておくタイプ
    gp_file_newでCameraFileを初期化
    gp_file_saveをしないと、実ファイルへは保存されない
  2. openに使ったファイル記述子を使うタイプ
    gp_file_new_from_fdでCameraFileを初期化
  3. CameraFileHandlerなるもので、さらに書き込み、読み込みを抽象化した構造体を使うもの
    gp_file_new_from_handlerでCameraFileを初期化

注意点的なもの

openに使ったファイル記述子を使うタイプ

openしたfdを用いて初期化するのだが、close処理はgp_file_freeで行われているのでopen/closeのペア運用しようとしている場合は注意が必要。

best-iso.cのプログラムを見ていて、openしているのにcloseがないなとソースを確認して気が付いた。
p_file_new_from_handlerのCameraFileHandlerを用いたほうは、CameraFileHandlerの開放処理は外側で行うような思想になっているのだが。

CameraFileHandlerを使うタイプ

gp_file_open、gp_file_saveには実装がないのでこれらを使いたい場合には使えないようだ。

考え方としてはファイル識別子を使ったものと同じ考えでいいはずなのだが。

gp_file_set_data_and_size

gp_file_set_data_and_sizeの第2パラメータで渡すdataは上位側でmallocで確保した領域を渡す必要がある。
内部のどこかしらでfreeしているので。

スタックで確保した領域を渡してはいけないようだ。

ファイル記述子のところでもそうだが、基本gp_file関数群の中で何でも開放するというのが基本方針なのか?

アプリケーション側で使う場合

サンプル中では、gp_file_new、gp_file_new_from_fdの2つが使われているが、

  1. gp_file_new
  2. gp_file_save
  3. gp_file_unref

をセットで使うのが一番いいように感じた。

gp_file_new_from_fdを使用する場合、事前にopenしておく必要があるし、注意点にも書いたが、open/closeをアプリケーション側でペアで記述できないというのは、エラー処理などでファイル記述子のクローズ漏れを起こすなどの問題点が発生する可能性が懸念される。

コメント

タイトルとURLをコピーしました