winix/content/rm.cpp

125 lines
2.3 KiB
C++
Executable File

/*
* This file is a part of Winix
* and is not publicly distributed
*
* Copyright (c) 2008-2010, Tomasz Sowa
* All rights reserved.
*
*/
#include "content.h"
#include "../core/request.h"
#include "../core/error.h"
#include "../core/db.h"
#include "../core/data.h"
bool Content::FunRmCheckAccess()
{
if( !request.is_item )
{
if( !request.CanRemove(*request.dir_table.back()) )
{
request.status = WINIX_ERR_PERMISSION_DENIED;
return false;
}
}
else
if( !request.CanRemove(request.item) )
{
request.status = WINIX_ERR_PERMISSION_DENIED;
return false;
}
return true;
}
void Content::FunRmDirRecursive()
{
// this method deletes recursively all directories
data.dirs.DeleteDir(request.dir_table.back()->id);
request.dir_table.erase(--request.dir_table.end());
if( request.dir_table.empty() )
{
// we have deleted the root directory
data.dirs.CheckRootDir();
Item * proot = data.dirs.GetRootDir();
if( proot )
request.dir_table.push_back(proot);
else
// there is no a root dir
// CheckRootDir() didn't add the root dir (probably problem with the database)
// make sure that Content::Make() will check that the dir_table is empty and returns
return;
}
// redirect to the last valid directory
RedirectTo(**(--request.dir_table.end()));
}
void Content::FunRmDir()
{
if( request.param_table.empty() )
request.status = WINIX_ERR_PERMISSION_DENIED;
else
if( request.IsParam("confirm") )
return;
else
if( request.IsParam("r") )
FunRmDirRecursive();
else
request.status = WINIX_ERR_UNKNOWN_PARAM;
}
void Content::FunRm()
{
if( !FunRmCheckAccess() )
return;
if( !request.is_item )
return FunRmDir();
if( request.param_table.empty() )
{
if( db.DelItem( request.item ) )
{
log << log2 << "Content: deleted item: subject: " << request.item.subject << ", id: " << request.item.id << logend;
TemplatesFunctions::pattern_cacher.DeletePattern(request.item);
if( data.mounts.pmount->type == Mount::thread )
db.EditThreadRemoveItem(request.item.parent_id);
else
if( data.mounts.pmount->type == Mount::ticket )
db.EditTicketRemoveItem(request.item.id);
}
else
{
request.status = WINIX_ERR_NO_ITEM;
}
RedirectTo(*request.dir_table.back());
}
else
{
if( !request.IsParam("confirm") )
request.status = WINIX_ERR_UNKNOWN_PARAM;
}
}