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 <abstract/aacore.h>
25 #include "nsComponentManagerUtils.h"
27 #include "nsStringAPI.h"
28 #include "nsWeakReference.h"
31 #include "unstable/mozIStorageConnection.h"
33 /* Project includes */
34 #include <abstract/base/aaIFlow.h>
35 #include <abstract/storage/aaIFilter.h>
36 #include <abstract/storage/aaIStateFilter.h>
37 #include <abstract/storage/aaILoadQuery.h>
38 #include <abstract/storage/aaBaseLoaders.h>
39 #include <abstract/storage/aaAccountLoaders.h>
40 #include <abstract/report/aaIBalanceSheet.h>
41 #include "aaBalanceCounter.h"
42 #include "aaBalanceSheet.h"
44 aaBalanceSheet::aaBalanceSheet(nsISupports
*aOuter
)
45 :mBalanceCount(0), mIncomeCount(0), mHasDate(PR_FALSE
)
46 ,mAssets(0.0), mLiabilities(0.0)
48 nsCOMPtr
<mozIStorageConnection
> connection
= do_QueryInterface(aOuter
);
50 mBalances
= do_CreateInstance(AA_LOADBALANCE_CONTRACT_ID
, connection
);
51 mBalancesInternal
= do_QueryInterface(mBalances
);
52 if (!mBalancesInternal
)
55 mIncomes
= do_CreateInstance(AA_LOADINCOME_CONTRACT_ID
, connection
);
56 mIncomesInternal
= do_QueryInterface(mIncomes
);
57 if (!mIncomesInternal
)
60 mBalanceFilter
= do_CreateInstance(AA_STATEFILTER_CONTRACT_ID
);
64 nsCOMPtr
<aaIFlow
> finres
=do_CreateInstance("@aasii.org/base/income-flow;1");
65 mIncomeFilter
= do_CreateInstance(AA_STATEFILTER_CONTRACT_ID
);
66 mIncomeFilter
->SetFlow(finres
);
70 mConnection
= connection
;
73 aaBalanceSheet::~aaBalanceSheet()
77 NS_IMPL_ISUPPORTS4(aaBalanceSheet
,
85 aaBalanceSheet::GetLength(PRUint32
*aLength
)
87 NS_ENSURE_ARG_POINTER(aLength
);
88 *aLength
= mBalanceCount
+ mIncomeCount
;
93 aaBalanceSheet::QueryElementAt(PRUint32 index
, const nsIID
& uuid
,
96 if (index
< mBalanceCount
)
97 return mBalances
->QueryElementAt(index
, uuid
, result
);
98 else if (index
< mBalanceCount
+ mIncomeCount
)
99 return mIncomes
->QueryElementAt(index
- mBalanceCount
, uuid
, result
);
100 return NS_ERROR_INVALID_ARG
;
104 aaBalanceSheet::IndexOf(PRUint32 startIndex
, nsISupports
*element
,
107 if (startIndex
< mBalanceCount
)
108 return mBalances
->IndexOf(startIndex
, element
, _retval
);
109 else if (startIndex
< mBalanceCount
+ mIncomeCount
)
110 return mIncomes
->IndexOf(startIndex
- mBalanceCount
, element
, _retval
);
111 return NS_ERROR_INVALID_ARG
;
115 aaBalanceSheet::Enumerate(nsISimpleEnumerator
**_retval
)
117 return NS_ERROR_NOT_IMPLEMENTED
;
122 aaBalanceSheet::Load()
126 rv
= mBalanceFilter
->SetDate(mDate
);
127 NS_ENSURE_SUCCESS(rv
, rv
);
128 rv
= mIncomeFilter
->SetDate(mDate
);
129 NS_ENSURE_SUCCESS(rv
, rv
);
130 rv
= mBalances
->SetFilter(mBalanceFilter
);
131 NS_ENSURE_SUCCESS(rv
, rv
);
132 rv
= mIncomes
->SetFilter(mIncomeFilter
);
133 NS_ENSURE_SUCCESS(rv
, rv
);
135 aaBalanceCounter counter
;
136 rv
= mBalancesInternal
->SetLoadObserver(&counter
);
137 NS_ENSURE_SUCCESS(rv
, rv
);
138 rv
= mBalances
->Load();
139 NS_ENSURE_SUCCESS(rv
, rv
);
140 rv
= mBalances
->GetLength(&mBalanceCount
);
141 NS_ENSURE_SUCCESS(rv
, rv
);
142 mAssets
= counter
.GetAssets();
143 mLiabilities
= counter
.GetLiabilities();
146 rv
= mIncomesInternal
->SetLoadObserver(&counter
);
147 NS_ENSURE_SUCCESS(rv
, rv
);
148 rv
= mIncomes
->Load();
149 NS_ENSURE_SUCCESS(rv
, rv
);
150 rv
= mIncomes
->GetLength(&mIncomeCount
);
151 NS_ENSURE_SUCCESS(rv
, rv
);
152 mAssets
+= counter
.GetAssets();
153 mLiabilities
+= counter
.GetLiabilities();
160 aaBalanceSheet::GetFilter(aaIFilter
* * aFilter
)
162 NS_ENSURE_ARG_POINTER(aFilter
);
163 NS_IF_ADDREF(*aFilter
= this);
167 aaBalanceSheet::SetFilter(aaIFilter
* aFilter
)
169 return NS_ERROR_NOT_AVAILABLE
;
172 aaBalanceSheet::PickFilter()
179 aaBalanceSheet::GetExpression(nsACString
& aExpression
)
181 aExpression
.Truncate();
185 /* aaIBalanceSheet */
187 aaBalanceSheet::GetDate(PRTime
*aDate
)
192 aaBalanceSheet::SetDate(PRTime aDate
)
199 aaBalanceSheet::PickDate()
205 aaBalanceSheet::GetTotalAssets(double *aTotalAssets
)
207 NS_ENSURE_ARG_POINTER(aTotalAssets
);
208 *aTotalAssets
= mAssets
;
213 aaBalanceSheet::GetTotalLiabilities(double *aTotalLiabilities
)
215 NS_ENSURE_ARG_POINTER(aTotalLiabilities
);
216 *aTotalLiabilities
= mLiabilities
;