伝説のツール「NotesPeek」をQtでリメイクする(その10・リスト型/範囲型)

Notesの基本的な「型」は、テキスト(文字列)型、数値型、日時型になります。これら基本型は、いずれも複数値になることは皆さんご存じのことと思います。

  • テキストリスト型
  • 数値リスト型
  • 日時リスト型

このうちテキストリストは、LISTという構造体が使われています。

typedef struct {
  USHORT ListEntries; /* list entries following */
                      /* now come the list entries */
} LIST;

f:id:takahide-kondoh:20170613065006p:plain

この図は文字列リストのメモリ配置を示していて、LIST.ListEntries=3の場合を表しています。L1〜L3はUSHORT型で、文字列1〜3の長さを表しています。

LISTが適用できるのはテキスト型で、TYPE_TEXT_LISTという型で判別します。では、数値や日時ではLIST型でなく、何が使われているのでしょう。

実は数値と日時には、単純なリストはなく、「RANGE」という構造体で複数値を表します。型の判別にはTYPE_NUMBER_RANGE、TYPE_TIME_RANGEという値でそれぞれ判別します。それではRANGE構造体を見てみましょう。

typedef struct {
  USHORT ListEntries;   /* list entries following */
  USHORT RangeEntries;  /* range entries following */
                        /* now come the list entries */
                        /* now come the range entries */
} RANGE;

ListEntriesの他にRangeEntriesというメンバーが存在します。このRangeEntriesは、「範囲」リストの数を表します。

「範囲」という概念は、日時でいう「何日から何日」、「何時から何時」というものを表し、主にカレンダーや予定などで使用されます。Notes APIから見ると、日時型の範囲はTIMEDATE_PAIRという構造体で表されます。

typedef struct { /* a timedate range entry */
  TIMEDATE Lower;
  TIMEDATE Upper;
} TIMEDATE_PAIR;

RangeEntriesは、このTIMEDATE_PAIR型のリストのアイテム数を表していたんですね。一方で数値の方は、NUMBER_PAIRという構造体があります。

typedef struct {  /* a float range entry */
  NUMBER Lower;
  NUMBER Upper;
} NUMBER_PAIR;

このNUMBER_PAIRですが、Notes/Domino APIプログラミング―C++とSTLによる実践的プログラミングによると「Notesクライアントからこれを入力することはできない」と書かれています。この本はNotes R5の頃に書かれていますが、現在のNotes 9でも数値範囲を入力できないのであれば、利用することはあまりないでしょう。ですが、APIでなら操作できるのであれば、扱えるようにしておこうと思います。

TYPE_NUMBER_RANGE、TYPE_TIME_RANGEのデータ構造は以下のようになります。

f:id:takahide-kondoh:20170613124053p:plain

せっかく数値のRANGEと日時のRANGEが同じ構造をしているので、C++テンプレートの機能を使って、実装してみることにしましょう。(続く)