## Introduction |
|
In this article we'll describe the process of migration of the code-base to a new CppCMS version. How to do it in a painless way? What should you care of and so on. |
|
|
## Why migrate? |
|
Many reasons: |
|
- CppCMS 1.x.x release expects much longer life-time support, providing binary backward compatibility. |
- Localization in CppCMS has made significant steps forward, including decent support based on ICU library. |
- New version provides support of Comet applications and event driven programming support. |
- Simplifies development providing internal HTTP server. |
- Provides full Win32 support. |
- Provides great range of supported compilers: Gnu Compilers Collection, Microsoft Visual C++ 2008, Intel Compiler and Sun Studio 12. |
- It removes dependencies on low quality CgiCC library that makes CppCMS interfaces inconsistent and removes dependency on specific Boost version. |
|
## How to migrate? |
|
|
### Main program |
|
The main program changed completely. |
It is best to rewrite it according the first [Tutorial](/wikipp/en/page/cppcms_1x_tut_hello). |
|
### Templates |
|
Namespaces or now called skins. So change |
<% namespace view %> |
<% end namespace %> |
|
to something like |
<% skin my_skin %> |
<% end skin %> |
|
Classes are now called views. So change |
<% class master uses data::message %> |
<% end class %> |
to something like |
<% view master uses content::message %> |
<% end view %> |
|
To output content, the syntax now changed from |
<% foo %> |
to |
<%= foo %> |
|
|
### Includes |
|
The data (content) holder now needs to be changed to include |
#include <cppcms/view.h> |
instead of |
#include <cppcms/base_view.h> |
|
The applications now have as constructor |
my_app (cppcms::service &srv); |
instead of |
my_app (cppcms::worker_thread &worker); |
|
You need to include: |
#include <cppcms/applications_pool.h> |
#include <cppcms/service.h> |
#include <cppcms/http_response.h> |
instead of the cgicc headers: |
#include <cgicc/HTTPHeader.h> |
#include <cgicc/HTTPStatusHeader.h> |
|
### Configuration |
|
To access configuration you now use: |
settings().get(""). |
instead of: |
app.config.sval("") |
Unfortunately settings() is not const, so you need to unconst your methods or use an ugly const_cast like: |
cppcms::json::value config = |
const_cast<my_app*>(this)->settings(); |
|
The configuration file format also has completely changed. |
So you may want to start with a new configuration file. |
|
### Cgicc |
|
CppCMS 1.0.0 does not use CgiCC any more (CgiCC allows to start CppCMS easily but it wasn't really good library in long term). |
|
Now you use [cppcms::http::request](http://cppcms.com/cppcms_ref/latest/classcppcms_1_1http_1_1request.html) |
|
To access the query string you now can use: |
request().query_string() |
instead of: |
env->getQueryString() |
|
|
To decode URLs you can use |
#include <cppcms/util.h> |
cppcms::util::urldecode(url) |
instead of: |
cgicc::form_urldecode(url) |
|
To set an http content header you can use: |
response().set_content_header("text/xml"); |
instead of: |
cgicc::HTTPHeader* hdr = new cgicc::HTTPContentHeader("text/xml"); |
set_header(hdr); |
|
To add some other kind of header (e.g. for redirection) you can use (nginx): |
response().set_header("X-Accel-Redirect", file); |
instead of |
add_header("X-Accel-Redirect: " + file); |
|
|
### URL Remapping |
|
|
To bind urls to a method, you now include: |
#include <cppcms/url_dispatcher.h> |
#include <cppcms/url_mapper.h> |
and then you can use: |
dispatcher().assign("^/?(.*?)/?$",&hello::execute,this,1); |
mapper().assign("{1}"); |
instead of |
url.add("^/?(.*?)/?$", boost::bind(&hello::execute, this, _1)); |
|
To change the default skin for a specific context in cppcms 1.0 you can now use: |
context().skin("my_skin") |
instead of the previous application-global setting: |
use_template("view"); |
## Introduction
|
|
In this article we'll describe the process of migration of the code-base to a new CppCMS version. How to do it in a painless way? What should you care of and so on.
|
|
|
## Why migrate?
|
|
Many reasons:
|
|
- CppCMS 1.x.x release expects much longer life-time support, providing binary backward compatibility.
|
- Localization in CppCMS has made significant steps forward, including decent support based on ICU library.
|
- New version provides support of Comet applications and event driven programming support.
|
- Simplifies development providing internal HTTP server.
|
- Provides full Win32 support.
|
- Provides great range of supported compilers: Gnu Compilers Collection, Microsoft Visual C++ 2008, Intel Compiler and Sun Studio 12.
|
- It removes dependencies on low quality CgiCC library that makes CppCMS interfaces inconsistent and removes dependency on specific Boost version.
|
|
## How to migrate?
|
|
|
### Main program
|
|
The main program changed completely.
|
It is best to rewrite it according the first [Tutorial](/wikipp/en/page/cppcms_1x_tut_hello).
|
|
### Templates
|
|
Namespaces or now called skins. So change
|
<% namespace view %>
|
<% end namespace %>
|
|
to something like
|
<% skin my_skin %>
|
<% end skin %>
|
|
Classes are now called views. So change
|
<% class master uses data::message %>
|
<% end class %>
|
to something like
|
<% view master uses content::message %>
|
<% end view %>
|
|
To output content, the syntax now changed from
|
<% foo %>
|
to
|
<%= foo %>
|
|
|
### Includes
|
|
The data (content) holder now needs to be changed to include
|
#include <cppcms/view.h>
|
instead of
|
#include <cppcms/base_view.h>
|
|
The applications now have as constructor
|
my_app (cppcms::service &srv);
|
instead of
|
my_app (cppcms::worker_thread &worker);
|
|
You need to include:
|
#include <cppcms/applications_pool.h>
|
#include <cppcms/service.h>
|
#include <cppcms/http_response.h>
|
instead of the cgicc headers:
|
#include <cgicc/HTTPHeader.h>
|
#include <cgicc/HTTPStatusHeader.h>
|
|
### Configuration
|
|
To access configuration you now use:
|
settings().get("").
|
instead of:
|
app.config.sval("")
|
Unfortunately settings() is not const, so you need to unconst your methods or use an ugly const_cast like:
|
cppcms::json::value config =
|
const_cast<my_app*>(this)->settings();
|
|
The configuration file format also has completely changed.
|
So you may want to start with a new configuration file.
|
|
### Cgicc
|
|
CppCMS 1.0.0 does not use CgiCC any more (CgiCC allows to start CppCMS easily but it wasn't really good library in long term).
|
|
Now you use [cppcms::http::request](http://cppcms.com/cppcms_ref/latest/classcppcms_1_1http_1_1request.html)
|
|
To access the query string you now can use:
|
request().query_string()
|
instead of:
|
env->getQueryString()
|
|
|
To decode URLs you can use
|
#include <cppcms/util.h>
|
cppcms::util::urldecode(url)
|
instead of:
|
cgicc::form_urldecode(url)
|
|
To set an http content header you can use:
|
response().set_content_header("text/xml");
|
instead of:
|
cgicc::HTTPHeader* hdr = new cgicc::HTTPContentHeader("text/xml");
|
set_header(hdr);
|
|
To add some other kind of header (e.g. for redirection) you can use (nginx):
|
response().set_header("X-Accel-Redirect", file);
|
instead of
|
add_header("X-Accel-Redirect: " + file);
|
|
|
### URL Remapping
|
|
|
To bind urls to a method, you now include:
|
#include <cppcms/url_dispatcher.h>
|
#include <cppcms/url_mapper.h>
|
and then you can use:
|
dispatcher().assign("^/?(.*?)/?$",&hello::execute,this,1);
|
mapper().assign("{1}");
|
instead of
|
url.add("^/?(.*?)/?$", boost::bind(&hello::execute, this, _1));
|
|
To change the default skin for a specific context in cppcms 1.0 you can now use:
|
context().skin("my_skin")
|
instead of the previous application-global setting:
|
use_template("view");
|
|