sbAlbumArtFetcherSet.cpp
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set sw=2 :miv */
3 /*
4  *=BEGIN SONGBIRD GPL
5  *
6  * This file is part of the Songbird web player.
7  *
8  * Copyright(c) 2005-2010 POTI, Inc.
9  * http://www.songbirdnest.com
10  *
11  * This file may be licensed under the terms of of the
12  * GNU General Public License Version 2 (the ``GPL'').
13  *
14  * Software distributed under the License is distributed
15  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
16  * express or implied. See the GPL for the specific language
17  * governing rights and limitations.
18  *
19  * You should have received a copy of the GPL along with this
20  * program. If not, go to http://www.gnu.org/licenses/gpl.html
21  * or write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  *
24  *=END SONGBIRD GPL
25  */
26 
27 //------------------------------------------------------------------------------
28 //------------------------------------------------------------------------------
29 //
30 // Songbird album art fetcher set.
31 //
32 //------------------------------------------------------------------------------
33 //------------------------------------------------------------------------------
34 
40 //------------------------------------------------------------------------------
41 //
42 // Songbird album art fetcher set imported services.
43 //
44 //------------------------------------------------------------------------------
45 
46 // Self imports.
47 #include "sbAlbumArtFetcherSet.h"
48 
49 // Mozilla imports.
50 #include <nsArrayUtils.h>
51 #include <nsComponentManagerUtils.h>
52 #include <nsIFileURL.h>
53 #include <nsIMutableArray.h>
54 #include <nsIURI.h>
55 #include <nsIVariant.h>
56 #include <nsServiceManagerUtils.h>
57 #include <nsStringGlue.h>
58 
59 // Songbird imports
60 #include <sbPrefBranch.h>
61 #include <sbThreadUtils.h>
62 
69 #include "prlog.h"
70 #ifdef PR_LOGGING
71 static PRLogModuleInfo* gAlbumArtFetcherSetLog = nsnull;
72 #define TRACE(args) PR_LOG(gAlbumArtFetcherSetLog, PR_LOG_DEBUG, args)
73 #define LOG(args) PR_LOG(gAlbumArtFetcherSetLog, PR_LOG_WARN, args)
74 #ifdef __GNUC__
75 #define __FUNCTION__ __PRETTY_FUNCTION__
76 #endif /* __GNUC__ */
77 #else
78 #define TRACE(args) /* nothing */
79 #define LOG(args) /* nothing */
80 #endif /* PR_LOGGING */
81 
82 //------------------------------------------------------------------------------
83 //
84 // nsISupports implementation.
85 //
86 //------------------------------------------------------------------------------
87 
92 
93 
94 //------------------------------------------------------------------------------
95 //
96 // sbIAlbumArtFetcherSet implementation.
97 //
98 //------------------------------------------------------------------------------
99 
100 //
101 // Getters/setters.
102 //
103 
104 
108 NS_IMETHODIMP
109 sbAlbumArtFetcherSet::GetFetcherType(PRUint32* aType)
110 {
111  TRACE(("%s[%.8x] = %d", __FUNCTION__, this, mType));
112  NS_ENSURE_ARG_POINTER(aType);
113  *aType = mType;
114  return NS_OK;
115 }
116 
117 NS_IMETHODIMP
118 sbAlbumArtFetcherSet::SetFetcherType(PRUint32 aType)
119 {
120  TRACE(("%s[%.8x] = %d", __FUNCTION__, this, aType));
121  nsresult rv;
122 
123  // If this has changed we need to reload the fetcher list
124  if (aType != mType) {
125  mType = aType;
126  TRACE(("%s - Reloading fetcher list.", __FUNCTION__));
127  rv = mAlbumArtService->GetFetcherList(mType,
128  PR_FALSE,
129  getter_AddRefs(mFetcherList));
130  NS_ENSURE_SUCCESS(rv, rv);
131  }
132 
133  return NS_OK;
134 }
135 
136 
137 //------------------------------------------------------------------------------
138 //
139 // sbIAlbumArtFetcher implementation.
140 //
141 //------------------------------------------------------------------------------
142 
143 /* \brief try to fetch album art for the given media items
144  * \param aMediaItems a list of the media items that we're looking for album art
145  * for
146  * \param aListener the listener to inform of success or failure
147  */
148 
149 NS_IMETHODIMP
150 sbAlbumArtFetcherSet::FetchAlbumArtForAlbum(nsIArray* aMediaItems,
151  sbIAlbumArtListener* aListener)
152 {
153  TRACE(("%s[%.8x]", __FUNCTION__, this));
154  NS_ASSERTION(SB_IsMainThread(mThreadManager), \
155  "sbAlbumArtFetcherSet::FetchAlbumArtForAlbum is main thread only!");
156  // Validate arguments.
157  NS_ENSURE_ARG_POINTER(aMediaItems);
158  NS_ENSURE_ARG_POINTER(aListener);
159 
160  nsresult rv;
161  PRUint32 fetcherListCount;
162  rv = mFetcherList->GetLength(&fetcherListCount);
163  NS_ENSURE_SUCCESS(rv, rv);
164 
165  if (fetcherListCount <= 0) {
166  // No fetchers so abort
167  aListener->OnSearchComplete(aMediaItems);
168  return NS_OK;
169  }
170 
171  // Save the listener and list of items
172  mListener = aListener;
173  mMediaItems = aMediaItems;
174 
175  // Start with the first fetcher
176  mFetcherIndex = 0;
177  mShutdown = PR_FALSE;
178  // This will change to false if any fetch fails
179  mFoundAllArtwork = PR_TRUE;
180 
181  // Indicate that fetcher is fetching.
182  mIsFetching = PR_TRUE;
183 
184  return TryNextFetcher();
185 }
186 
187 /* \brief try to fetch album art for the given media item
188  * \param aMediaItem a media item that we're looking for album art for
189  * \param aListener the listener to inform of success or failure
190  */
191 
192 NS_IMETHODIMP
193 sbAlbumArtFetcherSet::FetchAlbumArtForTrack(sbIMediaItem* aMediaItem,
194  sbIAlbumArtListener* aListener)
195 {
196  TRACE(("%s[%.8x]", __FUNCTION__, this));
197  NS_ASSERTION(SB_IsMainThread(mThreadManager), \
198  "sbAlbumArtFetcherSet::FetchAlbumArtForTrack is main thread only!");
199  // Validate arguments.
200  NS_ENSURE_ARG_POINTER(aMediaItem);
201  NS_ENSURE_ARG_POINTER(aListener);
202  nsresult rv;
203 
204  // Save the listener and list of items, this makes it easier later on
205  mListener = aListener;
206  nsCOMPtr<nsIMutableArray> itemArray =
207  do_CreateInstance("@songbirdnest.com/moz/xpcom/threadsafe-array;1", &rv);
208  NS_ENSURE_SUCCESS(rv, rv);
209  rv = itemArray->AppendElement(NS_ISUPPORTS_CAST(sbIMediaItem*, aMediaItem),
210  PR_FALSE);
211  NS_ENSURE_SUCCESS(rv, rv);
212  mMediaItems = do_QueryInterface(itemArray, &rv);
213  NS_ENSURE_SUCCESS(rv, rv);
214 
215 
216  // Start with the first fetcher
217  mFetcherIndex = 0;
218  mShutdown = PR_FALSE;
219  // This will change to false if any fetch fails
220  mFoundAllArtwork = PR_TRUE;
221 
222  // Indicate that fetcher is fetching.
223  mIsFetching = PR_TRUE;
224 
225  return TryNextFetcher();
226 }
227 
228 /* \brief shut down the fetcher
229  */
230 
231 NS_IMETHODIMP
232 sbAlbumArtFetcherSet::Shutdown()
233 {
234  TRACE(("%s[%.8x]", __FUNCTION__, this));
235  NS_ASSERTION(SB_IsMainThread(mThreadManager), \
236  "sbAlbumArtFetcherSet::Shutdown is main thread only!");
237  if (mFetcher) {
238  // Shutdown the current fetcher
239  mFetcher->Shutdown();
240  mFetcher = nsnull;
241  }
242  mIsFetching = PR_FALSE;
243  mShutdown = PR_TRUE;
244  mListener = nsnull;
245  mMediaItems = nsnull;
246  return NS_OK;
247 }
248 
249 
250 //
251 // Getters/setters.
252 //
253 
258 NS_IMETHODIMP
259 sbAlbumArtFetcherSet::GetShortName(nsAString& aShortName)
260 {
261  TRACE(("%s[%.8x]", __FUNCTION__, this));
262  aShortName.AssignLiteral("set");
263  return NS_OK;
264 }
265 
266 
272 NS_IMETHODIMP
273 sbAlbumArtFetcherSet::GetName(nsAString& aName)
274 {
275  TRACE(("%s[%.8x]", __FUNCTION__, this));
276  aName.AssignLiteral("set");
277  return NS_OK;
278 }
279 
280 
285 NS_IMETHODIMP
286 sbAlbumArtFetcherSet::GetDescription(nsAString& aDescription)
287 {
288  TRACE(("%s[%.8x]", __FUNCTION__, this));
289  aDescription.AssignLiteral("set");
290  return NS_OK;
291 }
292 
299 NS_IMETHODIMP
300 sbAlbumArtFetcherSet::GetIsLocal(PRBool* aIsLocal)
301 {
302  TRACE(("%s[%.8x]", __FUNCTION__, this));
303  NS_ENSURE_ARG_POINTER(aIsLocal);
304  *aIsLocal = mType == sbIAlbumArtFetcherSet::TYPE_LOCAL;
305  return NS_OK;
306 }
307 
313 NS_IMETHODIMP
314 sbAlbumArtFetcherSet::GetIsEnabled(PRBool* aIsEnabled)
315 {
316  TRACE(("%s[%.8x]", __FUNCTION__, this));
317  NS_ENSURE_ARG_POINTER(aIsEnabled);
318  *aIsEnabled = PR_TRUE;
319  return NS_OK;
320 }
321 
322 NS_IMETHODIMP
323 sbAlbumArtFetcherSet::SetIsEnabled(PRBool aIsEnabled)
324 {
325  TRACE(("%s[%.8x]", __FUNCTION__, this));
326  return NS_OK;
327 }
328 
334 NS_IMETHODIMP
335 sbAlbumArtFetcherSet::GetPriority(PRInt32* aPriority)
336 {
337  TRACE(("%s[%.8x]", __FUNCTION__, this));
338  NS_ENSURE_ARG_POINTER(aPriority);
339  *aPriority = -1;
340  return NS_OK;
341 }
342 
343 NS_IMETHODIMP
344 sbAlbumArtFetcherSet::SetPriority(PRInt32 aPriority)
345 {
346  TRACE(("%s[%.8x]", __FUNCTION__, this));
347  return NS_OK;
348 }
349 
354 NS_IMETHODIMP
355 sbAlbumArtFetcherSet::GetAlbumArtSourceList(nsIArray** aAlbumArtSourceList)
356 {
357  TRACE(("%s[%.8x]", __FUNCTION__, this));
358  NS_ENSURE_ARG_POINTER(aAlbumArtSourceList);
359  NS_ADDREF(*aAlbumArtSourceList = mAlbumArtSourceList);
360  return NS_OK;
361 }
362 
363 NS_IMETHODIMP
364 sbAlbumArtFetcherSet::SetAlbumArtSourceList(nsIArray* aAlbumArtSourceList)
365 {
366  TRACE(("%s[%.8x]", __FUNCTION__, this));
367  mAlbumArtSourceList = aAlbumArtSourceList;
368  return NS_OK;
369 }
370 
375 NS_IMETHODIMP
376 sbAlbumArtFetcherSet::GetIsFetching(PRBool* aIsFetching)
377 {
378  TRACE(("%s[%.8x]", __FUNCTION__, this));
379  NS_ENSURE_ARG_POINTER(aIsFetching);
380  *aIsFetching = mIsFetching;
381  return NS_OK;
382 }
383 
384 
385 //------------------------------------------------------------------------------
386 //
387 // Public services.
388 //
389 //------------------------------------------------------------------------------
390 
396  mType(sbIAlbumArtFetcherSet::TYPE_ALL),
397  mShutdown(PR_FALSE),
398  mIsFetching(PR_FALSE),
399  mListener(nsnull),
400  mFetcherList(nsnull),
401  mFetcherIndex(0),
402  mFetcher(nsnull),
403  mMediaItems(nsnull),
404  mTimeoutTimerValue(ALBUMART_SCANNER_TIMEOUT),
405  mFoundAllArtwork(PR_FALSE)
406 {
407 #ifdef PR_LOGGING
408  if (!gAlbumArtFetcherSetLog) {
409  gAlbumArtFetcherSetLog = PR_NewLogModule("sbAlbumArtFetcherSet");
410  }
411 #endif
412  TRACE(("%s[%.8x]", __FUNCTION__, this));
413  MOZ_COUNT_CTOR(sbAlbumArtFetcherSet);
414 }
415 
416 
422 {
423  TRACE(("%s[%.8x]", __FUNCTION__, this));
424  MOZ_COUNT_DTOR(sbAlbumArtFetcherSet);
425 
426  // Make sure to shutdown
427  Shutdown();
428 }
429 
430 
435 nsresult
437 {
438  TRACE(("%s[%.8x]", __FUNCTION__, this));
439  nsresult rv;
440 
441  // Create our timer
442  mTimeoutTimer = do_CreateInstance(NS_TIMER_CONTRACTID, &rv);
443  NS_ENSURE_SUCCESS(rv, rv);
444 
445  // Get the thread manager. This is used so that main thread checks work
446  // during XPCOM shutdown.
447  mThreadManager = do_GetService("@mozilla.org/thread-manager;1", &rv);
448  NS_ENSURE_SUCCESS(rv, rv);
449 
450  // Get the album art service.
451  mAlbumArtService = do_GetService(SB_ALBUMARTSERVICE_CONTRACTID, &rv);
452  NS_ENSURE_SUCCESS(rv, rv);
453 
454  // Get the list of fetchers.
455  rv = mAlbumArtService->GetFetcherList(mType,
456  PR_FALSE,
457  getter_AddRefs(mFetcherList));
458  NS_ENSURE_SUCCESS(rv, rv);
459 
460  // Get our timer values
461  // Get the preference branch.
463  NS_ENSURE_SUCCESS(rv, rv);
464 
465  mTimeoutTimerValue = prefBranch.GetIntPref(PREF_ALBUMART_SCANNER_TIMEOUT,
467 
468  // Get the console service for warning messages
469  mConsoleService = do_GetService("@mozilla.org/consoleservice;1", &rv);
470  NS_ENSURE_SUCCESS(rv, rv);
471 
472  return NS_OK;
473 }
474 
475 //------------------------------------------------------------------------------
476 //
477 // nsITimerCallback Implementation.
478 //
479 //------------------------------------------------------------------------------
480 
481 /* notify(in nsITimer aTimer); */
482 NS_IMETHODIMP
483 sbAlbumArtFetcherSet::Notify(nsITimer* aTimer)
484 {
485  NS_ENSURE_ARG_POINTER(aTimer);
486 
487  if (aTimer == mTimeoutTimer) {
488  // We have taken too long to find album art so skip this fetcher.
489  TRACE(("%s[%.8x] - Timeout exceeded so moving to next fetcher",
490  __FUNCTION__, this));
491  mTimeoutTimer->Cancel();
492  return TryNextFetcher();
493  }
494  return NS_OK;
495 }
496 
497 //------------------------------------------------------------------------------
498 //
499 // sbIAlbumArtListner Implementation.
500 //
501 //------------------------------------------------------------------------------
502 
503 /* onChangeFetcher(in sbIAlbumArtFetcher aFetcher); */
504 NS_IMETHODIMP
505 sbAlbumArtFetcherSet::OnChangeFetcher(sbIAlbumArtFetcher* aFetcher)
506 {
507  TRACE(("%s[%.8x]", __FUNCTION__, this));
508  return NS_OK;
509 }
510 
511 /* onTrackResult(in nsIURI aImageLocation, in sbIMediaItem aMediaItem); */
512 NS_IMETHODIMP
513 sbAlbumArtFetcherSet::OnTrackResult(nsIURI* aImageLocation,
514  sbIMediaItem* aMediaItem)
515 {
516  TRACE(("%s[%.8x]", __FUNCTION__, this));
517  // Validate arguments.
518  NS_ENSURE_ARG_POINTER(aMediaItem);
519  nsresult rv;
520 
521  if (!aImageLocation) {
522  // Indicate that a fetch failed so we can try the next fetcher
523  TRACE(("%s[%.8x] - No image found, marking mFoundAllArtwork as FALSE",
524  __FUNCTION__, this));
525  mFoundAllArtwork = PR_FALSE;
526  } else {
527  // Check if this is a local file and warn if not
528  rv = CheckLocalImage(aImageLocation);
529  NS_ENSURE_SUCCESS(rv, rv);
530  }
531 
532  if (mListener) {
533  mListener->OnTrackResult(aImageLocation, aMediaItem);
534  }
535 
536  return NS_OK;
537 }
538 
539 /* onAlbumResult(in nsIURI aImageLocation, in nsIArray aMediaItems); */
540 NS_IMETHODIMP
541 sbAlbumArtFetcherSet::OnAlbumResult(nsIURI* aImageLocation,
542  nsIArray* aMediaItems)
543 {
544  TRACE(("%s[%.8x]", __FUNCTION__, this));
545  // Validate arguments.
546  NS_ENSURE_ARG_POINTER(aMediaItems);
547  nsresult rv;
548 
549  if (!aImageLocation) {
550  // Indicate that a fetch failed so we can try the next fetcher
551  mFoundAllArtwork = PR_FALSE;
552  } else {
553  // Check if this is a local file and warn if not
554  rv = CheckLocalImage(aImageLocation);
555  NS_ENSURE_SUCCESS(rv, rv);
556 
557  // Send result to listener
558  if (mListener) {
559  mListener->OnAlbumResult(aImageLocation, aMediaItems);
560  }
561  }
562  return NS_OK;
563 }
564 
565 /* onSearchComplete(aMediaItems, aMediaItem); */
566 NS_IMETHODIMP
567 sbAlbumArtFetcherSet::OnSearchComplete(nsIArray* aMediaItems)
568 {
569  TRACE(("%s[%.8x]", __FUNCTION__, this));
570  nsresult rv;
571 
572  // Cancel the timer since we have a response.
573  mTimeoutTimer->Cancel();
574 
575  if (mFoundAllArtwork) {
576  // All done so indicate complete
577  TRACE(("Found all artwork, finishing"));
578  mIsFetching = PR_FALSE;
579 
580  if (mListener) {
581  // We don't check the result since we want to always shutdown the fetcher
582  // after we return from this call.
583  mListener->OnSearchComplete(aMediaItems);
584  mListener = nsnull;
585  }
586 
587  // Make sure we shutdown the current fetcher; we do this after the call to
588  // the listener so we don't release items it may need.
589  if (mFetcher) {
590  rv = mFetcher->Shutdown();
591  NS_ENSURE_SUCCESS(rv, rv);
592  mFetcher = nsnull;
593  }
594  } else {
595  // Missing images so try next fetcher for items that failed
596  TRACE(("Images missing, using next fetcher."));
597  return TryNextFetcher();
598  }
599 
600  return NS_OK;
601 }
602 
603 //------------------------------------------------------------------------------
604 //
605 // Internal services.
606 //
607 //------------------------------------------------------------------------------
608 
609 nsresult
610 sbAlbumArtFetcherSet::CheckLocalImage(nsIURI* aImageLocation)
611 {
612  TRACE(("%s[%.8x]", __FUNCTION__, this));
613  NS_ENSURE_ARG_POINTER(aImageLocation);
614  nsresult rv;
615  nsCOMPtr<nsIFileURL> localFile = do_QueryInterface(aImageLocation, &rv);
616  if (NS_FAILED(rv)) {
617  // Not a file so this must be online
618  nsString message(NS_LITERAL_STRING("Fetcher returned non-local file for image"));
619  // try and get the location returned and put in message to user.
620  nsCString uriSpec;
621  rv = aImageLocation->GetSpec(uriSpec);
622  if (NS_SUCCEEDED(rv)) {
623  message.AppendLiteral(": ");
624  message.AppendLiteral(uriSpec.get());
625  }
626  mConsoleService->LogStringMessage(message.get());
627  }
628 
629  return NS_OK;
630 }
631 
632 nsresult
633 sbAlbumArtFetcherSet::TryNextFetcher()
634 {
635  TRACE(("%s[%.8x]", __FUNCTION__, this));
636  nsresult rv;
637 
638  // Get how many fetchers are available
639  PRUint32 fetcherListCount;
640  rv = mFetcherList->GetLength(&fetcherListCount);
641  NS_ENSURE_SUCCESS(rv, rv);
642 
643  // While we still have fetchers and the fetcher fails to find artwork keep
644  // looping
645  rv = NS_OK;
646  while ( (mFetcherIndex <= fetcherListCount) &&
647  (!mShutdown)) {
648  rv = NextFetcher();
649  if (NS_SUCCEEDED(rv)) {
650  // This fetcher succeeded so return
651  break;
652  }
653  };
654 
655  return rv;
656 }
657 
658 nsresult
659 sbAlbumArtFetcherSet::NextFetcher()
660 {
661  TRACE(("%s[%.8x]", __FUNCTION__, this));
662  NS_ASSERTION(SB_IsMainThread(mThreadManager), \
663  "sbAlbumArtFetcherSet::NextFetcher is main thread only!");
664  nsresult rv;
665  PRUint32 currentFetcherIndex = mFetcherIndex;
666 
667  // Shutdown the existing fetcher
668  if (mFetcher) {
669  mFetcher->Shutdown();
670 
671  // If the fetcher is still fetching, we have to wait until it calls
672  // OnSearchComplete and shutdown then. This can happen if Shutdown isn't
673  // able to immediately stop the fetching (e.g., fetching on a thread).
674  PRBool isFetching;
675  rv = mFetcher->GetIsFetching(&isFetching);
676  NS_WARN_IF_FALSE
677  (NS_SUCCEEDED(rv),
678  "Could not determine whether fetcher is still fetching.\n");
679  if (NS_SUCCEEDED(rv) && isFetching)
680  return NS_OK;
681 
682  mFetcher = nsnull;
683  }
684 
685  // Increment now so that we don't end up in an endless loop if anything fails
686  mFetcherIndex++;
687 
688  // Check if we have been shutdown
689  if (mShutdown) {
690  return NS_OK;
691  }
692 
693  // Get how many fetchers are available
694  PRUint32 fetcherListCount;
695  rv = mFetcherList->GetLength(&fetcherListCount);
696  NS_ENSURE_SUCCESS(rv, rv);
697 
698  // Get how many items we are scanning
699  PRUint32 itemListLength;
700  rv = mMediaItems->GetLength(&itemListLength);
701  NS_ENSURE_SUCCESS(rv, rv);
702 
703  if (currentFetcherIndex >= fetcherListCount) {
704  TRACE(("%s[%.8x] - No more fetchers", __FUNCTION__, this));
705  mIsFetching = PR_FALSE;
706  if (mListener) {
707  mListener->OnSearchComplete(mMediaItems);
708  mListener = nsnull;
709  }
710  // Shutdown since we are done.
711  mShutdown = PR_TRUE;
712  return NS_OK;
713  }
714 
715  TRACE(("%s[%.8x] - Querying fetcher at index %d of %d",
716  __FUNCTION__, this, (currentFetcherIndex + 1), fetcherListCount));
717 
718  // Get the next fetcher
719  nsCAutoString fetcherContractID;
720  nsCOMPtr<nsIVariant>
721  fetcherContractIDVariant = do_QueryElementAt(mFetcherList,
722  currentFetcherIndex,
723  &rv);
724  NS_ENSURE_SUCCESS(rv, rv);
725 
726  rv = fetcherContractIDVariant->GetAsACString(fetcherContractID);
727  NS_ENSURE_SUCCESS(rv, rv);
728 
729  TRACE(("%s[%.8x] - Trying fetcher %s",
730  __FUNCTION__, this, fetcherContractID.get()));
731 
732  // Notify listeners that we have moved on to the next fetcher
733  mFetcher = do_CreateInstance(fetcherContractID.get(), &rv);
734  NS_ENSURE_SUCCESS(rv, rv);
735  if (mListener) {
736  mListener->OnChangeFetcher(mFetcher);
737  }
738 
739  // Set the source list to what we have.
740  rv = mFetcher->SetAlbumArtSourceList(mAlbumArtSourceList);
741  NS_ENSURE_SUCCESS(rv, rv);
742 
743  // Start up the timeout timer in case this takes to long
744  rv = mTimeoutTimer->InitWithCallback(this,
745  mTimeoutTimerValue,
746  nsITimer::TYPE_ONE_SHOT);
747  NS_ENSURE_SUCCESS(rv, rv);
748 
749  // Try fetching album art using the fetcher.
750 
751  // If there is only one media item in the list then use the single fetch,
752  // otherwise use the album fetch.
753  if (itemListLength == 1) {
754  // Grab the first item
755  nsCOMPtr<sbIMediaItem> firstMediaItem;
756  rv = mMediaItems->QueryElementAt(0,
757  NS_GET_IID(sbIMediaItem),
758  getter_AddRefs(firstMediaItem));
759  NS_ENSURE_SUCCESS(rv, rv);
760  mFoundAllArtwork = PR_TRUE;
761  rv = mFetcher->FetchAlbumArtForTrack(firstMediaItem, this);
762  } else {
763  mFoundAllArtwork = PR_TRUE;
764  rv = mFetcher->FetchAlbumArtForAlbum(mMediaItems, this);
765  }
766 
767  // Check if it failed
768  if (NS_FAILED(rv)) {
769  mTimeoutTimer->Cancel();
770  return rv;
771  }
772 
773  return NS_OK;
774 }
775 
return NS_OK
Songbird Album Art Fetcher Set Definitions.
#define SB_ALBUMARTSERVICE_CONTRACTID
NS_DECL_ISUPPORTS NS_DECL_SBIALBUMARTFETCHER NS_DECL_SBIALBUMARTFETCHERSET NS_DECL_NSITIMERCALLBACK NS_DECL_SBIALBUMARTLISTENER sbAlbumArtFetcherSet()
#define ALBUMART_SCANNER_TIMEOUT
#define PREF_ALBUMART_SCANNER_TIMEOUT
const unsigned long TYPE_LOCAL
PRBool SB_IsMainThread(nsIThreadManager *aThreadManager)
A component which is interested in the result of an album art fetch request.
readonly attribute boolean isFetching
Flag to indicate if this fetcher is currently fetching.
Songbird Thread Utilities Definitions.
Interface for an album art fetcher set. Instantiate as a component instance.
GstMessage * message
_updateCookies aName
#define PREF_ALBUMART_SCANNER_BRANCH
Interface that defines a single item of media in the system.
Interface for an album art fetcher. Instantiate as a component instance.
NS_IMPL_THREADSAFE_ISUPPORTS3(sbAlbumArtFetcherSet, sbIAlbumArtFetcherSet, sbIAlbumArtFetcher, sbIAlbumArtListener) NS_IMETHODIMP sbAlbumArtFetcherSet
If true, only attempt to fetch album art from local sources.
PRInt32 GetIntPref(const char *aKey, const PRInt32 aDefault)
Definition: sbPrefBranch.h:128
#define TRACE(args)