132 lines
3.0 KiB
C++
132 lines
3.0 KiB
C++
/*!\file
|
|
* \brief \todo Îïèñàíèå ôàéëà.
|
|
*/
|
|
/*
|
|
* AppBuilder.h
|
|
*
|
|
* Created on: 24 èþí. 2019 ã.
|
|
* Author: titov
|
|
*/
|
|
|
|
#ifndef SOURCE_APPLICATION_SOFTWARE_APPBUILDER_H_
|
|
#define SOURCE_APPLICATION_SOFTWARE_APPBUILDER_H_
|
|
|
|
#include "../../application/ISetupStep.hh"
|
|
|
|
#include "../Environment.hh"
|
|
|
|
#include "AppId.hh"
|
|
|
|
#include "../../units/LogicalEntities.hpp"
|
|
|
|
namespace configuration { namespace software {
|
|
|
|
class AppBuilder {
|
|
public:
|
|
typedef std::size_t Idx;
|
|
|
|
class BuildedItem {
|
|
|
|
friend class AppBuilder;
|
|
|
|
enum State {
|
|
INPUT,
|
|
PREPARE,
|
|
BUILD,
|
|
DONE,
|
|
ERROR,
|
|
};
|
|
|
|
application::ISetupStep * step;
|
|
State state;
|
|
InitializerStepId id;
|
|
|
|
public:
|
|
BuildedItem()
|
|
: step(nullptr),
|
|
state(INPUT),
|
|
id(-1) {}
|
|
|
|
};
|
|
|
|
AppBuilder( BuildedItem * items, std::size_t items_size,
|
|
Environment & env );
|
|
|
|
bool addState( application::ISetupStep * state, InitializerStepId id );
|
|
|
|
void process();
|
|
|
|
bool isBuilded() const;
|
|
|
|
std::size_t getSize() const { return size; }
|
|
|
|
void cancel();
|
|
|
|
virtual ~AppBuilder() = default;
|
|
protected:
|
|
virtual bool do_input( Environment & env, application::ISetupStep * & );
|
|
virtual bool do_prepare( application::ISetupStep * & );
|
|
virtual bool do_build( Environment & env, application::ISetupStep * & );
|
|
|
|
const std::size_t size;
|
|
BuildedItem * const setup_list;
|
|
|
|
Idx build_index = 0;
|
|
Idx step_quantity = 0;
|
|
Idx finish_quantity = 0;
|
|
|
|
Environment & global_env;
|
|
|
|
bool application_builded = false;
|
|
|
|
void end();
|
|
virtual bool do_end( Environment & env, application::ISetupStep * & );
|
|
|
|
|
|
|
|
};
|
|
|
|
template<std::size_t size>
|
|
struct AppBuilderBox {
|
|
AppBuilder::BuildedItem items[size];
|
|
AppBuilder builder;
|
|
|
|
AppBuilderBox( Environment & env ) :
|
|
items(), builder( items, size, env ) {}
|
|
};
|
|
|
|
}}
|
|
|
|
#include <exception>
|
|
|
|
namespace configuration { namespace software {
|
|
|
|
struct BadAppBuilderSize : public std::exception {
|
|
std::size_t item_quantity;
|
|
BadAppBuilderSize( std::size_t item_quantity ) : item_quantity(item_quantity) {}
|
|
const char* what() const noexcept { return "Bad AppBuilder size!"; }
|
|
};
|
|
|
|
inline void add( AppBuilder & builder, application::ISetupStep * step, InitializerStepId id ) {
|
|
|
|
if( not builder.addState(step, id) and step )
|
|
throw BadAppBuilderSize( builder.getSize() );
|
|
|
|
}
|
|
|
|
class AppBuilderSafety : public AppBuilder {
|
|
public:
|
|
AppBuilderSafety( BuildedItem * items, std::size_t items_size,
|
|
Environment & env ) : AppBuilder( items, items_size, env ) {}
|
|
protected:
|
|
virtual bool do_input( Environment & env, application::ISetupStep * & ) override;
|
|
virtual bool do_prepare( application::ISetupStep * & ) override;
|
|
virtual bool do_build( Environment & env, application::ISetupStep * & ) override;
|
|
virtual bool do_end( Environment & env, application::ISetupStep * & ) override;
|
|
};
|
|
|
|
}}
|
|
|
|
|
|
#endif /* SOURCE_APPLICATION_SOFTWARE_APPBUILDER_H_ */
|