/* * This file is a part of CMSLU -- Content Management System like Unix * and is not publicly distributed * * Copyright (c) 2008, Tomasz Sowa * All rights reserved. * */ #include "content.h" bool Content::Init() { templates.Read(); return true; } void Content::AddItem() { if( !request.session->is_logged ) return; try { request.session->done = Done::added_item; // request.item_table.resize(1); // Item & item = request.item_table[0]; request.item.subject = request.PostVar("subject"); request.item.content = request.PostVar("content"); request.item.parent_id = data.dir.GetDirId( request.PostVar("directory") ); request.item.type = Item::file; PrepareUrlSubject(request.item); request.session->done_status = db.AddItem(request.item); request.session->done_timer = 1; // if( request.session->done_status != Request::added_item ) //request.item_table.resize(1); //request.item_table[0] = request.item; } catch(const Error & e) { request.session->done_status = e; } } void Content::EditItem() { if( !request.session->is_logged ) return; try { request.session->done = Done::edited_item; // request.item_table.resize(1); // Item & item = request.item_table[0]; request.item.subject = request.PostVar("subject"); request.item.content = request.PostVar("content"); request.item.id = atol( request.PostVar("id").c_str() ); bool with_subject = false; if( request.PostVar("old_subject") != request.item.subject ) with_subject = true; request.item.parent_id = data.dir.GetDirId( request.PostVar("directory") ); request.item.type = Item::file; PrepareUrlSubject(request.item); request.session->done_status = db.EditItem(request.item, with_subject); request.session->done_timer = 1; } catch(const Error & e) { request.session->done_status = e; } } void Content::LogUser() { try { std::string & login = request.PostVar("login"); std::string & pass = request.PostVar("password"); long user_id; if( db.CheckUser(login, pass, user_id) ) { request.session->is_logged = true; request.session->user_id = user_id; request.session->user = login; log << log2 << "User " << login << " (id: " << user_id << ") logged" << logend; } } catch(const Error &) { } } void Content::MakeDirectoryStructure() { GetTable::size_type get_table_len = request.get_table.size(); long parent = -1; for( get_index = 0 ; get_index < get_table_len ; ++get_index) { Item * pdir; if( !data.dir.GetDir(request.get_table[get_index], parent, &pdir) ) break; parent = pdir->id; request.cur_dir_table.push_back( *pdir ); } // parent - last directory (or -1 if none) request.dir = parent; data.dir.GetDirChilds(parent, request.dir_table); } Request::Result Content::StandardFunction(std::string & name) { Request::Result res = Request::err404; // language polish // in the future there'll be something here // names of functions should not begin with an underscore '_' if( name == "dodaj" ) res = Request::add_item; else if( name == "edytuj" ) res = Request::edit_item; else if( name == "id" ) res = Request::show_item_by_id; else if( name == "usun" ) res = Request::del_item; else if( name == "potwierdz" ) res = Request::confirm; else if( name == "wyloguj" ) res = Request::logout; return res; } void Content::PrepareUrlSubject(Item & item) { SetUrlSubjectFromSubject(item); if( StandardFunction(item.url_subject) != Request::err404 ) { // names of functions should not begin with an underscore '_' // and we can simply add one '_' at the beginning // and the name will be unique item.url_subject.insert(item.url_subject.begin(), '_'); } } bool Content::MakeGetCheckDir() { if( get_index == request.get_table.size() ) { // request was for a directory db.GetItems(request.item_table, item); // !! temporarily long default_id = -1; if( request.cur_dir_table.empty() ) { default_id = data.dir.root.default_item; } else { default_id = request.cur_dir_table.back().default_item; } if( default_id != -1 ) { request.result = Request::show_item; std::vector::iterator i; for(i = request.item_table.begin() ; i != request.item_table.end() ; ++i) { if( i->id == default_id ) request.item_table[0] = *i; } request.item_table.resize(1); } else if( data.one_item_is_showed && request.item_table.size() == 1 && request.item_table[0].type == Item::file ) { request.result = Request::show_item; } else { request.result = Request::show_dir; } return true; } return false; } // zrobic tak ze gdzie podajemy cala liste aby nie ladowac contentu z bazy danych do itemow void Content::MakeGet() { MakeDirectoryStructure(); item.Clear(); // request.dir is set by MakeDirectoryStructure() item.parent_id = request.dir; if( MakeGetCheckDir() ) return; // request was for an item or a standard function request.result = StandardFunction( request.get_table[get_index] ); if( request.result != Request::err404 ) { // request for a standard function ++get_index; return; } if( request.get_table[get_index].empty() ) // we do not have an empty url_subject // err404 at the end return; // if we want to search by url_subject then request.get_table[get_index] should not be empty item.url_subject = request.get_table[get_index++]; db.GetItems(request.item_table, item); if( request.item_table.empty() ) // err404 at the end return; if( get_index == request.get_table.size() ) { request.result = Request::show_item; return; } // there is a standard function at the end request.result = StandardFunction( request.get_table[get_index++] ); } void Content::MakeEditItem() { if( !request.item_table.empty() ) request.item = request.item_table[0]; else { log << log1 << "Content: request.item_table should not be empty" << logend; request.result = Request::err404; } } void Content::AppendCurDir(std::string & dir) { std::vector::size_type a; for(a=0 ; ais_logged ) return; if( request.item_table.empty() ) { request.result = Request::err404; return; } if( get_index == request.get_table.size() ) { request.CopyFirstItem(); request.session->item = request.item; if( db.DelItem( request.item.id ) ) { request.session->done = Done::deleted_item; request.session->done_status = Error::ok; log << log2 << "Content: deleted item: subject: " << request.item.subject << ", id: " << request.item.id << logend; } else { request.session->done = Done::deleted_item; request.session->done_status = Error::db_no_item; } request.result = Request::redirect; request.str = data.base_url; AppendCurDir(request.str); request.session->done_timer = 2; } else { if( StandardFunction( request.get_table[get_index++] ) == Request::confirm ) { request.result = Request::del_item_confirm; request.CopyFirstItem(); } else request.result = Request::err404; } } void Content::MakeLogout() { if( request.session->is_logged ) { log << log2 << "User " << request.session->user << " (id: " << request.session->user_id << ") logged out" << logend; request.session->is_logged = false; request.session->user.clear(); request.session->user_id = 0; } request.result = Request::redirect; std::string path; data.dir.MakePath(request.dir, path); request.str = data.base_url + path; if( !request.item_table.empty() ) request.str += request.item_table[0].url_subject; request.session->done = Done::loggedout; request.session->done_timer = 2; } void Content::MakeStandardFunction() { if( request.result == Request::edit_item ) { MakeEditItem(); } else if( request.result == Request::show_item_by_id ) { MakeShowItemById(); } else if( request.result == Request::del_item ) { MakeDelItem(); } else if( request.result == Request::logout ) { MakeLogout(); } } void Content::MakePost() { if( request.IsPostVar("add_item") ) AddItem(); else if( request.IsPostVar("edit_item") ) EditItem(); else if( request.IsPostVar("logging") ) LogUser(); } void Content::Make() { MakePost(); MakeGet(); MakeStandardFunction(); templates.Generate(); // request.PrintGetTable(); //request.PrintEnv(); // request.PrintIn(); }