Iterator<Category> it = category_map.keySet().iterator();
while( it.hasNext()){
Category c = it.next();
if ( !active_map.containsKey( c )){
c.removeCategoryListener( category_listener );
it.remove();
}
}
for ( final Category c: active_map.keySet()){
if ( !category_map.containsKey( c )){
to_process.put( c, active_map.get(c));
c.addCategoryListener( category_listener );
category_map.put( c, active_map.get(c));
if ( c.getType() == Category.TYPE_UNCATEGORIZED ){
if ( category_dl_listener == null ){
// new downloads don't get a category-change event fired when added
// we also want to delay things a bit to allow other components
// to set an initial category. there's no hurry anyways
category_dl_listener =
new GlobalManagerAdapter()
{
public void
downloadManagerAdded(
final DownloadManager dm )
{
new DelayedEvent(
"TM:cat-check",
10*1000,
new AERunnable()
{
public void
runSupport()
{
Category dm_c = dm.getDownloadState().getCategory();
if ( dm_c == null || dm_c == c ){
// still uncategorised
Object[] details;
synchronized( category_map ){
details = category_map.get( c );
}
if ( details != null ){
processCategory( c, details, dm );
}
}
}
});
}
public void
downloadManagerRemoved(
DownloadManager dm )
{
}
};
azureus_core.getGlobalManager().addListener( category_dl_listener, false );
}
}
}
}
}
if ( to_process.size() > 0 ){
List<DownloadManager> downloads = azureus_core.getGlobalManager().getDownloadManagers();
for ( Map.Entry<Category, Object[]> entry: to_process.entrySet()){
Category c = entry.getKey();
Object[] details = entry.getValue();
List<DownloadManager> list = c.getDownloadManagers( downloads );
for( DownloadManager dm: list ){
processCategory( c, details, dm );
}