keepass2android/src/Kp2aBusinessLogic/database/edit/DeleteGroup.cs

170 lines
4.4 KiB
C#
Raw Normal View History

2013-02-23 11:43:42 -05:00
/*
This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file is based on Keepassdroid, Copyright Brian Pellin.
Keepass2Android is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
Keepass2Android is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Keepass2Android. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using KeePassLib;
namespace keepass2android
{
public class DeleteGroup : DeleteRunnable {
2013-02-23 11:43:42 -05:00
private PwGroup mGroup;
private Activity mAct;
protected bool mDontSave;
public DeleteGroup(Context ctx, IKp2aApp app, PwGroup group, Activity act, OnFinish finish)
: base(finish, app)
{
setMembers(ctx, app, group, act, false);
2013-02-23 11:43:42 -05:00
}
/*
public DeleteGroup(Context ctx, Database db, PwGroup group, Activity act, OnFinish finish, bool dontSave)
: base(finish)
{
2013-02-23 11:43:42 -05:00
setMembers(ctx, db, group, act, dontSave);
}
2013-02-23 11:43:42 -05:00
public DeleteGroup(Context ctx, Database db, PwGroup group, OnFinish finish, bool dontSave):base(finish) {
setMembers(ctx, db, group, null, dontSave);
}
*/
private void setMembers(Context ctx, IKp2aApp app, PwGroup group, Activity act, bool dontSave)
{
base.setMembers(ctx, app.GetDb());
2013-02-23 11:43:42 -05:00
mGroup = group;
mAct = act;
mDontSave = dontSave;
}
public override bool CanRecycle
{
get
{
return CanRecycleGroup(mGroup);
}
}
protected override UiStringKey QuestionsResourceId
{
get
{
return UiStringKey.AskDeletePermanentlyGroup;
}
2013-02-23 11:43:42 -05:00
}
public override void run() {
//from KP Desktop
PwGroup pg = mGroup;
PwGroup pgParent = pg.ParentGroup;
if(pgParent == null) return; // Can't remove virtual or root group
PwDatabase pd = mDb.pm;
PwGroup pgRecycleBin = pd.RootGroup.FindGroup(pd.RecycleBinUuid, true);
pgParent.Groups.Remove(pg);
if ((DeletePermanently) || (!CanRecycle))
2013-02-23 11:43:42 -05:00
{
pg.DeleteAllObjects(pd);
PwDeletedObject pdo = new PwDeletedObject(pg.Uuid, DateTime.Now);
pd.DeletedObjects.Add(pdo);
mFinish = new AfterDeletePermanently(mFinish, mApp, mGroup);
2013-02-23 11:43:42 -05:00
}
else // Recycle
{
bool bDummy = false;
EnsureRecycleBin(ref pgRecycleBin, ref bDummy);
2013-02-23 11:43:42 -05:00
pgRecycleBin.AddGroup(pg, true, true);
pg.Touch(false);
mFinish = new ActionOnFinish((success, message) =>
{
if ( success ) {
// Mark new parent (Recycle bin) dirty
PwGroup parent = mGroup.ParentGroup;
if ( parent != null ) {
mDb.dirty.Add(parent);
}
//Mark old parent dirty:
mDb.dirty.Add(pgParent);
} else {
// Let's not bother recovering from a failure to save a deleted group. It is too much work.
mApp.SetShutdown();
}
}, this.mFinish);
2013-02-23 11:43:42 -05:00
}
// Save
SaveDB save = new SaveDB(mCtx, mDb, mFinish, mDontSave);
save.run();
}
private class AfterDeletePermanently : OnFinish {
IKp2aApp mApp;
2013-02-23 11:43:42 -05:00
PwGroup mGroup;
public AfterDeletePermanently(OnFinish finish, IKp2aApp app, PwGroup group):base(finish) {
this.mApp = app;
2013-02-23 11:43:42 -05:00
this.mGroup = group;
}
public override void run() {
if ( mSuccess ) {
// Remove from group global
mApp.GetDb().groups.Remove(mGroup.Uuid);
2013-02-23 11:43:42 -05:00
// Remove group from the dirty global (if it is present), not a big deal if this fails (doesn't throw)
mApp.GetDb().dirty.Remove(mGroup);
2013-02-23 11:43:42 -05:00
// Mark parent dirty
PwGroup parent = mGroup.ParentGroup;
if ( parent != null ) {
mApp.GetDb().dirty.Add(parent);
2013-02-23 11:43:42 -05:00
}
} else {
// Let's not bother recovering from a failure to save a deleted group. It is too much work.
mApp.SetShutdown();
2013-02-23 11:43:42 -05:00
}
base.run();
}
}
}
}