PyObject *py_ped_timer_destroy_nested(PyObject *s, PyObject *args) { PedTimer *timer = NULL; timer = _ped_Timer2PedTimer(s); if (timer == NULL) { return NULL; } ped_timer_destroy_nested(timer); ped_timer_destroy(timer); Py_CLEAR(s); Py_INCREF(Py_None); return Py_None; }
int hfsplus_resize (PedFileSystem* fs, PedGeometry* geom, PedTimer* timer) { HfsPPrivateFSData* priv_data; PedTimer* timer_plus; PedGeometry* embedded_geom; PedSector hgms; /* check preconditions */ PED_ASSERT (fs != NULL); PED_ASSERT (fs->geom != NULL); PED_ASSERT (geom != NULL); PED_ASSERT (fs->geom->dev == geom->dev); #ifdef DEBUG PED_ASSERT ((hgms = hfsplus_get_min_size (fs)) != 0); #else if ((hgms = hfsplus_get_min_size (fs)) == 0) return 0; #endif if (ped_geometry_test_equal(fs->geom, geom)) return 1; priv_data = (HfsPPrivateFSData*) fs->type_specific; if (fs->geom->start != geom->start || geom->length > fs->geom->length || geom->length < hgms) { ped_exception_throw ( PED_EXCEPTION_NO_FEATURE, PED_EXCEPTION_CANCEL, _("Sorry, HFS+ cannot be resized that way yet.")); return 0; } if (priv_data->wrapper) { PedSector red, hgee; HfsPrivateFSData* hfs_priv_data = (HfsPrivateFSData*) priv_data->wrapper->type_specific; unsigned int hfs_sect_block = PED_BE32_TO_CPU (hfs_priv_data->mdb->block_size) / PED_SECTOR_SIZE_DEFAULT; /* There is a wrapper so we must calculate the new geometry of the embedded HFS+ volume */ red = ( (fs->geom->length - geom->length + hfs_sect_block - 1) / hfs_sect_block ) * hfs_sect_block; /* Can't we shrink the hfs+ volume by the desired size ? */ hgee = hfsplus_get_empty_end (fs); if (!hgee) return 0; if (red > priv_data->plus_geom->length - hgee) { /* No, shrink hfs+ by the greatest possible value */ hgee = ((hgee + hfs_sect_block - 1) / hfs_sect_block) * hfs_sect_block; red = priv_data->plus_geom->length - hgee; } embedded_geom = ped_geometry_new (geom->dev, priv_data->plus_geom->start, priv_data->plus_geom->length - red); /* There is a wrapper so the resize process is a two stages process (embedded resizing then wrapper resizing) : we create a sub timer */ ped_timer_reset (timer); ped_timer_set_state_name (timer, _("shrinking embedded HFS+ volume")); ped_timer_update(timer, 0.0); timer_plus = ped_timer_new_nested (timer, 0.98); } else { /* No wrapper : the desired geometry is the desired HFS+ volume geometry */ embedded_geom = geom; timer_plus = timer; } /* Resize the HFS+ volume */ if (!hfsplus_volume_resize (fs, embedded_geom, timer_plus)) { if (timer_plus != timer) ped_timer_destroy_nested (timer_plus); ped_exception_throw ( PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL, _("Resizing the HFS+ volume has failed.")); return 0; } if (priv_data->wrapper) { ped_geometry_destroy (embedded_geom); ped_timer_destroy_nested (timer_plus); ped_timer_set_state_name(timer, _("shrinking HFS wrapper")); timer_plus = ped_timer_new_nested (timer, 0.02); /* There's a wrapper : second stage = resizing it */ if (!hfsplus_wrapper_update (fs) || !hfs_resize (priv_data->wrapper, geom, timer_plus)) { ped_timer_destroy_nested (timer_plus); ped_exception_throw ( PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL, _("Updating the HFS wrapper has failed.")); return 0; } ped_timer_destroy_nested (timer_plus); } ped_timer_update(timer, 1.0); return 1; }