Notes C API探訪: LMBCS文字列のクラス化
今回はNLS_translateの応用として、LMBCS文字列を扱うクラスを定義してみます。LMBCS文字列はマルチバイト文字セットなので、格納にはstd::stringを使用します。
// nxpp/include/nxpp/lmbcs/nxpp_lmbcs.hpp
#ifndef NXPP_LMBCS_HPP
#define NXPP_LMBCS_HPP
#include "./nxpp_translate.hpp"
#ifdef NT
#pragma pack(push, 1)
#endif
#include <global.h>
#include <osmisc.h>
#include <misc.h>
#ifdef NT
#pragma pack(pop)
#endif
namespace nxpp {
/**
* @brief LMBCS文字列クラス
*/
class Lmbcs : public std::string
{
public:
/**
* @brief デフォルトコンストラクタ
*/
Lmbcs() : std::string() {}
/**
* @brief コンストラクタ
* @param p ヌル終端文字列
*/
Lmbcs(const char *p) : std::string(p) {}
/**
* @brief コンストラクタ
* @param p 文字列
* @param n サイズ
*/
Lmbcs(const char *p, size_t n) : std::string(p, n) {}
};
/**
* @brief STATUS値からエラー内容のテキストに変換する
* @param status ステータス値
* @return エラーテキスト(LMBCS文字列)
*/
inline nxpp::Lmbcs fromStatus(STATUS status) {
char buffer[MAXSPRINTF + 1];
WORD len = OSLoadString(NULLHANDLE, ERR(status), buffer, MAXSPRINTF);
return nxpp::Lmbcs(buffer, len);
}
} // namespace nxpp
/**
* @brief UTF-16文字列をLMBCS文字列に変換する
* @param wstr UTF-16文字列
* @return LMBCS文字列
*/
inline nxpp::Lmbcs toLmbcs(const std::wstring &wstr) {
return nxpp::unicodeToLmbcs<nxpp::Lmbcs>(wstr);
}
/**
* @brief LMBCS文字列をUTF-16文字列に変換する
* @param lmbcs LMBCS文字列
* @return UTF-16文字列
*/
inline std::wstring fromLmbcs(const nxpp::Lmbcs &lmbcs) {
return nxpp::lmbcsToUnicode<nxpp::Lmbcs>(lmbcs);
}
#endif // NXPP_LMBCS_HPP
nxpp::Lmbcsクラスは、現状std::stringクラスを継承しただけです。今後、LMBCS文字列として必要な機能を強化していきます。
nxpp::fromStatus関数は、OSLoadString関数を利用して、エラー文字列を取得し、それをLmbcsクラスとして返します。
toLmbcs関数は、Unicode文字列をLmbcsクラスに変換します。
fromLmbcs関数は、LmbcsクラスをUnicode文字列に変換します。
まとめ
今回のご紹介は非常にコンパクトにまとまってしまいましたが、それもこれも、これまでに「Notes C API探訪」シリーズの記事で紹介してきたAPI関数とそのラップ関数の集大成に他ならないからです。
Notes C APIは、C/C++の世界から入るとNotes/Dominoの独特の世界に戸惑い、Notes/Dominoの世界から入ると高度そうに見えるC/C++の言語の壁が侵入を阻む、非常に特殊な立ち位置の存在だと感じています。
一朝一夕に解を得られるわけではありませんが、これらの記事で少しでも気づきを得ていただけたら幸いです。