30 #include <nsComponentManagerUtils.h>
32 #include <nsStringAPI.h>
35 #include <nsISimpleEnumerator.h>
42 #include <sbIMediaItem.h>
43 #include <sbIMediaList.h>
57 sbMediaListDuplicateFilter::sbMediaListDuplicateFilter() :
63 mRemoveDuplicates(PR_FALSE)
68 sbMediaListDuplicateFilter::~sbMediaListDuplicateFilter()
71 nsAutoMonitor::DestroyMonitor(mMonitor);
78 PRBool aRemoveDuplicates)
80 NS_ENSURE_ARG_POINTER(aSource);
81 NS_ENSURE_ARG_POINTER(aDest);
83 nsresult rv = NS_ERROR_UNEXPECTED;
85 mMonitor = nsAutoMonitor::NewMonitor(
"sbMediaListDuplicateFilter::mMonitor");
86 NS_ENSURE_TRUE(mMonitor, NS_ERROR_OUT_OF_MEMORY);
88 nsCOMPtr<sbIMutablePropertyArray> propArray =
90 NS_ENSURE_SUCCESS(rv, rv);
93 rv = propArray->SetStrict(PR_FALSE);
94 NS_ENSURE_SUCCESS(rv, rv);
96 for (PRUint32 index = 0;
97 index < mSBPropKeysLength;
100 mSBPropKeys.AppendElement(prop);
101 propArray->AppendProperty(prop, EmptyString());
104 mSBPropertyArray = do_QueryInterface(propArray, &rv);
105 NS_ENSURE_SUCCESS(rv, rv);
107 mRemoveDuplicates = aRemoveDuplicates;
115 sbMediaListDuplicateFilter::GetDuplicateItems(PRUint32 * aDuplicateItems)
117 NS_ENSURE_ARG_POINTER(aDuplicateItems);
118 nsAutoMonitor mon(mMonitor);
119 *aDuplicateItems = mDuplicateItems;
124 sbMediaListDuplicateFilter::GetTotalItems(PRUint32 * aTotalItems)
126 NS_ENSURE_ARG_POINTER(aTotalItems);
127 nsAutoMonitor mon(mMonitor);
128 *aTotalItems = mTotalItems;
135 sbMediaListDuplicateFilter::HasMoreElements(PRBool *aMore)
137 NS_ENSURE_ARG_POINTER(aMore);
141 *aMore = mCurrentItem != nsnull;
146 sbMediaListDuplicateFilter::GetNext(
nsISupports ** aItem)
148 NS_ENSURE_ARG_POINTER(aItem);
156 return NS_ERROR_FAILURE;
159 rv = CallQueryInterface(mCurrentItem, aItem);
160 NS_ENSURE_SUCCESS(rv, rv);
162 mCurrentItem = nsnull;
170 sbMediaListDuplicateFilter::OnEnumerationBegin(
sbIMediaList *aMediaList,
173 NS_ENSURE_ARG_POINTER(_retval);
180 sbMediaListDuplicateFilter::OnEnumeratedItem(
sbIMediaList *aMediaList,
184 NS_ENSURE_ARG_POINTER(aMediaItem);
185 NS_ENSURE_ARG_POINTER(_retval);
187 nsresult rv = SaveItemKeys(aMediaItem);
188 NS_ENSURE_SUCCESS(rv, rv);
195 sbMediaListDuplicateFilter::OnEnumerationEnd(
sbIMediaList *aMediaList,
196 nsresult aStatusCode)
204 sbMediaListDuplicateFilter::SaveItemKeys(
sbIMediaItem * aItem)
209 nsAutoMonitor mon(mMonitor);
211 rv = aItem->GetProperties(mSBPropertyArray, getter_AddRefs(mItemProperties));
212 NS_ENSURE_SUCCESS(rv, rv);
214 nsCOMPtr<sbIProperty> property;
215 for (PRUint32 index = 0;
216 index < mSBPropKeysLength;
218 rv = mItemProperties->GetPropertyAt(index, getter_AddRefs(property));
219 if (NS_SUCCEEDED(rv)) {
220 rv =
property->GetValue(key);
221 if (NS_SUCCEEDED(rv) && !key.IsEmpty()) {
222 NS_ENSURE_TRUE(mKeys.PutEntry(key), NS_ERROR_OUT_OF_MEMORY);
230 sbMediaListDuplicateFilter::IsDuplicate(
sbIMediaItem * aItem,
233 aIsDuplicate =
false;
240 rv = aItem->GetProperties(mSBPropertyArray, getter_AddRefs(mItemProperties));
241 NS_ENSURE_SUCCESS(rv, rv);
243 nsCOMPtr<sbIProperty> property;
244 for (PRUint32 index = 0;
245 index < mSBPropKeysLength;
247 rv = mItemProperties->GetPropertyAt(index, getter_AddRefs(property));
248 if (NS_SUCCEEDED(rv)) {
249 property->GetValue(key);
250 if (mKeys.GetEntry(key)) {
260 sbMediaListDuplicateFilter::Advance()
264 nsAutoMonitor mon(mMonitor);
268 if (mRemoveDuplicates) {
270 NS_ENSURE_SUCCESS(rv, rv);
273 mInitialized = PR_TRUE;
277 rv = mSource->HasMoreElements(&more);
278 NS_ENSURE_SUCCESS(rv, rv);
280 mCurrentItem = nsnull;
281 while (more && !mCurrentItem) {
282 nsCOMPtr<nsISupports> supports;
283 rv = mSource->GetNext(getter_AddRefs(supports));
284 NS_ENSURE_SUCCESS(rv, rv);
285 mCurrentItem = do_QueryInterface(supports);
288 if (mRemoveDuplicates) {
289 bool isDuplicate =
false;
290 rv = IsDuplicate(mCurrentItem, isDuplicate);
291 NS_ENSURE_SUCCESS(rv, rv);
295 mCurrentItem = nsnull;
#define SB_PROPERTY_ORIGINURL
#define SB_PROPERTY_CONTENTURL
#define SB_PROPERTY_ORIGINITEMGUID