static gint gv_manager_raster_destroy_cb( GObject * raster_in, gpointer cb_data ) { GvManager *manager = GV_MANAGER(cb_data); GvRaster *raster = GV_RASTER(raster_in); GvDataset *ds = NULL; int i, active_rasters = 0; /* * Find in our list. The dataset must already be "under management". */ for( i = 0; i < manager->datasets->len; i++ ) { ds = (GvDataset *) g_ptr_array_index(manager->datasets, i); if( raster->dataset == ds->dataset ) break; } if( i == manager->datasets->len ) { g_warning( "gv_manager_raster_destroy_cb(): can't find dataset." ); return FALSE; } /* * Find our GvRaster. */ for( i = 0; i < GDALGetRasterCount(ds->dataset); i++ ) { if( ds->rasters[i] == raster ) { /* MB: still not sure if we need to unref here... */ // if (G_OBJECT(raster)->ref_count > 1) // g_object_unref(ds->rasters[i]); ds->rasters[i] = NULL; } else if( ds->rasters[i] != NULL ) active_rasters++; } /* * We apparently no longer need this GDALDataset. Dereference it, and * remove from the list. */ if (active_rasters == 0) { if (GDALDereferenceDataset(ds->dataset) < 1) { GDALClose(ds->dataset); } g_free(ds->rasters); g_free(ds); g_ptr_array_remove_fast(manager->datasets, ds); } return FALSE; }
GvManager *gv_manager_new() { return GV_MANAGER(gtk_type_new(GV_TYPE_MANAGER)); }