第01回 ソースコードを眺めてみる

対象となるソースコードアーカイブには、4個のディレクトリと236個のファイルが含まれています。まずは最初は、含まれるファイルの一覧から分かる範囲で切り分けてみることにします。

とにかく展開してみる

とにもかくにも、アーカイブを展開してみないことには話が始まりません。

アーカイブの中には、4つのフォルダとreadme.txtが入っています。当然ながら、まずはreadme.txtを熟読しましょう。今回は、最新版である7.1を対象としますので、71フォルダの下を見ることになります。この下にある76個のファイルをリストアップしてみます。

ファイル名 サイズ
ABOUTUNIT.dfm 15949
AboutUnit.cpp 823
AboutUnit.h 1310
AutoDownUnit.cpp 6608
AutoDownUnit.dfm 7492
AutoDownUnit.h 2993
BBSMAKEUNIT.dfm 2319
BBSWRITEUNIT.dfm 3920
BbsMakeUnit.cpp 3701
BbsMakeUnit.h 1570
BbsWriteUnit.cpp 3690
BbsWriteUnit.h 2590
CAutoDownList.cpp 1221
CAutoDownList.h 3838
CBbsFile.cpp 6039
CBbsFile.h 949
CFolder.cpp 813
CFolder.h 3776
CHost.cpp 16177
CHost.h 12194
CKey.cpp 32664
CKey.h 12634
CKeyBlock.cpp 340
CKeyBlock.h 951
CLongInt.cpp 20058
CLongInt.h 1927
CMainControl.cpp 391248
CMainControl.h 23052
CQuery.cpp 15573
CQuery.h 2496
CRC4.cpp 1560
CRC4.h 732
CWork.cpp 8309
CWork.h 11896
ControlUnit.cpp 6362
ControlUnit.dfm 8646
ControlUnit.h 6588
DOWNPARAMUNIT.dfm 5504
DownParamUnit.cpp 2244
DownParamUnit.h 2779
FolderAddUnit.cpp 2907
FolderAddUnit.dfm 3788
FolderAddUnit.h 2282
IpConvUnit.cpp 1381
IpConvUnit.dfm 2368
IpConvUnit.h 1632
MainUnit.cpp 191854
MainUnit.dfm 109940
MainUnit.h 33526
NodeAddUnit.cpp 1103
NodeAddUnit.dfm 2090
NodeAddUnit.h 1494
OptionUnit.cpp 30420
OptionUnit.dfm 38671
OptionUnit.h 9713
RSA.cpp 4852
RSA.h 774
RichTextView.hpp 11782
VIEWUNIT.dfm 2344
ViewUnit.cpp 4026
ViewUnit.h 1719
Winny.bpr 11603
Winny.cpp 2505
Winny.ico 3262
Winny.mak 5829
Winny.res 4032
def.h 1534
def0.h 245
def2.h 123
globals.h 4896
hdrs.h 2022
md5.cpp 11188
md5.h 1350
miscclass.h 4842
util.cpp 14048
util.h 1035

ずいぶんと数は減りましたが、まだ多いですね。
そこで、すぐに分かる範囲で切り分けてみます。

  • ファイル名
  • ファイルサイズ
  • 拡張子

ファイル名に特徴のあるもの

まず、ファイル名にも注目してみると、こんな推測ができます。

ファイル名 内容の推測
CAutoDownList.cpp 自動ダウン
CBbsFile.cpp BBSファイル
CHost.cpp ホストキャッシュ
CKey.cpp キー情報
CQuery.cpp 検索クエリ
CRC4.cpp RC4暗号化
md5.cpp MD5ハッシュ
RSA.cpp RSA暗号
Winny.cpp Winny.exeそのもの
util.cpp 雑多な処理
miscclass.h 雑多なクラス
RichTextView.hpp テキストボックス
CLongInt.cpp 大きな数字の計算

ファイルサイズの大きなもの

次に、ファイルサイズを見てみます。

最もサイズの大きいファイルが CMainControl.cpp ですね。MainUnit.cpp、MainUnit.dfm あたりまでは100KBを超えています。ただし、.dfm のファイルは UI 関係ですので見なかったことにしましょう。というわけで次は MainUnit.h、CKey.cppと続きます。

今回一番注目するのは、Winny2 のロジック部分ですが、なんとなく、このあたりに隠れていそうな気がします。

拡張子

最後に、拡張子から分かることを探してみます。

まず、C++言語と縁がない人のために解説すると、「.cpp」という拡張子を持つファイルが実際の動作内容が書かれたプログラム本体で、同じ左側(ベースファイル名)で拡張子が「.h」のものは、そのプログラムの「お品書き」のようなものになっています。つまり、この二つはセットで一つと言うことになります。

次に、「.bpr」「.mak」ですが、これらは複数のファイルから構成されるWinnyを、実際にWinny.exeという一つの実行ファイルにまとめる時に使う手順書のようなものです。

「.ico」はプログラミングに縁がない方も知っているかもしれません、Windows標準のアイコンファイルです。下半分に「WINNY」と書かれたあのアイコンですね。

「.hpp」という見慣れない拡張子を持つRichTextView.hppというファイルがあります。これはちゃんとreadme.txtを読んだ方には分かりますね。

最後に注目したいのが拡張子「.dfm」です。

フォームを持つもの

この「.dfm」という拡張子を持つファイルには、Winny内の各ウインドウにボタンやテキストボックス、メニューバーなどをどのように置けばよいのかが書かれています。

また、このファイルは同じベースファイル名を持つファイルと関連づけられています。つまり、対応する拡張子「.cpp」のファイルには、それぞれのウィンドウでの処理内容が書かれていそうです。

それぞれのウィンドウに対応する、というヒントをふまえて内容を推測してみましょう。

ベースファイル名 内容の推測
AboutUnit.cpp About
AutoDownUnit.cpp 自動ダウンロード
BbsMakeUnit.cpp BBSの新規スレッド作成
BbsWriteUnit.cpp BBSのスレッドへの書き込み
ControlUnit.cpp
DownParamUnit.cpp ダウンロード指定
FolderAddUnit.cpp フォルダ追加
IpConvUnit.cpp 自アドレスの暗号化
MainUnit.cpp メインと言うくらいでウィンドウ全体?
NodeAddUnit.cpp ノード追加
OptionUnit.cpp オプション
ViewUnit.cpp

ControlUnit.cpp など、名前だけだとよく分からないものもありますが、とりあえず今回は中身を見ずに分かる範囲と言うことで放置しておきます。

最初はここまで

まずは、おおざっぱにファイル群を仕分けしてみました。
今後も、こんな感じののんびりペースでやっていきますので、期待せずにお待ちください。