34 #include <nsArrayUtils.h>
35 #include <nsComponentManagerUtils.h>
37 #include <nsIMutableArray.h>
38 #include <nsIObjectOutputStream.h>
39 #include <nsIObjectInputStream.h>
40 #include <nsISimpleEnumerator.h>
41 #include <nsITreeView.h>
42 #include <nsServiceManagerUtils.h>
43 #include <nsISupportsPrimitives.h>
47 #include <sbIDatabaseQuery.h>
48 #include <sbIDatabaseResult.h>
49 #include <sbIFilterableMediaListView.h>
50 #include <sbILibraryConstraints.h>
51 #include <sbILocalDatabaseAsyncGUIDArray.h>
52 #include <sbILocalDatabaseLibrary.h>
53 #include <sbIMediaList.h>
54 #include <sbIMediaListView.h>
55 #include <sbIPropertyArray.h>
56 #include <sbIPropertyInfo.h>
57 #include <sbIPropertyManager.h>
58 #include <sbISQLBuilder.h>
59 #include <sbISearchableMediaListView.h>
70 static PRLogModuleInfo* sFilterSetLog = nsnull;
71 #define TRACE(args) if (sFilterSetLog) PR_LOG(sFilterSetLog, PR_LOG_DEBUG, args)
72 #define LOG(args) if (sFilterSetLog) PR_LOG(sFilterSetLog, PR_LOG_WARN, args)
85 mArray->SuppressInvalidation(PR_TRUE);
89 mArray->SuppressInvalidation(PR_FALSE);
92 nsCOMPtr<sbILocalDatabaseGUIDArray> mArray;
96 mMediaListView(aMediaListView)
99 NS_ASSERTION(aMediaListView,
"aMediaListView is null");
101 if (!sFilterSetLog) {
102 sFilterSetLog = PR_NewLogModule(
"sbLocalDatabaseCascadeFilterSet");
105 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - Constructed",
this));
110 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - Destructed",
this));
114 mMediaList->RemoveListener(
this);
128 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - Init",
this));
129 NS_ENSURE_ARG_POINTER(aLibrary);
130 NS_ENSURE_ARG_POINTER(aProtoArray);
131 NS_ENSURE_STATE(mMediaListView);
138 mProtoArray = aProtoArray;
140 rv = mProtoArray->ClearFilters();
141 NS_ENSURE_SUCCESS(rv, rv);
143 rv = mProtoArray->ClearSorts();
144 NS_ENSURE_SUCCESS(rv, rv);
146 rv = ApplyConstraintFilters(mProtoArray);
147 NS_ENSURE_SUCCESS(rv, rv);
149 rv = mProtoArray->SetIsDistinct(PR_TRUE);
150 NS_ENSURE_SUCCESS(rv, rv);
152 rv = mProtoArray->SetDistinctWithSortableValues(PR_TRUE);
153 NS_ENSURE_SUCCESS(rv, rv);
155 PRBool success = mListeners.Init();
156 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
158 rv = mMediaListView->GetMediaList(getter_AddRefs(mMediaList));
159 NS_ENSURE_SUCCESS(rv, rv);
167 nsCOMPtr<nsISupports> supports = do_QueryInterface(aState);
168 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - restoring state [0x%.8x] %s",
169 this, supports.get(), NS_LossyConvertUTF16toASCII(buff).get()));
173 for (PRUint32
i = 0;
i < aState->
mFilters.Length();
i++) {
177 sbFilterSpec* fs = mFilters.AppendElement();
178 NS_ENSURE_TRUE(fs, NS_ERROR_OUT_OF_MEMORY);
182 nsString* added = fs->propertyList.AppendElements(spec.
propertyList);
183 NS_ENSURE_TRUE(added, NS_ERROR_OUT_OF_MEMORY);
184 added = fs->values.AppendElements(spec.
values);
185 NS_ENSURE_TRUE(added, NS_ERROR_OUT_OF_MEMORY);
189 NS_ENSURE_SUCCESS(rv, rv);
192 rv = ConfigureFilterArray(fs, spec.
property);
193 NS_ENSURE_SUCCESS(rv, rv);
196 rv = ConfigureArray(
i);
197 NS_ENSURE_SUCCESS(rv, rv);
200 nsRefPtr<sbLocalDatabaseTreeView>
treeView =
202 NS_ENSURE_TRUE(treeView, NS_ERROR_OUT_OF_MEMORY);
204 rv = treeView->Init(mMediaListView,
208 NS_ENSURE_SUCCESS(rv, rv);
215 rv = UpdateListener(PR_FALSE);
216 NS_ENSURE_SUCCESS(rv, rv);
222 sbLocalDatabaseCascadeFilterSet::GetLength(PRUint16* aLength)
224 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - GetLength",
this));
225 NS_ENSURE_ARG_POINTER(aLength);
227 *aLength = mFilters.Length();
236 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - GetProperty",
this));
237 PRUint32 filterLength = mFilters.Length();
238 NS_ENSURE_TRUE(filterLength, NS_ERROR_UNEXPECTED);
239 NS_ENSURE_ARG_MAX(aIndex, filterLength - 1);
241 _retval = mFilters[aIndex].property;
247 sbLocalDatabaseCascadeFilterSet::IsSearch(PRUint16 aIndex,
250 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - IsSearch",
this));
251 NS_ENSURE_ARG_POINTER(_retval);
252 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
254 *_retval = mFilters[aIndex].isSearch;
260 sbLocalDatabaseCascadeFilterSet::AppendFilter(
const nsAString& aProperty,
263 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - AppendFilter",
this));
264 NS_ENSURE_ARG_POINTER(_retval);
268 sbFilterSpec* fs = mFilters.AppendElement();
269 NS_ENSURE_TRUE(fs, NS_ERROR_OUT_OF_MEMORY);
271 fs->isSearch = PR_FALSE;
272 fs->property = aProperty;
274 rv = ConfigureFilterArray(fs, aProperty);
275 NS_ENSURE_SUCCESS(rv, rv);
277 rv = ConfigureArray(mFilters.Length() - 1);
278 NS_ENSURE_SUCCESS(rv, rv);
280 *_retval = mFilters.Length() - 1;
282 rv = UpdateListener();
283 NS_ENSURE_SUCCESS(rv, rv);
289 sbLocalDatabaseCascadeFilterSet::AppendSearch(
const PRUnichar** aPropertyArray,
290 PRUint32 aPropertyArrayCount,
293 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - AppendSearch",
this));
294 if (aPropertyArrayCount) {
295 NS_ENSURE_ARG_POINTER(aPropertyArray);
297 NS_ENSURE_ARG_POINTER(_retval);
302 for (PRUint32
i = 0;
i < mFilters.Length();
i++) {
304 return NS_ERROR_INVALID_ARG;
308 sbFilterSpec* fs = mFilters.AppendElement();
309 NS_ENSURE_TRUE(fs, NS_ERROR_OUT_OF_MEMORY);
311 fs->isSearch = PR_TRUE;
313 for (PRUint32
i = 0;
i < aPropertyArrayCount;
i++) {
314 if (aPropertyArray[
i]) {
315 nsString* success = fs->propertyList.AppendElement(aPropertyArray[i]);
316 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
319 NS_WARNING(
"Null pointer passed in array");
324 NS_ENSURE_SUCCESS(rv, rv);
326 rv = ConfigureArray(mFilters.Length() - 1);
327 NS_ENSURE_SUCCESS(rv, rv);
329 *_retval = mFilters.Length() - 1;
331 rv = UpdateListener();
332 NS_ENSURE_SUCCESS(rv, rv);
338 sbLocalDatabaseCascadeFilterSet::Remove(PRUint16 aIndex)
340 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - Remove",
this));
341 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
345 sbFilterSpec& fs = mFilters[aIndex];
348 if (fs.arrayListener)
349 fs.array->RemoveAsyncListener(fs.arrayListener);
351 mFilters.RemoveElementAt(aIndex);
354 for (PRUint32 i = aIndex; i < mFilters.Length(); i++) {
355 rv = ConfigureArray(i);
356 NS_ENSURE_SUCCESS(rv, rv);
359 mListeners.EnumerateEntries(OnValuesChangedCallback, &i);
362 rv = UpdateListener();
363 NS_ENSURE_SUCCESS(rv, rv);
367 if (mMediaListView) {
369 NS_ENSURE_SUCCESS(rv, rv);
384 sbLocalDatabaseCascadeFilterSet::ChangeFilter(PRUint16 aIndex,
385 const nsAString& aProperty)
387 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - ChangeFilter",
this));
388 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
392 sbFilterSpec& fs = mFilters[aIndex];
394 return NS_ERROR_INVALID_ARG;
396 fs.property = aProperty;
397 fs.invalidationPending = PR_FALSE;
399 rv = fs.array->ClearSorts();
400 NS_ENSURE_SUCCESS(rv, rv);
402 rv = fs.array->AddSort(aProperty, PR_TRUE);
403 NS_ENSURE_SUCCESS(rv, rv);
406 rv = ConfigureArray(aIndex);
407 NS_ENSURE_SUCCESS(rv, rv);
409 rv = UpdateListener();
410 NS_ENSURE_SUCCESS(rv, rv);
413 nsCOMPtr<nsITreeSelection> selection;
414 rv = fs.treeView->GetSelection(getter_AddRefs(selection));
417 rv = selection->ClearSelection();
418 NS_ENSURE_SUCCESS(rv, rv);
424 if (mMediaListView) {
426 NS_ENSURE_SUCCESS(rv, rv);
436 sbLocalDatabaseCascadeFilterSet::Set(PRUint16 aIndex,
437 const PRUnichar** aValueArray,
438 PRUint32 aValueArrayCount)
443 for (PRUint32 i = 0; i < aValueArrayCount && aValueArray; i++) {
444 buff.Append(aValueArray[i]);
445 if (i + 1 < aValueArrayCount) {
446 buff.AppendLiteral(
", ");
449 if (!aValueArrayCount) {
450 buff.AssignLiteral(
"no values");
452 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - Set %d, %d [%s]",
453 this, aIndex, aValueArrayCount,
454 NS_LossyConvertUTF16toASCII(buff).
get()));
457 if (aValueArrayCount) {
458 NS_ENSURE_ARG_POINTER(aValueArray);
460 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
464 sbFilterSpec& fs = mFilters[aIndex];
467 for (PRUint32 i = 0; i < aValueArrayCount; i++) {
468 if (aValueArray[i]) {
469 nsString*
value = fs.values.AppendElement(aValueArray[i]);
470 NS_ENSURE_TRUE(value, NS_ERROR_OUT_OF_MEMORY);
473 NS_WARNING(
"Null pointer passed in array");
478 for (PRUint32 i = aIndex + 1; i < mFilters.Length(); i++) {
482 sbFilterSpec& downstream = mFilters[
i];
483 downstream.values.Clear();
485 if (downstream.treeView) {
486 nsCOMPtr<nsITreeSelection> selection;
487 rv = downstream.treeView->GetSelection(getter_AddRefs(selection));
490 rv = selection->ClearSelection();
491 NS_ENSURE_SUCCESS(rv, rv);
495 rv = ConfigureArray(i);
496 NS_ENSURE_SUCCESS(rv, rv);
499 mListeners.EnumerateEntries(OnValuesChangedCallback, &i);
504 if (mMediaListView) {
506 NS_ENSURE_SUCCESS(rv, rv);
521 sbLocalDatabaseCascadeFilterSet::Get(PRUint16 aIndex,
524 NS_ENSURE_ARG_POINTER(_retval);
526 nsresult rv = NS_ERROR_UNEXPECTED;
527 nsCOMPtr<nsIMutableArray> outArr =
528 do_CreateInstance(
"@songbirdnest.com/moz/xpcom/threadsafe-array;1", &rv);
529 NS_ENSURE_SUCCESS(rv, rv);
531 nsCOMPtr<nsISupportsString> supportsStr;
532 sbFilterSpec& fs = mFilters[aIndex];
533 for (PRUint32 i = 0; i < fs.values.Length(); i++) {
534 supportsStr = do_CreateInstance(
"@mozilla.org/supports-string;1", &rv);
535 NS_ENSURE_SUCCESS(rv, rv);
536 supportsStr->SetData(fs.values[i]);
538 outArr->AppendElement(supportsStr, PR_FALSE);
541 NS_ADDREF(*_retval = outArr);
546 sbLocalDatabaseCascadeFilterSet::ClearAll()
550 PRBool filterChanged = PR_FALSE, searchChanged = PR_FALSE;
552 for (PRUint32 i = 0; i < mFilters.Length(); i++) {
553 sbFilterSpec& fs = mFilters[
i];
556 if (!searchChanged) {
557 searchChanged = PR_TRUE;
560 else if (!filterChanged) {
561 filterChanged = PR_TRUE;
565 rv = ConfigureArray(i);
566 NS_ENSURE_SUCCESS(rv, rv);
569 if (mMediaListView) {
571 NS_ENSURE_SUCCESS(rv, rv);
586 sbLocalDatabaseCascadeFilterSet::GetValues(PRUint16 aIndex,
589 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - GetValues",
this));
590 NS_ENSURE_ARG_POINTER(_retval);
591 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
595 NS_ENSURE_TRUE(values, NS_ERROR_OUT_OF_MEMORY);
597 NS_ADDREF(*_retval = values);
602 sbLocalDatabaseCascadeFilterSet::GetValueAt(PRUint16 aIndex,
603 PRUint32 aValueIndex,
606 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - GetValueAt",
this));
607 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
609 mFilters[aIndex].array->GetSortPropertyValueByIndex(aValueIndex, aValue);
615 sbLocalDatabaseCascadeFilterSet::GetTreeView(PRUint16 aIndex,
618 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - GetTreeView",
this));
619 NS_ENSURE_ARG_POINTER(_retval);
620 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
621 NS_ENSURE_STATE(mMediaListView);
623 sbFilterSpec& fs = mFilters[aIndex];
626 return NS_ERROR_INVALID_ARG;
633 nsCOMPtr<sbIMutablePropertyArray> propArray =
635 NS_ENSURE_SUCCESS(rv, rv);
637 rv = propArray->SetStrict(PR_FALSE);
638 NS_ENSURE_SUCCESS(rv, rv);
640 rv = propArray->AppendProperty(fs.property, NS_LITERAL_STRING(
"a"));
641 NS_ENSURE_SUCCESS(rv, rv);
643 nsRefPtr<sbLocalDatabaseTreeView> newTreeView =
645 NS_ENSURE_TRUE(newTreeView, NS_ERROR_OUT_OF_MEMORY);
647 rv = newTreeView->Init(mMediaListView, fs.array, propArray, nsnull);
648 NS_ENSURE_SUCCESS(rv, rv);
650 fs.treeView = newTreeView;
653 NS_ADDREF(*_retval = fs.treeView);
659 sbLocalDatabaseCascadeFilterSet::GetValueCount(PRUint16 aIndex,
663 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - GetValueCount",
this));
664 NS_ENSURE_ARG_POINTER(_retval);
665 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
668 *_retval = mFilters[aIndex].cachedValueCount;
672 nsresult rv = mFilters[aIndex].array->GetLength(&valueCount);
673 NS_ENSURE_SUCCESS(rv, rv);
675 NS_ENSURE_SUCCESS(rv, rv);
676 *_retval = valueCount;
685 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - AddListener",
this));
686 nsISupportsHashKey* success = mListeners.PutEntry(aListener);
687 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
695 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - RemoveListener",
this));
697 mListeners.RemoveEntry(aListener);
705 NS_ENSURE_ARG_POINTER(mArray);
710 nsCOMPtr<sbIPropertyManager> propMan =
712 NS_ENSURE_SUCCESS(rv, rv);
714 PRUint32 numFilters = mFilters.Length();
715 for (PRUint32 i = 0; i < numFilters; i++) {
716 const sbFilterSpec&
filter = mFilters[
i];
719 if (filter.values.Length() == 0) {
723 if (filter.isSearch) {
729 PRUint32
length = filter.propertyList.Length();
730 for (PRUint32 j = 0; j <
length; j++) {
731 nsCOMPtr<sbIPropertyInfo> info;
732 rv = propMan->GetPropertyInfo(filter.propertyList[j],
733 getter_AddRefs(info));
734 NS_ENSURE_SUCCESS(rv, rv);
736 PRUint32 valuesLength = filter.values.Length();
737 sbStringArray valueArray(valuesLength);
739 for(PRUint32 k = 0; k < valuesLength; k++) {
740 nsString sortableValue;
741 rv = info->MakeSortable(filter.values[k], sortableValue);
742 NS_ENSURE_SUCCESS(rv, rv);
743 nsString* successString = valueArray.AppendElement(sortableValue);
744 NS_ENSURE_TRUE(successString, NS_ERROR_OUT_OF_MEMORY);
747 nsCOMPtr<nsIStringEnumerator> valueEnum =
749 NS_ENSURE_TRUE(valueEnum, NS_ERROR_OUT_OF_MEMORY);
751 rv = mArray->AddFilter(filter.propertyList[j], valueEnum, PR_TRUE);
752 NS_ENSURE_SUCCESS(rv, rv);
756 nsCOMPtr<sbIPropertyInfo> info;
757 rv = propMan->GetPropertyInfo(filter.property, getter_AddRefs(info));
758 NS_ENSURE_SUCCESS(rv, rv);
760 PRUint32
length = filter.values.Length();
761 sbStringArray sortableValueArray(length);
762 for (PRUint32 i = 0; i <
length; i++) {
763 nsAutoString sortableValue;
765 sortableValue = filter.values[
i];
768 rv = info->MakeSortable(filter.values[i], sortableValue);
769 NS_ENSURE_SUCCESS(rv, rv);
771 nsString* appended = sortableValueArray.AppendElement(sortableValue);
772 NS_ENSURE_TRUE(appended, NS_ERROR_OUT_OF_MEMORY);
775 nsCOMPtr<nsIStringEnumerator> valueEnum =
777 NS_ENSURE_TRUE(valueEnum, NS_ERROR_OUT_OF_MEMORY);
779 rv = mArray->AddFilter(filter.property, valueEnum, PR_FALSE);
780 NS_ENSURE_SUCCESS(rv, rv);
791 NS_ENSURE_ARG_POINTER(aBuilder);
792 NS_ENSURE_ARG_POINTER(aChanged);
795 *aChanged = PR_FALSE;
796 PRUint32 numFilters = mFilters.Length();
797 for (PRUint32 i = 0; i < numFilters; i++) {
798 const sbFilterSpec&
filter = mFilters[
i];
800 if (!filter.isSearch && filter.values.Length()) {
803 rv = aBuilder->Intersect(nsnull);
804 NS_ENSURE_SUCCESS(rv, rv);
806 nsCOMPtr<nsIStringEnumerator> values =
808 NS_ENSURE_TRUE(values, NS_ERROR_OUT_OF_MEMORY);
810 rv = aBuilder->IncludeList(filter.property, values, nsnull);
811 NS_ENSURE_SUCCESS(rv, rv);
822 NS_ENSURE_ARG_POINTER(aBuilder);
823 NS_ENSURE_ARG_POINTER(aChanged);
826 *aChanged = PR_FALSE;
827 PRUint32 numFilters = mFilters.Length();
828 for (PRUint32 i = 0; i < numFilters; i++) {
829 const sbFilterSpec&
filter = mFilters[
i];
831 if (filter.isSearch && filter.values.Length()) {
833 PRUint32 numProperties = filter.propertyList.Length();
834 PRUint32 numValues = filter.values.Length();
835 for (PRUint32 j = 0; j < numValues; j++) {
837 for (PRUint32 k = 0; k < numProperties; k++) {
838 rv = aBuilder->Include(filter.propertyList[k],
841 NS_ENSURE_SUCCESS(rv, rv);
844 if (j + 1 < numValues) {
845 rv = aBuilder->Intersect(nsnull);
846 NS_ENSURE_SUCCESS(rv, rv);
858 PRUint32 numFilters = mFilters.Length();
859 for (PRUint32 i = 0; i < numFilters; i++) {
860 sbFilterSpec&
filter = mFilters[
i];
862 if (!filter.isSearch) {
863 filter.values.Clear();
872 PRUint32 numFilters = mFilters.Length();
873 for (PRUint32 i = 0; i < numFilters; i++) {
874 sbFilterSpec&
filter = mFilters[
i];
876 if (filter.isSearch) {
877 filter.values.Clear();
886 mMediaListView = nsnull;
892 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - GetState",
this));
893 NS_ASSERTION(aState,
"aState is null");
895 nsRefPtr<sbLocalDatabaseCascadeFilterSetState> state =
897 NS_ENSURE_TRUE(state, NS_ERROR_OUT_OF_MEMORY);
900 PRUint32 numFilters = mFilters.Length();
901 for (PRUint32 i = 0; i < numFilters; i++) {
902 sbFilterSpec& fs = mFilters[
i];
905 state->mFilters.AppendElement();
906 NS_ENSURE_TRUE(spec, NS_ERROR_OUT_OF_MEMORY);
911 nsString* added = spec->
propertyList.AppendElements(fs.propertyList);
912 NS_ENSURE_TRUE(added, NS_ERROR_OUT_OF_MEMORY);
914 added = spec->
values.AppendElements(fs.values);
915 NS_ENSURE_TRUE(added, NS_ERROR_OUT_OF_MEMORY);
918 rv = fs.treeView->GetState(getter_AddRefs(spec->
treeViewState));
919 NS_ENSURE_SUCCESS(rv, rv);
926 state->ToString(buff);
927 nsCOMPtr<nsISupports> supports = do_QueryInterface(state);
928 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - returning state [0x%.8x] %s",
929 this, supports.get(), NS_LossyConvertUTF16toASCII(buff).get()));
933 NS_ADDREF(*aState = state);
941 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - OnGetLength(%d, %d)",
942 this, aIndex, aLength));
943 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
945 PRUint32 index = aIndex;
946 if (aLength != mFilters[index].cachedValueCount) {
947 mFilters[index].cachedValueCount = aLength;
950 mListeners.EnumerateEntries(OnValuesChangedCallback, &index);
957 sbLocalDatabaseCascadeFilterSet::ConfigureArray(PRUint32 aIndex)
959 TRACE((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - ConfigureArray",
this));
960 NS_ENSURE_TRUE(aIndex < mFilters.Length(), NS_ERROR_INVALID_ARG);
964 sbFilterSpec& fs = mFilters[aIndex];
965 fs.arrayListener->mIndex = aIndex;
972 rv = fs.array->ClearFilters();
973 NS_ENSURE_SUCCESS(rv, rv);
975 rv = ApplyConstraintFilters(fs.array);
976 NS_ENSURE_SUCCESS(rv, rv);
978 nsCOMPtr<sbIPropertyManager> propMan =
980 NS_ENSURE_SUCCESS(rv, rv);
983 for (PRUint32 i = 0; i < aIndex; i++) {
984 const sbFilterSpec& upstream = mFilters[
i];
986 if (upstream.values.Length() > 0) {
988 if(upstream.isSearch) {
990 for (PRUint32 j = 0; j < upstream.propertyList.Length(); j++) {
992 nsCOMPtr<sbIPropertyInfo> info;
993 rv = propMan->GetPropertyInfo(upstream.propertyList[j],
994 getter_AddRefs(info));
995 NS_ENSURE_SUCCESS(rv, rv);
998 for (PRUint32 k = 0; k < upstream.values.Length(); k++) {
999 nsAutoString sortableValue;
1000 rv = info->MakeSortable(upstream.values[k], sortableValue);
1001 NS_ENSURE_SUCCESS(rv, rv);
1003 nsString* success = sortableValues.AppendElement(sortableValue);
1004 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
1007 nsCOMPtr<nsIStringEnumerator> values =
1010 NS_ENSURE_TRUE(values, NS_ERROR_OUT_OF_MEMORY);
1012 rv = fs.array->AddFilter(upstream.propertyList[j],
1015 NS_ENSURE_SUCCESS(rv, rv);
1021 nsCOMPtr<sbIPropertyInfo> info;
1022 rv = propMan->GetPropertyInfo(upstream.property, getter_AddRefs(info));
1023 NS_ENSURE_SUCCESS(rv, rv);
1026 for (PRUint32 k = 0; k < upstream.values.Length(); k++) {
1027 nsAutoString sortableValue;
1028 rv = info->MakeSortable(upstream.values[k], sortableValue);
1029 NS_ENSURE_SUCCESS(rv, rv);
1031 nsString* success = sortableValues.AppendElement(sortableValue);
1032 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
1035 nsCOMPtr<nsIStringEnumerator> values =
1038 NS_ENSURE_TRUE(values, NS_ERROR_OUT_OF_MEMORY);
1040 rv = fs.array->AddFilter(upstream.property,
1043 NS_ENSURE_SUCCESS(rv, rv);
1052 sbLocalDatabaseCascadeFilterSet::ConfigureFilterArray(sbFilterSpec* aSpec,
1053 const nsAString& aSortProperty)
1055 NS_ASSERTION(aSpec,
"aSpec is null");
1059 rv = mProtoArray->CloneAsyncArray(getter_AddRefs(aSpec->array));
1060 NS_ENSURE_SUCCESS(rv, rv);
1069 NS_ENSURE_SUCCESS(rv, rv);
1071 rv = aSpec->array->AddSort(aSortProperty, PR_TRUE);
1072 NS_ENSURE_SUCCESS(rv, rv);
1075 NS_ENSURE_TRUE(aSpec->arrayListener, NS_ERROR_OUT_OF_MEMORY);
1076 rv = aSpec->arrayListener->Init(
this);
1077 NS_ENSURE_SUCCESS(rv, rv);
1078 rv = aSpec->array->AddAsyncListener(aSpec->arrayListener);
1079 NS_ENSURE_SUCCESS(rv, rv);
1081 nsCOMPtr<sbILocalDatabasePropertyCache> propertyCache;
1082 rv = mLibrary->GetPropertyCache(getter_AddRefs(propertyCache));
1083 NS_ENSURE_SUCCESS(rv, rv);
1085 rv = aSpec->array->SetPropertyCache(propertyCache);
1086 NS_ENSURE_SUCCESS(rv, rv);
1092 sbLocalDatabaseCascadeFilterSet::InvalidateFilter(sbFilterSpec& aFilter)
1094 LOG((
"sbLocalDatabaseCascadeFilterSet[0x%.8x] - Invalidating %s",
1095 this, NS_ConvertUTF16toUTF8(aFilter.property).get()));
1100 nsresult rv = aFilter.array->Invalidate(PR_TRUE);
1101 NS_ENSURE_SUCCESS(rv, rv);
1103 aFilter.invalidationPending = PR_FALSE;
1109 sbLocalDatabaseCascadeFilterSet::UpdateListener(PRBool aRemoveListener)
1111 NS_ENSURE_STATE(mMediaList);
1115 nsCOMPtr<sbIMediaListListener>
listener =
1118 if (aRemoveListener) {
1119 rv = mMediaList->RemoveListener(listener);
1120 NS_ENSURE_SUCCESS(rv, rv);
1123 nsCOMPtr<sbIMutablePropertyArray>
filter =
1125 NS_ENSURE_SUCCESS(rv, rv);
1127 nsAutoString voidString;
1128 voidString.SetIsVoid(PR_TRUE);
1131 for (PRUint32 i = 0; i < mFilters.Length(); i++) {
1132 sbFilterSpec& fs = mFilters[
i];
1134 rv = filter->AppendProperty(mFilters[i].property, voidString);
1135 NS_ENSURE_SUCCESS(rv, rv);
1141 rv = mMediaList->AddListener(listener,
1146 NS_ENSURE_SUCCESS(rv, rv);
1156 nsCOMPtr<sbILibraryConstraint> constraint;
1160 if (mMediaListView) {
1162 if (NS_FAILED(rv)) {
1163 constraint = nsnull;
1169 nsAutoTArray<nsString, 1> values;
1170 nsString* appended = values.AppendElement(NS_LITERAL_STRING(
"0"));
1171 NS_ENSURE_TRUE(appended, NS_ERROR_OUT_OF_MEMORY);
1173 nsCOMPtr<nsIStringEnumerator> valuesEnum =
1175 NS_ENSURE_TRUE(valuesEnum, NS_ERROR_OUT_OF_MEMORY);
1180 NS_ENSURE_SUCCESS(rv, rv);
1183 NS_ENSURE_TRUE(valuesEnum, NS_ERROR_OUT_OF_MEMORY);
1188 NS_ENSURE_SUCCESS(rv, rv);
1192 nsCOMPtr<sbIPropertyManager> propMan =
1194 NS_ENSURE_SUCCESS(rv, rv);
1196 nsCOMPtr<nsISimpleEnumerator> groupEnum;
1197 rv = constraint->GetGroups(getter_AddRefs(groupEnum));
1198 NS_ENSURE_SUCCESS(rv, rv);
1201 while (NS_SUCCEEDED(groupEnum->HasMoreElements(&hasMore)) && hasMore) {
1202 nsCOMPtr<nsISupports> groupSupports;
1203 rv = groupEnum->GetNext(getter_AddRefs(groupSupports));
1204 NS_ENSURE_SUCCESS(rv, rv);
1206 nsCOMPtr<sbILibraryConstraintGroup>
group(do_QueryInterface(groupSupports));
1207 NS_ENSURE_TRUE(
group, NS_ERROR_NO_INTERFACE);
1209 nsCOMPtr<nsIStringEnumerator> propEnum;
1210 rv =
group->GetProperties(getter_AddRefs(propEnum));
1211 NS_ENSURE_SUCCESS(rv, rv);
1213 while (NS_SUCCEEDED(propEnum->HasMore(&hasMore)) && hasMore) {
1215 rv = propEnum->GetNext(prop);
1216 NS_ENSURE_SUCCESS(rv, rv);
1218 nsCOMPtr<nsIStringEnumerator> valueEnum;
1219 rv =
group->GetValues(prop, getter_AddRefs(valueEnum));
1220 NS_ENSURE_SUCCESS(rv, rv);
1222 nsCOMPtr<sbIPropertyInfo> info;
1223 rv = propMan->GetPropertyInfo(prop,
1224 getter_AddRefs(info));
1225 NS_ENSURE_SUCCESS(rv, rv);
1230 rv = valueEnum->HasMore(&hasMore);
1231 NS_ENSURE_SUCCESS(rv, rv);
1233 nsString sortableValue;
1235 rv = valueEnum->GetNext(value);
1236 NS_ENSURE_SUCCESS(rv, rv);
1238 rv = info->MakeSortable(value, sortableValue);
1239 NS_ENSURE_SUCCESS(rv, rv);
1240 nsString* successString = valueArray.AppendElement(sortableValue);
1241 NS_ENSURE_TRUE(successString, NS_ERROR_OUT_OF_MEMORY);
1243 rv = valueEnum->HasMore(&hasMore);
1244 NS_ENSURE_SUCCESS(rv, rv);
1247 nsCOMPtr<nsIStringEnumerator> sortedValueEnum =
1249 NS_ENSURE_TRUE(sortedValueEnum, NS_ERROR_OUT_OF_MEMORY);
1251 rv = aArray->AddFilter(prop, sortedValueEnum, PR_FALSE);
1252 NS_ENSURE_SUCCESS(rv, rv);
1263 sbLocalDatabaseCascadeFilterSet::OnItemAdded(
sbIMediaList* aMediaList,
1266 PRBool* aNoMoreForBatch)
1268 NS_ENSURE_ARG_POINTER(aMediaList);
1269 NS_ENSURE_ARG_POINTER(aMediaItem);
1270 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
1275 for (PRUint32 i = 0; i < mFilters.Length(); i++) {
1276 mFilters[
i].invalidationPending = PR_TRUE;
1278 *aNoMoreForBatch = PR_TRUE;
1285 for (PRUint32 i = 0; i < mFilters.Length(); i++) {
1286 sbFilterSpec& fs = mFilters[
i];
1289 rv = aMediaItem->GetProperty(fs.property, junk);
1290 if (NS_SUCCEEDED(rv) && !junk.IsVoid()) {
1291 rv = InvalidateFilter(fs);
1292 NS_ENSURE_SUCCESS(rv, rv);
1296 *aNoMoreForBatch = PR_FALSE;
1301 sbLocalDatabaseCascadeFilterSet::OnBeforeItemRemoved(
sbIMediaList* aMediaList,
1304 PRBool* aNoMoreForBatch)
1306 NS_ENSURE_ARG_POINTER(aMediaList);
1307 NS_ENSURE_ARG_POINTER(aMediaItem);
1308 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
1312 *aNoMoreForBatch = PR_TRUE;
1317 sbLocalDatabaseCascadeFilterSet::OnAfterItemRemoved(
sbIMediaList* aMediaList,
1320 PRBool* aNoMoreForBatch)
1322 NS_ENSURE_ARG_POINTER(aMediaList);
1323 NS_ENSURE_ARG_POINTER(aMediaItem);
1324 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
1329 for (PRUint32 i = 0; i < mFilters.Length(); i++) {
1330 mFilters[
i].invalidationPending = PR_TRUE;
1332 *aNoMoreForBatch = PR_TRUE;
1338 for (PRUint32 i = 0; i < mFilters.Length(); i++) {
1339 sbFilterSpec& fs = mFilters[
i];
1341 nsresult rv = aMediaItem->GetProperty(fs.property, junk);
1342 if (NS_SUCCEEDED(rv) && !junk.IsVoid()) {
1343 rv = InvalidateFilter(fs);
1344 NS_ENSURE_SUCCESS(rv, rv);
1348 *aNoMoreForBatch = PR_FALSE;
1353 sbLocalDatabaseCascadeFilterSet::OnItemUpdated(
sbIMediaList* aMediaList,
1356 PRBool* aNoMoreForBatch)
1358 NS_ENSURE_ARG_POINTER(aMediaList);
1359 NS_ENSURE_ARG_POINTER(aMediaItem);
1360 NS_ENSURE_ARG_POINTER(aProperties);
1361 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
1366 for (PRUint32 i = 0; i < mFilters.Length(); i++) {
1367 sbFilterSpec& fs = mFilters[
i];
1370 rv = aProperties->GetPropertyValue(fs.property, junk);
1371 if (NS_SUCCEEDED(rv)) {
1373 fs.invalidationPending = PR_TRUE;
1376 rv = InvalidateFilter(fs);
1377 NS_ENSURE_SUCCESS(rv, rv);
1382 *aNoMoreForBatch = PR_FALSE;
1387 sbLocalDatabaseCascadeFilterSet::OnItemMoved(
sbIMediaList* aMediaList,
1388 PRUint32 aFromIndex,
1390 PRBool* aNoMoreForBatch)
1392 NS_ENSURE_ARG_POINTER(aMediaList);
1393 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
1397 *aNoMoreForBatch = PR_TRUE;
1402 sbLocalDatabaseCascadeFilterSet::OnBeforeListCleared(
sbIMediaList* aMediaList,
1403 PRBool aExcludeLists,
1404 PRBool* aNoMoreForBatch)
1406 NS_ENSURE_ARG_POINTER(aMediaList);
1407 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
1411 *aNoMoreForBatch = PR_TRUE;
1416 sbLocalDatabaseCascadeFilterSet::OnListCleared(
sbIMediaList* aMediaList,
1417 PRBool aExcludeLists,
1418 PRBool* aNoMoreForBatch)
1420 NS_ENSURE_ARG_POINTER(aMediaList);
1421 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
1424 for (PRUint32 i = 0; i < mFilters.Length(); i++) {
1425 sbFilterSpec& fs = mFilters[
i];
1427 fs.invalidationPending = PR_TRUE;
1430 nsresult rv = InvalidateFilter(fs);
1431 NS_ENSURE_SUCCESS(rv, rv);
1435 *aNoMoreForBatch = PR_FALSE;
1440 sbLocalDatabaseCascadeFilterSet::OnBatchBegin(
sbIMediaList* aMediaList)
1442 mBatchHelper.
Begin();
1447 sbLocalDatabaseCascadeFilterSet::OnBatchEnd(
sbIMediaList* aMediaList)
1453 for (PRUint32 i = 0; i < mFilters.Length(); i++) {
1454 sbFilterSpec& fs = mFilters[
i];
1455 if (fs.invalidationPending) {
1456 nsresult rv = InvalidateFilter(fs);
1457 NS_ENSURE_SUCCESS(rv, rv);
1466 PLDHashOperator PR_CALLBACK
1467 sbLocalDatabaseCascadeFilterSet::OnValuesChangedCallback(nsISupportsHashKey* aKey,
1470 TRACE((
"sbLocalDatabaseCascadeFilterSet[static] - OnValuesChangedCallback"));
1471 NS_ASSERTION(aKey && aUserData,
"Args should not be null!");
1474 nsCOMPtr<sbICascadeFilterSetListener> listener =
1475 do_QueryInterface(aKey->GetKey(), &rv);
1477 if (NS_SUCCEEDED(rv)) {
1478 PRUint32* index =
static_cast<PRUint32*
>(aUserData);
1479 rv = listener->OnValuesChanged(*index);
1480 NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
1481 "OnValuesChanged returned a failure code");
1483 return PL_DHASH_NEXT;
1495 mWeakCascadeFilterSet =
1498 NS_ENSURE_SUCCESS(rv, rv);
1499 mCascadeFilterSet = aCascadeFilterSet;
1506 sbLocalDatabaseCascadeFilterSetArrayListener::OnGetLength(PRUint32 aLength,
1509 TRACE((
"sbLocalDatabaseCascadeFilterSetArrayListener[0x%.8x] - "
1510 "OnGetLength(%d)",
this, aLength));
1514 if (NS_SUCCEEDED(aResult)) {
1515 nsCOMPtr<nsISupports> cascadeFilterSetRef =
1516 do_QueryReferent(mWeakCascadeFilterSet, &rv);
1517 if (cascadeFilterSetRef) {
1519 nsCOMPtr<nsISupports> classPtr = do_QueryInterface
1521 NS_ENSURE_SUCCESS(rv, rv);
1522 NS_ASSERTION(classPtr == cascadeFilterSetRef,
1523 "Weak reference and class pointer are out of sync!");
1525 rv = mCascadeFilterSet->
OnGetLength(mIndex, aLength);
1526 NS_ENSURE_SUCCESS(rv, rv);
1533 sbLocalDatabaseCascadeFilterSetArrayListener::OnGetGuidByIndex
1535 const nsAString& aGUID,
1542 sbLocalDatabaseCascadeFilterSetArrayListener::OnGetSortPropertyValueByIndex
1544 const nsAString& aGUID,
1551 sbLocalDatabaseCascadeFilterSetArrayListener::OnGetMediaItemIdByIndex
1553 PRUint32 aMediaItemId,
1560 sbLocalDatabaseCascadeFilterSetArrayListener::OnStateChange(PRUint32
aState)
1574 sbGUIDArrayPrimarySortEnumerator::HasMore(PRBool *_retval)
1576 NS_ENSURE_ARG_POINTER(_retval);
1580 rv = mArray->GetLength(&length);
1581 NS_ENSURE_SUCCESS(rv, rv);
1583 *_retval = mNextIndex < length;
1588 sbGUIDArrayPrimarySortEnumerator::GetNext(nsAString& _retval)
1592 rv = mArray->GetSortPropertyValueByIndex(mNextIndex, _retval);
1593 NS_ENSURE_SUCCESS(rv, rv);
1603 sbLocalDatabaseCascadeFilterSetState::Read(nsIObjectInputStream* aStream)
1605 NS_ENSURE_ARG_POINTER(aStream);
1612 rv = aStream->Read32(&length);
1613 NS_ENSURE_SUCCESS(rv, rv);
1615 for (PRUint32 i = 0; i < length; i++) {
1616 Spec* spec =
mFilters.AppendElement();
1617 NS_ENSURE_TRUE(spec, NS_ERROR_OUT_OF_MEMORY);
1619 rv = aStream->ReadBoolean(&spec->isSearch);
1620 NS_ENSURE_SUCCESS(rv, rv);
1622 rv = aStream->ReadString(spec->property);
1623 NS_ENSURE_SUCCESS(rv, rv);
1625 PRUint32 propertyListLength;
1626 rv = aStream->Read32(&propertyListLength);
1627 for (PRUint32 j = 0; j < propertyListLength; j++) {
1629 rv = aStream->ReadString(property);
1630 NS_ENSURE_SUCCESS(rv, rv);
1632 nsString* added = spec->propertyList.AppendElement(property);
1633 NS_ENSURE_TRUE(added, NS_ERROR_OUT_OF_MEMORY);
1636 PRUint32 valuesength;
1637 rv = aStream->Read32(&valuesength);
1638 for (PRUint32 j = 0; j < valuesength; j++) {
1640 rv = aStream->ReadString(value);
1641 NS_ENSURE_SUCCESS(rv, rv);
1643 nsString* added = spec->values.AppendElement(value);
1644 NS_ENSURE_TRUE(added, NS_ERROR_OUT_OF_MEMORY);
1647 PRBool hasTreeViewState;
1648 rv = aStream->ReadBoolean(&hasTreeViewState);
1649 NS_ENSURE_SUCCESS(rv, rv);
1651 if (hasTreeViewState) {
1653 NS_ENSURE_TRUE(spec->treeViewState, NS_ERROR_OUT_OF_MEMORY);
1655 rv = spec->treeViewState->Init();
1656 NS_ENSURE_SUCCESS(rv, rv);
1658 rv = spec->treeViewState->Read(aStream);
1659 NS_ENSURE_SUCCESS(rv, rv);
1667 sbLocalDatabaseCascadeFilterSetState::Write(nsIObjectOutputStream* aStream)
1669 NS_ENSURE_ARG_POINTER(aStream);
1673 PRUint32 length =
mFilters.Length();
1674 rv = aStream->Write32(length);
1675 NS_ENSURE_SUCCESS(rv, rv);
1677 for (PRUint32 i = 0; i < length; i++) {
1680 rv = aStream->WriteBoolean(fs.isSearch);
1681 NS_ENSURE_SUCCESS(rv, rv);
1683 rv = aStream->WriteWStringZ(fs.property.BeginReading());
1684 NS_ENSURE_SUCCESS(rv, rv);
1686 PRUint32 propertyListLength = fs.propertyList.Length();
1687 rv = aStream->Write32(propertyListLength);
1688 NS_ENSURE_SUCCESS(rv, rv);
1690 for (PRUint32 j = 0; j < propertyListLength; j++) {
1691 rv = aStream->WriteWStringZ(fs.propertyList[j].BeginReading());
1692 NS_ENSURE_SUCCESS(rv, rv);
1695 PRUint32 valuesLength = fs.values.Length();
1696 rv = aStream->Write32(valuesLength);
1697 NS_ENSURE_SUCCESS(rv, rv);
1699 for (PRUint32 j = 0; j < valuesLength; j++) {
1700 rv = aStream->WriteWStringZ(fs.values[j].BeginReading());
1701 NS_ENSURE_SUCCESS(rv, rv);
1704 if (fs.treeViewState) {
1705 rv = aStream->WriteBoolean(PR_TRUE);
1706 NS_ENSURE_SUCCESS(rv, rv);
1708 rv = fs.treeViewState->Write(aStream);
1709 NS_ENSURE_SUCCESS(rv, rv);
1712 rv = aStream->WriteBoolean(PR_FALSE);
1713 NS_ENSURE_SUCCESS(rv, rv);
1726 PRUint32 numFilters =
mFilters.Length();
1727 for (PRUint32 i = 0; i < numFilters; i++) {
1731 buff.AppendLiteral(
"search [[");
1732 PRUint32 propertyListLength = fs.
propertyList.Length();
1733 for (PRUint32 j = 0; j < propertyListLength; j++) {
1735 if (j + 1 < propertyListLength) {
1736 buff.AppendLiteral(
", ");
1739 buff.AppendLiteral(
"] ");
1742 buff.AppendLiteral(
"filter [");
1744 buff.AppendLiteral(
" ");
1747 buff.AppendLiteral(
"values [");
1749 PRUint32 valesLength = fs.
values.Length();
1750 for (PRUint32 j = 0; j < valesLength; j++) {
1751 buff.Append(fs.
values[j]);
1752 if (j + 1 < valesLength) {
1753 buff.AppendLiteral(
", ");
1756 buff.AppendLiteral(
"]");
1759 buff.AppendLiteral(
"treeView: ");
1762 NS_ENSURE_SUCCESS(rv, rv);
1766 if (i + 1 < numFilters) {
1767 buff.AppendLiteral(
", ");
nsresult AddConfiguration(sbILocalDatabaseGUIDArray *aArray)
[USER CODE SHOULD NOT REFERENCE THIS CLASS]
nsRefPtr< sbLocalDatabaseTreeViewState > treeViewState
nsresult AddFilters(sbILibraryConstraintBuilder *aBuilder, PRBool *aChanged)
NS_DECL_ISUPPORTS NS_DECL_SBICASCADEFILTERSET NS_DECL_SBIMEDIALISTLISTENER sbLocalDatabaseCascadeFilterSet(sbLocalDatabaseMediaListView *aMediaListView)
nsTArray< nsString > sbStringArray
Cascade filter management for a media list.
[USER CODE SHOULD NOT REFERENCE THIS CLASS]
nsresult GetState(sbLocalDatabaseCascadeFilterSetState **aState)
boolean isSearch(in unsigned short aIndex)
Determine if the filter at a given index is a search filter.
nsTArray< Spec > mFilters
#define SB_PROPERTY_HIDDEN
void ClearMediaListView()
virtual ~sbSuppressArrayInvalidation()
nsresult Init(sbLocalDatabaseLibrary *aLibrary, sbILocalDatabaseAsyncGUIDArray *aProtoArray, sbLocalDatabaseCascadeFilterSetState *aState)
static PRBool SB_IsTopLevelProperty(PRUint32 aPropertyDBID)
#define SB_PROPERTYMANAGER_CONTRACTID
readonly attribute unsigned short length
#define SB_PROPERTY_CREATED
nsresult AddSearches(sbILibraryConstraintBuilder *aBuilder, PRBool *aChanged)
NS_IMPL_ISUPPORTS3(sbLocalDatabaseCascadeFilterSet, sbICascadeFilterSet, sbIMediaListListener, nsISupportsWeakReference)
NS_IMPL_ISUPPORTS2(sbLocalDatabaseCascadeFilterSetArrayListener, nsISupportsWeakReference, sbILocalDatabaseAsyncGUIDArrayListener) nsresult sbLocalDatabaseCascadeFilterSetArrayListener
static nsresult GetProperty(nsIPropertyBag2 *aProperties, nsAString const &aProp, nsAString &aValue)
~sbLocalDatabaseCascadeFilterSet()
Listener interface for sbICascadeFilterSet.
NS_DECL_ISUPPORTS NS_DECL_NSISERIALIZABLE nsresult ToString(nsAString &aStr)
StringArrayEnumerator prototype hasMore
sbStringArray propertyList
NS_IMPL_ISUPPORTS1(sbLocalDatabaseCascadeFilterSetState, nsISerializable)
#define SB_PROPERTY_ISLIST
[USER CODE SHOULD NOT REFERENCE THIS CLASS]
An interface to carry around arrays of nsIProperty instances. Users of this interface should only QI ...
sbSuppressArrayInvalidation(sbILocalDatabaseGUIDArray *aArray)
nsresult OnGetLength(PRUint32 aIndex, PRUint32 aLength)
_getSelectedPageStyle s i
Array filter(tab.attributes, function(aAttr){return(_this.xulAttributes.indexOf(aAttr.name) >-1);}).forEach(tab.removeAttribute
Songbird Database Object Definition.