NotesとQtでWindows、Mac OS X、Ubuntuのデスクトップアプリ(その3 - STATUS編)
Notes C APIにおけるSTATUS型は、ほとんどの関数の戻り値となっています。関数の実行結果が成功したのか、失敗したのか、判断する材料となります。
「Notes/Domino APIプログラミング〜」では、std::exceptionを拡張した例外処理として実装しています。私も以前はこれを利用していましたが、Visual C++で例外の仕様が変更され、サンプルをコンパイルすると警告が出るようになりました。それを機に、C++における例外処理について調べてみると、処理の組み方によっては思わぬ処理フローを引き起こす場合があるようで、Notes APIを扱う場合は不向きではないかと考えるようになりました。そこで、STATUS値をラッピングするクラスは、単なるラッパークラスにすることにしました。以下はStatusクラスのヘッダーファイルです。
status.h
#ifndef NTLX_STATUS_H #define NTLX_STATUS_H #if defined(NT) #pragma pack(push, 1) #endif #include <global.h>#if defined(NT) #pragma pack(pop) #endif namespace ntlx { /** * @brief The Status class */ class Status { public: /** * @brief コンストラクタ */ Status() {} /** * @brief コンストラクタ * @param value ステータス値 */ Status(STATUS value) : value_(value) {} /** * @brief コピーコンストラクタ * @param other コピー元 */ Status(const Status& other) : value_(other.value_) {} /** * @brief 代入演算子 * @param other 代入元 * @return 自身への参照 */ Status& operator=(const Status& other) { if (this == &other) return *this; value_ = other.value_; return *this; } /** * @brief キャスト演算子 */ operator STATUS() const { return value_; } /** * @brief エラー値 * @return 上位2ピットをマスクしたエラー値 */ STATUS error() const { return ERR(value_); } /** * @brief エラーがないと真を返す * @return エラーがなければ真 */ bool success() const { return error() == NOERROR; } /** * @brief エラーがあると真を返す * @return エラーがあれば真 */ bool failure() const { return !success(); } /** * @brief すでに表示されていれば真を返す * @return 表示済であれば真 */ bool hasDisplayed() const { return ((value_ & STS_DISPLAYED) != 0); } /** * @brief リモート(Dominoサーバ)起因のエラーであれば真を返す * @return リモート起因なら真 */ bool isRemote() const { return ((value_ & STS_REMOTE) != 0); } private: STATUS value_; }; } #endif // NTLX_STATUS_H
マルチプラットフォームとして記述するので、Notes APIのヘッダーファイルをインクルードする場合、Windowsにおいては、構造体のアラインメントに配慮する必要があります。最初の方に書かれている#pragma pack(push,1)と#pragma pack(pop)はそのための記述で、これらでAPIヘッダーのインクルード行を挟みます。なお、MacとLinuxでは、構造体のアラインメントを考慮する必要はないそうです。
また、WindowsにおいてはWIN32という識別子が定義されるので、これを#ifに使うこともできますが、実はLinuxもこの識別子が必要になります。なので、識別子NTの方が判別しやすいでしょう。(続く)