nsresult
sbPlayQueueExternalLibraryListener::GenerateUpdates(
        sbIMediaItem* aMediaItem,
        sbIPropertyArray* aProperties,
        Updates& updates)
{
  TRACE(("%s[%p]", __FUNCTION__, this));
  nsresult rv;

  nsCOMPtr<sbILibrary> lib;
  rv = aMediaItem->GetLibrary(getter_AddRefs(lib));
  NS_ENSURE_SUCCESS(rv, rv);

  // This ensures that we have an item that is either in our master library or 
  // is duplicated in the master library.
  nsCOMPtr<sbIMediaItem> internalMediaItem;
  if (lib == mMasterLibrary) {
    internalMediaItem = aMediaItem;
  } else {
    rv = mMasterLibrary->GetDuplicate(aMediaItem,
                                        getter_AddRefs(internalMediaItem));
    NS_ENSURE_SUCCESS(rv, rv);
    if (internalMediaItem) {
      sbPropertyUpdate internalUpdate(internalMediaItem, aProperties);
      updates.push_back(internalUpdate);
    } else {
      // If we can't find a duplicate in our master library, just return.
      return NS_OK;
    }
  }

  // We found an item in our master library - go find duplicates in our external
  // libraries to update.
  for (PRInt32 i = 0; i < mExternalLibraries.Count(); i++)
  {
    if (mExternalLibraries[i] != lib) {
      nsCOMPtr<sbIMediaItem> externalMediaItem;
      rv = mExternalLibraries[i]->GetDuplicate(internalMediaItem,
                                               getter_AddRefs(externalMediaItem));
      if (NS_SUCCEEDED(rv) && externalMediaItem) {
        sbPropertyUpdate externalUpdate(externalMediaItem, aProperties);
        updates.push_back(externalUpdate);
      }
    }
  }
  return NS_OK;
}
Esempio n. 2
0
		void pushUpdate(const DataPackage& p) {
			NodeMap::iterator f = nodeMap.find(p.node.get());
			if(f != nodeMap.end()) {
				*f->second = p;
			}
			else {
				updates.push_back(p);
				Updates::iterator& last = nodeMap[p.node.get()] = updates.end(); --last;
			}
		}