29 #include <nsIProgrammingLanguage.h>
30 #include <sbILibrary.h>
31 #include <sbIMediaItemController.h>
32 #include <sbILibraryUtils.h>
33 #include <sbILocalDatabasePropertyCache.h>
34 #include <sbILocalDatabaseResourcePropertyBag.h>
35 #include <sbIPropertyArray.h>
36 #include <sbIPropertyManager.h>
39 #include <nsIClassInfoImpl.h>
40 #include <nsIObserver.h>
41 #include <nsIURIChecker.h>
42 #include <nsIFileURL.h>
43 #include <nsIStringEnumerator.h>
44 #include <nsIVariant.h>
45 #include <nsAutoLock.h>
46 #include <nsNetUtil.h>
56 PR_snprintf(buf,
sizeof(buf),
"%lld", val);
57 str.Append(NS_ConvertASCIItoUTF16(buf));
66 NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
79 sbLocalDatabaseMediaItem::sbLocalDatabaseMediaItem()
81 mOwnsLibrary(PR_FALSE),
83 mSuppressNotifications(PR_TRUE),
84 mItemController(nsnull),
85 mItemControllerFetched(PR_FALSE),
86 mPropertyBagLock(nsnull)
92 if(mPropertyBagLock) {
93 nsAutoLock::DestroyLock(mPropertyBagLock);
111 const nsAString& aGuid,
114 NS_ENSURE_ARG_POINTER(aLibrary);
115 NS_ENSURE_ARG(!aGuid.IsEmpty());
129 nsAutoLock::NewLock(
"sbLocalDatabaseMediaItem::mPropertyBagLock");
130 NS_ENSURE_TRUE(mPropertyBagLock, NS_ERROR_OUT_OF_MEMORY);
139 sbLocalDatabaseMediaItem::EnsurePropertyBag()
141 nsAutoLock lock(mPropertyBagLock);
159 nsCOMPtr<sbILocalDatabasePropertyCache> propertyCache;
160 rv =
mLibrary->GetPropertyCache(getter_AddRefs(propertyCache));
161 NS_ENSURE_SUCCESS(rv, rv);
162 rv = propertyCache->GetProperties(&guid,
167 NS_ENSURE_SUCCESS(rv, rv);
169 NS_ASSERTION(count == 1,
"GetProperties returned too many bags");
170 NS_ASSERTION(bags[0],
"GetProperties returned a null bag!");
172 NS_ENSURE_TRUE(bags[0], NS_ERROR_NULL_POINTER);
173 mPropertyBag = bags[0];
174 NS_FREE_XPCOM_ISUPPORTS_POINTER_ARRAY(count, bags);
183 sbLocalDatabaseMediaItem::GetInterfaces(PRUint32* count,
193 sbLocalDatabaseMediaItem::GetHelperForLanguage(PRUint32
language,
204 sbLocalDatabaseMediaItem::GetContractID(
char** aContractID)
206 *aContractID = nsnull;
214 sbLocalDatabaseMediaItem::GetClassDescription(
char** aClassDescription)
216 *aClassDescription = nsnull;
224 sbLocalDatabaseMediaItem::GetClassID(nsCID** aClassID)
234 sbLocalDatabaseMediaItem::GetImplementationLanguage(PRUint32* aImplementationLanguage)
236 *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
244 sbLocalDatabaseMediaItem::GetFlags(PRUint32 *aFlags)
246 *aFlags = nsIClassInfo::THREADSAFE;
254 sbLocalDatabaseMediaItem::GetClassIDNoAlloc(nsCID* aClassIDNoAlloc)
256 return NS_ERROR_NOT_AVAILABLE;
263 sbLocalDatabaseMediaItem::GetGuid(nsAString& aGuid)
273 sbLocalDatabaseMediaItem::GetCreated(PRInt64* aCreated)
275 NS_ASSERTION(mPropertyBagLock,
"mPropertyBagLock is null");
277 NS_ENSURE_ARG_POINTER(aCreated);
281 NS_ENSURE_SUCCESS(rv, rv);
283 PRInt32 convertedItems = PR_sscanf(NS_ConvertUTF16toUTF8(str).
get(),
"%lld",
285 NS_ENSURE_TRUE(convertedItems > 0, NS_ERROR_FAILURE);
294 sbLocalDatabaseMediaItem::GetUpdated(PRInt64* aUpdated)
296 NS_ASSERTION(mPropertyBagLock,
"mPropertyBagLock is null");
298 NS_ENSURE_ARG_POINTER(aUpdated);
302 NS_ENSURE_SUCCESS(rv, rv);
304 PRInt32 convertedItems = PR_sscanf(NS_ConvertUTF16toUTF8(str).
get(),
"%lld",
306 NS_ENSURE_TRUE(convertedItems > 0, NS_ERROR_FAILURE);
315 sbLocalDatabaseMediaItem::GetUserEditable(PRBool* aUserEditable)
317 NS_ASSERTION(mPropertyBagLock,
"mPropertyBagLock is null");
319 NS_ENSURE_ARG_POINTER(aUserEditable);
326 NS_ENSURE_SUCCESS(rv, rv);
328 if (str.EqualsLiteral(
"1")) {
329 *aUserEditable = PR_FALSE;
332 NS_ENSURE_SUCCESS(rv, rv);
333 *aUserEditable = !str.EqualsLiteral(
"1");
335 *aUserEditable = PR_TRUE;
341 if (*aUserEditable) {
345 NS_ENSURE_SUCCESS(rv, rv);
347 if (isList.IsEmpty() ||
348 isList.EqualsLiteral(
"0")) {
352 *aUserEditable = PR_TRUE;
354 nsRefPtr<nsIURI>
uri;
355 rv = this->GetContentSrc(getter_AddRefs(uri));
357 if (NS_SUCCEEDED(rv)) {
358 nsCOMPtr<nsIFileURL> fileUrl = do_QueryInterface(uri, &rv);
361 if (NS_SUCCEEDED(rv)) {
362 nsCOMPtr<nsIFile>
file;
363 rv = fileUrl->GetFile(getter_AddRefs(file));
364 if (NS_SUCCEEDED(rv)) {
366 rv = file->Exists(&exists);
367 NS_ENSURE_SUCCESS(rv, rv);
369 PRBool isWritable = PR_FALSE;
371 rv = file->IsWritable(&isWritable);
373 isWritable = PR_FALSE;
376 *aUserEditable = isWritable && exists;
392 NS_ENSURE_ARG_POINTER(_retval);
394 NS_ASSERTION(mPropertyBagLock,
"mPropertyBagLock is null");
396 nsresult rv = EnsurePropertyBag();
397 NS_ENSURE_SUCCESS(rv, rv);
399 nsAutoLock lock(mPropertyBagLock);
401 rv = mPropertyBag->GetIds(_retval);
402 NS_ENSURE_SUCCESS(rv, rv);
414 NS_ASSERTION(mPropertyBagLock,
"mPropertyBagLock is null");
416 nsresult rv = EnsurePropertyBag();
417 NS_ENSURE_SUCCESS(rv, rv);
419 nsAutoLock lock(mPropertyBagLock);
421 rv = mPropertyBag->GetProperty(aID, _retval);
422 NS_ENSURE_SUCCESS(rv, rv);
431 sbLocalDatabaseMediaItem::SetProperty(
const nsAString& aID,
434 NS_ASSERTION(mPropertyBagLock,
"mPropertyBagLock is null");
439 NS_WARNING(
"Attempt to set a read-only property!");
440 return NS_ERROR_INVALID_ARG;
450 nsCOMPtr<sbIMutablePropertyArray> properties =
452 NS_ENSURE_SUCCESS(rv, rv);
454 rv = EnsurePropertyBag();
455 NS_ENSURE_SUCCESS(rv, rv);
458 nsAutoLock lock(mPropertyBagLock);
460 nsAutoString oldValue;
461 rv = mPropertyBag->GetProperty(aID, oldValue);
462 NS_ENSURE_SUCCESS(rv, rv);
464 rv = properties->AppendProperty(aID, oldValue);
465 NS_ENSURE_SUCCESS(rv, rv);
467 rv = mPropertyBag->SetProperty(aID, aValue);
468 NS_ENSURE_SUCCESS(rv, rv);
484 NS_ENSURE_ARG_POINTER(aProperties);
485 NS_ASSERTION(mPropertyBagLock,
"mPropertyBagLock is null");
487 nsresult rv = EnsurePropertyBag();
488 NS_ENSURE_SUCCESS(rv, rv);
490 PRUint32 propertyCount;
491 rv = aProperties->GetLength(&propertyCount);
492 NS_ENSURE_SUCCESS(rv, rv);
494 for (PRUint32
i = 0;
i < propertyCount;
i++) {
495 nsCOMPtr<sbIProperty> property;
496 rv = aProperties->GetPropertyAt(
i, getter_AddRefs(property));
497 NS_ENSURE_SUCCESS(rv, rv);
500 rv =
property->GetId(propertyID);
501 NS_ENSURE_SUCCESS(rv, rv);
506 NS_WARNING(
"Attempt to set a read-only property!");
507 return NS_ERROR_INVALID_ARG;
515 nsCOMPtr<sbIMutablePropertyArray> properties =
517 NS_ENSURE_SUCCESS(rv, rv);
520 nsAutoLock lock(mPropertyBagLock);
522 for (PRUint32
i = 0;
i < propertyCount;
i++) {
523 nsCOMPtr<sbIProperty> property;
524 rv = aProperties->GetPropertyAt(
i, getter_AddRefs(property));
525 NS_ENSURE_SUCCESS(rv, rv);
528 rv =
property->GetId(propertyID);
529 NS_ENSURE_SUCCESS(rv, rv);
531 nsAutoString oldValue;
532 rv = mPropertyBag->GetProperty(propertyID, oldValue);
533 NS_ENSURE_SUCCESS(rv, rv);
535 rv = properties->AppendProperty(propertyID, oldValue);
536 NS_ENSURE_SUCCESS(rv, rv);
539 rv =
property->GetValue(value);
540 NS_ENSURE_SUCCESS(rv, rv);
542 rv = mPropertyBag->SetProperty(propertyID, value);
543 NS_ENSURE_SUCCESS(rv, rv);
561 NS_ENSURE_ARG_POINTER(_retval);
563 NS_ASSERTION(mPropertyBagLock,
"mPropertyBagLock is null");
565 nsresult rv = EnsurePropertyBag();
566 NS_ENSURE_SUCCESS(rv, rv);
568 nsCOMPtr<sbIMutablePropertyArray> properties =
570 NS_ENSURE_SUCCESS(rv, rv);
572 nsAutoLock lock(mPropertyBagLock);
575 PRUint32 propertyCount;
576 rv = aProperties->GetLength(&propertyCount);
577 NS_ENSURE_SUCCESS(rv, rv);
579 for (PRUint32
i = 0;
i < propertyCount;
i++) {
580 nsCOMPtr<sbIProperty> property;
581 rv = aProperties->GetPropertyAt(
i, getter_AddRefs(property));
582 NS_ENSURE_SUCCESS(rv, rv);
585 rv =
property->GetId(
id);
586 NS_ENSURE_SUCCESS(rv, rv);
589 rv = mPropertyBag->GetProperty(
id, value);
590 NS_ENSURE_SUCCESS(rv, rv);
592 rv = properties->AppendProperty(
id, value);
593 NS_ENSURE_SUCCESS(rv, rv);
597 nsCOMPtr<nsIStringEnumerator> ids;
598 rv = mPropertyBag->GetIds(getter_AddRefs(ids));
599 NS_ENSURE_SUCCESS(rv, rv);
602 while (NS_SUCCEEDED(ids->GetNext(
id))) {
605 rv = mPropertyBag->GetProperty(
id, value);
606 NS_ENSURE_SUCCESS(rv, rv);
608 if (!value.IsVoid()) {
609 rv = properties->AppendProperty(
id, value);
610 NS_ENSURE_SUCCESS(rv, rv);
615 NS_ADDREF(*_retval = properties);
626 NS_ENSURE_ARG_POINTER(_retval);
628 if (!aOtherLibraryResource) {
633 nsAutoString otherGUID;
634 nsresult rv = aOtherLibraryResource->GetGuid(otherGUID);
635 NS_ENSURE_SUCCESS(rv, rv);
637 *_retval =
mGuid.Equals(otherGUID);
645 sbLocalDatabaseMediaItem::GetMediaItemId(PRUint32* _retval)
647 NS_ENSURE_ARG_POINTER(_retval);
651 NS_ENSURE_SUCCESS(rv, rv);
661 NS_ENSURE_ARG_POINTER(aPropertyBag);
663 nsresult rv = EnsurePropertyBag();
664 NS_ENSURE_SUCCESS(rv, rv);
666 NS_ADDREF(*aPropertyBag = mPropertyBag);
673 NS_ENSURE_ARG_POINTER(aPropertyBag);
676 NS_ERROR(
"Can't reset the property bag!");
677 return NS_ERROR_UNEXPECTED;
680 mPropertyBag = aPropertyBag;
687 mSuppressNotifications = aSuppress;
694 sbLocalDatabaseMediaItem::GetLibrary(
sbILibrary** aLibrary)
699 NS_ENSURE_SUCCESS(rv, rv);
701 NS_IF_ADDREF(*aLibrary = library);
718 sbLocalDatabaseMediaItem::GetIsMutable(PRBool* aIsMutable)
720 *aIsMutable = PR_TRUE;
730 NS_ENSURE_ARG_POINTER(aMediaItemController);
738 NS_ENSURE_SUCCESS(rv, rv);
739 if (!trackType.IsEmpty()) {
741 nsCString cTrackType;
742 cTrackType = NS_ConvertUTF16toUTF8(trackType);
743 ToLowerCase(cTrackType);
744 nsCString cContractID;
747 cContractID.Append(cTrackType);
762 sbLocalDatabaseMediaItem::GetMediaCreated(PRInt64* aMediaCreated)
764 NS_ENSURE_ARG_POINTER(aMediaCreated);
768 NS_ENSURE_SUCCESS(rv, rv);
770 NS_ENSURE_FALSE(str.IsVoid(), NS_ERROR_UNEXPECTED);
772 PRInt32 itemsConverted = PR_sscanf(NS_ConvertUTF16toUTF8(str).
get(),
"%lld",
774 NS_ENSURE_TRUE(itemsConverted > 0, NS_ERROR_FAILURE);
783 sbLocalDatabaseMediaItem::SetMediaCreated(PRInt64 aMediaCreated)
789 NS_ENSURE_SUCCESS(rv, rv);
798 sbLocalDatabaseMediaItem::GetMediaUpdated(PRInt64* aMediaUpdated)
800 NS_ENSURE_ARG_POINTER(aMediaUpdated);
804 NS_ENSURE_SUCCESS(rv, rv);
806 NS_ENSURE_FALSE(str.IsVoid(), NS_ERROR_UNEXPECTED);
808 PRInt32 itemsConverted = PR_sscanf(NS_ConvertUTF16toUTF8(str).
get(),
"%lld",
810 NS_ENSURE_TRUE(itemsConverted > 0, NS_ERROR_FAILURE);
819 sbLocalDatabaseMediaItem::SetMediaUpdated(PRInt64 aMediaUpdated)
825 NS_ENSURE_SUCCESS(rv, rv);
834 sbLocalDatabaseMediaItem::GetContentSrc(nsIURI** aContentSrc)
836 NS_ENSURE_ARG_POINTER(aContentSrc);
840 NS_ENSURE_SUCCESS(rv, rv);
842 NS_ASSERTION(!str.IsVoid(),
"This should never be void!");
844 rv = NS_NewURI(aContentSrc, str);
845 NS_ENSURE_SUCCESS(rv, rv);
854 sbLocalDatabaseMediaItem::SetContentSrc(nsIURI* aContentSrc)
856 NS_ENSURE_ARG_POINTER(aContentSrc);
859 nsresult rv = aContentSrc->GetSpec(cstr);
860 NS_ENSURE_SUCCESS(rv, rv);
863 NS_ConvertUTF8toUTF16(cstr));
864 NS_ENSURE_SUCCESS(rv, rv);
873 sbLocalDatabaseMediaItem::GetContentLength(PRInt64* aContentLength)
875 NS_ENSURE_ARG_POINTER(aContentLength);
879 NS_ENSURE_SUCCESS(rv, rv);
884 PRInt32 itemsConverted = PR_sscanf(NS_ConvertUTF16toUTF8(str).
get(),
"%lld",
886 NS_ENSURE_TRUE(itemsConverted > 0, NS_ERROR_FAILURE);
895 sbLocalDatabaseMediaItem::SetContentLength(PRInt64 aContentLength)
901 NS_ENSURE_SUCCESS(rv, rv);
910 sbLocalDatabaseMediaItem::GetContentType(nsAString& aContentType)
914 NS_ENSURE_SUCCESS(rv, rv);
923 sbLocalDatabaseMediaItem::SetContentType(
const nsAString& aContentType)
927 NS_ENSURE_SUCCESS(rv, rv);
936 sbLocalDatabaseMediaItem::OpenInputStreamAsync(nsIStreamListener *aListener,
nsISupports *aContext,
nsIChannel** _retval)
939 NS_ENSURE_ARG_POINTER(_retval);
942 nsCOMPtr<nsIURI> pURI;
943 rv = this->GetContentSrc( getter_AddRefs(pURI) );
944 NS_ENSURE_SUCCESS(rv, rv);
947 nsCOMPtr<nsIIOService> pIOService;
948 pIOService = do_GetService(
"@mozilla.org/network/io-service;1", &rv);
949 NS_ENSURE_SUCCESS(rv, rv);
952 rv = pIOService->NewChannelFromURI(pURI, _retval);
953 NS_ENSURE_SUCCESS(rv, rv);
956 nsCOMPtr<nsIInterfaceRequestor> pIIR = do_QueryInterface( aListener );
958 (*_retval)->SetNotificationCallbacks( pIIR );
961 return (*_retval)->AsyncOpen( aListener, aContext );
968 sbLocalDatabaseMediaItem::OpenInputStream(nsIInputStream** _retval)
971 NS_ENSURE_ARG_POINTER(_retval);
974 nsCOMPtr<nsIURI> pURI;
975 rv = this->GetContentSrc( getter_AddRefs(pURI) );
976 NS_ENSURE_SUCCESS(rv, rv);
979 nsCOMPtr<nsIIOService> pIOService;
980 pIOService = do_GetService(
"@mozilla.org/network/io-service;1", &rv);
981 NS_ENSURE_SUCCESS(rv, rv);
984 nsCOMPtr<nsIChannel> pChannel;
985 rv = pIOService->NewChannelFromURI(pURI, getter_AddRefs(pChannel));
986 NS_ENSURE_SUCCESS(rv, rv);
988 return pChannel->Open(_retval);
995 sbLocalDatabaseMediaItem::OpenOutputStream(nsIOutputStream** _retval)
997 NS_ENSURE_ARG_POINTER(_retval);
999 nsCOMPtr<nsIURI> pURI;
1000 nsresult rv = GetContentSrc(getter_AddRefs(pURI));
1001 NS_ENSURE_SUCCESS(rv, rv);
1003 nsCOMPtr<nsIFileURL> fileURL = do_QueryInterface(pURI, &rv);
1004 if (NS_FAILED(rv)) {
1005 NS_NOTYETIMPLEMENTED(
"Don't have code for this case yet!");
1006 return NS_ERROR_NOT_IMPLEMENTED;
1009 nsCOMPtr<nsIFile>
file;
1010 rv = fileURL->GetFile(getter_AddRefs(file));
1011 NS_ENSURE_SUCCESS(rv, rv);
1015 rv = file->Exists(&exists);
1016 NS_ENSURE_SUCCESS(rv, rv);
1018 nsCOMPtr<sbILibraryUtils> libUtils =
1019 do_GetService(
"@songbirdnest.com/Songbird/library/Manager;1", &rv);
1020 NS_ENSURE_SUCCESS(rv, rv);
1021 nsCOMPtr<nsIFile> canonicalFile;
1022 rv = libUtils->GetCanonicalPath(file,
1023 getter_AddRefs(canonicalFile));
1024 NS_ENSURE_SUCCESS(rv, rv);
1025 canonicalFile.forget(getter_AddRefs(file));
1028 rv = NS_NewLocalFileOutputStream(_retval, file);
1029 NS_ENSURE_SUCCESS(rv, rv);
1042 buff.AppendLiteral(
"MediaItem {guid: ");
1044 buff.AppendLiteral(
"}");
1054 sbLocalDatabaseMediaItem::TestIsURIAvailable(
nsIObserver* aObserver)
1058 nsCOMPtr<nsIURIChecker> pURIChecker = do_CreateInstance(
"@mozilla.org/network/urichecker;1", &rv);
1059 NS_ENSURE_SUCCESS(rv, rv);
1062 nsCOMPtr<nsIURI> pURI;
1063 rv = this->GetContentSrc( getter_AddRefs(pURI) );
1064 NS_ENSURE_SUCCESS(rv, rv);
1066 rv = pURIChecker->Init( pURI );
1067 NS_ENSURE_SUCCESS(rv, rv);
1070 rv = pURIChecker->AsyncCheck(
this, aObserver );
1071 NS_ENSURE_SUCCESS(rv, rv);
1080 sbLocalDatabaseMediaItem::OnStartRequest( nsIRequest *aRequest,
nsISupports *aContext )
1090 sbLocalDatabaseMediaItem::OnStopRequest( nsIRequest *aRequest,
nsISupports *aContext, PRUint32 aStatus )
1094 nsCOMPtr<nsIObserver>
observer = do_QueryInterface( aContext, &rv );
1095 NS_ENSURE_SUCCESS(rv, rv);
1098 nsAutoString
data = ( aStatus == NS_BINDING_SUCCEEDED ) ?
1099 NS_LITERAL_STRING(
"true" ) : NS_LITERAL_STRING(
"false" );
1100 observer->Observe( aRequest,
"available", data.get() );
1114 sbLocalDatabaseIndexedMediaItem::GetIndex(PRUint32* aIndex)
1121 sbLocalDatabaseIndexedMediaItem::GetMediaItem(
sbIMediaItem** aMediaItem)
1123 NS_ADDREF(*aMediaItem = mMediaItem);
1129 sbLocalDatabaseIndexedMediaItem::GetInterfaces(PRUint32* count, nsIID***
array)
1135 sbLocalDatabaseIndexedMediaItem::GetHelperForLanguage(PRUint32
language,
1143 sbLocalDatabaseIndexedMediaItem::GetContractID(
char** aContractID)
1145 *aContractID = nsnull;
1150 sbLocalDatabaseIndexedMediaItem::GetClassDescription(
char** aClassDescription)
1152 *aClassDescription = nsnull;
1157 sbLocalDatabaseIndexedMediaItem::GetClassID(nsCID** aClassID)
1164 sbLocalDatabaseIndexedMediaItem::GetImplementationLanguage(PRUint32* aImplementationLanguage)
1166 *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
1171 sbLocalDatabaseIndexedMediaItem::GetFlags(PRUint32 *aFlags)
1173 *aFlags = nsIClassInfo::THREADSAFE;
1178 sbLocalDatabaseIndexedMediaItem::GetClassIDNoAlloc(nsCID* aClassIDNoAlloc)
1180 return NS_ERROR_NOT_AVAILABLE;
#define SB_PROPERTY_TRACKTYPE
static nsresult ToString(const nsDiscriminatedUnion &data, nsACString &outString)
NS_IMPL_THREADSAFE_RELEASE(sbRequestItem)
void NotifyListenersItemUpdated(in sbIMediaItem aItem, in sbIPropertyArray aProperties)
NS_IMPL_THREADSAFE_ADDREF(sbRequestItem)
readonly attribute AString guid
The guid of this resource.
#define SB_PROPERTY_CONTENTLENGTH
#define SB_PROPERTY_CREATED
[USER CODE SHOULD NOT REFERENCE THIS CLASS]
#define SB_PROPERTY_UPDATED
#define SB_PROPERTY_CONTENTTYPE
General interface to data resources.
this _dialogInput val(dateText)
static nsresult GetProperty(nsIPropertyBag2 *aProperties, nsAString const &aProp, nsAString &aValue)
#define SB_PROPERTY_ISREADONLY
NS_IMETHODIMP_(nsresult) sbVariant
Media library abstraction.
[USER CODE SHOULD NOT REFERENCE THIS CLASS]
static nsresult GetPropertyBag(sbIDevice *aDevice, nsIPropertyBag2 **aProperties)
nsresult SetProperties(nsIArray *aProperties)
NS_IMPL_CI_INTERFACE_GETTER2(sbDataRemoteWrapper, sbIDataRemote, nsIClassInfo) sbDataRemoteWrapper
#define SB_PROPERTY_ISLIST
#define SB_PROPERTY_CONTENTURL
An interface to carry around arrays of nsIProperty instances. Users of this interface should only QI ...
_getSelectedPageStyle s i