Commit 6468f172 authored by Victor Yacovlev's avatar Victor Yacovlev

Removed unneccessary files

parent e076d374
Build manual for openSUSE 13.1
---------------------------------
1. Required additional packages to install before build:
- cmake
- gcc-c++
- libqt4-devel
- libqca2-devel
- libQtWebKit-devel
- boost-devel
- zlib-devel
- llvm-devel
- llvm-clang
- python3-devel
2. Build and install commands
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ../
sudo make install # installs to /usr/local, requires root password
Build manual for Ubuntu 14.04 LTS
---------------------------------
1. Required additional packages to install before build:
- cmake
- g++
- libqt4-dev
- libqca2-dev
- zlib1g-dev
- libboost-dev
- llvm-dev
- clang
- python3.2-dev (or higher)
2. Build and install commands
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ../
sudo make install # installs to /usr/local, requires root password
## Установка и удаление системы КуМир 2.1.0 на Ubuntu.
### Установка системы
Ниже описана подробная инструкция по установке КуМир 2.1.0 на Ubuntu версии 14.04 или больше.
1. Запустить Терминал с помощью комбинации клавиш:
<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>T</kbd>. Все последующие команды вводятся в терминале.
2. Добавить репозиторий системы в индекс пакетов АРТ:
```
sudo add-apt-repository "deb http://repos.lpm.org.ru/kumir2/ubuntu trusty universe"
```
3. Обновить локальный индекс пакетов:
```
sudo apt-get update
```
4. Установить нужную конфигурацию системы КуМир.
* Стандартная: ```sudo apt-get install kumir2-classic```
* Для старшекласников: ```sudo apt-get install kumir2-highgrade```
* Для учителей: ```sudo apt-get install kumir2-teacher```
* Профессиональная версия: ```sudo apt-get install kumir2-ide```
* ВСЕ версии ```sudo apt-get install kumir2```
Сама установка требует участия пользователя дважды:
1. При появлении такого сообщения:
```
После данной операции, объём занятого дискового пространства возрастёт на ... MB.
Хотите продолжить? [Д/н]
```
необходимо нажать <kbd>Enter</kbd> либо набрать <kbd>д</kbd>.
2. При появлении предупреждения цифровой подписи:
```
ВНИМАНИЕ: Следующие пакеты невозможно аутентифицировать!
...
Установить эти пакеты без проверки? [y/N]
```
необходимо набрать <kbd>y</kbd> (на английской раскладке).
### Удаление системы
Удаление системы проводится с помощью всего одной команды, введённой в терминале (см. *п.1 инструкции по установке*):
```
sudo apt-get autoremove <НАЗВАНИЕ_ПАКЕТА>
```
Вместо ```НАЗВАНИЕ_ПАКЕТА``` нужно поставить название пакета, установленного в *п.4 инструкции по установке*. Например:
```
sudo apt-get autoremove kumir2-ide
```
В процессе удаления появится сообщение, аналогичное сообщению *п.4.1. инструкции по установке*, только вместо слова
```возрастёт``` будет написано ```уменьшится```. Действия в этом случае также аналогичны *п.4.1*.
**Предупреждение:** На более старых версиях Ubuntu система может не работать.
if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
set(FPC_TARGET x86_64)
else()
set(FPC_TARGET i386)
endif()
string(TOLOWER ${CMAKE_SYSTEM_NAME} FPC_SYSTEM_NAME)
if(WIN32)
set(FPC_SYSTEM_NAME win32)
endif(WIN32)
if(EXISTS ${CMAKE_SOURCE_DIR}/fpc/lib/fpc/2.4.4)
find_program(FPC_COMPILER fpc
NAMES ppc386 ppcx64
PATHS ${CMAKE_SOURCE_DIR}/fpc/lib/fpc/2.4.4
)
set(FPC_COMMON_FLAGS
-T${FPC_SYSTEM_NAME}
-d${FPC_TARGET}
-Fu${CMAKE_SOURCE_DIR}/fpc/lib/fpc/2.4.4/units/${FPC_TARGET}-${FPC_SYSTEM_NAME}/rtl
)
else()
find_program(FPC_COMPILER fpc
NAMES fpc ppc386 ppcx64
PATHS /usr/bin /usr/local/bin
)
set(FPC_COMMON_FLAGS
-T${FPC_SYSTEM_NAME}
-d${FPC_TARGET}
)
endif()
if(EXISTS ${FPC_COMPILER})
message("-- FreePascal compiler: ${FPC_COMPILER}")
else()
message(FATAL_ERROR "FreePascal compiler (version >= 2.4.0) not found")
endif()
project(Browser)
cmake_minimum_required(VERSION 2.8.9)
if(NOT DEFINED USE_QT)
set(USE_QT 4)
endif(NOT DEFINED USE_QT)
if(${USE_QT} GREATER 4)
# Find Qt5
find_package(Qt5 5.5.0 COMPONENTS Core Widgets WebEngineWidgets REQUIRED)
include_directories(${Qt5Core_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5WebEngineWidgets_INCLUDE_DIRS} BEFORE)
set(QT_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5WebEngineWidgets_LIBRARIES})
else()
# Find Qt4
set(QT_USE_QTMAIN 1)
find_package(Qt4 4.7.0 COMPONENTS QtCore QtGui QtXml QtSvg QtNetwork QtWebkit REQUIRED)
include(${QT_USE_FILE})
endif()
include(../../kumir2_plugin.cmake)
set(SOURCES
component.cpp
plugin.cpp
webpage.cpp
dir.cpp
localhostserver.cpp
networkaccessmanager.cpp
)
set(MOC_HEADERS
component.h
plugin.h
webpage.h
dir.h
localhostserver.h
networkaccessmanager.h
)
if(${USE_QT} GREATER 4)
qt5_wrap_cpp(MOC_SOURCES ${MOC_HEADERS})
else()
qt4_wrap_cpp(MOC_SOURCES ${MOC_HEADERS})
endif()
copySpecFile(Browser)
add_library(Browser SHARED ${MOC_SOURCES} ${SOURCES})
handleTranslation(Browser)
target_link_libraries(Browser ${QT_LIBRARIES} ExtensionSystem)
install(TARGETS Browser DESTINATION ${PLUGINS_DIR})
#include "component.h"
#include "webpage.h"
#include "plugin.h"
namespace Browser {
static QString screenString(QString s)
{
s.replace("\\", "\\\\");
s.replace("\"", "\\\"");
s.replace("\n", "\\n");
return s;
}
void Component::evaluateCommand(const QString &method, const QVariantList &arguments)
{
QString js = method + "(";
for (int i=0; i<arguments.size(); i++) {
QVariant arg = arguments[i];
if (arg.type()==QVariant::Char || arg.type()==QVariant::String) {
js += "\""+screenString(arg.toString())+"\"";
}
else if (arg.type()==QVariant::Bool) {
js += arg.toBool() ? "true" : "false";
}
else {
js += arg.toString();
}
}
js += ")";
#if QT_VERSION >= 0x050400
page()->runJavaScript(js);
#else
page()->currentFrame()->evaluateJavaScript(js);
#endif
}
Component::Component(class Plugin * plugin) :
#if QT_VERSION >= 0x050400
QWebEngineView()
#else
QWebView()
#endif
{
WebPage * pg = new WebPage();
pg->setComponent(this);
setPage(pg);
#if QT_VERSION < 0x050400
page()->setNetworkAccessManager(plugin->networkAccessManager());
#else
// TODO implement me!
#endif
#if QT_VERSION >= 0x050400
connect(page(), SIGNAL(loadStarted()), this, SLOT(addJavaScriptObjects()));
#else
connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(addJavaScriptObjects()));
#endif
#if defined(QT_DEBUG) && (QT_VERSION < 0x050400)
page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
if (qApp->applicationVersion().contains("/")) { // Not tagged version
page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
}
#endif
#if QT_VERSION >= 0x050400
connect(page(), SIGNAL(titleChanged(QString)),
this, SLOT(handleWebPageTitleChanged(QString)), Qt::DirectConnection);
#else
connect(page()->mainFrame(), SIGNAL(titleChanged(QString)),
this, SLOT(handleWebPageTitleChanged(QString)), Qt::DirectConnection);
#endif
}
void Component::handleWebPageTitleChanged(const QString &title)
{
emit titleChangeRequest(title, this);
}
void Component::addJavaScriptObjects()
{
foreach (const QString & name, manageableObjects_.keys()) {
QObject * obj = manageableObjects_[name];
#if QT_VERSION >= 0x050400
// TODO implement me!
#else
page()->mainFrame()->addToJavaScriptWindowObject(name, obj);
#endif
}
}
void Component::setContent(const QString &data)
{
setHtml(data);
#if QT_VERSION >= 0x050400
// TODO implement me!
#else
pageAction(QWebPage::Back)->setEnabled(false);
#endif
}
void Component::go(const QUrl &url)
{
setUrl(url);
#if QT_VERSION >= 0x050400
// TODO implement me!
#else
pageAction(QWebPage::Back)->setEnabled(false);
#endif
}
void Component::showEvent(QShowEvent *e)
{
#if QT_VERSION >= 0x050400
// TODO implement me!
#else
if (page()->mainFrame()->metaData().contains("refresh", "onshow")) {
page()->mainFrame()->evaluateJavaScript("updateContents()");
}
#endif
QWidget::showEvent(e);
}
QString Component::title() const
{
#if QT_VERSION >= 0x050400
return page()->title();
#else
return page()->mainFrame()->title();
#endif
}
QUrl Component::currentLocation() const
{
return url();
}
void Component::setTitleChangeHandler(const QObject *receiver, const char *method)
{
connect(this, SIGNAL(titleChangeRequest(QString,const Shared::Browser::InstanceInterface*)),
receiver, method, Qt::DirectConnection);
}
Component::~Component()
{
}
} // namespace Browser
#ifndef BROWSER_COMPONENT_H
#define BROWSER_COMPONENT_H
#include <QtCore>
#if QT_VERSION >= 0x050000
#include <QtWidgets>
#if QT_VERSION >= 0x050400
#include <QtWebEngineWidgets>
#else
#include <QtWebKitWidgets>
#endif
#else
#include <QtGui>
#include <QtWebKit>
#endif
#include "interfaces/browserinterface.h"
#include "interfaces/browser_instanceinterface.h"
namespace Browser {
namespace Ui {
class Component;
}
class Component
: public
#if QT_VERSION >= 0x050400
QWebEngineView
#else
QWebView
#endif
, public Shared::Browser::InstanceInterface
{
Q_OBJECT
Q_INTERFACES(Shared::Browser::InstanceInterface)
public:
explicit Component(class Plugin * plugin);
~Component();
inline QWidget * widget() { return this; }
QString title() const;
QUrl currentLocation() const;
void setTitleChangeHandler(const QObject *receiver, const char *method);
inline QMap<QString,QObject*> & manageableObjects() {
return manageableObjects_;
}
public slots:
void go(const QUrl & url);
void setContent(const QString & data);
void evaluateCommand(const QString & method, const QVariantList & arguments);
protected:
void showEvent(QShowEvent *e);
private:
QMap<QString, QObject*> manageableObjects_;
private slots:
void addJavaScriptObjects();
void handleWebPageTitleChanged(const QString & title);
/*private*/ signals:
void titleChangeRequest(const QString & title, const Shared::Browser::InstanceInterface * instance);
};
} // namespace Browser
#endif // BROWSER_COMPONENT_H
#include "dir.h"
namespace Browser {
Dir::Dir(QObject *parent) :
QObject(parent)
{
m_dir = QDir::current();
}
QStringList Dir::files(const QString &filter)
{
QStringList result = m_dir.entryList(filter.split(";"), QDir::Files);
QStringList filtered;
for (int i=0; i<result.size(); i++) {
if (!result[i].startsWith(".")) {
filtered << result[i];
}
}
return result;
}
QStringList Dir::dirs()
{
QStringList result = m_dir.entryList(QStringList(), QDir::Dirs);
result.removeAll(".");
if (m_dir==QDir::current())
result.removeAll("..");
QStringList filtered;
for (int i=0; i<result.size(); i++) {
if (!result[i].startsWith(".")) {
filtered << result[i];
}
}
return filtered;
}
QString Dir::resolveUrl(const QString &entry)
{
const QString absolutePath = m_dir.absoluteFilePath(entry);
return QUrl::fromLocalFile(absolutePath).toString();
}
void Dir::open(const QString &path)
{
m_dir.cd(path);
}
} // namespace Browser
#ifndef BROWSER_DIR_H
#define BROWSER_DIR_H
#include <QtCore>
namespace Browser {
class Dir : public QObject
{
Q_OBJECT
friend class Plugin;
public:
explicit Dir(QObject *parent = 0);
signals:
public slots:
QStringList files(const QString & filter);
QStringList dirs();
void open(const QString & path);
QString resolveUrl(const QString & entry);
private:
QDir m_dir;
};
} // namespace Browser
#endif // BROWSER_DIR_H
#include "localhostserver.h"
namespace Browser {
class NetworkReply
: public QNetworkReply
{
public :
explicit NetworkReply(const ServerResponse & response, const QNetworkRequest & request, QObject * parent = 0);
qint64 bytesAvailable() const;
inline bool isSequential() const { return true; }
inline void abort() { }
protected:
qint64 readData(char *data, qint64 maxlen);
qint64 position;
private:
QByteArray data;
QString contentType;
};
qint64 NetworkReply::readData(char *buffer, qint64 maxlen)
{
qint64 cnt = qMin<qint64>(maxlen, data.size()-position);
for (int i=0; i<cnt; i++) {
const char ch = data.at(position+i);
buffer[i] = ch;
}
position += cnt;
return cnt;
}
qint64 NetworkReply::bytesAvailable() const
{
return data.size();
}
NetworkReply::NetworkReply(const ServerResponse &response, const QNetworkRequest &, QObject *parent)
: QNetworkReply(parent)
{
QNetworkReply::open(QIODevice::ReadOnly);
position = 0;
contentType = response.mimeType;
if (response.code==200) {
data = response.data;
}
else {
QString error = QString("<html><head><title>Error %1</title></head><body><h1>Error %1</h1><p>%2</p></body></html>")
.arg(response.code)
.arg(response.errorText);
data = error.toUtf8();
}
QUrl qualifedUrl;
qualifedUrl.setScheme("http");
qualifedUrl.setHost("localhost");
qualifedUrl.setPath(response.uri);
setUrl(qualifedUrl);
setHeader(QNetworkRequest::LastModifiedHeader, QDateTime::currentDateTime());
setHeader(QNetworkRequest::ContentLengthHeader, data.size());
setHeader(QNetworkRequest::ContentTypeHeader, response.mimeType);
setHeader(QNetworkRequest::LocationHeader, qualifedUrl);
setRawHeader(QByteArray("Accept-Ranges"), QByteArray("bytes"));
setRawHeader(QByteArray("Server"), QByteArray("Kumir Localhost Server ")+qApp->applicationVersion().toLatin1());
setOperation(QNetworkAccessManager::GetOperation);
QMetaObject::invokeMethod(this, "metaDataChanged", Qt::QueuedConnection);
QMetaObject::invokeMethod(this, "downloadProgress", Qt::QueuedConnection,
Q_ARG(qint64, data.size()), Q_ARG(qint64, data.size()));
QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection);
QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
}
LocalhostServer::LocalhostServer(const QDir & webAppsRoot, QObject *parent)
: QObject(parent)
, m_webAppsRoot(webAppsRoot)
{
}
ServerResponse LocalhostServer::GET(const QUrl &url) {
const QString path = "/"+url.path();
ServerResponse resp;
QString fileName = m_webAppsRoot.absolutePath()+"/"+path;
while (fileName.contains("//")) {
fileName.replace("//","/");
}
if (fileName.endsWith("/")) {
fileName += "index.html";
}
if (QFile::exists(fileName)) {
QFile f(fileName);
if (f.open(QIODevice::ReadOnly)) {
resp.data = f.readAll();
resp.code = 200;
f.close();
}
else {
resp.code = 503;
resp.errorText = "File access denied: "+fileName;
}
}
else {
resp.code = 404;
resp.errorText = "File not found: "+fileName;
}
if (fileName.endsWith(".js")) {
resp.mimeType = "text/javascript";
}