BIO_f_base64

BIO_f_base64Base64フィルタで、これを使うことでBase64に変換できる。

/docs/man1.0.2/crypto/BIO_f_base64.html

BIO_f_base64.cで、

bufferとbase64base64とfile、という形で連結。

$ vi test.txt 
$ gcc -o BIO_f_base64 BIO_f_base64.c -lcrypto
$ ./BIO_f_base64 
file = 022f3240
buffer = 022f38c0
base64 = 022f5990
$ ls
BIO_f_base64  BIO_f_base64.c  test.txt
$ cat test.txt 
QUJDREU=
$

Base64文字列がtest.txtに書き込まれた。

Sample/openssl/BIO_f_base64/BIO_f_base64/src/BIO_f_base64 at master · bg1bgst333/Sample · GitHub

BIO_f_buffer

BIO_f_bufferはバッファ用フィルタBIOの作成に使うことは紹介した。

/docs/man1.0.2/crypto/BIO_f_buffer.html

今回は、BIO_pushで連結し、バッファBIOのbufferとファイルBIOのfileにそれぞれ文字列を書き込んでから、BIO_flushでフラッシュを試す。

BIO_f_buffer.cで、

このように、連結して、それぞれ書き込んで、フラッシュ。
BIO_free_allでbufferを解放すると、連結しているfileも解放される。

$ vi BIO_f_buffer.c 
$ gcc -o BIO_f_buffer BIO_f_buffer.c -lcrypto
$ ./BIO_f_buffer 
file = 0197b240
buffer = 0197b8c0
$ ls
BIO_f_buffer  BIO_f_buffer.c  test.txt
$ cat test.txt 
XYZABCDE$

fileのほうが先に書き込まれ、bufferは後になっている。

Sample/openssl/BIO_f_buffer/BIO_f_buffer/src/BIO_f_buffer at master · bg1bgst333/Sample · GitHub

BIO_push

BIO_pushでBIOチェインを連結する。

/docs/man1.1.0/crypto/BIO_push.html
BIOとBase64

BIO_push.cを作成し、

BIO_pushでbufferとfileを連結する。
その後、BIO_writeでbufferに"ABCDE"を書き込み、BIO_flushでフラッシュすると、test.txtに書き込まれる。

$ vi BIO_push.c 
$ gcc -o BIO_push BIO_push.c -lcrypto
$ ./BIO_push 
file = 008a9240
buffer = 008a98c0
$ ls
BIO_push  BIO_push.c  test.txt
$ cat test.txt 
ABCDE$

このように、BIOを連結してデータを渡していく。

Sample/openssl/BIO_push/BIO_push/src/BIO_push at master · bg1bgst333/Sample · GitHub

BIO_new_file

BIO_new_fileでファイル用データシンクBIOを作成する。

/docs/man1.0.2/crypto/BIO_new_file.html

BIO_new_file.cに、

test.txtを作成しておいて、BIO_new_file()で開く。
戻り値のポインタfileをprintfで出力。

$ vi BIO_new_file.c 
$ gcc -o BIO_new_file BIO_new_file.c -lcrypto
$ ./BIO_new_file 
file = 01385240
buffer = 013858c0
$ ls
BIO_new_file  BIO_new_file.c  test.txt
$

ファイル用データシンクBIOを作成できた。

Sample/openssl/BIO_new_file/BIO_new_file/src/BIO_new_file at master · bg1bgst333/Sample · GitHub

BIO_new

BIO_newでBIO構造体のオブジェクトを作成できる。
今回は、バッファ用フィルタBIOを作成する。

/docs/man1.1.0/crypto/BIO_new.html

BIO_new.cに、

と書く。
BIO_new()にBIO_f_buffer()の戻り値を渡すことで、バッファ用フィルタBIOが作成され、bufferにポインタが格納される。
それをprintfで出力。
最後にBIO_freeで解放する。

$ vi BIO_new.c
$ gcc -o BIO_new BIO_new.c -lcrypto
$ ./BIO_new 
buffer = 006db010
$

バッファ用フィルタBIOのポインタが出力された。

Sample/openssl/BIO_new/BIO_new/src/BIO_new at master · bg1bgst333/Sample · GitHub

VizCommand #36 viewコマンドで画像(ビットマップファイル)の表示

画像を表示するviewコマンドを実装する。

まず、WindowListItem.cppで、

OnCreateで、赤のペン、ブラシを、黒のペン、ブラシに変更。

Console.cppで、

"view"と入力されたら、SendMessageでUM_STREAMCOMMAND。

StreamConsole.hは、

OnViewを追加。

StreamConsole.cppは、

"view"でOnViewを呼ぶ。

OnViewで渡されたファイル名のビットマップファイルを、CPictureBoxを使ってLoadしてSetImage。

f:id:BG1:20170606153404p:plain

viewでtest1.bmpを表示。

f:id:BG1:20170606153542p:plain

表示できた。

f:id:BG1:20170606153623p:plain

マウスを右に持っていくと、隠れていたスクロールバーが姿を現す。

f:id:BG1:20170606153724p:plain

スクロールバーで下の方まで表示できる。

・viewコマンドで画像(ビットマップファイル)の表示 · bg1bgst333/VizCommand@7ee9bd7 · GitHub

VizCommand #35 walkコマンドでフォルダの移動

linuxコマンドのcdに相当するフォルダ移動コマンドwalkを実装する。

Console.hで、

Consoleオブジェクトが生成された時のデフォルトカレントパスとしてm_tstrDefaultCurrentPathを用意。
コンストラクタもtstrDefaultCurrentPathを引数に取るものを追加。
そしてOnWalkハンドラを追加。

Console.cppは、

コンストラクタでm_tstrDefaultCurrentPathにtstrDefaultCurrentPathを入れる。

OnCreateでは、pConsoleCore->SetCurrentPathでm_tstrDefaultCurrentPathをセットする。

OnConsoleCoreCommandで"walk"と入力されたらOnWalkを呼ぶようにする。

OnWalkでは、パラメータのtstrPathがなければ、pConsoleCore->GetMyDocumentPathでマイドキュメントのパスを取得してtstrPathに入れる。
tstrPathがある場合は、絶対パスに変換。
pConsoleCore->SetCurrentPathでtstrPathをカレントパスにセット。
pConsoleCore->GetOutputFormStringでフォーム文字列を更新して、UM_FINISHRESPONSEでレスポンス処理終了。

ConsoleCore.cppでは、

カレントパスが無い場合はマイドキュメントをカレントパスとするようにする。
つまり、カレントパスが指定されていたら、そのままにする。

StreamConsole.cppでは、

listの前のpConsoleCore->GetCurrentPathでカレントパスをtstrCurrentPathに保持しておき、listの後に挿入するCConsoleのコンストラクタにtstrCurrentPathを渡す。
これで新しいConsoleでもカレントパスが保持される。

f:id:BG1:20170606125558p:plain

walkにパラメータが無い場合は、

f:id:BG1:20170606125646p:plain

変わらない。

f:id:BG1:20170606125736p:plain

".."で、

f:id:BG1:20170606125800p:plain

上のフォルダに移動。

f:id:BG1:20170606125859p:plain

ここでパラメータ無しのwalkで、

f:id:BG1:20170606125930p:plain

マイドキュメントに戻ってきた。

f:id:BG1:20170606130006p:plain

testフォルダに移動。

f:id:BG1:20170606130031p:plain

testにきた。

f:id:BG1:20170606130314p:plain

ここでlistコマンドを打つと、

f:id:BG1:20170606130337p:plain

testフォルダの一覧を表示し、次のConsoleのカレントパスもtestになっている。

f:id:BG1:20170606130439p:plain

walkで上に移動。

f:id:BG1:20170606130510p:plain

listでマイドキュメント表示。

・walkコマンドでフォルダの移動 · bg1bgst333/VizCommand@9429b94 · GitHub