winix/content/rm.cpp

138 lines
2.9 KiB
C++
Raw Normal View History

/*
* This file is a part of CMSLU -- Content Management System like Unix
* and is not publicly distributed
*
* Copyright (c) 2008-2009, Tomasz Sowa
* All rights reserved.
*
*/
#include "content.h"
#include "../core/request.h"
#include "../core/error.h"
#include "../core/db.h"
#include "../core/data.h"
void Content::FunRmDirRecursive()
{
data.dirs.MakePath(request.dir_table.back()->id, request.session->dir_old);
// 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;
}
request.session->done = Done::deleted_dir;
request.session->done_status = Error::ok;
request.session->done_timer = 2;
// redirect to the last valid directory
RedirectTo(**(--request.dir_table.end()));
}
void Content::FunRmDir()
{
if( request.dir_table.size() == 1 )
{
// rm for the root dir
// only the superuser can do it
if( !request.session->puser || !request.session->puser->super_user )
{
request.status = Error::permision_denied;
return;
}
}
else
{
Item * last_but_one_dir = *(--(--request.dir_table.end()));
if( !request.HasWriteAccess(*last_but_one_dir) )
{
request.status = Error::permision_denied;
return;
}
}
if( request.param_table.empty() )
request.status = Error::permision_denied;
else
if( request.IsParam("confirm") )
return;
else
if( request.IsParam("r") )
FunRmDirRecursive();
else
request.status = Error::unknown_param;
}
void Content::FunRm()
{
if( !request.is_item )
{
FunRmDir();
return;
}
if( !request.HasWriteAccess(*request.dir_table.back()) )
{
request.status = Error::permision_denied;
return;
}
if( request.param_table.empty() )
{
// we'll put some information about the deleted item (on the next page)
request.session->item = request.item;
// !! zmienic interfejs dla db.DelItem
if( db.DelItem( request.item ) )
{
request.session->done_status = Error::ok;
log << log2 << "Content: deleted item: subject: " << request.item.subject << ", id: " << request.item.id << logend;
TemplatesFunctions::pattern_cacher.DeletePattern(request.item);
}
else
{
request.session->done_status = Error::db_no_item;
}
request.session->done = Done::deleted_item;
RedirectTo(*request.dir_table.back());
request.session->done_timer = 2;
}
else
{
if( !request.IsParam("confirm") )
//request.result = Request::err404;
request.status = Error::unknown_param;
}
}