1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */
4 * Copyright (C) 2007 Sergey Yanovich <ynvich@gmail.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include "xpcom-config.h"
25 #include "nsAutoPtr.h"
26 #include "nsComponentManagerUtils.h"
27 #include "nsServiceManagerUtils.h"
28 #include "nsIObserverService.h"
29 #include "nsIMutableArray.h"
31 /* Project includes */
33 #include "aaIResource.h"
37 #include "aaIHandler.h"
38 #include "aaBaseKeys.h"
43 :mAmount(0.0), mBroadcasting(PR_FALSE
)
51 NS_IMPL_ISUPPORTS3(aaFact
,
58 aaFact::GetId(PRInt64
*aId
)
60 NS_ENSURE_ARG_POINTER(aId
);
65 aaFact::SetId(PRInt64 aId
)
78 aaFact::Accept(aaIHandler
* aQuery
)
80 NS_ENSURE_ARG_POINTER(aQuery
);
81 return aQuery
->HandleFact(this);
85 aaFact::GetEdited(PRBool
* aEdited
)
87 NS_ENSURE_ARG_POINTER(aEdited
);
93 aaFact::Sync(aaIStorager
*aStorager
, aaISqliteChannel
*aChannel
)
95 return NS_ERROR_NOT_IMPLEMENTED
;
100 aaFact::GetEventId(PRInt64
*aEventId
)
102 NS_ENSURE_ARG_POINTER( aEventId
);
103 if (NS_UNLIKELY( !mEvent
))
104 return NS_ERROR_NOT_INITIALIZED
;
105 *aEventId
= PickEventId();
109 aaFact::PickEventId()
113 nsCOMPtr
<aaIEvent
> event
= do_QueryReferent(mEvent
);
115 event
->GetId(&mEventId
);
121 aaFact::GetTime(PRTime
*aTime
)
123 NS_ENSURE_ARG_POINTER( aTime
);
124 if (NS_UNLIKELY( !mEvent
))
125 return NS_ERROR_NOT_INITIALIZED
;
134 nsCOMPtr
<aaIEvent
> event
= do_QueryReferent(mEvent
);
136 event
->GetTime(&mTime
);
141 aaFact::SetEvent(aaIEvent
*aEvent
)
143 if (NS_UNLIKELY( ! aEvent
)) {
149 rv
= aEvent
->GetId( &mEventId
);
150 NS_ENSURE_SUCCESS(rv
, rv
);
152 rv
= aEvent
->GetTime( &mTime
);
153 NS_ENSURE_SUCCESS(rv
, rv
);
155 mEvent
= do_GetWeakReference(aEvent
, &rv
);
156 NS_ENSURE_SUCCESS(rv
, rv
);
162 aaFact::GetTakeFrom(aaIFlow
* *aTakeFrom
)
164 NS_ENSURE_ARG_POINTER( aTakeFrom
);
165 NS_IF_ADDREF( *aTakeFrom
= mTakeFrom
);
169 aaFact::SetTakeFrom(aaIFlow
*aTakeFrom
)
171 NS_ENSURE_TRUE(!mStateFrom
, NS_ERROR_ALREADY_INITIALIZED
);
172 mTakeFrom
= aTakeFrom
;
175 nsCOMPtr
<nsIObserverService
> broadcaster
= do_GetService(
176 "@mozilla.org/observer-service;1");
177 NS_ENSURE_TRUE(broadcaster
, NS_OK
);
178 broadcaster
->NotifyObservers(this, "fact-from-flow-change", nsnull
);
182 aaFact::PickTakeFrom()
188 aaFact::GetGiveTo(aaIFlow
* *aGiveTo
)
190 NS_ENSURE_ARG_POINTER( aGiveTo
);
191 NS_IF_ADDREF( *aGiveTo
= mGiveTo
);
195 aaFact::SetGiveTo(aaIFlow
*aGiveTo
)
197 NS_ENSURE_TRUE(!mStateTo
, NS_ERROR_ALREADY_INITIALIZED
);
201 nsCOMPtr
<nsIObserverService
> broadcaster
= do_GetService(
202 "@mozilla.org/observer-service;1");
203 NS_ENSURE_TRUE(broadcaster
, NS_OK
);
204 broadcaster
->NotifyObservers(this, "fact-to-flow-change", nsnull
);
214 aaFact::GetAmount(double *aAmount
)
216 NS_ENSURE_ARG_POINTER( aAmount
);
221 aaFact::SetAmount(double aAmount
)
233 aaFact::InitStateFrom(aaIState
*aStateFrom
)
235 NS_ENSURE_TRUE(!mStateFrom
, NS_ERROR_ALREADY_INITIALIZED
);
236 if ((!mTakeFrom
|| !mTakeFrom
->PickId()) && !aStateFrom
)
239 nsCOMPtr
<aaIState
> stateFrom
= aStateFrom
;
241 NS_ENSURE_TRUE(mTakeFrom
, NS_ERROR_INVALID_ARG
);
242 NS_ENSURE_ARG_POINTER(aStateFrom
->PickFlow());
243 NS_ENSURE_TRUE(mTakeFrom
->PickId() == aStateFrom
->PickFlow()->PickId(),
244 NS_ERROR_INVALID_ARG
);
245 if (mStateTo
&& mStateTo
->PickFlow()->PickId()) {
246 NS_ENSURE_TRUE(mStateTo
->PickFlow()->PickGiveResource(),
247 NS_ERROR_INVALID_ARG
);
248 NS_ENSURE_TRUE(aStateFrom
->PickFlow()->PickTakeResource(),
249 NS_ERROR_INVALID_ARG
);
250 if (mStateTo
->PickFlow()->PickGiveResource()->PickId() !=
251 aStateFrom
->PickFlow()->PickTakeResource()->PickId())
252 return NS_ERROR_INVALID_ARG
;
256 stateFrom
= do_CreateInstance(AA_STATE_CONTRACT
, &rv
);
257 NS_ENSURE_SUCCESS(rv
, rv
);
260 rv
= stateFrom
->SetFlow(mTakeFrom
);
261 NS_ENSURE_SUCCESS(rv
, rv
);
263 rv
= stateFrom
->ApplyFact(this);
264 NS_ENSURE_SUCCESS(rv
, rv
);
266 mStateFrom
= stateFrom
;
271 aaFact::InitStateTo(aaIState
*aStateTo
)
273 NS_ENSURE_TRUE(!mStateTo
, NS_ERROR_ALREADY_INITIALIZED
);
274 if ((!mGiveTo
|| !mGiveTo
->PickId()) && !aStateTo
)
277 nsCOMPtr
<aaIState
> stateTo
= aStateTo
;
279 NS_ENSURE_TRUE(mGiveTo
, NS_ERROR_INVALID_ARG
);
280 NS_ENSURE_ARG_POINTER(aStateTo
->PickFlow());
281 NS_ENSURE_TRUE(mGiveTo
->PickId() == aStateTo
->PickFlow()->PickId(),
282 NS_ERROR_INVALID_ARG
);
283 if (mStateFrom
&& mStateFrom
->PickFlow()->PickId()) {
284 NS_ENSURE_TRUE(mStateFrom
->PickFlow()->PickTakeResource(),
285 NS_ERROR_INVALID_ARG
);
286 NS_ENSURE_TRUE(aStateTo
->PickFlow()->PickGiveResource(),
287 NS_ERROR_INVALID_ARG
);
288 if (mStateFrom
->PickFlow()->PickTakeResource()->PickId() !=
289 aStateTo
->PickFlow()->PickGiveResource()->PickId())
290 return NS_ERROR_INVALID_ARG
;
294 stateTo
= do_CreateInstance(AA_STATE_CONTRACT
, &rv
);
295 NS_ENSURE_SUCCESS(rv
, rv
);
298 rv
= stateTo
->SetFlow(mGiveTo
);
299 NS_ENSURE_SUCCESS(rv
, rv
);
301 rv
= stateTo
->ApplyFact(this);
302 NS_ENSURE_SUCCESS(rv
, rv
);
309 aaFact::GetStateFrom(aaIState
* * aStateFrom
)
311 NS_ENSURE_ARG_POINTER(aStateFrom
);
312 NS_IF_ADDREF(*aStateFrom
= mStateFrom
);
317 aaFact::GetStateTo(aaIState
* * aStateTo
)
319 NS_ENSURE_ARG_POINTER(aStateTo
);
320 NS_IF_ADDREF(*aStateTo
= mStateTo
);
325 aaFact::GetBroadcasting(PRBool
*aBroadcasting
)
327 NS_ENSURE_ARG_POINTER(aBroadcasting
);
328 *aBroadcasting
= mBroadcasting
;
332 aaFact::SetBroadcasting(PRBool aBroadcasting
)
334 mBroadcasting
= aBroadcasting
;
339 aaFact::UseRule(aaIRule
*aRule
, double aAmount
)
342 nsRefPtr
<aaFact
> newFact
= new aaFact();
344 rv
= aRule
->GetRate(&rate
);
345 NS_ENSURE_SUCCESS(rv
, rv
);
347 rv
= newFact
->SetAmount(rate
* aAmount
);
348 NS_ENSURE_SUCCESS(rv
, rv
);
350 nsCOMPtr
<aaIFlow
> takeFrom
, giveTo
;
351 rv
= aRule
->GetTakeFrom(getter_AddRefs(takeFrom
));
352 NS_ENSURE_SUCCESS(rv
, rv
);
354 rv
= newFact
->SetTakeFrom(takeFrom
);
355 NS_ENSURE_SUCCESS(rv
, rv
);
357 rv
= aRule
->GetGiveTo(getter_AddRefs(giveTo
));
358 NS_ENSURE_SUCCESS(rv
, rv
);
360 rv
= newFact
->SetGiveTo(giveTo
);
361 NS_ENSURE_SUCCESS(rv
, rv
);
363 nsCOMPtr
<nsIMutableArray
> factSet
= do_QueryReferent(mEvent
);
364 rv
= factSet
->AppendElement(newFact
, PR_FALSE
);
365 NS_ENSURE_SUCCESS(rv
, rv
);