1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* ***** BEGIN LICENSE BLOCK *****
3 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 : *
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/
9 : *
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
13 : * License.
14 : *
15 : * The Original Code is mozilla.org code.
16 : *
17 : * The Initial Developer of the Original Code is Neil Deakin
18 : * Portions created by the Initial Developer are Copyright (C) 2006
19 : * the Initial Developer. All Rights Reserved.
20 : *
21 : * Contributor(s):
22 : *
23 : * Alternatively, the contents of this file may be used under the terms of
24 : * either of the GNU General Public License Version 2 or later (the "GPL"),
25 : * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 : * in which case the provisions of the GPL or the LGPL are applicable instead
27 : * of those above. If you wish to allow use of your version of this file only
28 : * under the terms of either the GPL or the LGPL, and not to allow others to
29 : * use your version of this file under the terms of the MPL, indicate your
30 : * decision by deleting the provisions above and replace them with the notice
31 : * and other provisions required by the GPL or the LGPL. If you do not delete
32 : * the provisions above, a recipient may use your version of this file under
33 : * the terms of any one of the MPL, the GPL or the LGPL.
34 : *
35 : * ***** END LICENSE BLOCK ***** */
36 :
37 : #ifndef nsXMLBinding_h__
38 : #define nsXMLBinding_h__
39 :
40 : #include "nsAutoPtr.h"
41 : #include "nsIAtom.h"
42 : #include "nsCycleCollectionParticipant.h"
43 :
44 : class nsXULTemplateResultXML;
45 : class nsXMLBindingValues;
46 :
47 : /**
48 : * Classes related to storing bindings for XML handling.
49 : */
50 :
51 : /**
52 : * a <binding> description
53 : */
54 : struct nsXMLBinding {
55 : nsCOMPtr<nsIAtom> mVar;
56 : nsCOMPtr<nsIDOMXPathExpression> mExpr;
57 :
58 : nsAutoPtr<nsXMLBinding> mNext;
59 :
60 0 : nsXMLBinding(nsIAtom* aVar, nsIDOMXPathExpression* aExpr)
61 0 : : mVar(aVar), mExpr(aExpr), mNext(nsnull)
62 : {
63 0 : MOZ_COUNT_CTOR(nsXMLBinding);
64 0 : }
65 :
66 0 : ~nsXMLBinding()
67 0 : {
68 0 : MOZ_COUNT_DTOR(nsXMLBinding);
69 0 : }
70 : };
71 :
72 : /**
73 : * a collection of <binding> descriptors. This object is refcounted by
74 : * nsXMLBindingValues objects and the query processor.
75 : */
76 : class nsXMLBindingSet
77 0 : {
78 : public:
79 :
80 : // results hold a reference to a binding set in their
81 : // nsXMLBindingValues fields
82 : nsAutoRefCnt mRefCnt;
83 :
84 : // pointer to the first binding in a linked list
85 : nsAutoPtr<nsXMLBinding> mFirst;
86 :
87 : public:
88 :
89 : NS_IMETHOD_(nsrefcnt) AddRef();
90 : NS_IMETHOD_(nsrefcnt) Release();
91 : NS_DECL_OWNINGTHREAD
92 1464 : NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(nsXMLBindingSet)
93 :
94 : /**
95 : * Add a binding to the set
96 : */
97 : nsresult
98 : AddBinding(nsIAtom* aVar, nsIDOMXPathExpression* aExpr);
99 :
100 : /**
101 : * The nsXMLBindingValues class stores an array of values, one for each
102 : * target symbol that could be set by the bindings in the set.
103 : * LookupTargetIndex determines the index into the array for a given
104 : * target symbol.
105 : */
106 : PRInt32
107 : LookupTargetIndex(nsIAtom* aTargetVariable, nsXMLBinding** aBinding);
108 : };
109 :
110 : /**
111 : * a set of values of bindings. This object is used once per result.
112 : */
113 : class nsXMLBindingValues
114 : {
115 : protected:
116 :
117 : // the binding set
118 : nsRefPtr<nsXMLBindingSet> mBindings;
119 :
120 : /**
121 : * A set of values for variable bindings. To look up a binding value,
122 : * scan through the binding set in mBindings for the right target atom.
123 : * Its index will correspond to the index in this array.
124 : */
125 : nsCOMArray<nsIDOMXPathResult> mValues;
126 :
127 : public:
128 :
129 0 : nsXMLBindingValues() { MOZ_COUNT_CTOR(nsXMLBindingValues); }
130 0 : ~nsXMLBindingValues() { MOZ_COUNT_DTOR(nsXMLBindingValues); }
131 :
132 : nsXMLBindingSet* GetBindingSet() { return mBindings; }
133 :
134 0 : void SetBindingSet(nsXMLBindingSet* aBindings) { mBindings = aBindings; }
135 :
136 : PRInt32
137 0 : LookupTargetIndex(nsIAtom* aTargetVariable, nsXMLBinding** aBinding)
138 : {
139 : return mBindings ?
140 0 : mBindings->LookupTargetIndex(aTargetVariable, aBinding) : -1;
141 : }
142 :
143 : /**
144 : * Retrieve the assignment for a particular variable
145 : *
146 : * aResult the result generated from the template
147 : * aBinding the binding looked up using LookupTargetIndex
148 : * aIndex the index of the assignment to retrieve
149 : * aType the type of result expected
150 : * aValue the value of the assignment
151 : */
152 : void
153 : GetAssignmentFor(nsXULTemplateResultXML* aResult,
154 : nsXMLBinding* aBinding,
155 : PRInt32 idx,
156 : PRUint16 type,
157 : nsIDOMXPathResult** aValue);
158 :
159 : void
160 : GetNodeAssignmentFor(nsXULTemplateResultXML* aResult,
161 : nsXMLBinding* aBinding,
162 : PRInt32 idx,
163 : nsIDOMNode** aValue);
164 :
165 : void
166 : GetStringAssignmentFor(nsXULTemplateResultXML* aResult,
167 : nsXMLBinding* aBinding,
168 : PRInt32 idx,
169 : nsAString& aValue);
170 : };
171 :
172 : #endif // nsXMLBinding_h__
|