1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/* ***** BEGIN LICENSE BLOCK *****
3
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
* The contents of this file are subject to the Mozilla Public License Version
6
* 1.1 (the "License"); you may not use this file except in compliance with
7
* the License. You may obtain a copy of the License at
8
* http://www.mozilla.org/MPL/
10
* Software distributed under the License is distributed on an "AS IS" basis,
11
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
* for the specific language governing rights and limitations under the
15
* The Original Code is mozilla.org code.
17
* The Initial Developer of the Original Code is
18
* Netscape Communications Corporation.
19
* Portions created by the Initial Developer are Copyright (C) 1999
20
* the Initial Developer. All Rights Reserved.
24
* Alternatively, the contents of this file may be used under the terms of
25
* either of the GNU General Public License Version 2 or later (the "GPL"),
26
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27
* in which case the provisions of the GPL or the LGPL are applicable instead
28
* of those above. If you wish to allow use of your version of this file only
29
* under the terms of either the GPL or the LGPL, and not to allow others to
30
* use your version of this file under the terms of the MPL, indicate your
31
* decision by deleting the provisions above and replace them with the notice
32
* and other provisions required by the GPL or the LGPL. If you do not delete
33
* the provisions above, a recipient may use your version of this file under
34
* the terms of any one of the MPL, the GPL or the LGPL.
36
* ***** END LICENSE BLOCK ***** */
39
#define _MORKCURSOR_ 1
46
#include "morkObject.h"
49
//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
51
#define morkDerived_kCursor /*i*/ 0x4375 /* ascii 'Cu' */
53
class morkCursor : public morkObject, public nsIMdbCursor{ // collection iterator
55
// public: // slots inherited from morkObject (meant to inform only)
56
// nsIMdbHeap* mNode_Heap;
57
// mork_able mNode_Mutable; // can this node be modified?
58
// mork_load mNode_Load; // is this node clean or dirty?
59
// mork_base mNode_Base; // must equal morkBase_kNode
60
// mork_derived mNode_Derived; // depends on specific node subclass
61
// mork_access mNode_Access; // kOpen, kClosing, kShut, or kDead
62
// mork_usage mNode_Usage; // kHeap, kStack, kMember, kGlobal, kNone
63
// mork_uses mNode_Uses; // refcount for strong refs
64
// mork_refs mNode_Refs; // refcount for strong refs + weak refs
66
// mork_color mBead_Color; // ID for this bead
67
// morkHandle* mObject_Handle; // weak ref to handle for this object
69
public: // state is public because the entire Mork system is private
70
NS_DECL_ISUPPORTS_INHERITED
72
// { ----- begin attribute methods -----
73
NS_IMETHOD IsFrozenMdbObject(nsIMdbEnv* ev, mdb_bool* outIsReadonly);
74
// same as nsIMdbPort::GetIsPortReadonly() when this object is inside a port.
75
// } ----- end attribute methods -----
77
// { ----- begin ref counting for well-behaved cyclic graphs -----
78
NS_IMETHOD GetWeakRefCount(nsIMdbEnv* ev, // weak refs
80
NS_IMETHOD GetStrongRefCount(nsIMdbEnv* ev, // strong refs
83
NS_IMETHOD AddWeakRef(nsIMdbEnv* ev);
84
NS_IMETHOD AddStrongRef(nsIMdbEnv* ev);
86
NS_IMETHOD CutWeakRef(nsIMdbEnv* ev);
87
NS_IMETHOD CutStrongRef(nsIMdbEnv* ev);
89
NS_IMETHOD CloseMdbObject(nsIMdbEnv* ev); // called at strong refs zero
90
NS_IMETHOD IsOpenMdbObject(nsIMdbEnv* ev, mdb_bool* outOpen);
91
// } ----- end ref counting -----
93
// } ===== end nsIMdbObject methods =====
95
// { ===== begin nsIMdbCursor methods =====
97
// { ----- begin attribute methods -----
98
NS_IMETHOD GetCount(nsIMdbEnv* ev, mdb_count* outCount); // readonly
99
NS_IMETHOD GetSeed(nsIMdbEnv* ev, mdb_seed* outSeed); // readonly
101
NS_IMETHOD SetPos(nsIMdbEnv* ev, mdb_pos inPos); // mutable
102
NS_IMETHOD GetPos(nsIMdbEnv* ev, mdb_pos* outPos);
104
NS_IMETHOD SetDoFailOnSeedOutOfSync(nsIMdbEnv* ev, mdb_bool inFail);
105
NS_IMETHOD GetDoFailOnSeedOutOfSync(nsIMdbEnv* ev, mdb_bool* outFail);
106
// } ----- end attribute methods -----
108
// } ===== end nsIMdbCursor methods =====
110
// } ----- end attribute methods -----
112
mork_seed mCursor_Seed;
113
mork_pos mCursor_Pos;
114
mork_bool mCursor_DoFailOnSeedOutOfSync;
115
mork_u1 mCursor_Pad[ 3 ]; // explicitly pad to u4 alignment
117
// { ===== begin morkNode interface =====
118
public: // morkNode virtual methods
119
virtual void CloseMorkNode(morkEnv* ev); // CloseCursor() only if open
120
virtual ~morkCursor(); // assert that CloseCursor() executed earlier
122
public: // morkCursor construction & destruction
123
morkCursor(morkEnv* ev, const morkUsage& inUsage, nsIMdbHeap* ioHeap);
124
void CloseCursor(morkEnv* ev); // called by CloseMorkNode();
126
private: // copying is not allowed
127
morkCursor(const morkCursor& other);
128
morkCursor& operator=(const morkCursor& other);
130
public: // dynamic type identification
131
mork_bool IsCursor() const
132
{ return IsNode() && mNode_Derived == morkDerived_kCursor; }
133
// } ===== end morkNode methods =====
135
public: // other cursor methods
137
public: // typesafe refcounting inlines calling inherited morkNode methods
138
static void SlotWeakCursor(morkCursor* me,
139
morkEnv* ev, morkCursor** ioSlot)
140
{ morkNode::SlotWeakNode((morkNode*) me, ev, (morkNode**) ioSlot); }
142
static void SlotStrongCursor(morkCursor* me,
143
morkEnv* ev, morkCursor** ioSlot)
144
{ morkNode::SlotStrongNode((morkNode*) me, ev, (morkNode**) ioSlot); }
148
//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
150
#endif /* _MORKCURSOR_ */