32 #include <nsAutoLock.h>
33 #include <nsArrayUtils.h>
34 #include <nsComponentManagerUtils.h>
36 #include <nsServiceManagerUtils.h>
37 #include <nsStringGlue.h>
40 #include <sbIMediacoreCapabilities.h>
41 #include <sbIMediacoreFactory.h>
42 #include <sbIPlaylistReader.h>
59 sbMediacoreTypeSniffer::~sbMediacoreTypeSniffer()
62 nsAutoMonitor::DestroyMonitor(
mMonitor);
69 mMonitor = nsAutoMonitor::NewMonitor(
"sbMediacoreTypeSniffer::mMonitor");
70 NS_ENSURE_TRUE(
mMonitor, NS_ERROR_OUT_OF_MEMORY);
72 nsresult rv = NS_ERROR_UNEXPECTED;
74 nsCOMPtr<sbIMediacoreFactoryRegistrar> factoryRegistrar =
76 NS_ENSURE_SUCCESS(rv, rv);
81 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
84 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
87 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
90 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
93 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
96 NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
98 nsCOMPtr<nsIArray> factories;
100 NS_ENSURE_SUCCESS(rv, rv);
103 rv = factories->GetLength(&length);
104 NS_ENSURE_SUCCESS(rv, rv);
106 for(PRUint32 current = 0; current < length; ++current) {
107 nsCOMPtr<sbIMediacoreFactory> factory = do_QueryElementAt(factories,
110 NS_ENSURE_SUCCESS(rv, rv);
112 nsCOMPtr<sbIMediacoreCapabilities> caps;
113 rv = factory->GetCapabilities(getter_AddRefs(caps));
114 NS_ENSURE_SUCCESS(rv, rv);
117 nsCOMPtr<nsIStringEnumerator> extensions;
118 rv = caps->GetAudioExtensions(getter_AddRefs(extensions));
119 NS_ENSURE_SUCCESS(rv, rv);
122 while(NS_SUCCEEDED(extensions->HasMore(&hasMore)) &&
126 rv = extensions->GetNext(extension);
127 NS_ENSURE_SUCCESS(rv, rv);
129 NS_ConvertUTF16toUTF8 theExtension(extension);
131 NS_ENSURE_TRUE(hashKey, NS_ERROR_OUT_OF_MEMORY);
134 NS_ENSURE_TRUE(hashKey, NS_ERROR_OUT_OF_MEMORY);
138 rv = caps->GetVideoExtensions(getter_AddRefs(extensions));
139 NS_ENSURE_SUCCESS(rv, rv);
142 while(NS_SUCCEEDED(extensions->HasMore(&hasMore)) &&
146 rv = extensions->GetNext(extension);
147 NS_ENSURE_SUCCESS(rv, rv);
149 NS_ConvertUTF16toUTF8 theExtension(extension);
151 NS_ENSURE_TRUE(hashKey, NS_ERROR_OUT_OF_MEMORY);
154 NS_ENSURE_TRUE(hashKey, NS_ERROR_OUT_OF_MEMORY);
158 rv = caps->GetImageExtensions(getter_AddRefs(extensions));
159 NS_ENSURE_SUCCESS(rv, rv);
162 while(NS_SUCCEEDED(extensions->HasMore(&hasMore)) &&
166 rv = extensions->GetNext(extension);
167 NS_ENSURE_SUCCESS(rv, rv);
169 NS_ConvertUTF16toUTF8 theExtension(extension);
171 NS_ENSURE_TRUE(hashKey, NS_ERROR_OUT_OF_MEMORY);
174 NS_ENSURE_TRUE(hashKey, NS_ERROR_OUT_OF_MEMORY);
179 nsCOMPtr<sbIPlaylistReaderManager> readerManager;
180 if (NS_IsMainThread()) {
181 readerManager = do_GetService(
182 "@songbirdnest.com/Songbird/PlaylistReaderManager;1",
184 NS_ENSURE_SUCCESS(rv, rv);
188 "@songbirdnest.com/Songbird/PlaylistReaderManager;1",
190 NS_ENSURE_SUCCESS(rv, rv);
194 PRUnichar **extensions = nsnull;
196 rv = readerManager->SupportedFileExtensions(&length, &extensions);
197 NS_ENSURE_SUCCESS(rv, rv);
199 for(PRUint32 current = 0; current < length; ++current) {
200 NS_ConvertUTF16toUTF8 theExtension(extensions[current]);
206 NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(length, extensions);
218 sbMediacoreTypeSniffer::GetFileExtensionFromURI(nsIURI* aURI,
221 NS_ENSURE_ARG_POINTER(aURI);
223 nsCAutoString strExtension;
226 nsCOMPtr<nsIURL>
url = do_QueryInterface(aURI, &rv);
227 if (NS_SUCCEEDED(rv)) {
229 rv = url->GetFileExtension(strExtension);
230 NS_ENSURE_SUCCESS(rv, rv);
235 rv = aURI->GetSpec(spec);
236 NS_ENSURE_SUCCESS(rv, rv);
238 PRInt32 index = spec.RFindChar(
'.');
240 strExtension.Assign(StringTail(spec, spec.Length() -1 - index));
244 if (strExtension.IsEmpty()) {
250 strExtension.Trim(
".");
252 ToLowerCase(strExtension, _retval);
258 sbMediacoreTypeSniffer::IsValidMediaURL(nsIURI *aURL,
261 NS_ENSURE_ARG_POINTER(aURL);
262 NS_ENSURE_ARG_POINTER(_retval);
266 nsCString fileExtension;
267 nsresult rv = GetFileExtensionFromURI(aURL, fileExtension);
268 NS_ENSURE_SUCCESS(rv, rv);
271 if(!fileExtension.IsEmpty()) {
305 sbMediacoreTypeSniffer::IsValidAudioURL(nsIURI *aURL, PRBool *aRetVal)
307 NS_ENSURE_ARG_POINTER(aURL);
308 NS_ENSURE_ARG_POINTER(aRetVal);
312 nsCString fileExtension;
313 nsresult rv = GetFileExtensionFromURI(aURL, fileExtension);
314 NS_ENSURE_SUCCESS(rv, rv);
316 if (!fileExtension.IsEmpty()) {
332 sbMediacoreTypeSniffer::IsValidVideoURL(nsIURI *aURL,
335 NS_ENSURE_ARG_POINTER(aURL);
336 NS_ENSURE_ARG_POINTER(_retval);
340 nsCString fileExtension;
341 nsresult rv = GetFileExtensionFromURI(aURL, fileExtension);
342 NS_ENSURE_SUCCESS(rv, rv);
345 if(!fileExtension.IsEmpty()) {
370 sbMediacoreTypeSniffer::IsValidPlaylistURL(nsIURI *aURL,
373 NS_ENSURE_ARG_POINTER(aURL);
374 NS_ENSURE_ARG_POINTER(_retval);
378 nsCString fileExtension;
379 nsresult rv = GetFileExtensionFromURI(aURL, fileExtension);
380 NS_ENSURE_SUCCESS(rv, rv);
383 if(!fileExtension.IsEmpty()) {
408 sbMediacoreTypeSniffer::IsValidImageURL(nsIURI *aURL, PRBool *aRetVal)
410 NS_ENSURE_ARG_POINTER(aURL);
411 NS_ENSURE_ARG_POINTER(aRetVal);
415 nsCString fileExtension;
416 GetFileExtensionFromURI(aURL, fileExtension);
418 if (!fileExtension.IsEmpty()) {
434 sbMediacoreTypeSniffer::IsValidWebSafePlaylistURL(nsIURI *aURL,
437 NS_ENSURE_ARG_POINTER(aURL);
438 NS_ENSURE_ARG_POINTER(_retval);
442 nsCString fileExtension;
443 nsresult rv = GetFileExtensionFromURI(aURL, fileExtension);
444 NS_ENSURE_SUCCESS(rv, rv);
448 if(!fileExtension.IsEmpty() &&
459 template<
class EntryType>
463 NS_ENSURE_TRUE(aEntry, PL_DHASH_STOP);
464 NS_ENSURE_TRUE(aUserArg, PL_DHASH_STOP);
466 nsTArray<nsString> *aArray =
reinterpret_cast<nsTArray<nsString> *
>(aUserArg);
469 aArray->AppendElement(NS_ConvertUTF8toUTF16(aEntry->GetKey()));
470 NS_ENSURE_TRUE(elem, PL_DHASH_STOP);
472 return PL_DHASH_NEXT;
478 NS_ENSURE_ARG_POINTER(_retval);
480 nsTArray<nsString> allExtensions;
487 nsCOMPtr<nsIStringEnumerator> allExtensionsEnum =
489 NS_ENSURE_TRUE(allExtensionsEnum, NS_ERROR_OUT_OF_MEMORY);
491 allExtensionsEnum.forget(_retval);
499 NS_ENSURE_ARG_POINTER(_retval);
501 nsTArray<nsString> allExtensions;
504 PRUint32 count =
mVideoExtensions.EnumerateEntries(EnumerateAllExtensions<nsCStringHashKey>,
508 nsCOMPtr<nsIStringEnumerator> allExtensionsEnum =
510 NS_ENSURE_TRUE(allExtensionsEnum, NS_ERROR_OUT_OF_MEMORY);
512 allExtensionsEnum.forget(_retval);
520 NS_ENSURE_ARG_POINTER(_retval);
522 nsTArray<nsString> allExtensions;
525 PRUint32 count =
mPlaylistExtensions.EnumerateEntries(EnumerateAllExtensions<nsCStringHashKey>,
529 nsCOMPtr<nsIStringEnumerator> allExtensionsEnum =
531 NS_ENSURE_TRUE(allExtensionsEnum, NS_ERROR_OUT_OF_MEMORY);
533 allExtensionsEnum.forget(_retval);
541 NS_ENSURE_ARG_POINTER(_retval);
543 nsTArray<nsString> allExtensions;
548 (EnumerateAllExtensions<nsCStringHashKey>, &allExtensions);
553 allExtensions.AppendElement(NS_LITERAL_STRING(
"gif"));
554 allExtensions.AppendElement(NS_LITERAL_STRING(
"jpg"));
555 allExtensions.AppendElement(NS_LITERAL_STRING(
"jpeg"));
556 allExtensions.AppendElement(NS_LITERAL_STRING(
"png"));
557 allExtensions.AppendElement(NS_LITERAL_STRING(
"bmp"));
560 nsCOMPtr<nsIStringEnumerator> allExtensionsEnum =
562 NS_ENSURE_TRUE(allExtensionsEnum, NS_ERROR_OUT_OF_MEMORY);
564 allExtensionsEnum.forget(_retval);
572 NS_ENSURE_ARG_POINTER(_retval);
574 nsTArray<nsString> allExtensions;
577 PRUint32 count =
mAudioExtensions.EnumerateEntries(EnumerateAllExtensions<nsCStringHashKey>,
581 count =
mVideoExtensions.EnumerateEntries(EnumerateAllExtensions<nsCStringHashKey>,
585 nsCOMPtr<nsIStringEnumerator> allExtensionsEnum =
587 NS_ENSURE_TRUE(allExtensionsEnum, NS_ERROR_OUT_OF_MEMORY);
589 allExtensionsEnum.forget(_retval);
595 sbMediacoreTypeSniffer::GetUnsupportedVideoFileExtensions(
598 NS_ENSURE_ARG_POINTER(aOutStringEnum);
600 static const char defaultKnownVideoExtensions[] =
601 "3g2,3gp,3gp2,3gpp,asf,avi,divx,dv,dvr-ms,flc,flh,fli,flv,flx,m1pg,"
602 "m1v,m2t,m2ts,m2v,mj2,mjp,mjpg,mkv,moov,mov,movie,mp2v,mp4v,mpe,mpeg,"
603 "mpg,mpg2,mpv,mpv2,msdvd,mxf,nsv,ogm,qt,qtch,qtl,qtz,rm,rmvb,rv,smv,"
604 "ts,vc1,vob,vp6,vp7,wm,wmv,xvid";
606 nsCString knownExtensions;
607 knownExtensions.Assign(defaultKnownVideoExtensions);
609 nsTArray<nsCString> knownExtensionsStrArray;
611 NS_LITERAL_CSTRING(
","),
612 knownExtensionsStrArray);
614 nsTArray<nsString> unsupportedExtensionsStrArray;
615 for (PRUint32
i = 0;
i < knownExtensionsStrArray.Length();
i++) {
625 unsupportedExtensionsStrArray.AppendElement(
626 NS_ConvertUTF8toUTF16(knownExtensionsStrArray[i]));
629 nsCOMPtr<nsIStringEnumerator> extensionsEnum =
631 NS_ENSURE_TRUE(extensionsEnum, NS_ERROR_OUT_OF_MEMORY);
633 extensionsEnum.forget(aOutStringEnum);
const sbCreateProxiedComponent do_ProxiedGetService(const nsCID &aCID, nsresult *error=0)
void nsCString_Split(const nsACString &aString, const nsACString &aDelimiter, nsTArray< nsCString > &aSubStringArray)
StringArrayEnumerator prototype hasMore
_getSelectedPageStyle s i