28 #include <sbIDatabaseQuery.h>
29 #include <sbIDatabaseResult.h>
30 #include <sbILibrary.h>
31 #include <sbILocalDatabaseLibrary.h>
32 #include <sbILocalDatabasePropertyCache.h>
33 #include <sbILocalDatabaseMediaItem.h>
34 #include <sbILocalDatabaseSimpleMediaList.h>
35 #include <sbIMediaItem.h>
36 #include <sbIMediaList.h>
37 #include <sbIPropertyArray.h>
38 #include <sbIPropertyInfo.h>
39 #include <sbIPropertyManager.h>
40 #include <sbISQLBuilder.h>
46 #include <sbILibraryManager.h>
49 #include <nsAutoPtr.h>
52 #include <nsComponentManagerUtils.h>
53 #include <nsIClassInfoImpl.h>
54 #include <nsINetUtil.h>
55 #include <nsIObserverService.h>
56 #include <nsIUUIDGenerator.h>
57 #include <nsIProgrammingLanguage.h>
60 #include <nsServiceManagerUtils.h>
61 #include <nsIInterfaceRequestorUtils.h>
62 #include <nsVoidArray.h>
67 #define RANDOM_ADD_CHUNK_SIZE 1000;
68 #define SQL_IN_LIMIT 1000
70 #define ONEDAY (1000*60*60*24)
83 static PRLogModuleInfo* gLocalDatabaseSmartMediaListLog = nsnull;
84 #define TRACE(args) PR_LOG(gLocalDatabaseSmartMediaListLog, PR_LOG_DEBUG, args)
85 #define LOG(args) PR_LOG(gLocalDatabaseSmartMediaListLog, PR_LOG_WARN, args)
96 nsCOMPtr<nsINetUtil> netUtil = do_GetService(NS_IOSERVICE_CONTRACTID, &rv);
97 NS_ENSURE_SUCCESS(rv, rv);
99 static const PRUnichar sEquals =
'=';
101 PRInt32 length = aString.Length();
107 PRInt32
pos = aString.FindChar(sEquals);
109 nsAutoString
name(nsDependentSubstring(aString, 0, pos));
110 nsCAutoString unescapedNameUtf8;
111 rv = netUtil->UnescapeString(NS_ConvertUTF16toUTF8(name), 0, unescapedNameUtf8);
112 NS_ENSURE_SUCCESS(rv, rv);
114 nsAutoString
value(nsDependentSubstring(aString, pos + 1, length - pos));
115 nsCAutoString unescapedValueUtf8;
116 if (pos < length - 1) {
117 rv = netUtil->UnescapeString(NS_ConvertUTF16toUTF8(value), 0, unescapedValueUtf8);
118 NS_ENSURE_SUCCESS(rv, rv);
121 PRBool success = aMap.Put(NS_ConvertUTF8toUTF16(unescapedNameUtf8),
122 NS_ConvertUTF8toUTF16(unescapedValueUtf8));
123 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
135 const PRUnichar *
start, *end;
136 PRUint32 length = aString.BeginReading(&start, &end);
142 nsDependentSubstring chunk;
144 const PRUnichar* chunkStart =
start;
145 static const PRUnichar sAmp =
'&';
146 for (
const PRUnichar* current = start; current < end; current++) {
148 if (*current == sAmp) {
149 chunk.Rebind(chunkStart, current - chunkStart);
152 NS_ENSURE_SUCCESS(rv, rv);
153 if (current + 1 < end) {
154 chunkStart = current + 1;
163 chunk.Rebind(chunkStart, end - chunkStart);
165 NS_ENSURE_SUCCESS(rv, rv);
171 PLDHashOperator PR_CALLBACK
176 NS_ASSERTION(aUserData,
"Null user data");
179 nsCOMPtr<nsINetUtil> netUtil = do_GetService(NS_IOSERVICE_CONTRACTID, &rv);
180 NS_ENSURE_SUCCESS(rv, PL_DHASH_STOP);
183 static_cast<nsString*
>(aUserData);
184 NS_ENSURE_TRUE(str, PL_DHASH_STOP);
187 rv = netUtil->EscapeString(NS_ConvertUTF16toUTF8(aKey),
188 nsINetUtil::ESCAPE_XALPHAS,
190 NS_ENSURE_SUCCESS(rv, PL_DHASH_STOP);
193 rv = netUtil->EscapeString(NS_ConvertUTF16toUTF8(aEntry),
194 nsINetUtil::ESCAPE_XALPHAS,
196 NS_ENSURE_SUCCESS(rv, PL_DHASH_STOP);
198 str->Append(NS_ConvertUTF8toUTF16(key));
199 str->AppendLiteral(
"=");
200 str->Append(NS_ConvertUTF8toUTF16(value));
201 str->AppendLiteral(
"&");
203 return PL_DHASH_NEXT;
214 if (str.Length() > 0) {
215 aString = nsDependentSubstring(str, 0, str.Length() - 1);
218 aString = EmptyString();
231 const nsAString& aOperatorString,
232 const nsAString& aLeftValue,
233 const nsAString& aRightValue,
234 const nsAString& aDisplayUnit)
236 , mPropertyID(aPropertyID)
237 , mOperatorString(aOperatorString)
238 , mLeftValue(aLeftValue)
239 , mRightValue(aRightValue)
240 , mDisplayUnit(aDisplayUnit)
242 mLock = nsAutoLock::NewLock(
"sbLocalDatabaseSmartMediaListCondition::mLock");
244 "sbLocalDatabaseSmartMediaListCondition::mLock failed to create lock!");
250 nsAutoLock::DestroyLock(
mLock);
255 sbLocalDatabaseSmartMediaListCondition::GetPropertyID(nsAString& aPropertyID)
257 nsAutoLock lock(
mLock);
266 NS_ENSURE_ARG_POINTER(aOperator);
268 nsAutoLock lock(
mLock);
273 nsCOMPtr<sbIPropertyManager> propMan;
275 NS_ENSURE_SUCCESS(rv, rv);
278 nsCOMPtr<sbIPropertyInfo> info;
279 rv = propMan->GetPropertyInfo(
mPropertyID, getter_AddRefs(info));
280 NS_ENSURE_SUCCESS(rv, rv);
284 NS_ENSURE_SUCCESS(rv, rv);
287 *aOperator = mOperator;
288 NS_IF_ADDREF(*aOperator);
294 sbLocalDatabaseSmartMediaListCondition::GetLeftValue(nsAString& aLeftValue)
296 nsAutoLock lock(
mLock);
303 sbLocalDatabaseSmartMediaListCondition::GetRightValue(nsAString& aRightValue)
305 nsAutoLock lock(
mLock);
312 sbLocalDatabaseSmartMediaListCondition::GetDisplayUnit(nsAString& aDisplayUnit)
314 nsAutoLock lock(
mLock);
323 nsAutoLock lock(
mLock);
328 PRBool success = map.Init();
329 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
331 success = map.Put(NS_LITERAL_STRING(
"property"),
mPropertyID);
332 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
335 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
337 success = map.Put(NS_LITERAL_STRING(
"leftValue"),
mLeftValue);
338 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
340 success = map.Put(NS_LITERAL_STRING(
"rightValue"),
mRightValue);
341 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
343 success = map.Put(NS_LITERAL_STRING(
"displayUnit"),
mDisplayUnit);
344 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
347 NS_ENSURE_SUCCESS(rv, rv);
379 : mInnerMonitor(nsnull)
380 , mConditionsMonitor(nsnull)
384 , mSelectDirection(PR_TRUE)
385 , mRandomSelection(PR_FALSE)
386 , mAutoUpdateMonitor(nsnull)
389 , mListenersMonitor(nsnull)
390 , mSourceMonitor(nsnull)
393 if (!gLocalDatabaseSmartMediaListLog) {
394 gLocalDatabaseSmartMediaListLog =
395 PR_NewLogModule(
"sbLocalDatabaseSmartMediaList");
403 nsAutoMonitor::DestroyMonitor(mInnerMonitor);
405 if(mConditionsMonitor) {
406 nsAutoMonitor::DestroyMonitor(mConditionsMonitor);
408 if(mAutoUpdateMonitor) {
409 nsAutoMonitor::DestroyMonitor(mAutoUpdateMonitor);
411 if (mListenersMonitor) {
412 nsAutoMonitor::DestroyMonitor(mListenersMonitor);
414 if (mSourceMonitor) {
415 nsAutoMonitor::DestroyMonitor(mSourceMonitor);
421 nsresult rv = mItem->GetLibrary(getter_AddRefs(library));
422 NS_ENSURE_SUCCESS(rv, );
424 nsCOMPtr<sbIMediaList> libraryList = do_QueryInterface(library, &rv);
425 NS_ENSURE_SUCCESS(rv, );
427 (void) libraryList->RemoveListener(
this);
432 NS_ENSURE_SUCCESS(rv, );
435 NS_ENSURE_SUCCESS(rv, );
465 mItem->SetSuppressNotifications(PR_TRUE);
473 mItem->SetSuppressNotifications(PR_FALSE);
476 nsCOMPtr<sbILocalDatabaseMediaItem> mItem;
485 NS_ENSURE_ARG_POINTER(aItem);
487 mInnerMonitor = nsAutoMonitor::NewMonitor(
"sbLocalDatabaseSmartMediaList::mInnerMonitor");
488 NS_ENSURE_TRUE(mInnerMonitor, NS_ERROR_OUT_OF_MEMORY);
490 mConditionsMonitor = nsAutoMonitor::NewMonitor(
"sbLocalDatabaseSmartMediaList::mConditionsMonitor");
491 NS_ENSURE_TRUE(mConditionsMonitor, NS_ERROR_OUT_OF_MEMORY);
493 mAutoUpdateMonitor = nsAutoMonitor::NewMonitor(
"sbLocalDatabaseSmartMediaList::mAutoUpdateMonitor");
494 NS_ENSURE_TRUE(mAutoUpdateMonitor, NS_ERROR_OUT_OF_MEMORY);
496 mListenersMonitor = nsAutoMonitor::NewMonitor(
"sbLocalDatabaseSmartMediaList::mListenersMonitor");
497 NS_ENSURE_TRUE(mListenersMonitor, NS_ERROR_OUT_OF_MEMORY);
499 mSourceMonitor = nsAutoMonitor::NewMonitor(
"sbLocalDatabaseSmartMediaList::mSourceMonitor");
500 NS_ENSURE_TRUE(mSourceMonitor, NS_ERROR_OUT_OF_MEMORY);
505 mLocalDBItem = do_QueryInterface(mItem, &rv);
506 NS_ENSURE_SUCCESS(rv, rv);
508 nsAutoString storageGuid;
511 NS_ENSURE_SUCCESS(rv, rv);
514 rv = mItem->GetLibrary(getter_AddRefs(library));
515 NS_ENSURE_SUCCESS(rv, rv);
517 nsCOMPtr<sbIMediaItem> mediaItem;
518 rv = library->GetMediaItem(storageGuid, getter_AddRefs(mediaItem));
519 NS_ENSURE_SUCCESS(rv, rv);
521 mList = do_QueryInterface(mediaItem, &rv);
522 NS_ENSURE_SUCCESS(rv, rv);
530 NS_ENSURE_SUCCESS(rv, rv);
532 nsCOMPtr<sbIMediaItem> mi =
533 do_QueryInterface(mList, &rv);
534 NS_ENSURE_SUCCESS(rv, rv);
537 NS_ENSURE_SUCCESS(rv, rv);
542 NS_ENSURE_SUCCESS(rv, rv);
545 NS_ENSURE_SUCCESS(rv, rv);
548 nsCOMPtr<sbIMediaList> libraryList = do_QueryInterface(library, &rv);
549 NS_ENSURE_SUCCESS(rv, rv);
553 rv = libraryList->AddListener(
this,
557 NS_ENSURE_SUCCESS(rv, rv);
560 NS_ENSURE_SUCCESS(rv, rv);
563 mLocalDatabaseLibrary = do_QueryInterface(library, &rv);
564 NS_ENSURE_SUCCESS(rv, rv);
566 rv = mLocalDatabaseLibrary->GetPropertyCache(getter_AddRefs(mPropertyCache));
567 NS_ENSURE_SUCCESS(rv, rv);
569 rv = CreateQueries();
570 NS_ENSURE_SUCCESS(rv, rv);
573 rv = ReadConfiguration();
574 NS_ENSURE_SUCCESS(rv, rv);
582 NS_ENSURE_ARG_POINTER(aContentType);
585 PRUint32 conditionLength = mConditions.Length();
588 if (!conditionLength)
589 return NS_ERROR_NOT_AVAILABLE;
591 nsCOMPtr<sbILocalDatabaseSmartMediaListCondition> condition;
592 nsCOMPtr<sbIPropertyOperator> propertyOperator;
593 nsString propertyID, leftValue, operatorStr;
594 for (PRUint32
i = 0;
i < conditionLength; ++
i) {
595 condition = mConditions[
i];
597 rv = condition->GetPropertyID(propertyID);
598 NS_ENSURE_SUCCESS(rv, rv);
601 rv = condition->GetOperator(getter_AddRefs(propertyOperator));
602 NS_ENSURE_SUCCESS(rv, rv);
603 rv = propertyOperator->GetOperator(operatorStr);
604 NS_ENSURE_SUCCESS(rv, rv);
605 rv = condition->GetLeftValue(leftValue);
606 NS_ENSURE_SUCCESS(rv, rv);
613 leftValue.EqualsLiteral(
"video")) ||
615 leftValue.EqualsLiteral(
"audio"))) {
621 leftValue.EqualsLiteral(
"audio")) ||
623 leftValue.EqualsLiteral(
"video"))) {
630 mList->GetListContentType(aContentType);
637 aType.Assign(NS_LITERAL_STRING(
"smart"));
642 sbLocalDatabaseSmartMediaList::GetMatchType(PRUint32* aMatchType)
644 NS_ENSURE_ARG_POINTER(aMatchType);
645 nsAutoMonitor monitor(mConditionsMonitor);
647 *aMatchType = mMatchType;
652 sbLocalDatabaseSmartMediaList::SetMatchType(PRUint32 aMatchType)
654 NS_ENSURE_ARG_RANGE(aMatchType,
658 nsAutoMonitor monitor(mConditionsMonitor);
659 mMatchType = aMatchType;
661 nsresult rv = WriteConfiguration();
662 NS_ENSURE_SUCCESS(rv, rv);
668 sbLocalDatabaseSmartMediaList::GetConditionCount(PRUint32* aConditionCount)
670 NS_ENSURE_ARG_POINTER(aConditionCount);
672 nsAutoMonitor monitor(mConditionsMonitor);
673 *aConditionCount = mConditions.Length();
679 sbLocalDatabaseSmartMediaList::GetLimitType(PRUint32* aLimitType)
681 NS_ENSURE_ARG_POINTER(aLimitType);
682 *aLimitType = mLimitType;
687 sbLocalDatabaseSmartMediaList::SetLimitType(PRUint32 aLimitType)
689 NS_ENSURE_ARG_RANGE(aLimitType,
693 nsAutoMonitor monitor(mConditionsMonitor);
694 mLimitType = aLimitType;
696 nsresult rv = WriteConfiguration();
697 NS_ENSURE_SUCCESS(rv, rv);
703 sbLocalDatabaseSmartMediaList::GetLimit(PRUint64* aLimit)
705 NS_ENSURE_ARG_POINTER(aLimit);
711 sbLocalDatabaseSmartMediaList::SetLimit(PRUint64 aLimit)
713 nsAutoMonitor monitor(mConditionsMonitor);
716 nsresult rv = WriteConfiguration();
717 NS_ENSURE_SUCCESS(rv, rv);
723 sbLocalDatabaseSmartMediaList::GetSelectPropertyID(nsAString& aSelectPropertyID)
725 aSelectPropertyID = mSelectPropertyID;
730 sbLocalDatabaseSmartMediaList::SetSelectPropertyID(
const nsAString& aSelectPropertyID)
732 nsAutoMonitor monitor(mConditionsMonitor);
733 mSelectPropertyID = aSelectPropertyID;
735 nsresult rv = WriteConfiguration();
736 NS_ENSURE_SUCCESS(rv, rv);
742 sbLocalDatabaseSmartMediaList::GetSelectDirection(PRBool* aSelectDirection)
744 NS_ENSURE_ARG_POINTER(aSelectDirection);
746 nsAutoMonitor monitor(mConditionsMonitor);
747 *aSelectDirection = mSelectDirection;
752 sbLocalDatabaseSmartMediaList::SetSelectDirection(PRBool aSelectDirection)
754 nsAutoMonitor monitor(mConditionsMonitor);
755 mSelectDirection = aSelectDirection;
757 nsresult rv = WriteConfiguration();
758 NS_ENSURE_SUCCESS(rv, rv);
764 sbLocalDatabaseSmartMediaList::GetRandomSelection(PRBool* aRandomSelection)
766 NS_ENSURE_ARG_POINTER(aRandomSelection);
768 nsAutoMonitor monitor(mConditionsMonitor);
769 *aRandomSelection = mRandomSelection;
774 sbLocalDatabaseSmartMediaList::SetRandomSelection(PRBool aRandomSelection)
776 nsAutoMonitor monitor(mConditionsMonitor);
777 mRandomSelection = aRandomSelection;
779 nsresult rv = WriteConfiguration();
780 NS_ENSURE_SUCCESS(rv, rv);
786 sbLocalDatabaseSmartMediaList::GetAutoUpdate(PRBool* aAutoUpdate)
788 NS_ENSURE_ARG_POINTER(aAutoUpdate);
790 nsAutoMonitor monitor(mAutoUpdateMonitor);
791 *aAutoUpdate = mAutoUpdate;
796 sbLocalDatabaseSmartMediaList::SetAutoUpdate(PRBool aAutoUpdate)
798 nsAutoMonitor monitor(mAutoUpdateMonitor);
799 mAutoUpdate = aAutoUpdate;
801 nsresult rv = WriteConfiguration();
802 NS_ENSURE_SUCCESS(rv, rv);
808 sbLocalDatabaseSmartMediaList::GetNotExistsMode(PRUint32* aNotExistsMode)
810 NS_ENSURE_ARG_POINTER(aNotExistsMode);
812 nsAutoMonitor monitor(mConditionsMonitor);
813 *aNotExistsMode = mNotExistsMode;
818 sbLocalDatabaseSmartMediaList::SetNotExistsMode(PRUint32 aNotExistsMode)
820 nsAutoMonitor monitor(mConditionsMonitor);
821 mNotExistsMode = aNotExistsMode;
823 nsresult rv = WriteConfiguration();
824 NS_ENSURE_SUCCESS(rv, rv);
830 sbLocalDatabaseSmartMediaList::AppendCondition(
const nsAString& aPropertyID,
832 const nsAString& aLeftValue,
833 const nsAString& aRightValue,
834 const nsAString& aDisplayUnit,
837 NS_ENSURE_ARG_POINTER(aOperator);
838 NS_ENSURE_ARG_POINTER(_retval);
839 NS_ENSURE_ARG(aPropertyID.Length() > 1);
845 nsresult rv = aOperator->GetOperator(op);
846 NS_ENSURE_SUCCESS(rv, rv);
851 if (!aRightValue.IsEmpty())
852 return NS_ERROR_ILLEGAL_VALUE;
854 if (aRightValue.IsEmpty())
855 return NS_ERROR_ILLEGAL_VALUE;
862 !aLeftValue.IsEmpty()) {
863 return NS_ERROR_ILLEGAL_VALUE;
866 sbRefPtrCondition condition;
872 NS_ENSURE_TRUE(condition, NS_ERROR_OUT_OF_MEMORY);
874 sbRefPtrCondition* success = mConditions.AppendElement(condition);
875 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
877 rv = WriteConfiguration();
878 NS_ENSURE_SUCCESS(rv, rv);
880 NS_ADDREF(*_retval = condition);
886 sbLocalDatabaseSmartMediaList::RemoveConditionAt(PRUint32 aConditionIndex)
888 nsAutoMonitor monitor(mConditionsMonitor);
889 PRUint32
count = mConditions.Length();
891 NS_ENSURE_ARG(aConditionIndex < count);
892 mConditions.RemoveElementAt(aConditionIndex);
894 nsresult rv = WriteConfiguration();
895 NS_ENSURE_SUCCESS(rv, rv);
901 sbLocalDatabaseSmartMediaList::GetConditionAt(PRUint32 aConditionIndex,
904 NS_ENSURE_ARG_POINTER(_retval);
906 nsAutoMonitor monitor(mConditionsMonitor);
907 PRUint32 count = mConditions.Length();
909 NS_ENSURE_ARG(aConditionIndex < count);
911 *_retval = mConditions[aConditionIndex];
918 sbLocalDatabaseSmartMediaList::ClearConditions()
920 nsAutoMonitor monitor(mConditionsMonitor);
924 nsresult rv = WriteConfiguration();
925 NS_ENSURE_SUCCESS(rv, rv);
931 sbLocalDatabaseSmartMediaList::Rebuild()
933 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - Rebuild()",
this));
937 nsAutoMonitor monitor(mConditionsMonitor);
938 nsAutoMonitor monitor2(mSourceMonitor);
946 if (!(mRandomSelection || !mSelectPropertyID.IsEmpty()))
947 return NS_ERROR_INVALID_ARG;
951 if (mRandomSelection) {
952 rv = RebuildMatchTypeNoneRandom();
953 NS_ENSURE_SUCCESS(rv, rv);
956 rv = RebuildMatchTypeNoneNotRandom();
957 NS_ENSURE_SUCCESS(rv, rv);
961 rv = RebuildMatchTypeAnyAll();
962 NS_ENSURE_SUCCESS(rv, rv);
966 nsCOMPtr<sbILocalDatabaseSimpleMediaList> ldsml =
967 do_QueryInterface(mList, &rv);
968 NS_ENSURE_SUCCESS(rv, rv);
970 rv = ldsml->NotifyContentChanged();
971 NS_ENSURE_SUCCESS(rv, rv);
973 nsAutoMonitor monitor(mListenersMonitor);
974 for (PRInt32
i=0;
i<mListeners.Count();
i++)
975 mListeners.ObjectAt(
i)->OnRebuild(
this);
981 sbLocalDatabaseSmartMediaList::RebuildMatchTypeAnyAll()
983 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - RebuildMatchTypeAnyAll()",
991 nsAutoString tempTableName;
992 rv = CreateTempTable(tempTableName);
993 NS_ENSURE_SUCCESS(rv, rv);
1002 sql.AssignLiteral(
"insert into ");
1003 sql.Append(tempTableName);
1004 sql.AppendLiteral(
" (media_item_id, limitby, selectby) ");
1006 PRUint32 count = mConditions.Length();
1007 for (PRUint32
i = 0;
i <
count;
i++) {
1008 nsAutoString conditionSql;
1009 rv = CreateSQLForCondition(mConditions[
i], i == count-1, conditionSql);
1010 NS_ENSURE_SUCCESS(rv, rv);
1012 sql.Append(conditionSql);
1013 if (
i + 1 < count) {
1017 sql.AppendLiteral(
" intersect ");
1020 sql.AppendLiteral(
" union ");
1025 rv = ExecuteQuery(sql);
1026 NS_ENSURE_SUCCESS(rv, rv);
1030 if (mRandomSelection) {
1031 nsAutoString updateRandom;
1032 updateRandom.AppendLiteral(
"update ");
1033 updateRandom.Append(tempTableName);
1034 updateRandom.AppendLiteral(
" set selectby = random()");
1035 rv = ExecuteQuery(updateRandom);
1036 NS_ENSURE_SUCCESS(rv, rv);
1040 rv = ExecuteQuery(mClearListQuery);
1041 NS_ENSURE_SUCCESS(rv, rv);
1044 rv = GetCopyToListQuery(tempTableName, copy);
1045 NS_ENSURE_SUCCESS(rv, rv);
1058 rowLimit = (PRUint32)(mLimit & 0xFFFFFFFF);
1061 nsAutoString rollingSql;
1062 rollingSql.AssignLiteral(
"select limitby from ");
1063 rollingSql.Append(tempTableName);
1064 rollingSql.AppendLiteral(
" order by selectby ");
1065 rollingSql.AppendLiteral(mSelectDirection ?
"asc" :
"desc");
1066 rv = GetRollingLimit(rollingSql, 0, &rowLimit);
1067 NS_ENSURE_SUCCESS(rv, rv);
1073 copy.AppendLiteral(
" order by selectby ");
1074 copy.AppendLiteral(mSelectDirection ?
"asc" :
"desc");
1075 copy.AppendLiteral(
" limit ");
1076 copy.AppendInt(rowLimit);
1081 rv = ExecuteQuery(copy);
1082 NS_ENSURE_SUCCESS(rv, rv);
1085 rv = DropTempTable(tempTableName);
1086 NS_ENSURE_SUCCESS(rv, rv);
1092 sbLocalDatabaseSmartMediaList::RebuildMatchTypeNoneNotRandom()
1094 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - "
1095 "RebuildMatchTypeNoneNotRandom()",
this));
1100 NS_ENSURE_STATE(!mRandomSelection);
1101 NS_ENSURE_STATE(!mSelectPropertyID.IsEmpty());
1103 NS_NAMED_LITERAL_STRING(kMediaItems,
"media_items");
1104 NS_NAMED_LITERAL_STRING(kMediaItemId,
"media_item_id");
1105 NS_NAMED_LITERAL_STRING(kMediaItemsAlias,
"_mi");
1106 NS_NAMED_LITERAL_STRING(kLimitAlias,
"_limit");
1107 NS_NAMED_LITERAL_STRING(kMediaListTypeId,
"media_list_type_id");
1121 nsCOMPtr<sbISQLSelectBuilder> builder =
1123 NS_ENSURE_SUCCESS(rv, rv);
1125 rv = builder->SetBaseTableName(kMediaItems);
1126 NS_ENSURE_SUCCESS(rv, rv);
1128 rv = builder->SetBaseTableAlias(kMediaItemsAlias);
1129 NS_ENSURE_SUCCESS(rv, rv);
1131 rv = AddSelectColumnAndJoin(builder, kMediaItemsAlias, PR_TRUE);
1132 NS_ENSURE_SUCCESS(rv, rv);
1134 rv = AddLimitColumnAndJoin(builder, kMediaItemsAlias);
1135 NS_ENSURE_SUCCESS(rv, rv);
1138 nsCOMPtr<sbISQLBuilderCriterion> nullCriterion;
1139 rv = builder->CreateMatchCriterionNull(kMediaItemsAlias,
1142 getter_AddRefs(nullCriterion));
1143 NS_ENSURE_SUCCESS(rv, rv);
1145 rv = builder->AddCriterion(nullCriterion);
1146 NS_ENSURE_SUCCESS(rv, rv);
1149 rv = builder->ToString(sql);
1150 NS_ENSURE_SUCCESS(rv, rv);
1152 rv = GetRollingLimit(sql, 1, &limitRow);
1153 NS_ENSURE_SUCCESS(rv, rv);
1162 limitRow = (PRUint32)(mLimit & 0xFFFFFFFF);
1165 nsAutoString tempTableName;
1166 rv = CreateTempTable(tempTableName);
1167 NS_ENSURE_SUCCESS(rv, rv);
1171 nsCOMPtr<sbISQLSelectBuilder> builder =
1173 NS_ENSURE_SUCCESS(rv, rv);
1175 rv = builder->SetBaseTableName(kMediaItems);
1176 NS_ENSURE_SUCCESS(rv, rv);
1178 rv = builder->SetBaseTableAlias(kMediaItemsAlias);
1179 NS_ENSURE_SUCCESS(rv, rv);
1181 rv = builder->AddColumn(kMediaItemsAlias, kMediaItemId);
1182 NS_ENSURE_SUCCESS(rv, rv);
1184 rv = builder->AddColumn(EmptyString(), NS_LITERAL_STRING(
"0"));
1185 NS_ENSURE_SUCCESS(rv, rv);
1188 nsCOMPtr<sbISQLBuilderCriterion> nullCriterion;
1189 rv = builder->CreateMatchCriterionNull(kMediaItemsAlias,
1192 getter_AddRefs(nullCriterion));
1193 NS_ENSURE_SUCCESS(rv, rv);
1195 rv = builder->AddCriterion(nullCriterion);
1196 NS_ENSURE_SUCCESS(rv, rv);
1198 rv = AddSelectColumnAndJoin(builder, kMediaItemsAlias, PR_TRUE);
1199 NS_ENSURE_SUCCESS(rv, rv);
1203 rv = builder->SetLimit(limitRow);
1204 NS_ENSURE_SUCCESS(rv, rv);
1208 rv = builder->ToString(sql);
1209 NS_ENSURE_SUCCESS(rv, rv);
1212 insert.AssignLiteral(
"insert into ");
1213 insert.Append(tempTableName);
1214 insert.AppendLiteral(
" (media_item_id, limitby, selectby) ");
1217 rv = ExecuteQuery(insert);
1218 NS_ENSURE_SUCCESS(rv, rv);
1221 rv = ExecuteQuery(mClearListQuery);
1222 NS_ENSURE_SUCCESS(rv, rv);
1225 rv = GetCopyToListQuery(tempTableName, copy);
1226 NS_ENSURE_SUCCESS(rv, rv);
1228 rv = ExecuteQuery(copy);
1229 NS_ENSURE_SUCCESS(rv, rv);
1232 rv = DropTempTable(tempTableName);
1233 NS_ENSURE_SUCCESS(rv, rv);
1239 sbLocalDatabaseSmartMediaList::RebuildMatchTypeNoneRandom()
1241 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - "
1242 "RebuildMatchTypeNoneRandom()",
this));
1247 NS_ENSURE_STATE(mRandomSelection);
1248 NS_ENSURE_STATE(mSelectPropertyID.IsEmpty());
1250 NS_NAMED_LITERAL_STRING(kMediaItemId,
"media_item_id");
1251 NS_NAMED_LITERAL_STRING(kLimitBy,
"limitby");
1264 rv = GetMediaItemIdRange(&min, &max);
1265 if (NS_FAILED(rv)) {
1268 if (rv == NS_ERROR_UNEXPECTED) {
1271 NS_ENSURE_SUCCESS(rv, rv);
1282 PRUint32
length = max - min + 1;
1283 sbMediaItemIdArray mediaItemIds(length);
1286 PRUint32* success = mediaItemIds.AppendElement(min +
i);
1287 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
1291 ShuffleArray(mediaItemIds);
1294 nsAutoString tempTableName;
1295 rv = CreateTempTable(tempTableName);
1296 NS_ENSURE_SUCCESS(rv, rv);
1305 nsCOMPtr<sbISQLSelectBuilder> builder =
1307 NS_ENSURE_SUCCESS(rv, rv);
1309 rv = builder->AddColumn(EmptyString(), kLimitBy);
1310 NS_ENSURE_SUCCESS(rv, rv);
1312 rv = builder->SetBaseTableName(tempTableName);
1313 NS_ENSURE_SUCCESS(rv, rv);
1315 nsAutoString rollingQuery;
1316 rv = builder->ToString(rollingQuery);
1317 NS_ENSURE_SUCCESS(rv, rv);
1324 PRUint32 rowLimit = 0;
1327 while (pos < length) {
1329 if (pos + chunkSize > length) {
1330 chunkSize = length -
pos;
1333 rv = AddMediaItemsTempTable(tempTableName, mediaItemIds, pos, chunkSize);
1334 NS_ENSURE_SUCCESS(rv, rv);
1338 rv = GetRowCount(tempTableName, &rowCount);
1339 NS_ENSURE_SUCCESS(rv, rv);
1341 if (rowCount >= mLimit) {
1346 rowLimit = (PRUint32)(mLimit & 0xFFFFFFFF);
1351 PRUint32 rollingRow;
1352 rv = GetRollingLimit(rollingQuery, 0, &rollingRow);
1353 NS_ENSURE_SUCCESS(rv, rv);
1355 if (rollingRow > 0) {
1356 rowLimit = rollingRow;
1365 rv = ExecuteQuery(mClearListQuery);
1366 NS_ENSURE_SUCCESS(rv, rv);
1369 rv = GetCopyToListQuery(tempTableName, copy);
1370 NS_ENSURE_SUCCESS(rv, rv);
1374 copy.AppendLiteral(
" limit ");
1375 copy.AppendInt(rowLimit);
1378 rv = ExecuteQuery(copy);
1379 NS_ENSURE_SUCCESS(rv, rv);
1382 rv = DropTempTable(tempTableName);
1383 NS_ENSURE_SUCCESS(rv, rv);
1389 sbLocalDatabaseSmartMediaList::AddMediaItemsTempTable(
const nsAutoString& tempTableName,
1390 sbMediaItemIdArray& aArray,
1394 NS_NAMED_LITERAL_STRING(kMediaItems,
"media_items");
1395 NS_NAMED_LITERAL_STRING(kMediaItemId,
"media_item_id");
1396 NS_NAMED_LITERAL_STRING(kMediaItemsAlias,
"_mi");
1397 NS_NAMED_LITERAL_STRING(kMediaListTypeId,
"media_list_type_id");
1401 nsCOMPtr<sbISQLSelectBuilder> builder =
1403 NS_ENSURE_SUCCESS(rv, rv);
1405 rv = builder->SetBaseTableName(kMediaItems);
1406 NS_ENSURE_SUCCESS(rv, rv);
1408 rv = builder->SetBaseTableAlias(kMediaItemsAlias);
1409 NS_ENSURE_SUCCESS(rv, rv);
1411 rv = builder->AddColumn(kMediaItemsAlias, kMediaItemId);
1412 NS_ENSURE_SUCCESS(rv, rv);
1414 rv = AddLimitColumnAndJoin(builder, kMediaItemsAlias);
1415 NS_ENSURE_SUCCESS(rv, rv);
1417 rv = builder->AddColumn(EmptyString(), NS_LITERAL_STRING(
"''"));
1418 NS_ENSURE_SUCCESS(rv, rv);
1421 nsCOMPtr<sbISQLBuilderCriterion> nullCriterion;
1422 rv = builder->CreateMatchCriterionNull(kMediaItemsAlias,
1425 getter_AddRefs(nullCriterion));
1426 NS_ENSURE_SUCCESS(rv, rv);
1428 rv = builder->AddCriterion(nullCriterion);
1429 NS_ENSURE_SUCCESS(rv, rv);
1431 nsCOMPtr<sbISQLBuilderCriterionIn> criterion;
1432 rv = builder->CreateMatchCriterionIn(kMediaItemsAlias,
1434 getter_AddRefs(criterion));
1435 NS_ENSURE_SUCCESS(rv, rv);
1437 rv = builder->AddCriterion(criterion);
1438 NS_ENSURE_SUCCESS(rv, rv);
1440 nsAutoString insertStart;
1441 insertStart.AssignLiteral(
"insert into ");
1442 insertStart.Append(tempTableName);
1443 insertStart.AppendLiteral(
" (media_item_id, limitby, selectby) ");
1446 for (PRUint32
i = 0;
i < aLength;
i++) {
1448 rv = criterion->AddLong(aArray[aStart +
i]);
1449 NS_ENSURE_SUCCESS(rv, rv);
1456 rv = builder->AddRandomOrder();
1457 NS_ENSURE_SUCCESS(rv, rv);
1460 rv = builder->ToString(sql);
1461 NS_ENSURE_SUCCESS(rv, rv);
1463 nsAutoString
insert(insertStart);
1466 rv = ExecuteQuery(insert);
1467 NS_ENSURE_SUCCESS(rv, rv);
1470 rv = criterion->Clear();
1471 NS_ENSURE_SUCCESS(rv, rv);
1479 sbLocalDatabaseSmartMediaList::GetRollingLimit(
const nsAString& aSql,
1480 PRUint32 aRollingLimitColumnIndex,
1483 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - GetRollingLimit()",
this));
1485 nsCOMPtr<sbIDatabaseQuery> query;
1486 nsresult rv = mLocalDatabaseLibrary->CreateQuery(getter_AddRefs(query));
1487 NS_ENSURE_SUCCESS(rv, rv);
1489 rv = query->SetRollingLimit(mLimit);
1490 NS_ENSURE_SUCCESS(rv, rv);
1492 rv = query->SetRollingLimitColumnIndex(aRollingLimitColumnIndex);
1493 NS_ENSURE_SUCCESS(rv, rv);
1495 rv = query->AddQuery(aSql);
1496 NS_ENSURE_SUCCESS(rv, rv);
1499 rv = query->Execute(&dbOk);
1500 NS_ENSURE_SUCCESS(rv, rv);
1501 NS_ENSURE_TRUE(dbOk == 0, NS_ERROR_FAILURE);
1503 rv = query->GetRollingLimitResult(aRow);
1504 NS_ENSURE_SUCCESS(rv, rv);
1506 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - GetRollingLimit() - %s = %d",
1507 this, NS_ConvertUTF16toUTF8(aSql).
get(), *aRow));
1513 sbLocalDatabaseSmartMediaList::CreateSQLForCondition(sbRefPtrCondition& aCondition,
1519 NS_NAMED_LITERAL_STRING(kConditionAlias,
"_c");
1520 NS_NAMED_LITERAL_STRING(kMediaItemId,
"media_item_id");
1521 NS_NAMED_LITERAL_STRING(kMemberMediaItemId,
"member_media_item_id");
1522 NS_NAMED_LITERAL_STRING(kMediaItems,
"media_items");
1523 NS_NAMED_LITERAL_STRING(kMediaLists,
"simple_media_lists");
1524 NS_NAMED_LITERAL_STRING(kMediaItemsAlias,
"_mi");
1525 NS_NAMED_LITERAL_STRING(kMediaListTypeId,
"media_list_type_id");
1526 NS_NAMED_LITERAL_STRING(kPropertyId,
"property_id");
1527 NS_NAMED_LITERAL_STRING(kResourceProperties,
"resource_properties");
1531 nsCOMPtr<sbIPropertyInfo> info;
1532 rv = mPropMan->GetPropertyInfo(aCondition->mPropertyID,
1533 getter_AddRefs(info));
1534 if (NS_FAILED(rv)) {
1535 if (rv == NS_ERROR_NOT_AVAILABLE) {
1536 return NS_ERROR_NOT_AVAILABLE;
1539 NS_ENSURE_SUCCESS(rv, rv);
1543 nsCOMPtr<sbISQLSelectBuilder> builder =
1545 NS_ENSURE_SUCCESS(rv, rv);
1549 rv = builder->SetBaseTableName(kMediaItems);
1550 NS_ENSURE_SUCCESS(rv, rv);
1552 nsAutoString mediaColumn;
1553 nsAutoString joinTable;
1554 PRBool bIsMediaListMatch;
1560 sbRefPtrCondition ruleCondition = aCondition;
1562 if (bIsMediaListMatch) {
1563 if (ruleCondition->mLeftValue.IsEmpty()) {
1577 nsCOMPtr<sbIPropertyOperator> opObj;
1578 rv = ruleCondition->GetOperator(getter_AddRefs(opObj));
1579 NS_ENSURE_SUCCESS(rv, rv);
1582 rv = opObj->GetOperator(op);
1583 NS_ENSURE_SUCCESS(rv, rv);
1594 NS_LITERAL_STRING(
""),
1595 NS_LITERAL_STRING(
""),
1596 NS_LITERAL_STRING(
""));
1597 bIsMediaListMatch = PR_FALSE;
1598 isTopLevelProperty = PR_TRUE;
1601 mediaColumn = kMemberMediaItemId;
1602 joinTable = kMediaLists;
1605 mediaColumn = kMediaItemId;
1606 joinTable = kResourceProperties;
1609 nsAutoString baseAlias;
1612 if (isTopLevelProperty) {
1613 baseAlias.Assign(kConditionAlias);
1614 rv = builder->SetBaseTableAlias(baseAlias);
1615 NS_ENSURE_SUCCESS(rv, rv);
1617 rv = builder->AddColumn(baseAlias, kMediaItemId);
1618 NS_ENSURE_SUCCESS(rv, rv);
1620 rv = AddCriterionForCondition(builder, ruleCondition, info);
1621 NS_ENSURE_SUCCESS(rv, rv);
1624 nsCOMPtr<sbISQLBuilderCriterion> criterion;
1625 rv = builder->CreateMatchCriterionNull(baseAlias,
1628 getter_AddRefs(criterion));
1629 NS_ENSURE_SUCCESS(rv, rv);
1631 rv = builder->AddCriterion(criterion);
1632 NS_ENSURE_SUCCESS(rv, rv);
1635 baseAlias.Assign(kMediaItemsAlias);
1636 rv = builder->SetBaseTableAlias(baseAlias);
1637 NS_ENSURE_SUCCESS(rv, rv);
1639 builder->SetDistinct(PR_TRUE);
1641 rv = builder->AddColumn(baseAlias, kMediaItemId);
1642 NS_ENSURE_SUCCESS(rv, rv);
1649 nsCOMPtr<sbISQLBuilderCriterion> criterion_media_item;
1650 rv = builder->CreateMatchCriterionTable(baseAlias,
1655 getter_AddRefs(criterion_media_item));
1656 NS_ENSURE_SUCCESS(rv, rv);
1660 if (bIsMediaListMatch) {
1661 rv = MediaListGuidToDB(ruleCondition->mLeftValue, longVal);
1662 NS_ENSURE_SUCCESS(rv, rv);
1664 if (longVal == (PRUint32)-1)
1665 return NS_ERROR_UNEXPECTED;
1667 colId = kMediaItemId;
1670 rv = mPropertyCache->GetPropertyDBID(ruleCondition->mPropertyID, &longVal);
1671 NS_ENSURE_SUCCESS(rv, rv);
1673 colId = kPropertyId;
1676 nsCOMPtr<sbISQLBuilderCriterion> join_criterion;
1679 nsCOMPtr<sbISQLBuilderCriterion> criterion_property_id;
1680 rv = builder->CreateMatchCriterionLong(kConditionAlias,
1684 getter_AddRefs(criterion_property_id));
1685 NS_ENSURE_SUCCESS(rv, rv);
1688 rv = builder->CreateAndCriterion(criterion_media_item,
1689 criterion_property_id,
1690 getter_AddRefs(join_criterion));
1691 NS_ENSURE_SUCCESS(rv, rv);
1699 NS_ENSURE_SUCCESS(rv, rv);
1702 rv = AddCriterionForCondition(builder, ruleCondition, info);
1703 NS_ENSURE_SUCCESS(rv, rv);
1706 nsCOMPtr<sbISQLBuilderCriterion> criterion;
1707 rv = builder->CreateMatchCriterionNull(kMediaItemsAlias,
1710 getter_AddRefs(criterion));
1711 NS_ENSURE_SUCCESS(rv, rv);
1713 rv = builder->AddCriterion(criterion);
1714 NS_ENSURE_SUCCESS(rv, rv);
1718 rv = AddLimitColumnAndJoin(builder, baseAlias);
1719 NS_ENSURE_SUCCESS(rv, rv);
1724 !mSelectPropertyID.IsEmpty()) {
1727 rv = AddSelectColumnAndJoin(builder, baseAlias, aAddOrderBy);
1728 NS_ENSURE_SUCCESS(rv, rv);
1732 rv = builder->AddColumn(EmptyString(), NS_LITERAL_STRING(
"''"));
1733 NS_ENSURE_SUCCESS(rv, rv);
1736 rv = builder->ToString(_retval);
1737 NS_ENSURE_SUCCESS(rv, rv);
1739 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - CreateSQLForCondition() - %s",
1740 this, NS_LossyConvertUTF16toASCII(Substring(_retval, 0, 400)).
get()));
1741 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - CreateSQLForCondition() - %s",
1742 this, NS_LossyConvertUTF16toASCII(Substring(_retval, 400, 800)).
get()));
1748 sbLocalDatabaseSmartMediaList::ScanfInt64(nsAString &aString, PRInt64 *aRetVal) {
1750 NS_ConvertUTF16toUTF8 narrow(aString);
1753 return NS_ERROR_INVALID_ARG;
1760 sbLocalDatabaseSmartMediaList::ScanfInt64d(nsAString &aString) {
1762 NS_ConvertUTF16toUTF8 narrow(aString);
1771 sbLocalDatabaseSmartMediaList::SPrintfInt64(nsAString &aString,
1774 if (PR_snprintf(out, 32,
gsFmtRadix10, aValue) == (PRUint32)-1) {
1775 aString = NS_LITERAL_STRING(
"0");
1777 NS_ConvertUTF8toUTF16 wide(out);
1782 sbLocalDatabaseSmartMediaList::StripTime(PRInt64 aDateTime) {
1783 PRExplodedTime explodedTime = {0};
1784 PR_ExplodeTime(aDateTime * PR_USEC_PER_MSEC, PR_LocalTimeParameters, &explodedTime);
1785 explodedTime.tm_usec = 0;
1786 explodedTime.tm_sec = 0;
1787 explodedTime.tm_min = 0;
1788 explodedTime.tm_hour = 0;
1789 return PR_ImplodeTime(&explodedTime) / PR_USEC_PER_MSEC;
1794 sbRefPtrCondition& aCondition,
1797 NS_ENSURE_ARG_POINTER(aBuilder);
1798 NS_ENSURE_ARG_POINTER(aInfo);
1800 NS_NAMED_LITERAL_STRING(kConditionAlias,
"_c");
1801 NS_NAMED_LITERAL_STRING(kObjSearchable,
"obj_searchable");
1802 NS_NAMED_LITERAL_STRING(kMediaItem,
"media_item_id");
1808 nsAutoString columnName;
1810 PRBool bNeedOrIsNull;
1811 rv = GetConditionNeedsNull(aCondition, aInfo, bNeedOrIsNull);
1812 NS_ENSURE_SUCCESS(rv, rv);
1814 if (isTopLevelProperty) {
1816 NS_ENSURE_SUCCESS(rv, rv);
1819 columnName.Assign(kObjSearchable);
1822 nsCOMPtr<sbIPropertyOperator> opObj;
1823 rv = aCondition->GetOperator(getter_AddRefs(opObj));
1824 NS_ENSURE_SUCCESS(rv, rv);
1827 rv = opObj->GetOperator(op);
1828 NS_ENSURE_SUCCESS(rv, rv);
1831 nsAutoString leftValue;
1832 nsAutoString rightValue;
1836 leftValue = NS_LITERAL_STRING(
"1");
1839 leftValue = NS_LITERAL_STRING(
"");
1843 PRTime timeValue = 0;
1844 NS_ConvertUTF16toUTF8 narrow(aCondition->mLeftValue);
1846 if(PR_sscanf(narrow.get(),
gsFmtRadix10, &timeValue) != 1) {
1847 return NS_ERROR_INVALID_ARG;
1852 PRTime
now = PR_Now()/PR_USEC_PER_MSEC;
1853 PRTime when = now - timeValue;
1854 if(PR_snprintf(out, 32,
gsFmtRadix10, when) == (PRUint32)-1) {
1855 return NS_ERROR_FAILURE;
1857 NS_ConvertUTF8toUTF16 wide(out);
1860 leftValue = aCondition->mLeftValue;
1863 PRBool bNumericCondition = PR_FALSE;
1865 columnName.Assign(kMediaItem);
1868 rv = MediaListGuidToDB(leftValue,
id);
1869 NS_ENSURE_SUCCESS(rv, rv);
1871 leftValue.Truncate();
1872 leftValue.AppendInt(
id);
1874 bNumericCondition = PR_TRUE;
1877 PRBool invertRange = PR_FALSE;
1879 rightValue = aCondition->mRightValue;
1885 SPrintfInt64(leftValue, StripTime(ScanfInt64d(leftValue)));
1886 SPrintfInt64(rightValue, StripTime(ScanfInt64d(rightValue))+(
ONEDAY-
ONE_MS));
1892 SPrintfInt64(leftValue, StripTime(ScanfInt64d(leftValue)));
1893 SPrintfInt64(rightValue, StripTime(ScanfInt64d(leftValue))+(
ONEDAY-
ONE_MS));
1899 SPrintfInt64(leftValue, StripTime(ScanfInt64d(leftValue)));
1900 SPrintfInt64(rightValue, StripTime(ScanfInt64d(leftValue))+(
ONEDAY-
ONE_MS));
1902 invertRange = PR_TRUE;
1906 SPrintfInt64(leftValue, StripTime(ScanfInt64d(leftValue)));
1911 SPrintfInt64(leftValue, StripTime(ScanfInt64d(leftValue))+(
ONEDAY-
ONE_MS));
1916 SPrintfInt64(leftValue, StripTime(ScanfInt64d(leftValue))+(
ONEDAY-
ONE_MS));
1921 SPrintfInt64(leftValue, StripTime(ScanfInt64d(leftValue)));
1925 if (!leftValue.IsEmpty()) {
1926 rv = aInfo->MakeSearchable(leftValue, value);
1931 if (NS_FAILED(rv)) {
1932 nsCOMPtr<nsINetUtil> netUtil =
1933 do_CreateInstance(
"@mozilla.org/network/util;1", &rv);
1934 NS_ENSURE_SUCCESS(rv, rv);
1937 rv = netUtil->EscapeString(NS_ConvertUTF16toUTF8(leftValue),
1938 nsINetUtil::ESCAPE_URL_PATH,
1940 NS_ENSURE_SUCCESS(rv, rv);
1942 value = NS_ConvertUTF8toUTF16(spec);
1948 nsCOMPtr<sbISQLBuilderCriterion>
left;
1954 rv = aBuilder->CreateMatchCriterionString(kConditionAlias,
1958 getter_AddRefs(left));
1959 NS_ENSURE_SUCCESS(rv, rv);
1961 nsAutoString rvalue;
1962 rv = aInfo->MakeSearchable(rightValue, rvalue);
1967 if (NS_FAILED(rv)) {
1968 rvalue = rightValue;
1971 nsCOMPtr<sbISQLBuilderCriterion>
right;
1976 rv = aBuilder->CreateMatchCriterionString(kConditionAlias,
1980 getter_AddRefs(right));
1981 NS_ENSURE_SUCCESS(rv, rv);
1983 nsCOMPtr<sbISQLBuilderCriterion> criterion;
1985 rv = aBuilder->CreateOrCriterion(left, right, getter_AddRefs(criterion));
1987 rv = aBuilder->CreateAndCriterion(left, right, getter_AddRefs(criterion));
1988 NS_ENSURE_SUCCESS(rv, rv);
1990 if (bNeedOrIsNull) {
1991 nsCOMPtr<sbISQLBuilderCriterion> orIsNull;
1992 rv = aBuilder->CreateMatchCriterionNull(kConditionAlias,
1995 getter_AddRefs(orIsNull));
1996 NS_ENSURE_SUCCESS(rv, rv);
1998 nsCOMPtr<sbISQLBuilderCriterion> criterionOrIsNull;
1999 rv = aBuilder->CreateOrCriterion(criterion,
2001 getter_AddRefs(criterionOrIsNull));
2002 NS_ENSURE_SUCCESS(rv, rv);
2003 criterion = criterionOrIsNull;
2006 rv = aBuilder->AddCriterion(criterion);
2007 NS_ENSURE_SUCCESS(rv, rv);
2013 PRInt32 matchType = -1;
2051 if (matchType >= 0) {
2052 nsCOMPtr<sbISQLBuilderCriterion> criterion;
2053 if (bNumericCondition) {
2054 PRInt64 numericValue;
2055 rv = ScanfInt64(value, &numericValue);
2056 NS_ENSURE_SUCCESS(rv, rv);
2057 rv = aBuilder->CreateMatchCriterionLongLong(kConditionAlias,
2061 getter_AddRefs(criterion));
2063 rv = aBuilder->CreateMatchCriterionString(kConditionAlias,
2067 getter_AddRefs(criterion));
2069 NS_ENSURE_SUCCESS(rv, rv);
2071 if (bNeedOrIsNull) {
2072 nsCOMPtr<sbISQLBuilderCriterion> orIsNull;
2073 rv = aBuilder->CreateMatchCriterionNull(kConditionAlias,
2076 getter_AddRefs(orIsNull));
2077 NS_ENSURE_SUCCESS(rv, rv);
2079 nsCOMPtr<sbISQLBuilderCriterion> criterionOrIsNull;
2080 rv = aBuilder->CreateOrCriterion(criterion,
2082 getter_AddRefs(criterionOrIsNull));
2083 NS_ENSURE_SUCCESS(rv, rv);
2084 criterion = criterionOrIsNull;
2087 rv = aBuilder->AddCriterion(criterion);
2088 NS_ENSURE_SUCCESS(rv, rv);
2106 like.AppendLiteral(
"%");
2115 like.AppendLiteral(
"%");
2118 nsCOMPtr<sbISQLBuilderCriterion> criterion;
2128 rv = aBuilder->CreateMatchCriterionString(kConditionAlias,
2132 getter_AddRefs(criterion));
2133 NS_ENSURE_SUCCESS(rv, rv);
2135 if (bNeedOrIsNull) {
2136 nsCOMPtr<sbISQLBuilderCriterion> orIsNull;
2137 rv = aBuilder->CreateMatchCriterionNull(kConditionAlias,
2140 getter_AddRefs(orIsNull));
2141 NS_ENSURE_SUCCESS(rv, rv);
2143 nsCOMPtr<sbISQLBuilderCriterion> criterionOrIsNull;
2144 rv = aBuilder->CreateOrCriterion(criterion,
2146 getter_AddRefs(criterionOrIsNull));
2147 NS_ENSURE_SUCCESS(rv, rv);
2148 criterion = criterionOrIsNull;
2151 rv = aBuilder->AddCriterion(criterion);
2152 NS_ENSURE_SUCCESS(rv, rv);
2158 return NS_ERROR_UNEXPECTED;
2161 nsresult sbLocalDatabaseSmartMediaList::MediaListGuidToDB(nsAString &
val, PRUint32 &v)
2170 do_GetService(
"@songbirdnest.com/Songbird/library/Manager;1", &rv);
2171 NS_ENSURE_SUCCESS(rv, rv);
2174 if (!mSourceLibraryGuid.IsEmpty()) {
2175 rv = libraryManager->GetLibrary(mSourceLibraryGuid, getter_AddRefs(library));
2177 rv = libraryManager->GetMainLibrary(getter_AddRefs(library));
2179 NS_ENSURE_SUCCESS(rv, rv);
2181 nsCOMPtr<sbIMediaItem> item;
2182 rv = library->GetMediaItem(val, getter_AddRefs(item));
2186 nsAutoString storageGuid;
2189 NS_ENSURE_SUCCESS(rv, rv);
2191 if (!storageGuid.IsEmpty()) {
2192 nsCOMPtr<sbIMediaItem> storageItem;
2193 rv = library->GetMediaItem(storageGuid, getter_AddRefs(storageItem));
2194 NS_ENSURE_SUCCESS(rv, rv);
2196 rv = storageItem->GetGuid(guid);
2197 NS_ENSURE_SUCCESS(rv, rv);
2202 nsCOMPtr<sbILocalDatabaseLibrary> locallibrary =
2203 do_QueryInterface(library, &rv);
2204 NS_ENSURE_SUCCESS(rv, rv);
2206 rv = locallibrary->GetMediaItemIdForGuid(guid, &
id);
2207 NS_ENSURE_SUCCESS(rv, rv);
2216 sbLocalDatabaseSmartMediaList::GetConditionNeedsNull(sbRefPtrCondition& aCondition,
2218 PRBool &bNeedIsNull)
2223 bNeedIsNull = PR_FALSE;
2227 nsCOMPtr<sbIPropertyOperator> opObj;
2228 rv = aCondition->GetOperator(getter_AddRefs(opObj));
2229 NS_ENSURE_SUCCESS(rv, rv);
2230 NS_ENSURE_TRUE(opObj, NS_ERROR_FAILURE);
2233 rv = opObj->GetOperator(op);
2234 NS_ENSURE_SUCCESS(rv, rv);
2237 bNeedIsNull = PR_TRUE;
2241 bNeedIsNull = PR_FALSE;
2245 bNeedIsNull = PR_FALSE;
2249 bNeedIsNull = PR_TRUE;
2253 nsAutoString leftValue,
value;
2254 leftValue = aCondition->mLeftValue;
2255 if (!leftValue.IsEmpty()) {
2256 rv = aInfo->MakeSearchable(leftValue, value);
2261 if (NS_FAILED(rv)) {
2266 PRBool bIsEmpty = value.IsEmpty();
2269 PRBool bIsNumber = PR_TRUE;
2270 rv = ScanfInt64(value, &fValue);
2273 bIsNumber = PR_FALSE;
2278 if ((bIsNumber && fValue == 0) ||
2279 (!bIsNumber && bIsEmpty)) {
2280 bNeedIsNull = PR_TRUE;
2287 if ((bIsNumber && fValue != 0) ||
2288 (!bIsNumber && !bIsEmpty)) {
2289 bNeedIsNull = PR_TRUE;
2296 bNeedIsNull = PR_TRUE;
2304 bNeedIsNull = PR_TRUE;
2311 bNeedIsNull = PR_TRUE;
2318 bNeedIsNull = PR_TRUE;
2329 bNeedIsNull = PR_TRUE;
2334 bNeedIsNull = PR_FALSE;
2339 sbLocalDatabaseSmartMediaList::CreateQueries()
2343 NS_NAMED_LITERAL_STRING(kSimpleMediaLists,
"simple_media_lists");
2344 NS_NAMED_LITERAL_STRING(kMediaItemId,
"media_item_id");
2346 nsCOMPtr<sbILocalDatabaseMediaItem> ldmi = do_QueryInterface(mList, &rv);
2347 NS_ENSURE_SUCCESS(rv, rv);
2350 rv = ldmi->GetMediaItemId(&mediaItemId);
2351 NS_ENSURE_SUCCESS(rv, rv);
2353 nsCOMPtr<sbISQLDeleteBuilder> deleteb =
2356 rv = deleteb->SetTableName(kSimpleMediaLists);
2357 NS_ENSURE_SUCCESS(rv, rv);
2359 nsCOMPtr<sbISQLBuilderCriterion> criterion;
2360 rv = deleteb->CreateMatchCriterionLong(EmptyString(),
2364 getter_AddRefs(criterion));
2365 NS_ENSURE_SUCCESS(rv, rv);
2367 rv = deleteb->AddCriterion(criterion);
2368 NS_ENSURE_SUCCESS(rv, rv);
2370 rv = deleteb->ToString(mClearListQuery);
2371 NS_ENSURE_SUCCESS(rv, rv);
2378 const nsAString& aBaseTableAlias,
2381 NS_ENSURE_ARG_POINTER(aBuilder);
2383 NS_NAMED_LITERAL_STRING(kObjSortable,
"obj_sortable");
2384 NS_NAMED_LITERAL_STRING(kPropertyId,
"property_id");
2385 NS_NAMED_LITERAL_STRING(kMediaItemId,
"media_item_id");
2386 NS_NAMED_LITERAL_STRING(kResourceProperties,
"resource_properties");
2387 NS_NAMED_LITERAL_STRING(kSelectAlias,
"_select");
2394 nsAutoString columnName;
2396 NS_ENSURE_SUCCESS(rv, rv);
2398 rv = aBuilder->AddColumn(aBaseTableAlias, columnName);
2399 NS_ENSURE_SUCCESS(rv, rv);
2402 rv = aBuilder->AddOrder(aBaseTableAlias, columnName, mSelectDirection);
2403 NS_ENSURE_SUCCESS(rv, rv);
2408 rv = aBuilder->AddColumn(kSelectAlias, kObjSortable);
2409 NS_ENSURE_SUCCESS(rv, rv);
2412 PRUint32 propertyDBID;
2413 rv = mPropertyCache->GetPropertyDBID(mSelectPropertyID, &propertyDBID);
2414 NS_ENSURE_SUCCESS(rv, rv);
2417 nsCOMPtr<sbISQLBuilderCriterion> criterion_media_item;
2418 rv = aBuilder->CreateMatchCriterionTable(aBaseTableAlias,
2423 getter_AddRefs(criterion_media_item));
2424 NS_ENSURE_SUCCESS(rv, rv);
2428 nsCOMPtr<sbISQLBuilderCriterion> criterion_property_id;
2429 rv = aBuilder->CreateMatchCriterionLong(kSelectAlias,
2433 getter_AddRefs(criterion_property_id));
2434 NS_ENSURE_SUCCESS(rv, rv);
2437 nsCOMPtr<sbISQLBuilderCriterion> join_criterion;
2438 rv = aBuilder->CreateAndCriterion(criterion_media_item,
2439 criterion_property_id,
2440 getter_AddRefs(join_criterion));
2441 NS_ENSURE_SUCCESS(rv, rv);
2446 kResourceProperties,
2449 NS_ENSURE_SUCCESS(rv, rv);
2452 rv = aBuilder->AddOrder(kSelectAlias, kObjSortable, mSelectDirection);
2453 NS_ENSURE_SUCCESS(rv, rv);
2462 const nsAString& aBaseTableAlias)
2464 NS_ENSURE_ARG_POINTER(aBuilder);
2466 NS_NAMED_LITERAL_STRING(kContentLength,
"content_length");
2467 NS_NAMED_LITERAL_STRING(kLimitAlias,
"_limit");
2468 NS_NAMED_LITERAL_STRING(kObjSortable,
"obj_sortable");
2469 NS_NAMED_LITERAL_STRING(kPropertyId,
"property_id");
2470 NS_NAMED_LITERAL_STRING(kMediaItemId,
"media_item_id");
2471 NS_NAMED_LITERAL_STRING(kResourceProperties,
"resource_properties");
2475 switch(mLimitType) {
2479 rv = aBuilder->AddColumn(EmptyString(), NS_LITERAL_STRING(
"0"));
2480 NS_ENSURE_SUCCESS(rv, rv);
2485 rv = aBuilder->AddColumn(kLimitAlias, kObjSortable);
2486 NS_ENSURE_SUCCESS(rv, rv);
2489 kResourceProperties,
2494 NS_ENSURE_SUCCESS(rv, rv);
2496 PRUint32 propertyId;
2499 NS_ENSURE_SUCCESS(rv, rv);
2501 nsCOMPtr<sbISQLBuilderCriterion> criterion;
2502 rv = aBuilder->CreateMatchCriterionLong(kLimitAlias,
2506 getter_AddRefs(criterion));
2507 rv = aBuilder->AddCriterion(criterion);
2508 NS_ENSURE_SUCCESS(rv, rv);
2513 rv = aBuilder->AddColumn(aBaseTableAlias, kContentLength);
2514 NS_ENSURE_SUCCESS(rv, rv);
2522 sbLocalDatabaseSmartMediaList::GetCopyToListQuery(
const nsAString& aTempTableName,
2527 nsCOMPtr<sbILocalDatabaseMediaItem> ldmi = do_QueryInterface(mList, &rv);
2528 NS_ENSURE_SUCCESS(rv, rv);
2531 rv = ldmi->GetMediaItemId(&mediaItemId);
2532 NS_ENSURE_SUCCESS(rv, rv);
2534 nsCOMPtr<sbISQLInsertBuilder> insert =
2537 rv = insert->SetIntoTableName(NS_LITERAL_STRING(
"simple_media_lists"));
2538 NS_ENSURE_SUCCESS(rv, rv);
2540 rv = insert->AddColumn(NS_LITERAL_STRING(
"media_item_id"));
2541 NS_ENSURE_SUCCESS(rv, rv);
2543 rv = insert->AddColumn(NS_LITERAL_STRING(
"member_media_item_id"));
2544 NS_ENSURE_SUCCESS(rv, rv);
2546 rv = insert->AddColumn(NS_LITERAL_STRING(
"ordinal"));
2547 NS_ENSURE_SUCCESS(rv, rv);
2549 nsCOMPtr<sbISQLSelectBuilder>
select =
2552 rv = select->SetBaseTableName(aTempTableName);
2553 NS_ENSURE_SUCCESS(rv, rv);
2555 nsAutoString mediaItemIdStr;
2556 mediaItemIdStr.AppendInt(mediaItemId);
2557 rv = select->AddColumn(EmptyString(), mediaItemIdStr);
2558 NS_ENSURE_SUCCESS(rv, rv);
2560 rv = select->AddColumn(EmptyString(), NS_LITERAL_STRING(
"media_item_id"));
2561 NS_ENSURE_SUCCESS(rv, rv);
2563 rv = select->AddColumn(EmptyString(), NS_LITERAL_STRING(
"count"));
2564 NS_ENSURE_SUCCESS(rv, rv);
2566 rv = insert->SetSelect(select);
2567 NS_ENSURE_SUCCESS(rv, rv);
2569 rv = insert->ToString(aSql);
2570 NS_ENSURE_SUCCESS(rv, rv);
2576 sbLocalDatabaseSmartMediaList::CreateTempTable(nsAString&
aName)
2580 rv = MakeTempTableName(aName);
2581 NS_ENSURE_SUCCESS(rv, rv);
2584 sql.AssignLiteral(
"create table ");
2586 sql.AppendLiteral(
" (media_item_id integer unique, limitby integer, selectby text, count integer primary key autoincrement)");
2588 rv = ExecuteQuery(sql);
2589 NS_ENSURE_SUCCESS(rv, rv);
2595 sbLocalDatabaseSmartMediaList::DropTempTable(
const nsAString& aName)
2600 sql.AssignLiteral(
"drop table ");
2603 rv = ExecuteQuery(sql);
2604 NS_ENSURE_SUCCESS(rv, rv);
2610 sbLocalDatabaseSmartMediaList::ExecuteQuery(
const nsAString& aSql)
2612 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - ExecuteQuery() - %s",
2613 this, NS_LossyConvertUTF16toASCII(Substring(aSql, 0, 400)).
get()));
2614 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - ExecuteQuery() - %s",
2615 this, NS_LossyConvertUTF16toASCII(Substring(aSql, 400, 800)).
get()));
2617 nsCOMPtr<sbIDatabaseQuery> query;
2618 nsresult rv = mLocalDatabaseLibrary->CreateQuery(getter_AddRefs(query));
2619 NS_ENSURE_SUCCESS(rv, rv);
2621 rv = query->AddQuery(aSql);
2622 NS_ENSURE_SUCCESS(rv, rv);
2625 rv = query->Execute(&dbOk);
2626 NS_ENSURE_SUCCESS(rv, rv);
2627 NS_ENSURE_TRUE(dbOk == 0, NS_ERROR_FAILURE);
2634 sbLocalDatabaseSmartMediaList::MakeTempTableName(nsAString& aName)
2638 nsCOMPtr<nsIUUIDGenerator> uuidGen =
2639 do_GetService(
"@mozilla.org/uuid-generator;1", &rv);
2640 NS_ENSURE_SUCCESS(rv, rv);
2643 rv = uuidGen->GenerateUUIDInPlace(&
id);
2644 NS_ENSURE_SUCCESS(rv, rv);
2646 char guidChars[NSID_LENGTH];
2647 id.ToProvidedString(guidChars);
2649 nsString
guid(NS_ConvertASCIItoUTF16(nsDependentCString(guidChars,
2652 nsAutoString stripped;
2657 stripped.Append(Substring(guid, 1, 8));
2658 stripped.Append(Substring(guid, 10, 4));
2659 stripped.Append(Substring(guid, 15, 4));
2660 stripped.Append(Substring(guid, 20, 4));
2661 stripped.Append(Substring(guid, 25, 12));
2663 nsAutoString tempTableName;
2664 tempTableName.AssignLiteral(
"temp_smart_");
2665 tempTableName.Append(stripped);
2667 aName = tempTableName;
2672 sbLocalDatabaseSmartMediaList::GetMediaItemIdRange(PRUint32* aMin,
2676 sql.AssignLiteral(
"select min(media_item_id), max(media_item_id) from media_items");
2678 nsCOMPtr<sbIDatabaseQuery> query;
2679 nsresult rv = mLocalDatabaseLibrary->CreateQuery(getter_AddRefs(query));
2680 NS_ENSURE_SUCCESS(rv, rv);
2682 rv = query->AddQuery(sql);
2683 NS_ENSURE_SUCCESS(rv, rv);
2686 rv = query->Execute(&dbOk);
2687 NS_ENSURE_SUCCESS(rv, rv);
2688 NS_ENSURE_TRUE(dbOk == 0, NS_ERROR_FAILURE);
2690 nsCOMPtr<sbIDatabaseResult> result;
2691 rv = query->GetResultObject(getter_AddRefs(result));
2692 NS_ENSURE_TRUE(result, NS_ERROR_FAILURE);
2695 rv = result->GetRowCount(&rowCount);
2696 NS_ENSURE_SUCCESS(rv, rv);
2698 if (rowCount != 1) {
2699 return NS_ERROR_UNEXPECTED;
2703 rv = result->GetRowCell(0, 0, temp);
2704 NS_ENSURE_SUCCESS(rv, rv);
2706 *aMin = temp.ToInteger(&rv);
2707 NS_ENSURE_SUCCESS(rv, rv);
2709 rv = result->GetRowCell(0, 1, temp);
2710 NS_ENSURE_SUCCESS(rv, rv);
2712 *aMax = temp.ToInteger(&rv);
2713 NS_ENSURE_SUCCESS(rv, rv);
2719 sbLocalDatabaseSmartMediaList::GetRowCount(
const nsAString& aTableName,
2723 sql.AssignLiteral(
"select count(1) from ");
2724 sql.Append(aTableName);
2726 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - GetRowCount() - %s",
2727 this, NS_LossyConvertUTF16toASCII(sql).
get()));
2729 nsCOMPtr<sbIDatabaseQuery> query;
2730 nsresult rv = mLocalDatabaseLibrary->CreateQuery(getter_AddRefs(query));
2731 NS_ENSURE_SUCCESS(rv, rv);
2733 rv = query->AddQuery(sql);
2734 NS_ENSURE_SUCCESS(rv, rv);
2737 rv = query->Execute(&dbOk);
2738 NS_ENSURE_SUCCESS(rv, rv);
2739 NS_ENSURE_TRUE(dbOk == 0, NS_ERROR_FAILURE);
2741 nsCOMPtr<sbIDatabaseResult> result;
2742 rv = query->GetResultObject(getter_AddRefs(result));
2743 NS_ENSURE_TRUE(result, NS_ERROR_FAILURE);
2746 rv = result->GetRowCount(&rowCount);
2747 NS_ENSURE_SUCCESS(rv, rv);
2749 if (rowCount != 1) {
2750 return NS_ERROR_UNEXPECTED;
2754 rv = result->GetRowCell(0, 0, temp);
2755 NS_ENSURE_SUCCESS(rv, rv);
2757 *_retval = temp.ToInteger(&rv);
2758 NS_ENSURE_SUCCESS(rv, rv);
2768 sbLocalDatabaseSmartMediaList::ShuffleArray(sbMediaItemIdArray& aArray)
2770 PRUint32 n = aArray.Length();
2773 for (i = 0; i < n - 1; i++) {
2774 PRUint32 j = i + rand() / (RAND_MAX / (n -
i) + 1);
2775 PRUint32
t = aArray[j];
2776 aArray[j] = aArray[
i];
2783 sbLocalDatabaseSmartMediaList::ReadConfiguration()
2785 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - ReadConfiguration()",
this));
2789 nsAutoMonitor monitor(mConditionsMonitor);
2792 PRBool success = map.Init();
2793 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2799 mSelectPropertyID.Truncate();
2800 mSelectDirection = PR_TRUE;
2801 mRandomSelection = PR_FALSE;
2802 mAutoUpdate =
false;
2803 mConditions.Clear();
2808 NS_ENSURE_SUCCESS(rv, rv);
2811 if (state.IsEmpty()) {
2817 NS_ENSURE_SUCCESS(rv, rv);
2822 if (map.Get(NS_LITERAL_STRING(
"matchType"), &value)) {
2823 mMatchType = value.ToInteger(&dontCare);
2830 if (map.Get(NS_LITERAL_STRING(
"limitType"), &value)) {
2831 mLimitType = value.ToInteger(&dontCare);
2838 if (map.Get(NS_LITERAL_STRING(
"limit"), &value)) {
2840 PR_sscanf(NS_LossyConvertUTF16toASCII(value).
get(),
"%llu", &mLimit);
2843 if (map.Get(NS_LITERAL_STRING(
"selectPropertyID"), &value)) {
2844 mSelectPropertyID =
value;
2847 if (map.Get(NS_LITERAL_STRING(
"selectDirection"), &value)) {
2848 mSelectDirection = value.EqualsLiteral(
"1");
2851 if (map.Get(NS_LITERAL_STRING(
"randomSelection"), &value)) {
2852 mRandomSelection = value.EqualsLiteral(
"1");
2855 if (map.Get(NS_LITERAL_STRING(
"autoUpdate"), &value)) {
2856 PR_sscanf(NS_LossyConvertUTF16toASCII(value).
get(),
"%d", &mAutoUpdate);
2859 map.Get(NS_LITERAL_STRING(
"sourceLibraryGuid"), &mSourceLibraryGuid);
2861 if (map.Get(NS_LITERAL_STRING(
"conditionCount"), &value)) {
2862 PRUint32 count = value.ToInteger(&rv);
2863 NS_ENSURE_SUCCESS(rv, rv);
2866 success = conditionMap.Init();
2867 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2869 for (PRUint32
i = 0;
i <
count;
i++) {
2871 key.AssignLiteral(
"condition");
2874 if (map.Get(key, &value)) {
2875 conditionMap.Clear();
2877 if (NS_FAILED(rv)) {
2878 NS_WARNING(
"Could not parse condition state");
2884 nsAutoString property;
2885 nsAutoString leftValue;
2886 nsAutoString rightValue;
2887 nsAutoString displayUnit;
2888 nsAutoString opString;
2890 if (conditionMap.Get(NS_LITERAL_STRING(
"property"), &value)) {
2894 if (conditionMap.Get(NS_LITERAL_STRING(
"leftValue"), &value)) {
2898 if (conditionMap.Get(NS_LITERAL_STRING(
"rightValue"), &value)) {
2902 if (conditionMap.Get(NS_LITERAL_STRING(
"displayUnit"), &value)) {
2903 displayUnit =
value;
2906 if (conditionMap.Get(NS_LITERAL_STRING(
"operator"), &value)) {
2910 if (!property.IsEmpty() && !opString.IsEmpty()) {
2912 sbRefPtrCondition condition;
2918 NS_ENSURE_TRUE(condition, NS_ERROR_OUT_OF_MEMORY);
2920 sbRefPtrCondition* victory = mConditions.AppendElement(condition);
2921 NS_ENSURE_TRUE(victory, NS_ERROR_OUT_OF_MEMORY);
2924 NS_WARNING(
"Can't restore condition, blank property or operator");
2934 sbLocalDatabaseSmartMediaList::WriteConfiguration()
2936 TRACE((
"sbLocalDatabaseSmartMediaList[0x%.8x] - WriteConfiguration()",
this));
2940 PRUint32 count = mConditions.Length();
2943 PRBool success = map.Init();
2944 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2947 match.AppendInt(mMatchType);
2948 success = map.Put(NS_LITERAL_STRING(
"matchType"), match);
2949 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2952 limitType.AppendInt(mLimitType);
2953 success = map.Put(NS_LITERAL_STRING(
"limitType"), limitType);
2954 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2959 PR_snprintf(buf,
sizeof(buf),
"%llu", mLimit);
2960 limit.Append(NS_ConvertASCIItoUTF16(buf));
2961 success = map.Put(NS_LITERAL_STRING(
"limit"), limit);
2962 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2964 success = map.Put(NS_LITERAL_STRING(
"selectPropertyID"),
2966 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2969 selectDirection.AppendLiteral(mSelectDirection ?
"1" :
"0");
2970 success = map.Put(NS_LITERAL_STRING(
"selectDirection"), selectDirection);
2971 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2974 randomSelection.AppendLiteral(mRandomSelection ?
"1" :
"0");
2975 success = map.Put(NS_LITERAL_STRING(
"randomSelection"), randomSelection);
2976 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2979 autoUpdate.AppendInt(mAutoUpdate);
2980 success = map.Put(NS_LITERAL_STRING(
"autoUpdate"), autoUpdate);
2981 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2984 conditionCount.AppendInt(count);
2985 success = map.Put(NS_LITERAL_STRING(
"conditionCount"), conditionCount);
2986 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
2988 for (PRUint32
i = 0;
i <
count;
i++) {
2990 key.AssignLiteral(
"condition");
2994 rv = mConditions[
i]->ToString(value);
2995 NS_ENSURE_SUCCESS(rv, rv);
2997 success = map.Put(key, value);
2998 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
3001 success = map.Put(NS_LITERAL_STRING(
"sourceLibraryGuid"), mSourceLibraryGuid);
3002 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
3006 NS_ENSURE_SUCCESS(rv, rv);
3010 NS_ENSURE_SUCCESS(rv, rv);
3018 NS_ENSURE_SUCCESS(rv, rv);
3025 sbLocalDatabaseSmartMediaList::OnItemAdded(
sbIMediaList* aMediaList,
3028 PRBool* aNoMoreForBatch)
3030 NS_ENSURE_ARG_POINTER(aMediaList);
3031 NS_ENSURE_ARG_POINTER(aMediaItem);
3032 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
3035 *aNoMoreForBatch = PR_TRUE;
3040 sbLocalDatabaseSmartMediaList::OnBeforeItemRemoved(
sbIMediaList* aMediaList,
3043 PRBool* aNoMoreForBatch)
3045 NS_ENSURE_ARG_POINTER(aMediaList);
3046 NS_ENSURE_ARG_POINTER(aMediaItem);
3047 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
3051 nsresult rv = GetLibrary(getter_AddRefs(library));
3052 NS_ENSURE_SUCCESS(rv, rv);
3054 PRBool isOurLibrary;
3055 rv = aMediaList->Equals(library, &isOurLibrary);
3056 NS_ENSURE_SUCCESS(rv, rv);
3060 rv = aMediaItem->Equals(mItem, &isThis);
3061 NS_ENSURE_SUCCESS(rv, rv);
3065 if (isThis && isOurLibrary) {
3067 nsCOMPtr<sbIMediaList> list = do_QueryInterface(library, &rv);
3068 NS_ENSURE_SUCCESS(rv, rv);
3070 rv = list->Remove(mList);
3071 NS_ENSURE_SUCCESS(rv, rv);
3073 nsCOMPtr<sbILocalDatabaseSimpleMediaList> ldsml =
3074 do_QueryInterface(mList, &rv);
3075 NS_ENSURE_SUCCESS(rv, rv);
3078 *aNoMoreForBatch = PR_FALSE;
3083 sbLocalDatabaseSmartMediaList::OnAfterItemRemoved(
sbIMediaList* aMediaList,
3086 PRBool* aNoMoreForBatch)
3088 NS_ENSURE_ARG_POINTER(aMediaList);
3089 NS_ENSURE_ARG_POINTER(aMediaItem);
3090 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
3093 *aNoMoreForBatch = PR_TRUE;
3098 sbLocalDatabaseSmartMediaList::OnItemUpdated(
sbIMediaList* aMediaList,
3101 PRBool* aNoMoreForBatch)
3103 NS_ENSURE_ARG_POINTER(aMediaList);
3104 NS_ENSURE_ARG_POINTER(aMediaItem);
3105 NS_ENSURE_ARG_POINTER(aProperties);
3106 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
3109 *aNoMoreForBatch = PR_TRUE;
3114 sbLocalDatabaseSmartMediaList::OnItemMoved(
sbIMediaList* aMediaList,
3115 PRUint32 aFromIndex,
3117 PRBool* aNoMoreForBatch)
3119 NS_ENSURE_ARG_POINTER(aMediaList);
3120 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
3123 *aNoMoreForBatch = PR_TRUE;
3128 sbLocalDatabaseSmartMediaList::OnBeforeListCleared(
sbIMediaList* aMediaList,
3129 PRBool aExcludeLists,
3130 PRBool* aNoMoreForBatch)
3132 NS_ENSURE_ARG_POINTER(aMediaList);
3133 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
3136 *aNoMoreForBatch = PR_TRUE;
3141 sbLocalDatabaseSmartMediaList::OnListCleared(
sbIMediaList* aMediaList,
3142 PRBool aExcludeLists,
3143 PRBool* aNoMoreForBatch)
3145 NS_ENSURE_ARG_POINTER(aMediaList);
3146 NS_ENSURE_ARG_POINTER(aNoMoreForBatch);
3149 *aNoMoreForBatch = PR_TRUE;
3154 sbLocalDatabaseSmartMediaList::OnBatchBegin(
sbIMediaList* aMediaList)
3156 NS_ENSURE_ARG_POINTER(aMediaList);
3163 sbLocalDatabaseSmartMediaList::OnBatchEnd(
sbIMediaList* aMediaList)
3165 NS_ENSURE_ARG_POINTER(aMediaList);
3174 if (!mList)
return NS_ERROR_NULL_POINTER;
3178 nsCOMPtr<sbIMutablePropertyArray> properties =
3180 NS_ENSURE_SUCCESS(rv, rv);
3183 nsAutoString oldName;
3185 NS_ENSURE_SUCCESS(rv, rv);
3189 NS_ENSURE_SUCCESS(rv, rv);
3192 mList->SetName(aName);
3198 rv = mLocalDatabaseLibrary->NotifyListenersItemUpdated(
this, properties);
3199 NS_ENSURE_SUCCESS(rv, rv);
3207 if (!mList)
return NS_ERROR_NULL_POINTER;
3210 return mList->GetName(aName);
3215 sbLocalDatabaseSmartMediaList::GetInterfaces(PRUint32* count, nsIID***
array)
3221 sbLocalDatabaseSmartMediaList::GetHelperForLanguage(PRUint32
language,
3229 sbLocalDatabaseSmartMediaList::GetContractID(
char** aContractID)
3231 *aContractID = nsnull;
3236 sbLocalDatabaseSmartMediaList::GetClassDescription(
char** aClassDescription)
3238 *aClassDescription = nsnull;
3243 sbLocalDatabaseSmartMediaList::GetClassID(nsCID** aClassID)
3250 sbLocalDatabaseSmartMediaList::GetImplementationLanguage(PRUint32* aImplementationLanguage)
3252 *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
3257 sbLocalDatabaseSmartMediaList::GetFlags(PRUint32 *aFlags)
3259 *aFlags = nsIClassInfo::THREADSAFE;
3264 sbLocalDatabaseSmartMediaList::GetClassIDNoAlloc(nsCID* aClassIDNoAlloc)
3266 return NS_ERROR_NOT_AVAILABLE;
3272 NS_ENSURE_ARG_POINTER(aListener);
3274 nsAutoMonitor monitor(mListenersMonitor);
3277 if (mListeners.IndexOfObject(aListener) == -1)
3278 mListeners.AppendObject(aListener);
3285 NS_ENSURE_ARG_POINTER(aListener);
3287 nsAutoMonitor monitor(mListenersMonitor);
3288 mListeners.RemoveObject(aListener);
3293 sbLocalDatabaseSmartMediaList::SetSourceLibraryGuid(
const nsAString& aGUID) {
3295 nsAutoMonitor monitor(mSourceMonitor);
3297 mSourceLibraryGuid = aGUID;
3299 nsresult rv = WriteConfiguration();
3300 NS_ENSURE_SUCCESS(rv, rv);
3306 sbLocalDatabaseSmartMediaList::GetSourceLibraryGuid(nsAString &retVal) {
3308 nsAutoMonitor monitor(mSourceMonitor);
3310 nsString libraryguid = mSourceLibraryGuid;
3312 if (libraryguid.IsEmpty()) {
3317 do_GetService(
"@songbirdnest.com/Songbird/library/Manager;1", &rv);
3318 NS_ENSURE_SUCCESS(rv, rv);
3320 nsCOMPtr<sbILibrary> mainLib;
3321 rv = libraryManager->GetMainLibrary(getter_AddRefs(mainLib));
3322 NS_ENSURE_SUCCESS(rv, rv);
3324 rv = mainLib->GetGuid(libraryguid);
3325 NS_ENSURE_SUCCESS(rv, rv);
3328 retVal = libraryguid;
3334 sbLocalDatabaseSmartMediaList::Observe(
nsISupports *aObject,
3336 const PRUnichar *
aData) {
3337 TRACE((
"%s: observing %s", __FUNCTION__, aTopic));
3342 nsresult rv = mItem->GetLibrary(getter_AddRefs(library));
3343 NS_ENSURE_SUCCESS(rv, rv);
3345 nsCOMPtr<sbIMediaList> libraryList = do_QueryInterface(library, &rv);
3346 NS_ENSURE_SUCCESS(rv, rv);
3348 rv = libraryList->RemoveListener(
this);
3352 NS_ENSURE_SUCCESS(rv, rv);
3355 NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
"Problem removing shutdown notification observer");
#define SB_OPERATOR_AFTERDATE
#define SB_OPERATOR_ONDATE
#define SB_OPERATOR_AFTERORONDATE
#define SB_PROPERTY_MEDIALISTNAME
static nsCOMPtr< nsIObserverService > observerService
const unsigned long MATCH_NOTLIKE
#define SB_OPERATOR_NOTINTHELAST
#define SB_OPERATOR_BEFOREDATE
#define SB_OPERATOR_NOTEQUALS
#define SB_OPERATOR_BEFOREORONDATE
#define SB_OPERATOR_CONTAINS
#define SB_OPERATOR_NOTCONTAINS
#define SB_OPERATOR_ISNOTSET
static nsresult SB_GetTopLevelPropertyColumn(const nsAString &aProperty, nsAString &aColumnName)
#define SB_SQLBUILDER_INSERT_CONTRACTID
#define SB_DUMMYPROPERTY_SMARTMEDIALIST_PLAYLIST
const unsigned long MATCH_LESSEQUAL
#define SB_OPERATOR_BEGINSWITH
static PRBool SB_IsTopLevelProperty(PRUint32 aPropertyDBID)
#define SB_OPERATOR_GREATER
#define SB_OPERATOR_EQUALS
sbAutoSuppressor(sbIMediaItem *aItem)
readonly attribute AString guid
The guid of this resource.
#define SB_PROPERTYMANAGER_CONTRACTID
#define SB_OPERATOR_NOTONDATE
#define SB_PROPERTY_STORAGEGUID
#define SB_SQLBUILDER_DELETE_CONTRACTID
#define SB_OPERATOR_LESSEQUAL
#define SB_SQLBUILDER_SELECT_CONTRACTID
Interface for building SELECT statements.
#define SB_PROPERTY_OUTERGUID
#define SB_PROPERTY_UPDATED
An interface to represent an operator that may act upon a property.
#define SB_PROPERTY_CONTENTTYPE
General interface to data resources.
const unsigned long JOIN_LEFT_OUTER
this _dialogInput val(dateText)
#define SB_PROPERTY_DURATION
An interface used to describe a metadata property for use by the UI and other sbILibrary interfaces (...
const unsigned long MATCH_LESS
#define SB_OPERATOR_NOTENDSWITH
function insert(dbq, size, name)
const unsigned long JOIN_INNER
const unsigned long MATCH_LIKE
ExtensionSchemeMatcher prototype match
#define SB_OPERATOR_ISSET
#define SB_PROPERTY_SMARTMEDIALIST_STATE
#define SB_OPERATOR_NOTBEGINSWITH
#define SB_OPERATOR_BETWEENDATES
const unsigned long MATCH_GREATEREQUAL
#define SB_OPERATOR_INTHELAST
const unsigned long MATCH_NOTEQUALS
#define SB_OPERATOR_GREATEREQUAL
#define SB_OPERATOR_ISTRUE
#define SB_OPERATOR_BETWEEN
#define SB_OPERATOR_ISFALSE
const unsigned long MATCH_GREATER
#define SB_OPERATOR_ENDSWITH
An interface to carry around arrays of nsIProperty instances. Users of this interface should only QI ...
_getSelectedPageStyle s i
const unsigned long MATCH_EQUALS
_updateTextAndScrollDataForFrame aData