summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/db/mork/morkPortTableCursor.h
blob: 2a7bf3d0e948c20fbc9bdf305c7fcd8edc73f1e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef _MORKPORTTABLECURSOR_
#define _MORKPORTTABLECURSOR_ 1

#ifndef _MORK_
#  include "mork.h"
#endif

#ifndef _MORKCURSOR_
#  include "morkCursor.h"
#endif

#ifndef _MORKROWSPACE_
#  include "morkRowSpace.h"
#endif

// 456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789

class orkinPortTableCursor;
#define morkDerived_kPortTableCursor /*i*/ 0x7443 /* ascii 'tC' */

class morkPortTableCursor : public morkCursor,
                            public nsIMdbPortTableCursor {  // row iterator
 public:
  NS_DECL_ISUPPORTS_INHERITED
  // public: // slots inherited from morkObject (meant to inform only)
  // nsIMdbHeap*     mNode_Heap;
  // mork_able    mNode_Mutable; // can this node be modified?
  // mork_load    mNode_Load;    // is this node clean or dirty?
  // mork_base    mNode_Base;    // must equal morkBase_kNode
  // mork_derived mNode_Derived; // depends on specific node subclass
  // mork_access  mNode_Access;  // kOpen, kClosing, kShut, or kDead
  // mork_usage   mNode_Usage;   // kHeap, kStack, kMember, kGlobal, kNone
  // mork_uses    mNode_Uses;    // refcount for strong refs
  // mork_refs    mNode_Refs;    // refcount for strong refs + weak refs

  // morkFactory* mObject_Factory;  // weak ref to suite factory

  // mork_seed  mCursor_Seed;
  // mork_pos   mCursor_Pos;
  // mork_bool  mCursor_DoFailOnSeedOutOfSync;
  // mork_u1    mCursor_Pad[ 3 ]; // explicitly pad to u4 alignment

 public:  // state is public because the entire Mork system is private
  // { ----- begin attribute methods -----
  NS_IMETHOD SetPort(nsIMdbEnv* ev,
                     nsIMdbPort* ioPort) override;  // sets pos to -1
  NS_IMETHOD GetPort(nsIMdbEnv* ev, nsIMdbPort** acqPort) override;

  NS_IMETHOD SetRowScope(nsIMdbEnv* ev,  // sets pos to -1
                         mdb_scope inRowScope) override;
  NS_IMETHOD GetRowScope(nsIMdbEnv* ev, mdb_scope* outRowScope) override;
  // setting row scope to zero iterates over all row scopes in port

  NS_IMETHOD SetTableKind(nsIMdbEnv* ev,  // sets pos to -1
                          mdb_kind inTableKind) override;
  NS_IMETHOD GetTableKind(nsIMdbEnv* ev, mdb_kind* outTableKind) override;
  // setting table kind to zero iterates over all table kinds in row scope
  // } ----- end attribute methods -----

  // { ----- begin table iteration methods -----
  NS_IMETHOD NextTable(                  // get table at next position in the db
      nsIMdbEnv* ev,                     // context
      nsIMdbTable** acqTable) override;  // the next table in the iteration
  // } ----- end table iteration methods -----
  morkStore* mPortTableCursor_Store;  // weak ref to store

  mdb_scope mPortTableCursor_RowScope;
  mdb_kind mPortTableCursor_TableKind;

  // We only care if LastTable is non-nil, so it is not refcounted;
  // so you must never access table state or methods using LastTable:

  morkTable* mPortTableCursor_LastTable;    // nil or last table (no refcount)
  morkRowSpace* mPortTableCursor_RowSpace;  // current space (strong ref)

  morkRowSpaceMapIter mPortTableCursor_SpaceIter;  // iter over spaces
  morkTableMapIter mPortTableCursor_TableIter;     // iter over tables

  // these booleans indicate when the table or space iterator is exhausted:

  mork_bool mPortTableCursor_TablesDidEnd;  // no more tables?
  mork_bool mPortTableCursor_SpacesDidEnd;  // no more spaces?
  mork_u1 mPortTableCursor_Pad[2];          // for u4 alignment

  // { ===== begin morkNode interface =====
 public:                                             // morkNode virtual methods
  virtual void CloseMorkNode(morkEnv* ev) override;  // ClosePortTableCursor()

 public:  // morkPortTableCursor construction & destruction
  morkPortTableCursor(morkEnv* ev, const morkUsage& inUsage, nsIMdbHeap* ioHeap,
                      morkStore* ioStore, mdb_scope inRowScope,
                      mdb_kind inTableKind, nsIMdbHeap* ioSlotHeap);
  void ClosePortTableCursor(morkEnv* ev);  // called by CloseMorkNode();

 private:  // copying is not allowed
  morkPortTableCursor(const morkPortTableCursor& other);
  morkPortTableCursor& operator=(const morkPortTableCursor& other);

 public:  // dynamic type identification
  mork_bool IsPortTableCursor() const {
    return IsNode() && mNode_Derived == morkDerived_kPortTableCursor;
  }
  // } ===== end morkNode methods =====

 protected:                        // utilities
  virtual ~morkPortTableCursor();  // assert that close executed earlier

  void init_space_tables_map(morkEnv* ev);

 public:  // other cursor methods
  static void NilCursorStoreError(morkEnv* ev);
  static void NonPortTableCursorTypeError(morkEnv* ev);

  morkEnv* CanUsePortTableCursor(nsIMdbEnv* mev, mork_bool inMutable,
                                 nsresult* outErr) const;

  morkRowSpace* NextSpace(morkEnv* ev);
  morkTable* NextTable(morkEnv* ev);

  mork_bool SetRowScope(morkEnv* ev, mork_scope inRowScope);
  mork_bool SetTableKind(morkEnv* ev, mork_kind inTableKind);

 public:  // typesafe refcounting inlines calling inherited morkNode methods
  static void SlotWeakPortTableCursor(morkPortTableCursor* me, morkEnv* ev,
                                      morkPortTableCursor** ioSlot) {
    morkNode::SlotWeakNode((morkNode*)me, ev, (morkNode**)ioSlot);
  }

  static void SlotStrongPortTableCursor(morkPortTableCursor* me, morkEnv* ev,
                                        morkPortTableCursor** ioSlot) {
    morkNode::SlotStrongNode((morkNode*)me, ev, (morkNode**)ioSlot);
  }
};

// 456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789

#endif /* _MORKPORTTABLECURSOR_ */