# Effi (C++)

Effi is C++ application development framework.

## Overview

Effi is application development framework. It provides full range of development tools to create web-based C++ software applications with rich Windows-like GUI.
The framework includes declarative language for application description, provides API for XML documents manipulating, facilities for large data lists representation, thread synchronization, localization and data logging. Effi also contains dedicated libraries for interaction with RDBMS as well as for data storage and serialization/restoration etc. - the full list of libraries is below.
Particular Effi components are distributed as free and open source software.

### Browsers supported

Effi-based applications have web front-end available with the following browsers:
* Internet Explorer 7.0+
* Mozilla Firefox 3.5+
* Chrome 4.0+
* Safari 4.0+

## List of Effi libraries

* EffiDB package is an implementation of unified Effi interfaces for communication with relational database management systems. The purpose of EffiDB is to provide unified access to various RDBMSes and isolate application developer from any low-level interaction with database. EffiDB manages database connections, builds and executes SQL statements and parses query results. It also provides the mechanism for requests results caching and automatically manages the memory. Currently (as of June 2010) supported RDBMSes are MySQL, MSSQL, Oracle and SQLite.
* EffiValue package provides universal storage and serialization/restoration mechanism for any C++ data type. It allows to create and transmit heterogeneous compound structures of any complexity without dedicated C++ classes definition.
* acommon - collection of basic Effi utilities including smart pointers, localization facilities, exceptions handling etc.
* alink - library for modules (.so) dynamic loading. Allows to invoke functions and get class instances from modules.
* athread - thread management library. By default C++ executables are not thread-safe, that is their correct work during simultaneous execution by multiple threads is not guaranteed. athread provides thread synchronization facilities for thread creation, isolation, start, deletion and memory management.
* adecimal - decimal floating point implementation for C++ analogous to C# and Java implementations. Decimal computations are carried out to meet precision and rounding requirements established by financial applications.
* aparser - library provides API for reading and manipulating XML documents. Actually aparser library is a C++ wrapper for common XML parser library Libxml2 written in C. aparser supports main Libxml2 functionality without introducing any new functionality. Using C++ library as opposed to a C library increases the productivity of application code writing, namely it provides automatic memory management in common cases and simplifies notation for application developers. aparser library can parse an XML document: read it into memory, validate data, build a document tree. This makes it possible to carry search within the tree, modify XML data as objects of this tree structure and create result into file or an std::string. The library can also be used to create new XML documents from scratch.
* ardbms - library is an implementation of unified Effi interfaces for communication with relational database management systems. ardbms provides uniform access to the set of RDBMSes and supplies low-level interaction with database. ardbms manages database connections, builds and runs SQL queries and parses query results. It also provides requests results caching and automatically manages the memory. ardbms supports MySQL, MSSQL, Oracle and SQLite DBMSes through appropriate libraries:
** mssql_impl
** mysql_impl
** oracle_impl
** sqlite_impl
* aserializer - data serialization/restoration. Serialization in the Effi framework is a process of converting data (perhaps complicated data structure) into a sequence of bytes so that the sequence can be stored or transmitted across a network. The opposite operation is Restoration. Currently Effi has 3 serialized stream formats implemented: XML, binary and URL.
* data - universal storage for any C++ type including XML-like structures and arrays of heterogeneous data.
* datalist - library is devoted to representation of lists of data (notably long lists like 1 million items) in GUI. The library provides operations on the lists such as sorting, filtration, search and splitting list into short portions; it ensures live scrolling and pagination. Two implementations are available: DataList and DBList. DBList deals with data queried from database. DataList implies that there is local copy of data collected, and all the operations are being performed on this data copy; thus DataList gives an opportunity to work not only with data extracted from the database but also with data collected in any other way.
* protocol - application server devoted to manage interdependent applications at runtime. The library dispatches server requests execution so that optimize overall performance. On request submission protocol library determines the most effective executor for the request (the request can be executed in the same process or on the same computer or somewhere else) and passes the request there. Execution result (if any) is being returned to the original invoker.
* jss - interface for JavaScript Server that allows to call JavaScript from C++ code and vice versa.
* Persistent Storage Service (PSS) - utility allows to store data per session, per user or per window. As a result, it provides depositary for data that determines system state. The library has two implementations to store data in database and in file:
** PSSDB
** PSSFile
* Services - there exists a number of libraries that can be utilized as useful applications for distinct purposes.
** Bridge - communication tool that passes data between applications. There are 2 implementations for different protocols:
*** http
*** Webservices
** DLLoader (Dynamic Library Loader) - makes it possible to run several applications (load several libraries) within one process. It allows to configure libraries distribution among processes.
** TaskMan - manages application behavior on particular function calls (events). The nature of some such events does not allow developer to determine what action is to be performed when the event occurs. TaskMan allows to configure this conditional behavior, it is also possible to configure it via GUI. Both synchronous and asynchronous actions execution are available.
** Authorizer - provides authentication and authorization facilities. Authentication is being performed not only for user login, but also on application components inter-communication. Access rights are being verified on each method call.
** DynAttrMan (Dynamic Attribute Manager) - provides a mechanism to store custom objects attributes. Sometimes developer needs flexible approach to manage arbitrary attributes for objects application deals with. DynAttrMan makes it possible to handle such attributes without database scheme alteration.
** FileMapper - allows to edit large data objects stored in database by means of appropriate editors. Data are being extracted from the database to temporary file and can be handled as usual file by proper application. File saving synchronizes the database immediately.
** Multimedia - tool that operates images and multimedia data. The library coupled with dedicated JavaScript controls offers toolkit to completely handle multimedia and images. Library isolates application developer from multimedia data specific and allows to perform actions like format conversion, scaling, sizingm thumbnailing etc.
** SMS-gate - application that enables integration with SMS service providers.
* sws - web-service that transforms XML description of UI windows and elements into GUI representation.
* automated test framework - Selenium-based library includes automated test framework that can be adopted to create application tests set. Effi has built-in mechanism that automatically generates primitives for automated test library.

## Effi-based products

ASoft uses Effi framework for own development. A wide range of products have been created with Effi platform including: Geographic information system for cartography data storing, managing and representation; and report builder providing tools to compose and run database queries of any complexity and represent the result using pre-configured layout.
Products for the Ministry of Internal Affairs of Russia include: storage and search system for criminal cases materials, search federal system of genetic identification, and unified automated information system for duty units.