Exemple #1
0
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;
}
Exemple #2
0
GvManager *gv_manager_new()
{
    return GV_MANAGER(gtk_type_new(GV_TYPE_MANAGER));
}