提交 5e556b6613c7140ae85c39b92a017b618c6777c7

作者 qingxiongf
2 个父辈 b1db07ea 90ed5e67
1   -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -o -lfcgi++ -lfcgi")
2   -
3   -INCLUDE_DIRECTORIES(
4   - ${CMAKE_SOURCE_DIR}/src/server/spserver
5   -)
6   -
7   -
8   -ADD_SUBDIRECTORY(spserver)
9   -ADD_SUBDIRECTORY(services)
10   -
11   -
12   -
13   -########################################################
14   -# Files
15   -SET (DMAP_SERVER_SRCS
16   - dmpfilterresponsedecorator.cpp
17   - dmpmainserver.cpp
18   - dmprequesthandler.cpp
19   - dmpserver.cpp
20   - dmpserverapi.cpp
21   - dmpserverconfig.cpp
22   - dmpservercontext.cpp
23   - dmpserverapicontext.cpp
24   - dmpserverapihandler.cpp
25   - dmpserverfilter.cpp
26   - dmpserverinterface.cpp
27   - dmpserverinterfaceimpl.cpp
28   - dmpservermanager.cpp
29   - dmpservermanagerapi.cpp
30   - dmpserverresponse.cpp
31   - dmpserverrequest.cpp
32   - dmpserverparameters.cpp
33   - dmpserverplugins.cpp
34   - dmpserverutils.cpp
35   - dmpserverloader.cpp
36   - dmpserverproject.cpp
37   - dmpserverregistry.cpp
38   - python/dmppythonutils.cpp
39   - python/dmpserverwrapper.cpp
40   - dmphttpbase.cpp
41   - dmphttputils.cpp
42   -)
43   -
44   -SET (DMAP_SERVER_HDRS
45   - dmpfilterresponsedecorator.h
46   - dmpmainserver.h
47   - dmprequesthandler.h
48   - dmpserver.h
49   - dmpserverapi.h
50   - dmpserverapihandler.h
51   - dmpserverapicontext.h
52   - dmpservercontext.h
53   - dmpserverconfig.h
54   - dmpserverentity.h
55   - dmpserverfilter.h
56   - dmpserverinterface.h
57   - dmpserverinterfaceimpl.h
58   - dmpservermanager.h
59   - dmpservermanagerapi.h
60   - dmpserverrequest.h
61   - dmpserverresponse.h
62   - dmpserverparameters.h
63   - dmpserverplugins.h
64   - dmpserverutils.h
65   - dmpservice.h
66   - dmpservermodule.h
67   - dmpserverloader.h
68   - dmpserverproject.h
69   - dmpserverregistry.h
70   - python/dmppythonutils.h
71   - dmphttpbase.h
72   - dmphttputils.h
73   -)
74   -
75   -#############################################################
76   -# dmap_server library
77   -
78   -
79   -
80   -INCLUDE_DIRECTORIES(
81   - ${CMAKE_SOURCE_DIR}/src/core
82   - ${CMAKE_SOURCE_DIR}/src/core/geometry
83   - ${CMAKE_SOURCE_DIR}/src/core/symbology
84   -)
85   -
86   -INCLUDE_DIRECTORIES(SYSTEM
87   - ${PYTHON_INCLUDE_PATH}
88   -)
89   -ADD_LIBRARY(dmap_server SHARED ${DMAP_SERVER_SRCS} ${DMAP_SERVER_HDRS})
90   -
91   -target_link_libraries(dmap_server
92   - dmap_core
93   - ${Boost_LIBRARIES}
94   - Boost::regex
95   - ${PYTHON_LIBRARIES}
96   - dl)
97   -
98   -IF (WITH_BINDINGS)
99   - TARGET_LINK_LIBRARIES(dmap_server
100   - Boost::${DMAP_BOOST_PYTHON_FOUND}
101   - )
102   -ENDIF(WITH_BINDINGS)
103   -
104   -set_target_properties(dmap_server
105   - PROPERTIES
106   - POSITION_INDEPENDENT_CODE 1
107   - CXX_VISIBILITY_PRESET hidden
108   - VISIBILITY_INLINES_HIDDEN 1
109   - #VERSION ${COMPLETE_VERSION}
110   - #SOVERSION ${COMPLETE_VERSION}
111   - )
112   -
113   -generate_export_header(
114   - dmap_server
115   - BASE_NAME SERVER
116   - EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}/dmap_server.h"
117   -)
118   -
119   -
120   -target_include_directories(dmap_server
121   - PUBLIC
122   - ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}
123   - )
124   - MESSAGE(STATUS "dmap_server path: ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}")
125   -
126   -
127   -add_executable(dmap_spserv
128   - dmap_spserv.cpp
129   - dmpspserverrequest.h
130   - dmpspserverresponse.h
131   - dmpspserverrequest.cpp
132   - dmpspserverresponse.cpp
133   -)
134   -
135   -add_executable(dmap_serv
136   - dmap_serv.cpp
137   - dmpapacheserverrequest.h
138   - dmpapacheserverresponse.h
139   - dmpapacheserverrequest.cpp
140   - dmpapacheserverresponse.cpp
141   -)
142   -
143   -target_link_libraries(dmap_spserv
144   - spserver
145   - dmap_server
146   - )
147   -
148   -target_link_libraries(dmap_serv
149   - dmap_server
150   -)
151   -
152   -INCLUDE_DIRECTORIES(
153   - ${CMAKE_SOURCE_DIR}/pgsql/include
154   -)
155   -LINK_DIRECTORIES(dmap_server ${CMAKE_SOURCE_DIR}/pgsql/lib)
156   -TARGET_LINK_LIBRARIES(dmap_server ${CMAKE_SOURCE_DIR}/pgsql/lib/libpq.so)
157   -
158   -find_package(Fcgi REQUIRED)
159   -if (NOT FCGI_FOUND)
160   - message (SEND_ERROR "Fast CGI dependency was not found!")
161   -endif()
162   -
163   -target_include_directories(dmap_serv SYSTEM PRIVATE
164   - ${FCGI_INCLUDE_DIR}
165   -)
166   -target_link_libraries(dmap_serv
167   - ${FCGI_LIBRARY}
168   -)
169   -########################################################
170   -# Install
171   -INSTALL(FILES
172   - dmpserver.ini
173   - DESTINATION ${DMAP_LIBEXEC_SUBDIR}
174   -)
175   -
176   -INSTALL(TARGETS dmap_server
177   - RUNTIME DESTINATION ${DMAP_BIN_DIR}
178   - LIBRARY DESTINATION ${DMAP_LIB_DIR}
179   - ARCHIVE DESTINATION ${DMAP_LIB_DIR}
180   - PUBLIC_HEADER DESTINATION ${DMAP_INCLUDE_DIR}
181   -)
182   -
183   -INSTALL(TARGETS dmap_serv
184   - DESTINATION ${DMAP_BIN_DIR}
185   -)
186   -
187   -INSTALL(TARGETS dmap_spserv
188   - DESTINATION ${DMAP_BIN_DIR}
  1 +
  2 +INCLUDE_DIRECTORIES(
  3 + ${CMAKE_SOURCE_DIR}/src/server/spserver
  4 +)
  5 +
  6 +ADD_SUBDIRECTORY(spserver)
  7 +ADD_SUBDIRECTORY(services)
  8 +
  9 +########################################################
  10 +# Files
  11 +SET (DMAP_SERVER_SRCS
  12 + dmpfilterresponsedecorator.cpp
  13 + dmpmainserver.cpp
  14 + dmprequesthandler.cpp
  15 + dmpserver.cpp
  16 + dmpservice.cpp
  17 + dmpservercontext.cpp
  18 + dmpserverapihandler.cpp
  19 + dmpserverfilter.cpp
  20 + dmpserverinterface.cpp
  21 + dmpserverinterfaceimpl.cpp
  22 + dmpservermanager.cpp
  23 + dmpservermanagerapi.cpp
  24 + dmpserverresponse.cpp
  25 + dmpserverrequest.cpp
  26 + dmpserverparameters.cpp
  27 + dmpserverplugins.cpp
  28 + dmpserverutils.cpp
  29 + dmpservernativeloader.cpp
  30 + python/dmppythonutils.cpp
  31 + python/dmpserverwrapper.cpp
  32 +)
  33 +
  34 +SET (DMAP_SERVER_HDRS
  35 + dmpfilterresponsedecorator.h
  36 + dmpmainserver.h
  37 + dmprequesthandler.h
  38 + dmpserver.h
  39 + dmpserverapihandler.h
  40 + dmpservercontext.h
  41 + dmpserverfilter.h
  42 + dmpserverinterface.h
  43 + dmpserverinterfaceimpl.h
  44 + dmpservermanager.h
  45 + dmpservermanagerapi.h
  46 + dmpserverrequest.h
  47 + dmpserverresponse.h
  48 + dmpserverparameters.h
  49 + dmpserverplugins.h
  50 + dmpserverutils.h
  51 + dmpservice.h
  52 + dmpservermodule.h
  53 + dmpservernativeloader.h
  54 + python/dmppythonutils.h
  55 +)
  56 +
  57 +#############################################################
  58 +# dmap_server library
  59 +
  60 +INCLUDE_DIRECTORIES(
  61 + ${CMAKE_SOURCE_DIR}/src/core
  62 +)
  63 +
  64 +INCLUDE_DIRECTORIES(SYSTEM
  65 + ${PYTHON_INCLUDE_PATH}
  66 +)
  67 +ADD_LIBRARY(dmap_server SHARED ${DMAP_SERVER_SRCS} ${DMAP_SERVER_HDRS})
  68 +
  69 +target_link_libraries(dmap_server
  70 + dmap_core
  71 + ${Boost_LIBRARIES}
  72 + Boost::regex
  73 + ${PYTHON_LIBRARIES}
  74 + dl)
  75 +
  76 +IF (WITH_BINDINGS)
  77 + TARGET_LINK_LIBRARIES(dmap_server
  78 + Boost::${DMAP_BOOST_PYTHON_FOUND}
  79 + )
  80 +ENDIF(WITH_BINDINGS)
  81 +
  82 +set_target_properties(dmap_server
  83 + PROPERTIES
  84 + POSITION_INDEPENDENT_CODE 1
  85 + CXX_VISIBILITY_PRESET hidden
  86 + VISIBILITY_INLINES_HIDDEN 1
  87 + #VERSION ${COMPLETE_VERSION}
  88 + #SOVERSION ${COMPLETE_VERSION}
  89 + )
  90 +
  91 +generate_export_header(
  92 + dmap_server
  93 + BASE_NAME SERVER
  94 + EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}/dmap_server.h"
  95 +)
  96 +
  97 +
  98 +target_include_directories(dmap_server
  99 + PUBLIC
  100 + ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}
  101 + )
  102 + MESSAGE(STATUS "dmap_server path: ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}")
  103 +
  104 +add_executable(dmap_spserv
  105 + dmap_spserv.cpp
  106 + dmpspserverrequest.h
  107 + dmpspserverresponse.h
  108 + dmpspserverrequest.cpp
  109 + dmpspserverresponse.cpp
  110 +)
  111 +
  112 +target_link_libraries(dmap_spserv
  113 + spserver
  114 + dmap_server
  115 + )
  116 +
  117 +########################################################
  118 +# Install
  119 +
  120 +INSTALL(TARGETS dmap_server
  121 + RUNTIME DESTINATION ${DMAP_BIN_DIR}
  122 + LIBRARY DESTINATION ${DMAP_LIB_DIR}
  123 + ARCHIVE DESTINATION ${DMAP_LIB_DIR}
  124 + PUBLIC_HEADER DESTINATION ${DMAP_INCLUDE_DIR}
  125 +)
  126 +
  127 +INSTALL(TARGETS dmap_spserv
  128 + DESTINATION ${DMAP_BIN_DIR}
189 129 )
\ No newline at end of file
... ...
... ... @@ -54,25 +54,25 @@ if (temp_data.find(http_) == 0) {
54 54 int DmpHttp::DmpHttpBase::buildPostRequest(const std::string& server, const std::string& path,
55 55 std::ostream& out_request) {
56 56 // 分割path中的json数据
57   - std::string temp_path(path), temp_json;
58   - int json_pos_begin = temp_path.find(HTTP_JSON_BEGIN) + 1;
59   - int json_pos_end = temp_path.find(HTTP_JSON_END);
60   - if (json_pos_begin != std::string::npos) {
61   - // 计算json的长度
62   - int temp_json_lenth = std::string::npos;
63   - if (json_pos_end != temp_json_lenth) {
64   - temp_json_lenth = (json_pos_end - json_pos_begin);
65   - }
66   - temp_json = temp_path.substr(json_pos_begin, temp_json_lenth);
67   - temp_path = temp_path.substr(0, (json_pos_begin - 1));
68   - }
69   - out_request << "POST " << temp_path.c_str() << " HTTP/1.0\r\n";
70   - out_request << "Host: " << server.c_str() << "\r\n";
71   - out_request << "Content-Length: " << temp_json.length() << "\r\n";
72   - out_request << "Content-Type: application/x-www-form-urlencoded\r\n";
73   - out_request << "Accept: */*\r\n";
74   - out_request << "Connection: close\r\n\r\n";
75   - out_request << temp_json.c_str();
  57 + // std::string temp_path(path), temp_json;
  58 + // int json_pos_begin = temp_path.find(HTTP_JSON_BEGIN) + 1;
  59 + // int json_pos_end = temp_path.find(HTTP_JSON_END);
  60 + // if (json_pos_begin != std::string::npos) {
  61 + // // 计算json的长度
  62 + // int temp_json_lenth = std::string::npos;
  63 + // if (json_pos_end != temp_json_lenth) {
  64 + // temp_json_lenth = (json_pos_end - json_pos_begin);
  65 + // }
  66 + // temp_json = temp_path.substr(json_pos_begin, temp_json_lenth);
  67 + // temp_path = temp_path.substr(0, (json_pos_begin - 1));
  68 + // }
  69 + // out_request << "POST " << temp_path.c_str() << " HTTP/1.0\r\n";
  70 + // out_request << "Host: " << server.c_str() << "\r\n";
  71 + // out_request << "Content-Length: " << temp_json.length() << "\r\n";
  72 + // out_request << "Content-Type: application/x-www-form-urlencoded\r\n";
  73 + // out_request << "Accept: */*\r\n";
  74 + // out_request << "Connection: close\r\n\r\n";
  75 + // out_request << temp_json.c_str();
76 76 return HTTP_SUCCESS;
77 77 }
78 78
... ...
... ... @@ -15,15 +15,15 @@ DmpHttp::DmpHttpUtils::~DmpHttpUtils() {}
15 15
16 16 int DmpHttp::DmpHttpUtils::post(const std::string& url)
17 17 {
18   - handle_request_resolve(url, DmpHttpBase::buildPostRequest);
  18 + handleRequestResolve(url, DmpHttpBase::buildPostRequest);
19 19 return HTTP_SUCCESS;
20 20 }
21 21 int DmpHttp::DmpHttpUtils::get(const std::string& url)
22 22 {
23   - handle_request_resolve(url, DmpHttpBase::buildGetRequest);
  23 + handleRequestResolve(url, DmpHttpBase::buildGetRequest);
24 24 return HTTP_SUCCESS;
25 25 }
26   -void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuildRequest func) {
  26 +void DmpHttp::DmpHttpUtils::handleRequestResolve(const std::string& url, pBuildRequest func) {
27 27 try {
28 28 responseData_.clear();
29 29 // 解析URL
... ... @@ -37,7 +37,7 @@ void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuil
37 37 // 解析服务地址\端口
38 38 boost::asio::ip::tcp::resolver::query query(server, port);
39 39 resolver_.async_resolve(query,
40   - boost::bind(&DmpHttpUtils::handle_resolve, this,
  40 + boost::bind(&DmpHttpUtils::handleResolve, this,
41 41 boost::asio::placeholders::error,
42 42 boost::asio::placeholders::iterator));
43 43 }
... ... @@ -47,7 +47,7 @@ void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuil
47 47 }
48 48 return;
49 49 }
50   -void DmpHttp::DmpHttpUtils::handle_resolve(const boost::system::error_code& err,
  50 +void DmpHttp::DmpHttpUtils::handleResolve(const boost::system::error_code& err,
51 51 boost::asio::ip::tcp::resolver::iterator endpoint_iterator) {
52 52 if (err) {
53 53 std::cout << "Error: " << err << "\n";
... ... @@ -55,30 +55,30 @@ void DmpHttp::DmpHttpUtils::handle_resolve(const boost::system::error_code& err,
55 55 }
56 56 // 尝试连接
57 57 boost::asio::async_connect(socket_, endpoint_iterator,
58   - boost::bind(&DmpHttpUtils::handle_connect, this,
  58 + boost::bind(&DmpHttpUtils::handleConnect, this,
59 59 boost::asio::placeholders::error));
60 60 }
61   -void DmpHttp::DmpHttpUtils::handle_connect(const boost::system::error_code& err) {
  61 +void DmpHttp::DmpHttpUtils::handleConnect(const boost::system::error_code& err) {
62 62 if (err) {
63 63 std::cout << "Error: " << err << "\n";
64 64 return;
65 65 }
66 66 // 发送request请求
67 67 boost::asio::async_write(socket_, request_,
68   - boost::bind(&DmpHttpUtils::handle_write_request, this,
  68 + boost::bind(&DmpHttpUtils::handleWriteRequest, this,
69 69 boost::asio::placeholders::error));
70 70 }
71   -void DmpHttp::DmpHttpUtils::handle_write_request(const boost::system::error_code& err) {
  71 +void DmpHttp::DmpHttpUtils::handleWriteRequest(const boost::system::error_code& err) {
72 72 if (err) {
73 73 std::cout << "Error: " << err << "\n";
74 74 return;
75 75 }
76 76 // 异步持续读数据到response_,直到接收协议符号 \r\n 为止
77 77 boost::asio::async_read_until(socket_, response_, "\r\n",
78   - boost::bind(&DmpHttpUtils::handle_read_status_line, this,
  78 + boost::bind(&DmpHttpUtils::handleReadStatusLine, this,
79 79 boost::asio::placeholders::error));
80 80 }
81   -void DmpHttp::DmpHttpUtils::handle_read_status_line(const boost::system::error_code& err) {
  81 +void DmpHttp::DmpHttpUtils::handleReadStatusLine(const boost::system::error_code& err) {
82 82 if (err) {
83 83 std::cout << "Error: " << err << "\n";
84 84 return;
... ... @@ -102,11 +102,11 @@ void DmpHttp::DmpHttpUtils::handle_read_status_line(const boost::system::error_c
102 102 }
103 103 // 读取响应头,直到接收协议符号 \r\n\r\n 为止
104 104 boost::asio::async_read_until(socket_, response_, "\r\n\r\n",
105   - boost::bind(&DmpHttpUtils::handle_read_headers, this,
  105 + boost::bind(&DmpHttpUtils::handleReadHeaders, this,
106 106 boost::asio::placeholders::error));
107 107 }
108 108
109   -void DmpHttp::DmpHttpUtils::handle_read_headers(const boost::system::error_code& err) {
  109 +void DmpHttp::DmpHttpUtils::handleReadHeaders(const boost::system::error_code& err) {
110 110 if (err) {
111 111 std::cout << "Error: " << err << "\n";
112 112 return;
... ... @@ -135,10 +135,10 @@ void DmpHttp::DmpHttpUtils::handle_read_headers(const boost::system::error_code&
135 135 // 开始读取剩余所有内容
136 136 boost::asio::async_read(socket_, response_,
137 137 boost::asio::transfer_at_least(1),
138   - boost::bind(&DmpHttpUtils::handle_read_content, this,
  138 + boost::bind(&DmpHttpUtils::handleReadContent, this,
139 139 boost::asio::placeholders::error));
140 140 }
141   -void DmpHttp::DmpHttpUtils::handle_read_content(const boost::system::error_code& err) {
  141 +void DmpHttp::DmpHttpUtils::handleReadContent(const boost::system::error_code& err) {
142 142 if (!err) {
143 143
144 144 // 输出读到的数据
... ... @@ -152,7 +152,7 @@ void DmpHttp::DmpHttpUtils::handle_read_content(const boost::system::error_code&
152 152 // 继续读取剩余内容,直到读到EOF
153 153 boost::asio::async_read(socket_, response_,
154 154 boost::asio::transfer_at_least(1),
155   - boost::bind(&DmpHttpUtils::handle_read_content, this,
  155 + boost::bind(&DmpHttpUtils::handleReadContent, this,
156 156 boost::asio::placeholders::error));
157 157
158 158 }
... ...
... ... @@ -25,20 +25,20 @@ namespace DmpHttp
25 25 virtual std::string getResponse(void) {return responseData_;}
26 26 private:
27 27 // 建立请求
28   - void handle_request_resolve(const std::string& url, pBuildRequest func);
  28 + void handleRequestResolve(const std::string& url, pBuildRequest func);
29 29 // 解析后
30   - void handle_resolve(const boost::system::error_code& err,
  30 + void handleResolve(const boost::system::error_code& err,
31 31 boost::asio::ip::tcp::resolver::iterator endpoint_iterator);
32 32 // 连接后
33   - void handle_connect(const boost::system::error_code& err);
  33 + void handleConnect(const boost::system::error_code& err);
34 34 // 发送请求后
35   - void handle_write_request(const boost::system::error_code& err);
  35 + void handleWriteRequest(const boost::system::error_code& err);
36 36 // 读取响应后
37   - void handle_read_status_line(const boost::system::error_code& err);
  37 + void handleReadStatusLine(const boost::system::error_code& err);
38 38 // 读取响应头后
39   - void handle_read_headers(const boost::system::error_code& err);
  39 + void handleReadHeaders(const boost::system::error_code& err);
40 40 // 读取正文数据后
41   - void handle_read_content(const boost::system::error_code& err);
  41 + void handleReadContent(const boost::system::error_code& err);
42 42 private:
43 43 // 解析器
44 44 boost::asio::ip::tcp::resolver resolver_;
... ...
1   -/**************************************************************************
2   -* file: dmpservermanager.cpp
3   -
4   -* Author: wanzhongping
5   -* Date: 2021-07-27 21:59:46
6   -* Email: zhongpingw@chinadci.com
7   -* copyright: 广州城市信息研究所有限公司
8   -***************************************************************************/
9   -#include "dmpservermanager.h"
10   -#include "dmpserver.h"
11   -#include "dmphttputils.h"
12   -#include "dmpserverConfig.h"
13   -#include <memory>
14   -#include <boost/property_tree/ptree.hpp>
15   -#include <boost/property_tree/json_parser.hpp>
16   -#include <boost/property_tree/xml_parser.hpp>
17   -#include <sstream>
18   -#include <fstream>
19   -#include <iostream>
20   -#include "dmplogger.h"
21   -
22   -
23   -DmpServerManager::DmpServerManager()
24   -{
25   - serverRegistry_ = new DmpServerRegistry();
26   -}
27   -
28   -DmpServerManager::~DmpServerManager()
29   -{
30   - if (serverRegistry_)
31   - {
32   - delete serverRegistry_;
33   - serverRegistry_ = NULL;
34   - }
35   -
36   - ProjectMap::iterator iter = projects_.begin();
37   - for (; iter != projects_.end(); ++iter)
38   - {
39   - DmpProject *mapProject = iter->second;
40   - if (mapProject)
41   - {
42   - delete mapProject;
43   - mapProject = nullptr;
44   - }
45   - }
46   - projects_.clear();
47   -}
48   -
49   -void DmpServerManager::init(const boost::filesystem::path &modulePath)
50   -{
51   - serverRegistry_->init(modulePath);
52   -
53   - if(!LoadServices())
54   - {
55   - std::cout << "加载服务失败!" << std::endl;
56   - LOGGER_ERROR("加载服务失败!");
57   - }
58   -}
59   -
60   -std::string DmpServerManager::getCapabilities()
61   -{
62   - return serverRegistry_->getCapabilities();
63   -}
64   -
65   -std::shared_ptr<DmpServer> DmpServerManager::serverForRequest(const DmpServerRequest &request)
66   -{
67   - return serverRegistry_->getServerForRequest(request);
68   -}
69   -
70   -std::shared_ptr<DmpServerApi> DmpServerManager::apiForRequest(const DmpServerRequest &request)
71   -{
72   - return serverRegistry_->getApiForRequest(request);
73   -}
74   -
75   -DmpProject *DmpServerManager::getProject(const std::string &serviceName)
76   -{
77   - std::map<std::string, DmpProject *>::iterator iter = projects_.find(serviceName);
78   - if (iter != projects_.end())
79   - {
80   - return iter->second;
81   - }
82   - else
83   - {
84   - return nullptr;
85   - }
86   -}
87   -
88   -bool DmpServerManager::removeProject(const std::string &serviceName)
89   -{
90   - try
91   - {
92   - std::map<std::string, DmpProject *>::iterator iter = projects_.find(serviceName);
93   - if (iter != projects_.end())
94   - {
95   - delete iter->second;
96   - projects_.erase(iter);
97   - }
98   - }
99   - catch (const std::exception &e)
100   - {
101   - std::cerr << e.what() << '\n';
102   - return false;
103   - }
104   - return true;
105   -}
106   -
107   -bool DmpServerManager::publish(const std::string& serverName, const std::string& serviceName, const std::string& title, int capabilities, const std::string& projectData)
108   -{
109   - //project
110   - std::string projData;
111   - if (!DmpServerUtils::Base64Decode(projectData, &projData))
112   - {
113   - return false;
114   - }
115   - DmpProject *project = new DmpProject();
116   - if (!project->Read(projData))
117   - {
118   - delete project;
119   - return false;
120   - }
121   -
122   - if (!serverRegistry_->getServer(serverName)->publish(serviceName, title, capabilities, *project))
123   - {
124   - delete project;
125   - return false;
126   - }
127   - projects_[serviceName] = project;
128   - return true;
129   -}
130   -
131   -bool DmpServerManager::deleteService(const std::string &serverName, const std::string &serviceName)
132   -{
133   - if (serverRegistry_->getServer(serverName)->remove(serviceName) && removeProject(serviceName))
134   - {
135   - return true;
136   - }
137   - else
138   - {
139   - return false;
140   - }
141   -}
142   -
143   -bool DmpServerManager::startService(const std::string &serverName, const std::string &serviceName)
144   -{
145   - return serverRegistry_->getServer(serverName)->start(serviceName);
146   -}
147   -
148   -bool DmpServerManager::stopService(const std::string &serverName, const std::string &serviceName)
149   -{
150   - return serverRegistry_->getServer(serverName)->stop(serviceName);
151   -}
152   -bool DmpServerManager::LoadServices()
153   -{
154   - boost::property_tree::ptree pt,ptList;
155   - std::string conn = DmpServerConfig::Instance()->getMetaUrl();
156   - const std::string url= conn + URI_RELOAD;
157   - std::string strContent=DmpHttp::get(url);
158   - if(strContent.length()==0)
159   - {
160   - return false;
161   - }
162   -
163   - ////测试响应内容写入文本
164   - // std::ofstream examplefile ("/mnt/d/example.txt");
165   - // if (examplefile.is_open()) {
166   - // examplefile << DmpHttp::get(url_);
167   - // examplefile.close();
168   - // }
169   - //boost::property_tree::read_json("./example.txt", pt_);
170   -
171   - std::stringstream ssData;
172   - ssData<<strContent.c_str();
173   - boost::property_tree::read_json(ssData, pt);
174   - int iCount = std::atoi(pt.get<std::string>("data.count").c_str());
175   - if(iCount>0)
176   - {
177   - ptList=pt.get_child("data.list");
178   - for (auto& e : ptList)
179   - {
180   - std::string name = e.second.get<std::string>("name");
181   - std::string title = e.second.get<std::string>("title");
182   - std::string type = e.second.get<std::string>("type");
183   - int capabilities =e.second.get<int>("capabilities");
184   - std::string project = e.second.get<std::string>("project");
185   - this->publish(type,name,title,capabilities,project);
186   - }
187   - }
188   - return true;
  1 +/**************************************************************************
  2 +* file: dmpservermanager.cpp
  3 +
  4 +* Author: wanzhongping
  5 +* Date: 2021-07-27 21:59:46
  6 +* Email: zhongpingw@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +#include "dmpservermanager.h"
  10 +#include "dmpserver.h"
  11 +#include "dmphttputils.h"
  12 +#include "dmpserverConfig.h"
  13 +#include <memory>
  14 +#include <boost/property_tree/ptree.hpp>
  15 +#include <boost/property_tree/json_parser.hpp>
  16 +#include <boost/property_tree/xml_parser.hpp>
  17 +#include <sstream>
  18 +#include <fstream>
  19 +#include <math.h>
  20 +#include "dmptilelayer.h"
  21 +#include <iostream>
  22 +#include "dmplogger.h"
  23 +#include "dmptilelayer.h"
  24 +
  25 +DmpServerManager::DmpServerManager()
  26 +{
  27 + serverRegistry_ = new DmpServerRegistry();
  28 +}
  29 +
  30 +DmpServerManager::~DmpServerManager()
  31 +{
  32 + if (serverRegistry_)
  33 + {
  34 + delete serverRegistry_;
  35 + serverRegistry_ = NULL;
  36 + }
  37 +
  38 + ProjectMap::iterator iter = projects_.begin();
  39 + for (; iter != projects_.end(); ++iter)
  40 + {
  41 + DmpProject *mapProject = iter->second;
  42 + if (mapProject)
  43 + {
  44 + delete mapProject;
  45 + mapProject = nullptr;
  46 + }
  47 + }
  48 + projects_.clear();
  49 +}
  50 +
  51 +void DmpServerManager::init(const boost::filesystem::path &modulePath)
  52 +{
  53 + serverRegistry_->init(modulePath);
  54 + if(!loadServices())
  55 + {
  56 + std::cout << "加载服务失败!" << std::endl;
  57 + LOGGER_ERROR("加载服务失败!");
  58 + }
  59 + //LoadDmpServices();
  60 +}
  61 +
  62 +std::string DmpServerManager::getCapabilities()
  63 +{
  64 + return serverRegistry_->getCapabilities();
  65 +}
  66 +
  67 +std::shared_ptr<DmpServer> DmpServerManager::serverForRequest(const DmpServerRequest &request)
  68 +{
  69 + return serverRegistry_->getServerForRequest(request);
  70 +}
  71 +
  72 +std::shared_ptr<DmpServerApi> DmpServerManager::apiForRequest(const DmpServerRequest &request)
  73 +{
  74 + return serverRegistry_->getApiForRequest(request);
  75 +}
  76 +
  77 +DmpProject *DmpServerManager::getProject(const std::string &serviceName)
  78 +{
  79 + std::map<std::string, DmpProject *>::iterator iter = projects_.find(serviceName);
  80 + if (iter != projects_.end())
  81 + {
  82 + return iter->second;
  83 + }
  84 + else
  85 + {
  86 + return nullptr;
  87 + }
  88 +}
  89 +
  90 +bool DmpServerManager::removeProject(const std::string &serviceName)
  91 +{
  92 + try
  93 + {
  94 + std::map<std::string, DmpProject *>::iterator iter = projects_.find(serviceName);
  95 + if (iter != projects_.end())
  96 + {
  97 + delete iter->second;
  98 + projects_.erase(iter);
  99 + }
  100 + }
  101 + catch (const std::exception &e)
  102 + {
  103 + std::cerr << e.what() << '\n';
  104 + return false;
  105 + }
  106 + return true;
  107 +}
  108 +
  109 +bool DmpServerManager::publish(const std::string& serverName, const std::string& serviceName, const std::string& title, int capabilities, const std::string& projectData)
  110 +{
  111 + //project
  112 + std::string projData;
  113 + if (!DmpServerUtils::Base64Decode(projectData, &projData))
  114 + {
  115 + return false;
  116 + }
  117 + DmpProject *project = new DmpProject();
  118 + if (!project->Read(projData))
  119 + {
  120 + delete project;
  121 + return false;
  122 + }
  123 +
  124 + if (!serverRegistry_->getServer(serverName)->publish(serviceName, title, capabilities, *project))
  125 + {
  126 + delete project;
  127 + return false;
  128 + }
  129 + projects_[serviceName] = project;
  130 +
  131 + return true;
  132 +}
  133 +
  134 +bool DmpServerManager::deleteService(const std::string &serverName, const std::string &serviceName)
  135 +{
  136 + if (serverRegistry_->getServer(serverName)->remove(serviceName) && removeProject(serviceName))
  137 + {
  138 + return true;
  139 + }
  140 + else
  141 + {
  142 + return false;
  143 + }
  144 +}
  145 +
  146 +bool DmpServerManager::startService(const std::string &serverName, const std::string &serviceName)
  147 +{
  148 + return serverRegistry_->getServer(serverName)->start(serviceName);
  149 +}
  150 +
  151 +bool DmpServerManager::stopService(const std::string &serverName, const std::string &serviceName)
  152 +{
  153 + return serverRegistry_->getServer(serverName)->stop(serviceName);
  154 +}
  155 +bool DmpServerManager::loadServices()
  156 +{
  157 + boost::property_tree::ptree pt,ptList;
  158 + std::string conn = DmpServerConfig::Instance()->getMetaUrl();
  159 + const std::string url= conn + URI_RELOAD;
  160 + std::string strContent=DmpHttp::get(url);
  161 + if(strContent.length()==0)
  162 + {
  163 + return false;
  164 + }
  165 + std::stringstream ssData;
  166 + ssData<<strContent.c_str();
  167 + boost::property_tree::read_json(ssData, pt);
  168 + int iCount = std::atoi(pt.get<std::string>("data.count").c_str());
  169 + if(iCount>0)
  170 + {
  171 + ptList=pt.get_child("data.list");
  172 + for (auto& e : ptList)
  173 + {
  174 + std::string name = e.second.get<std::string>("name");
  175 + std::string title = e.second.get<std::string>("title");
  176 + std::string type = e.second.get<std::string>("type");
  177 + int capabilities =e.second.get<int>("capabilities");
  178 + std::string project = e.second.get<std::string>("project");
  179 + this->initServices(type,name,title,capabilities,project);
  180 + }
  181 + }
  182 + return true;
  183 +}
  184 +bool DmpServerManager::initServices(const std::string& serverName, const std::string& serviceName, const std::string& title, int capabilities, const std::string& projectData)
  185 +{
  186 + //project
  187 + std::string projData;
  188 + if (!DmpServerUtils::Base64Decode(projectData, &projData))
  189 + {
  190 + return false;
  191 + }
  192 + DmpProject *project = new DmpProject();
  193 + if (!project->Read(projData))
  194 + {
  195 + delete project;
  196 + return false;
  197 + }
  198 +
  199 + if (!serverRegistry_->getServer(serverName)->publish(serviceName, title, capabilities, *project))
  200 + {
  201 + delete project;
  202 + return false;
  203 + }
  204 + projects_[serviceName] = project;
  205 + return true;
189 206 }
\ No newline at end of file
... ...
... ... @@ -19,6 +19,7 @@
19 19 #include "dmpserverrequest.h"
20 20 #include "dmpserverregistry.h"
21 21
  22 +
22 23 #define URI_RELOAD ("/API/Service/TileService/Reload") //加载已注册服务接口
23 24 class SERVER_EXPORT DmpServerManager
24 25 {
... ... @@ -37,7 +38,12 @@ public:
37 38 DmpProject* getProject(const std::string& serviceName);
38 39 bool removeProject(const std::string& serviceName);
39 40 std::string getCapabilities();
40   - bool LoadServices();
  41 + bool loadServices();
  42 + //初始化加载服务
  43 + bool initServices(const std::string& serverName, const std::string& serviceName, const std::string& title, int capabilities, const std::string& projectData);
  44 + // bool ctreatTmsThumbnail() ;
  45 + // bool ctreatWmtsThumbnail() ;
  46 + // bool BufferCopy(cairo_surface_t *pClsCSFrom, cairo_surface_t *pClsCSTo,cairo_t *cr,int x,int y);
41 47
42 48 private:
43 49 typedef std::map<std::string, DmpProject*, ci_less> ProjectMap;
... ... @@ -54,4 +60,5 @@ struct ServicesData
54 60 std::string project;
55 61 };
56 62
  63 +
57 64 #endif // __dmpservermanager_h__
... ...
  1 +/**************************************************************************
  2 +* file: dmptilethumbnail.cpp
  3 +
  4 +* Author: lijiahuan
  5 +* Date: 2021-12-23 15:33:50
  6 +* Email: jiahuanl@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +#include "dmptilethumbnail.h"
  10 +#include <iostream>
  11 +#include <string>
  12 +#include <map>
  13 +#include <memory>
  14 +#include <math.h>
  15 +
  16 +
  17 +bool DmpTileThumbnail::ctreatWmtsThumbnail(DmpTileLayer *tileLayer)
  18 +{
  19 +
  20 + std::string path = tileLayer->getDataSource();
  21 + path="/mnt/d/Code/tiles/qgis";
  22 + std::string vendor=tileLayer->getVendor();
  23 + std::string format=tileLayer->getFormat();
  24 +
  25 + DmpRectangle rectangle=tileLayer->extent();
  26 + std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin());
  27 + std::string upperPoint=std::to_string(rectangle.xmax())+" "+std::to_string(rectangle.ymax());
  28 + Point minPoin{.x=107.78981494180618,.y=18.870480519260582};
  29 + Point maxPoin{.x=120.43553603935675,.y=25.999868757737033};
  30 +
  31 + int tileMatrix=6;
  32 + Point origin{.x=-400,.y=400};
  33 + double resolution=0.02197265625009295*256;
  34 + int minCol=floor(abs(origin.x-minPoin.x)/resolution);
  35 + int minRow=floor(abs(origin.y-minPoin.y)/resolution);
  36 + int maxCol=floor(abs(origin.x-maxPoin.x)/resolution);
  37 + int maxRow=floor(abs(origin.y-maxPoin.y)/resolution);
  38 + int width=maxCol-minCol;
  39 + int heigth=minRow-maxRow;
  40 + cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 256*(width+1), 256*(heigth+1));
  41 + cairo_t *cr =cairo_create (surface);
  42 +
  43 + for( int i = 0 ; i <= width ; i++ )
  44 + {
  45 + for(int j=0;j<=heigth;j++)
  46 + {
  47 + char* buff;
  48 + int length;
  49 + getTile(maxRow+j,minCol+i,tileMatrix,format,buff,length);
  50 + // std::string filepath=path+"/"+std::to_string(tileMatrix)+"/"+std::to_string(minCol+i)+"/"+std::to_string(maxRow+j)+".png";
  51 + // cairo_surface_t* image = cairo_image_surface_create_from_png( filepath.c_str());
  52 +
  53 + st_png_data* pPngData;
  54 + pPngData->pdata=(unsigned char*)buff;
  55 + pPngData->length=length;
  56 + cairo_surface_t* image1 = cairo_image_surface_create_from_png_stream(cairo_read_func_mine,&pPngData);
  57 +
  58 + BufferCopy(image1,surface,cr,0,0);
  59 + cairo_surface_write_to_png (surface, "./wmts1.png");
  60 + BufferCopy(image1,surface,cr,i*256,j*256);
  61 + }
  62 + }
  63 +
  64 + cairo_destroy (cr);
  65 + cairo_surface_write_to_png (surface, "./wmts.png");
  66 + cairo_surface_destroy (surface);
  67 + return true;
  68 +}
  69 +bool DmpTileThumbnail::ctreatTmsThumbnail()
  70 +{
  71 + std::string path="/mnt/d/Code/tiles/qgis";
  72 + std::string vendor="QGIS";
  73 + Point origin{.x=-400,.y=400};
  74 + Point minPoin{.x=107.78981494180618,.y=18.870480519260582};
  75 + Point maxPoin{.x=120.43553603935675,.y=25.999868757737033};
  76 + double resolution=0.02197265625009295*256;
  77 + // int minCol=floor(abs(origin.x-minPoin.x)/resolution);
  78 + // int minRow=floor(abs(origin.y-minPoin.y)/resolution);
  79 + // int maxCol=floor(abs(origin.x-maxPoin.x)/resolution);
  80 + // int maxRow=floor(abs(origin.y-maxPoin.y)/resolution);
  81 + int minCol=51;
  82 + int minRow=28;
  83 + int maxCol=53;
  84 + int maxRow=27;
  85 + int width=maxCol-minCol;
  86 + int heigth=minRow-maxRow;
  87 + cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 256*(width+1), 256*(heigth+1));
  88 + cairo_t *cr =cairo_create (surface);
  89 + for( int i = 0 ; i <= width ; i++ )
  90 + {
  91 + for(int j=0;j<=heigth;j++)
  92 + {
  93 + std::string filepath=path+"/6/"+std::to_string(minCol+i)+"/"+std::to_string(maxRow+j)+".png";
  94 + cairo_surface_t* image = cairo_image_surface_create_from_png( filepath.c_str());
  95 +
  96 + BufferCopy(image,surface,cr,i*256,j*256);
  97 + }
  98 + }
  99 + cairo_destroy (cr);
  100 + cairo_surface_write_to_png (surface, "./tms.png");
  101 + cairo_surface_destroy (surface);
  102 + return true;
  103 +}
  104 +bool DmpTileThumbnail::BufferCopy(cairo_surface_t *pClsCSFrom, cairo_surface_t *pClsCSTo, cairo_t *cr,int x,int y)
  105 +{
  106 + if (pClsCSFrom == NULL||pClsCSTo == NULL)
  107 + {
  108 + return false;
  109 + }
  110 + if(cr==NULL)
  111 + {
  112 + cr = cairo_create (pClsCSTo);
  113 + }
  114 + cairo_set_source_surface(cr, pClsCSFrom, x, y);
  115 + cairo_paint(cr);
  116 +
  117 + return true;
  118 +}
  119 +void DmpTileThumbnail::getTile(int row, int col, int level, std::string& format,char* refbuff,int length)
  120 +{
  121 + int packSize = 128;
  122 + int rGroup = (int)row/packSize;
  123 + rGroup = rGroup * packSize;
  124 + int cGroup = (int)col/packSize;
  125 + cGroup = cGroup*packSize;
  126 + std::string path="/mnt/d/Code/tiles/gdmap/_alllayers";
  127 + std::string bundleBase =GetBundlePath(level,rGroup,cGroup);
  128 + std::string bundleFilePath = path+bundleBase + ".bundle";
  129 + std::string bundlxFilePath = path+bundleBase + ".bundlx";
  130 +
  131 + int index = packSize * (col - cGroup) + (row - rGroup);
  132 +
  133 + //读取bundlx文件存储该切片的位置,计算偏移量
  134 + std::ifstream freadx(bundlxFilePath, std::ifstream::binary);
  135 + if(!freadx)
  136 + {
  137 +
  138 + return;
  139 + }
  140 + freadx.seekg(16+5*index, freadx.beg);
  141 + char* buffer = new char[5];
  142 + freadx.read(buffer,5);
  143 + freadx.close();
  144 +
  145 + long offset = (long)(buffer[0]&0xff)
  146 + + (long)(buffer[1]&0xff) * 256
  147 + + (long)(buffer[2]&0xff) * 65536
  148 + + (long)(buffer[3]&0xff) * 16777216
  149 + + (long)(buffer[4]&0xff) * 4294967296L;
  150 + delete [] buffer;
  151 + //读取bundle文件获取切片
  152 + std::ifstream fread(bundleFilePath, std::ifstream::binary);
  153 + if(!fread)
  154 + {
  155 +
  156 + return;
  157 + }
  158 + fread.seekg(offset, fread.beg);
  159 + char* buff = new char[4];
  160 + fread.read(buff, 4);
  161 + length = (long)(buff[0]&0xff)
  162 + + (long)(buff[1]&0xff) * 256
  163 + + (long)(buff[2]&0xff) * 65536
  164 + + (long)(buff[3]&0xff) * 16777216;
  165 + delete[] buff;
  166 + char* imgBuffer = new char[length];
  167 + fread.read(imgBuffer, length);
  168 + fread.close();
  169 + refbuff=imgBuffer;
  170 + delete[] imgBuffer;
  171 +}
  172 +std::string DmpTileThumbnail::GetBundlePath(int level, int rGroup, int cGroup)
  173 +{
  174 + std::string l = std::to_string(level);
  175 + int len = l.length();
  176 + if (len < 2)
  177 + {
  178 + for (int i = 0; i < 2 - len; i++)
  179 + {
  180 + l = "0" + l;
  181 + }
  182 + }
  183 + l = "L" + l;
  184 + std::string r =IntToHexStr(rGroup);
  185 +
  186 + int rLength = r.length();
  187 + if (rLength < 4)
  188 + {
  189 + for (int i = 0; i < 4 - rLength; i++)
  190 + {
  191 + r = "0" + r;
  192 + }
  193 + }
  194 + r = "R" + r;
  195 +
  196 + std::string c = IntToHexStr(cGroup);
  197 + int cLength = c.length();
  198 + if (cLength < 4)
  199 + {
  200 + for (int i = 0; i < 4 - cLength; i++)
  201 + {
  202 + c = "0" + c;
  203 + }
  204 + }
  205 + c = "C" + c;
  206 + std::string rootPath;
  207 + std::string bundlePath = rootPath + "/"+l+"/"+r+c;
  208 + return bundlePath;
  209 +}
  210 +std::string DmpTileThumbnail::IntToFormatStr(const int num)
  211 + {
  212 + std::string str = std::to_string(num);
  213 + if(num>=0 && num<10)
  214 + {
  215 + str = "0"+str;
  216 + }
  217 + return str;
  218 + }
  219 +
  220 +std::string DmpTileThumbnail::IntToHexStr(const int num)
  221 + {
  222 + char* buffer = new char[8];
  223 + sprintf(buffer,"%x",num);
  224 + std::string str = std::string(buffer);
  225 + delete[] buffer;
  226 + return str;
  227 + }
  228 +
  229 +
  230 +cairo_status_t DmpTileThumbnail::cairo_read_func_mine (void *closure, unsigned char *data, unsigned int length)
  231 +{
  232 + st_png_data* pPngData = (st_png_data*)closure;
  233 + memcpy(data, pPngData->pdata + pPngData->length, length);
  234 + pPngData->length += length;
  235 + return CAIRO_STATUS_SUCCESS;
  236 +}
... ...
  1 +/**************************************************************************
  2 +* file: dmptilethumbnail.h
  3 +
  4 +* Author: lijiahuan
  5 +* Date: 2021-12-23 15:34:29
  6 +* Email: jiahuanl@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +
  10 +#ifndef __dmptilethumbnail_h__
  11 +#define __dmptilethumbnail_h__
  12 +#include <cairo/cairo.h>
  13 +#include "dmptilelayer.h"
  14 +// namespace tileserver
  15 +// {
  16 + class DmpTileThumbnail
  17 + {
  18 + public:
  19 +
  20 + static bool ctreatTmsThumbnail() ;
  21 + static bool ctreatWmtsThumbnail(DmpTileLayer *tileLayer);
  22 + static bool BufferCopy(cairo_surface_t *pClsCSFrom, cairo_surface_t *pClsCSTo,cairo_t *cr,int x,int y);
  23 + static void getTile(int row, int col, int level, std::string& format,char* refbuff,int length);
  24 + static std::string GetBundlePath(int level, int rGroup, int cGroup);
  25 + static std::string IntToFormatStr(const int num);
  26 + static std::string IntToHexStr(const int num);
  27 + static cairo_status_t cairo_read_func_mine (void *closure, unsigned char *data, unsigned int length);
  28 + const int _packetSize = 128;
  29 +
  30 + };
  31 + struct Point
  32 + {
  33 + double x;
  34 + double y;
  35 + };
  36 +
  37 + struct st_png_data
  38 + {
  39 + unsigned char* pdata;
  40 + unsigned int length;
  41 + };
  42 +// }
  43 +
  44 +#endif // __dmptilethumbnail_h__
... ...
  1 +/**************************************************************************
  2 +* file: dmpmanagerapihandler.cpp
  3 +
  4 +* Author: wanzhongping
  5 +* Date: 2021-07-15 14:46:40
  6 +* Email: zhongpingw@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +#include <iostream>
  10 +#include <boost/json.hpp>
  11 +#include <boost/property_tree/ptree.hpp>
  12 +#include <boost/property_tree/json_parser.hpp>
  13 +#include <boost/property_tree/xml_parser.hpp>
  14 +#include <boost/foreach.hpp>
  15 +#include <boost/lexical_cast.hpp>
  16 +#include <boost/algorithm/string.hpp>
  17 +#include <boost/date_time.hpp>
  18 +
  19 +#include "dmpmanagerapihandler.h"
  20 +#include "dmpserverrequest.h"
  21 +#include "dmpserverresponse.h"
  22 +#include "dmpapiparameters.h"
  23 +#include "dmplogger.h"
  24 +#include "dmpapiutils.h"
  25 +#include "dmpservermanager.h"
  26 +#include "dmpserverutils.h"
  27 +
  28 +DmpManagerApiHandler::DmpManagerApiHandler()
  29 +{
  30 +
  31 +}
  32 +
  33 +void DmpManagerApiHandler::HandleRequest(const DmpServerApiContext &context) const
  34 +{
  35 + if (OperationId().compare("regservice") == 0) {
  36 + regService(context);
  37 + }
  38 + else if (OperationId().compare("startservice") == 0) {
  39 + startService(context);
  40 + }
  41 + else if (OperationId().compare("stopservice") == 0) {
  42 + stopService(context);
  43 + }
  44 + else if(OperationId().compare("regtileservice") == 0) {
  45 + RegTileService(context);
  46 + }
  47 + else if(OperationId().compare("getservicelist") == 0) {
  48 + GetServiceList(context);
  49 + }
  50 + else if(OperationId().compare("getservicedetail") == 0) {
  51 + GetServiceDetail(context);
  52 + }
  53 + else if(OperationId().compare("getcapabilities") == 0) {
  54 + getCapabilities(context);
  55 + }
  56 + else if(OperationId().compare("updateservice") == 0) {
  57 + UpdateService(context);
  58 + }
  59 + else if(OperationId().compare("deleteservice") == 0) {
  60 + deleteService(context);
  61 + }
  62 + else if(OperationId().compare("gettileserviceinfo") == 0) {
  63 + GetTileServiceInfo(context);
  64 + }
  65 + else if(OperationId().compare("addcatalog") == 0) {
  66 + AddCatalog(context);
  67 + }
  68 + else if(OperationId().compare("deletecatalog") == 0) {
  69 + DeleteCatalog(context);
  70 + }
  71 + else if(OperationId().compare("getservicesmatrixsets") == 0) {
  72 + GetServicesMatrixSets(context);
  73 + }
  74 + else if(OperationId().compare("deletecache") == 0) {
  75 + DeleteCache(context);
  76 + }
  77 + else if(OperationId().compare("updatecache") == 0) {
  78 + UpdateCache(context);
  79 + }
  80 + else if(OperationId().compare("reloadservices") == 0) {
  81 + reloadServices(context);
  82 + }
  83 + else {
  84 + context.response()->write("not find oparation: " + OperationId());
  85 + }
  86 +}
  87 +void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const
  88 +{
  89 + switch (context.request()->method())
  90 + {
  91 + case DmpServerRequest::Method::GET_METHOD:
  92 + {
  93 + context.response()->write("{\"status\":\"true\",\"message\":\"服务发布测试——————GET\"}");
  94 + break;
  95 + }
  96 + case DmpServerRequest::Method::POST_METHOD:
  97 + {
  98 + std::string name;
  99 + std::string title;
  100 + int capabilities;
  101 + std::string serverType;
  102 + std::string project;
  103 + const char* data = (char*)(context.request()->GetData());
  104 + if(data && *data != '\0')
  105 + {
  106 + try
  107 + {
  108 + std::stringstream stream(data);
  109 + boost::property_tree::ptree pt;
  110 + boost::property_tree::read_json(stream, pt);
  111 +
  112 + name = pt.get<std::string>("name");
  113 + title = pt.get<std::string>("title");
  114 + capabilities = pt.get<int>("capabilities");
  115 + serverType = pt.get<std::string>("type");
  116 + project = pt.get<std::string>("project");
  117 + }
  118 + catch (boost::property_tree::ptree_bad_path& e) {
  119 + LOGGER_ERROR(e.what());
  120 + context.response()->write("{\"status\":\"false\",\"message\":\"服务发布失败\"}");
  121 + return;
  122 + }
  123 + catch (boost::property_tree::ptree_bad_data& e) {
  124 + LOGGER_ERROR(e.what());
  125 + context.response()->write("{\"status\":\"false\",\"message\":\"服务发布失败\"}");
  126 + return;
  127 + }
  128 + if(context.manager()->publish(serverType, name, title, capabilities, project)) {
  129 + LOGGER_INFO("服务发布成功");
  130 + context.response()->write("{\"status\":\"true\",\"message\":\"Pulish service successful!\"}");
  131 + // std::string projData;
  132 + // DmpServerUtils::Base64Decode(project, &projData);
  133 + // context.response()->removeHeader("Content-Type");
  134 + // context.response()->setHeader("Content-Type", "text/xml;charset=utf-8");
  135 + // context.response()->write(projData);
  136 + }
  137 + else
  138 + {
  139 + LOGGER_ERROR("服务发布失败");
  140 + context.response()->write("{\"status\":\"false\",\"message\":\"Pulish service fail!\"}");
  141 + }
  142 + }
  143 + else
  144 + {
  145 + LOGGER_ERROR("POST数据为空");
  146 + context.response()->write("{\"status\":\"false\",\"message\":\"Pulish service fail!\"}");
  147 + return;
  148 + }
  149 + break;
  150 +
  151 + }
  152 + default:
  153 + {
  154 +
  155 + }
  156 + }
  157 +}
  158 +
  159 +void DmpManagerApiHandler::startService(const DmpServerApiContext &context) const
  160 +{
  161 + switch (context.request()->method())
  162 + {
  163 + case DmpServerRequest::Method::GET_METHOD:
  164 + {
  165 + DmpServerParameters params = context.request()->serverParameters();
  166 + std::string serverName;
  167 + params.getValue("servername", serverName);
  168 + std::string serviceName;
  169 + params.getValue("servicename",serviceName);
  170 + context.manager()->startService(serverName, serviceName);
  171 + break;
  172 + }
  173 + case DmpServerRequest::Method::POST_METHOD:
  174 + {
  175 + context.response()->write("{\"status\":\"true\",\"message\":\"服务删除——————POST\"}");
  176 + break;
  177 + }
  178 + default:
  179 + {
  180 +
  181 + }
  182 + }
  183 +}
  184 +void DmpManagerApiHandler::stopService(const DmpServerApiContext &context) const
  185 +{
  186 + switch (context.request()->method())
  187 + {
  188 + case DmpServerRequest::Method::GET_METHOD:
  189 + {
  190 + DmpServerParameters params = context.request()->serverParameters();
  191 + std::string serverName;
  192 + params.getValue("servername", serverName);
  193 + std::string serviceName;
  194 + params.getValue("servicename",serviceName);
  195 + context.manager()->stopService(serverName, serviceName);
  196 + break;
  197 + }
  198 + case DmpServerRequest::Method::POST_METHOD:
  199 + {
  200 + context.response()->write("{\"status\":\"true\",\"message\":\"服务删除——————POST\"}");
  201 + break;
  202 + }
  203 + default:
  204 + {
  205 +
  206 + }
  207 + }
  208 +}
  209 +void DmpManagerApiHandler::RegTileService(const DmpServerApiContext &context) const
  210 +{
  211 + switch (context.request()->method())
  212 + {
  213 + case DmpServerRequest::Method::GET_METHOD:
  214 + {
  215 + context.response()->write("{\"status\":\"true\",\"message\":\"切片服务发布测试——————GET\"}");
  216 + break;
  217 + }
  218 + case DmpServerRequest::Method::POST_METHOD:
  219 + {
  220 + context.response()->write("{\"status\":\"true\",\"message\":\"切片服务发布测试——————POST\"}");
  221 + break;
  222 + }
  223 + default:
  224 + {
  225 +
  226 + }
  227 + }
  228 +}
  229 +void DmpManagerApiHandler::GetServiceList(const DmpServerApiContext &context) const
  230 +{
  231 +}
  232 +
  233 +void DmpManagerApiHandler::GetServiceDetail(const DmpServerApiContext &context) const
  234 +{
  235 +}
  236 +
  237 +void DmpManagerApiHandler::UpdateService(const DmpServerApiContext &context) const
  238 +{
  239 + switch (context.request()->method())
  240 + {
  241 + case DmpServerRequest::Method::GET_METHOD:
  242 + {
  243 + context.response()->write("{\"status\":\"true\",\"message\":\"更新服务信息——————GET\"}");
  244 + break;
  245 + }
  246 + case DmpServerRequest::Method::POST_METHOD:
  247 + {
  248 + context.response()->write("{\"status\":\"true\",\"message\":\"更新服务信息——————POST\"}");
  249 + break;
  250 + }
  251 + default:
  252 + {
  253 +
  254 + }
  255 + }
  256 +}
  257 +
  258 +void DmpManagerApiHandler::deleteService(const DmpServerApiContext &context) const
  259 +{
  260 + switch (context.request()->method())
  261 + {
  262 + case DmpServerRequest::Method::GET_METHOD:
  263 + {
  264 + DmpServerParameters params = context.request()->serverParameters();
  265 + std::string serverName;
  266 + params.getValue("servername", serverName);
  267 + std::string serviceName;
  268 + params.getValue("servicename",serviceName);
  269 + if(context.manager()->deleteService(serverName, serviceName)) {
  270 + context.response()->write("{\"status\":\"true\",\"message\":\"删除服务成功\"}");
  271 + }else{
  272 + context.response()->write("{\"status\":\"false\",\"message\":\"删除服务失败\"}");
  273 + }
  274 + break;
  275 + }
  276 + case DmpServerRequest::Method::POST_METHOD:
  277 + {
  278 + context.response()->write("{\"status\":\"true\",\"message\":\"服务删除——————POST\"}");
  279 + break;
  280 + }
  281 + default:
  282 + {
  283 +
  284 + }
  285 + }
  286 +}
  287 +
  288 +//获取配置文件切片信息
  289 +void DmpManagerApiHandler::GetTileServiceInfo(const DmpServerApiContext &context) const
  290 +{
  291 + switch (context.request()->method())
  292 + {
  293 + case DmpServerRequest::Method::GET_METHOD:
  294 + {
  295 + context.response()->write("{\"status\":\"true\",\"message\":\"获取切片配置信息——————GET\"}");
  296 + break;
  297 + }
  298 + case DmpServerRequest::Method::POST_METHOD:
  299 + {
  300 + std::string path;
  301 + std::string strExtent;
  302 + const char* data = (char*)(context.request()->GetData());
  303 + if(data && *data != '\0')
  304 + {
  305 + try
  306 + {
  307 + std::stringstream stream(data);
  308 + boost::property_tree::ptree pt;
  309 + boost::property_tree::ptree pt_json;
  310 + std::string confcdipath;
  311 + std::string confxmlpath;
  312 +
  313 + boost::property_tree::read_json(stream, pt);
  314 + path= pt.get<std::string>("projectlayers.maplayer.datasource");
  315 + confcdipath=path+"/conf.cdi";
  316 + confxmlpath=path+"/conf.xml";
  317 + //读取切片配置文件conf.cdi
  318 + boost::property_tree::ptree pt_confcdi;
  319 + boost::property_tree::read_xml(confcdipath,pt_confcdi);
  320 + //boost::property_tree::ptree pt_base=pt.get_child("base");
  321 + std::string xmin=pt_confcdi.get<std::string>("EnvelopeN.XMin");
  322 + std::string ymin=pt_confcdi.get<std::string>("EnvelopeN.YMin");
  323 + std::string xmax=pt_confcdi.get<std::string>("EnvelopeN.XMax");
  324 + std::string ymax=pt_confcdi.get<std::string>("EnvelopeN.YMax");
  325 + pt.put("projectlayers.maplayer.extent.xmin",xmin);
  326 + pt.put("projectlayers.maplayer.extent.ymin",ymin);
  327 + pt.put("projectlayers.maplayer.extent.xmax",xmax);
  328 + pt.put("projectlayers.maplayer.extent.ymax",ymax);
  329 + //读取配置文件conf.xml
  330 + boost::property_tree::ptree pt_confxml;
  331 + boost::property_tree::read_xml(confxmlpath,pt_confxml);
  332 + std::string strWKT=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.SpatialReference.WKT");
  333 + std::string wkid=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.SpatialReference.WKID");
  334 + std::string top=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileOrigin.X");
  335 + std::string left=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileOrigin.Y");
  336 + std::string tileCols=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileCols");
  337 + std::string tileRows=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileRows");
  338 + std::string dpi=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.DPI");
  339 + pt.put("projectCrs.spatialrefsys.wkt",strWKT);
  340 + pt.put("projectCrs.spatialrefsys.srid",wkid);
  341 +
  342 + boost::property_tree::ptree pt_tileMatrixSets=pt.get_child("tileMatrixSets");
  343 + BOOST_FOREACH(boost::property_tree::ptree::value_type &v1,pt_tileMatrixSets)
  344 + {
  345 + //conf.xml中读取tileinfo
  346 + boost::property_tree::ptree pt_levels,pt_tileMatrixSet;
  347 + boost::property_tree::ptree pt_tileArry=pt_confxml.get_child("CacheInfo.TileCacheInfo.LODInfos");
  348 + BOOST_FOREACH(boost::property_tree::ptree::value_type &v2,pt_tileArry)
  349 + {
  350 + boost::property_tree::ptree pt_level;
  351 + if(v2.first=="LODInfo")
  352 + {
  353 + std::string level=v2.second.get<std::string>("LevelID");
  354 + std::string scale=v2.second.get<std::string>("Scale");
  355 + std::string resolution=v2.second.get<std::string>("Resolution");
  356 + pt_level.add("level.id",level);
  357 + pt_level.add("level.scaleDenominator",scale);
  358 + pt_level.add("level.resolution",resolution);
  359 + pt_levels.push_back(std::make_pair("", pt_level));
  360 + }
  361 + }
  362 + std::string id_=v1.second.get<std::string>("tileMatrixSet.id");
  363 + pt_tileMatrixSet.add("id",id_);
  364 + pt_tileMatrixSet.add("crs","EPSG::"+wkid);
  365 + pt_tileMatrixSet.add("tileCols",tileCols);
  366 + pt_tileMatrixSet.add("tileRows",tileRows);
  367 + pt_tileMatrixSet.add("dpi",dpi);
  368 + pt_tileMatrixSet.add("tileOrigin.X",top);
  369 + pt_tileMatrixSet.add("tileOrigin.Y",left);
  370 + pt_tileMatrixSet.add_child("levels",pt_levels);
  371 + //pt_tilelist.add_child("tileMatrixList",pt_tiles);
  372 + v1.second.put_child("tileMatrixSet",pt_tileMatrixSet);
  373 + //v1.second.put("id","EPSG::"+wkid);
  374 + }
  375 +
  376 + pt.put_child("tileMatrixSets",pt_tileMatrixSets);
  377 + std::stringstream ss;
  378 + boost::property_tree::write_json(ss,pt);
  379 + strExtent=ss.str();
  380 + }
  381 + catch (boost::property_tree::ptree_bad_path& e) {
  382 + LOGGER_ERROR(e.what());
  383 + context.response()->write("{\"status\":\"false\",\"message\":\"获取切片配置信息失败\"}");
  384 + return;
  385 + }
  386 + catch (boost::property_tree::ptree_bad_data& e) {
  387 + LOGGER_ERROR(e.what());
  388 + context.response()->write("{\"status\":\"false\",\"message\":\"获取切片配置信息失败\"}");
  389 + return;
  390 + }
  391 + context.response()->write(strExtent);
  392 + }
  393 + break;
  394 + }
  395 + default:
  396 + {
  397 +
  398 + }
  399 + }
  400 +}
  401 +
  402 +//判断服务是否存在
  403 +void DmpManagerApiHandler::IsExistServiceName(const DmpServerApiContext &context) const
  404 +{
  405 + switch (context.request()->method())
  406 + {
  407 + case DmpServerRequest::Method::GET_METHOD:
  408 + {
  409 + context.response()->write("{\"status\":\"true\",\"message\":\"——————GET\"}");
  410 + break;
  411 + }
  412 + case DmpServerRequest::Method::POST_METHOD:
  413 + {
  414 + context.response()->write("{\"status\":\"true\",\"message\":\"——————POST\"}");
  415 + break;
  416 + }
  417 + default:
  418 + {
  419 +
  420 + }
  421 + }
  422 +}
  423 +
  424 +//新增目录
  425 +void DmpManagerApiHandler::AddCatalog(const DmpServerApiContext &context) const
  426 +{
  427 + switch (context.request()->method())
  428 + {
  429 + case DmpServerRequest::Method::GET_METHOD:
  430 + {
  431 + context.response()->write("{\"status\":\"true\",\"message\":\"新增目录——————GET\"}");
  432 + break;
  433 + }
  434 + case DmpServerRequest::Method::POST_METHOD:
  435 + {
  436 + context.response()->write("{\"status\":\"true\",\"message\":\"新增目录——————POST\"}");
  437 + break;
  438 + }
  439 + default:
  440 + {
  441 +
  442 + }
  443 + }
  444 +}
  445 +
  446 +//删除目录
  447 +void DmpManagerApiHandler::DeleteCatalog(const DmpServerApiContext &context) const
  448 +{
  449 + switch (context.request()->method())
  450 + {
  451 + case DmpServerRequest::Method::GET_METHOD:
  452 + {
  453 + context.response()->write("{\"status\":\"true\",\"message\":\"删除目录——————GET\"}");
  454 + break;
  455 + }
  456 + case DmpServerRequest::Method::POST_METHOD:
  457 + {
  458 + context.response()->write("{\"status\":\"true\",\"message\":\"删除目录——————POST\"}");
  459 + break;
  460 + }
  461 + default:
  462 + {
  463 +
  464 + }
  465 + }
  466 +}
  467 +
  468 +void DmpManagerApiHandler::GetServicesMatrixSets(const DmpServerApiContext &context) const
  469 +{
  470 + switch (context.request()->method())
  471 + {
  472 + case DmpServerRequest::Method::GET_METHOD:
  473 + {
  474 + context.response()->write("{\"status\":\"true\",\"message\":\"删除目录——————GET\"}");
  475 + break;
  476 + }
  477 + case DmpServerRequest::Method::POST_METHOD:
  478 + {
  479 + context.response()->write("{\"status\":\"true\",\"message\":\"删除目录——————POST\"}");
  480 + break;
  481 + }
  482 + default:
  483 + {
  484 +
  485 + }
  486 + }
  487 +}
  488 +void DmpManagerApiHandler::GetCatalogList(const DmpServerApiContext &context) const
  489 +{
  490 + switch (context.request()->method())
  491 + {
  492 + case DmpServerRequest::Method::GET_METHOD:
  493 + {
  494 + context.response()->write("{\"status\":\"true\",\"message\":\"获取目录列表——————GET\"}");
  495 + break;
  496 + }
  497 + case DmpServerRequest::Method::POST_METHOD:
  498 + {
  499 + context.response()->write("{\"status\":\"true\",\"message\":\"获取目录列表——————POST\"}");
  500 + break;
  501 + }
  502 + default:
  503 + {
  504 +
  505 + }
  506 + }
  507 +}
  508 +void DmpManagerApiHandler::UpdateCache(const DmpServerApiContext &context)const
  509 +{
  510 + switch (context.request()->method())
  511 + {
  512 + case DmpServerRequest::Method::GET_METHOD:
  513 + {
  514 + std::string serviceName_;
  515 + const DmpServerParameters params_ (context.request()->serverParameters());
  516 + CIMap paramsMap=params_.parameters();
  517 + std::map<std::string, std::string>::const_iterator iter;
  518 + iter =paramsMap.find("SERVICENAME");
  519 + if (iter != paramsMap.end())
  520 + {
  521 + try
  522 + {
  523 + serviceName_ = boost::lexical_cast<std::string>(iter->second);
  524 + }
  525 + catch (boost::bad_lexical_cast &e)
  526 + {
  527 + LOGGER_ERROR(e.what());
  528 + context.response()->write("{\"status\":\"true\",\"message\":\"获取参数信息错误——————GET\"}");
  529 + return;
  530 + }
  531 + }
  532 +
  533 + break;
  534 + }
  535 + case DmpServerRequest::Method::POST_METHOD:
  536 + {
  537 + context.response()->write("{\"status\":\"true\",\"message\":\"更新缓存——————POST\"}");
  538 + break;
  539 + }
  540 + default:
  541 + {
  542 +
  543 + }
  544 + }
  545 +}
  546 +void DmpManagerApiHandler::DeleteCache(const DmpServerApiContext &context)const
  547 +{
  548 + switch (context.request()->method())
  549 + {
  550 + case DmpServerRequest::Method::GET_METHOD:
  551 + {
  552 + std::string serviceName_;
  553 + const DmpServerParameters params_ (context.request()->serverParameters());
  554 + CIMap paramsMap=params_.parameters();
  555 + std::map<std::string, std::string>::const_iterator iter;
  556 + iter =paramsMap.find("SERVICENAME");
  557 + if (iter != paramsMap.end())
  558 + {
  559 + try
  560 + {
  561 + serviceName_ = boost::lexical_cast<std::string>(iter->second);
  562 + }
  563 + catch (boost::bad_lexical_cast &e)
  564 + {
  565 + LOGGER_ERROR(e.what());
  566 + context.response()->write("{\"status\":\"true\",\"message\":\"获取参数信息错误——————GET\"}");
  567 + return;
  568 + }
  569 + }
  570 +
  571 + break;
  572 + }
  573 + case DmpServerRequest::Method::POST_METHOD:
  574 + {
  575 + context.response()->write("{\"status\":\"true\",\"message\":\"删除缓存——————POST\"}");
  576 + break;
  577 + }
  578 + default:
  579 + {
  580 +
  581 + }
  582 + }
  583 +}
  584 +
  585 +void DmpManagerApiHandler::getCapabilities(const DmpServerApiContext &context) const
  586 +{
  587 + std::string strJson = context.manager()->getCapabilities();
  588 + context.response()->write(strJson);
  589 +}
  590 +void DmpManagerApiHandler::reloadServices(const DmpServerApiContext &context) const
  591 +{
  592 + switch (context.request()->method())
  593 + {
  594 + case DmpServerRequest::Method::GET_METHOD:
  595 + {
  596 + if(context.manager()->loadServices()) {
  597 + context.response()->write("{\"status\":\"true\",\"message\":\"重载服务成功\"}");
  598 + }else{
  599 + context.response()->write("{\"status\":\"false\",\"message\":\"重载服务失败\"}");
  600 + }
  601 + break;
  602 +
  603 + }
  604 + case DmpServerRequest::Method::POST_METHOD:
  605 + {
  606 + context.response()->write("{\"status\":\"true\",\"message\":\"服务重载——————POST\"}");
  607 + break;
  608 + }
  609 + default:
  610 + {
  611 +
  612 + }
  613 + }
  614 +}
\ No newline at end of file
... ...
... ... @@ -45,9 +45,12 @@ void DmpManagerApiHandler::HandleRequest(const DmpServerApiContext &context) con
45 45 else if(OperationId().compare("deleteservice") == 0) {
46 46 deleteService(context);
47 47 }
48   - else if(OperationId().compare("reloadservices") == 0) {
  48 + else if(OperationId().compare("reloadservices") == 0) {
49 49 reloadServices(context);
50 50 }
  51 + else if(OperationId().compare("gettileserviceinfo") == 0) {
  52 + GetTileServiceInfo(context);
  53 + }
51 54 else {
52 55 context.response()->write("not find oparation: " + OperationId());
53 56 }
... ... @@ -56,6 +59,7 @@ void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const
56 59 {
57 60 switch (context.request()->method())
58 61 {
  62 +
59 63 case DmpServerRequest::Method::GET_METHOD:
60 64 {
61 65 context.response()->write("{\"status\":\"true\",\"message\":\"服务发布测试——————GET\"}");
... ... @@ -93,9 +97,12 @@ void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const
93 97 context.response()->write("{\"status\":\"false\",\"message\":\"服务发布失败\"}");
94 98 return;
95 99 }
96   - if(context.manager()->publish(serverType, name, title, capabilities, project)) {
  100 + int flag=context.manager()->publish(serverType, name, title, capabilities, project);
  101 + if(flag==1) {
97 102 LOGGER_INFO("服务发布成功");
98   - context.response()->write("{\"status\":\"true\",\"message\":\"Pulish service successful!\"}");
  103 + std::string http="http://"+context.request()->domain()+":"+context.request()->port();
  104 + std::string url=http+"/DMap/Services/"+name+"/TileServer/tmsService?REQUEST=GetThumbnail";
  105 + context.response()->write("{\"status\":\""+std::to_string(flag)+"\",\"url\":\""+url+"\",\"message\":\"Pulish service successful!\"}");
99 106 // std::string projData;
100 107 // DmpServerUtils::Base64Decode(project, &projData);
101 108 // context.response()->removeHeader("Content-Type");
... ... @@ -105,7 +112,14 @@ void DmpManagerApiHandler::regService(const DmpServerApiContext &context) const
105 112 else
106 113 {
107 114 LOGGER_ERROR("服务发布失败");
108   - context.response()->write("{\"status\":\"false\",\"message\":\"Pulish service fail!\"}");
  115 + if(flag==0)
  116 + {
  117 + context.response()->write("{\"status\":\""+std::to_string(flag)+"\",\"message\":\"Pulish service thumbnail fail!\"}");
  118 + }
  119 + else
  120 + {
  121 + context.response()->write("{\"status\":\""+std::to_string(flag)+"\",\"message\":\"Pulish service fail!\"}");
  122 + }
109 123 }
110 124 }
111 125 else
... ... @@ -236,4 +250,117 @@ void DmpManagerApiHandler::reloadServices(const DmpServerApiContext &context) co
236 250
237 251 }
238 252 }
  253 +}
  254 +//获取配置文件切片信息
  255 +void DmpManagerApiHandler::GetTileServiceInfo(const DmpServerApiContext &context) const
  256 +{
  257 + switch (context.request()->method())
  258 + {
  259 + case DmpServerRequest::Method::GET_METHOD:
  260 + {
  261 + context.response()->write("{\"status\":\"true\",\"message\":\"获取切片配置信息——————GET\"}");
  262 + break;
  263 + }
  264 + case DmpServerRequest::Method::POST_METHOD:
  265 + {
  266 + std::string path;
  267 + std::string strExtent;
  268 + const char* data = (char*)(context.request()->GetData());
  269 + if(data && *data != '\0')
  270 + {
  271 + try
  272 + {
  273 + std::stringstream stream(data);
  274 + boost::property_tree::ptree pt;
  275 + boost::property_tree::ptree pt_json;
  276 + std::string confcdipath;
  277 + std::string confxmlpath;
  278 +
  279 + boost::property_tree::read_json(stream, pt);
  280 + path= pt.get<std::string>("projectlayers.maplayer.datasource");
  281 + confcdipath=path+"/conf.cdi";
  282 + confxmlpath=path+"/conf.xml";
  283 + //读取切片配置文件conf.cdi
  284 + boost::property_tree::ptree pt_confcdi;
  285 + boost::property_tree::read_xml(confcdipath,pt_confcdi);
  286 + //boost::property_tree::ptree pt_base=pt.get_child("base");
  287 + std::string xmin=pt_confcdi.get<std::string>("EnvelopeN.XMin");
  288 + std::string ymin=pt_confcdi.get<std::string>("EnvelopeN.YMin");
  289 + std::string xmax=pt_confcdi.get<std::string>("EnvelopeN.XMax");
  290 + std::string ymax=pt_confcdi.get<std::string>("EnvelopeN.YMax");
  291 + pt.put("projectlayers.maplayer.extent.xmin",xmin);
  292 + pt.put("projectlayers.maplayer.extent.ymin",ymin);
  293 + pt.put("projectlayers.maplayer.extent.xmax",xmax);
  294 + pt.put("projectlayers.maplayer.extent.ymax",ymax);
  295 + //读取配置文件conf.xml
  296 + boost::property_tree::ptree pt_confxml;
  297 + boost::property_tree::read_xml(confxmlpath,pt_confxml);
  298 + std::string strWKT=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.SpatialReference.WKT");
  299 + std::string wkid=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.SpatialReference.WKID");
  300 + std::string top=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileOrigin.X");
  301 + std::string left=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileOrigin.Y");
  302 + std::string tileCols=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileCols");
  303 + std::string tileRows=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.TileRows");
  304 + std::string dpi=pt_confxml.get<std::string>("CacheInfo.TileCacheInfo.DPI");
  305 + pt.put("projectCrs.spatialrefsys.wkt",strWKT);
  306 + pt.put("projectCrs.spatialrefsys.srid",wkid);
  307 +
  308 + boost::property_tree::ptree pt_tileMatrixSets=pt.get_child("tileMatrixSets");
  309 + BOOST_FOREACH(boost::property_tree::ptree::value_type &v1,pt_tileMatrixSets)
  310 + {
  311 + //conf.xml中读取tileinfo
  312 + boost::property_tree::ptree pt_levels,pt_tileMatrixSet;
  313 + boost::property_tree::ptree pt_tileArry=pt_confxml.get_child("CacheInfo.TileCacheInfo.LODInfos");
  314 + BOOST_FOREACH(boost::property_tree::ptree::value_type &v2,pt_tileArry)
  315 + {
  316 + boost::property_tree::ptree pt_level;
  317 + if(v2.first=="LODInfo")
  318 + {
  319 + std::string level=v2.second.get<std::string>("LevelID");
  320 + std::string scale=v2.second.get<std::string>("Scale");
  321 + std::string resolution=v2.second.get<std::string>("Resolution");
  322 + pt_level.add("level.id",level);
  323 + pt_level.add("level.scaleDenominator",scale);
  324 + pt_level.add("level.resolution",resolution);
  325 + pt_levels.push_back(std::make_pair("", pt_level));
  326 + }
  327 + }
  328 + std::string id_=v1.second.get<std::string>("tileMatrixSet.id");
  329 + pt_tileMatrixSet.add("id",id_);
  330 + pt_tileMatrixSet.add("crs","EPSG::"+wkid);
  331 + pt_tileMatrixSet.add("tileCols",tileCols);
  332 + pt_tileMatrixSet.add("tileRows",tileRows);
  333 + pt_tileMatrixSet.add("dpi",dpi);
  334 + pt_tileMatrixSet.add("tileOrigin.X",top);
  335 + pt_tileMatrixSet.add("tileOrigin.Y",left);
  336 + pt_tileMatrixSet.add_child("levels",pt_levels);
  337 + //pt_tilelist.add_child("tileMatrixList",pt_tiles);
  338 + v1.second.put_child("tileMatrixSet",pt_tileMatrixSet);
  339 + //v1.second.put("id","EPSG::"+wkid);
  340 + }
  341 +
  342 + pt.put_child("tileMatrixSets",pt_tileMatrixSets);
  343 + std::stringstream ss;
  344 + boost::property_tree::write_json(ss,pt);
  345 + strExtent=ss.str();
  346 + }
  347 + catch (boost::property_tree::ptree_bad_path& e) {
  348 + LOGGER_ERROR(e.what());
  349 + context.response()->write("{\"status\":\"false\",\"message\":\"获取切片配置信息失败\"}");
  350 + return;
  351 + }
  352 + catch (boost::property_tree::ptree_bad_data& e) {
  353 + LOGGER_ERROR(e.what());
  354 + context.response()->write("{\"status\":\"false\",\"message\":\"获取切片配置信息失败\"}");
  355 + return;
  356 + }
  357 + context.response()->write(strExtent);
  358 + }
  359 + break;
  360 + }
  361 + default:
  362 + {
  363 +
  364 + }
  365 + }
239 366 }
\ No newline at end of file
... ...
... ... @@ -27,6 +27,7 @@ public:
27 27 void deleteService(const DmpServerApiContext &context) const;
28 28 void getCapabilities(const DmpServerApiContext &context)const;
29 29 void reloadServices(const DmpServerApiContext &context)const;
  30 + void GetTileServiceInfo(const DmpServerApiContext &context) const;
30 31
31 32 };
32 33
... ...
... ... @@ -3,6 +3,7 @@
3 3
4 4 SET (TILESERVER_SRCS
5 5 dmptileserver.cpp
  6 + #dmptilethumbnail.cpp
6 7 wmts/dmpwmts.cpp
7 8 wmts/dmpwmtsparameters.cpp
8 9 wmts/dmptileproviderfactory.cpp
... ... @@ -18,6 +19,7 @@ SET (TILESERVER_SRCS
18 19
19 20 SET (TILESERVER_HDRS
20 21 dmptileserver.h
  22 + #dmptilethumbnail.h
21 23 wmts/dmpwmtsparameters.h
22 24 wmts/dmptileprovider.h
23 25 wmts/dmptileproviderfactory.h
... ...
... ... @@ -12,6 +12,7 @@
12 12 #include "wmts/dmpwmts.h"
13 13 #include "tms/dmptms.h"
14 14 #include "dmpserverresponse.h"
  15 +#include "dmptilethumbnail.h"
15 16
16 17 namespace tileserver
17 18 {
... ...
... ... @@ -23,6 +23,7 @@
23 23 #include "dmpservice.h"
24 24 #include "dmpserverutils.h"
25 25 #include "dmpserverproject.h"
  26 +#include<cairo/cairo.h>
26 27
27 28 namespace tileserver
28 29 {
... ...
... ... @@ -52,15 +52,21 @@ namespace DmpWmts
52 52 return;
53 53 }
54 54 }
55   - void DmpCapabiliTilesOperation::WriteCapabilities(boost::property_tree::ptree& pt,const std::string& host,const std::string& servicename,DmpServerResponse& response)
  55 + void DmpCapabiliTilesOperation::WriteCapabilities(boost::property_tree::ptree& pt,const std::string& host,const std::string& servicename,const std::string& title,DmpServerResponse& response)
56 56 {
57 57 //构建能力文档
58 58 boost::property_tree::ptree pt_root,pt_TileMatrix;
59   - CreateGetCapabilitiesDocument(host,servicename,pt_root);
  59 + //CreateGetCapabilitiesDocument(host,servicename,pt_root);
  60 + CreateGetCapabilitiesDocument(host,title,pt_root);
60 61 pt_root.add("Capabilities.Contents.Layer.ows:Title",pt.get<std::string>("Layer.ows:Title"));
61 62 pt_root.add("Capabilities.Contents.Layer.ows:Abstract",pt.get<std::string>("Layer.ows:Abstract"));
62 63 pt_root.add("Capabilities.Contents.Layer.ows:Identifier",pt.get<std::string>("Layer.ows:Identifier"));
63 64 //pt_root_.add("Capabilities.Contents.Layer.Style.<xmlattr>.isDefault",pt_.get<std::string>("Layer.Style.<xmlattr>.isDefault"));
  65 +
  66 +
  67 + pt_root.add("Capabilities.Contents.Layer.ows:BoundingBox.ows:LowerCorner",pt.get<std::string>("Layer.ows:BoundingBox.ows:LowerCorner"));
  68 + pt_root.add("Capabilities.Contents.Layer.ows:BoundingBox.ows:UpperCorner",pt.get<std::string>("Layer.ows:BoundingBox.ows:UpperCorner"));
  69 +
64 70 pt_root.add("Capabilities.Contents.Layer.Style",pt.get<std::string>("Layer.Style"));
65 71 pt_root.add("Capabilities.Contents.Layer.Format",pt.get<std::string>("Layer.Format"));
66 72 pt_root.add("Capabilities.Contents.Layer.TileMatrixSetLink.TileMatrixSet",pt.get<std::string>("Layer.TileMatrixSetLink.TileMatrixSet"));
... ...
... ... @@ -35,7 +35,7 @@ namespace DmpWmts
35 35 public:
36 36 DmpCapabiliTilesOperation();
37 37 void WriteCapabilities(DmpServerResponse& response);
38   - void WriteCapabilities(boost::property_tree::ptree& pt ,const std::string& host ,const std::string& servicename,DmpServerResponse& response);
  38 + void WriteCapabilities(boost::property_tree::ptree& pt ,const std::string& host ,const std::string& servicename,const std::string& title,DmpServerResponse& response);
39 39 void GetCapabilitiesDocument(DmpServerResponse& response);
40 40 void CreateGetCapabilitiesDocument(const std::string& host,const std::string& servicename,boost::property_tree::ptree& pt);
41 41 void GetServiceIdentificationElement(const std::string& servicename,boost::property_tree::ptree& pt);
... ...
... ... @@ -66,7 +66,7 @@ namespace DmpWmts
66 66 const DmpServerProject *serverProject = context.serverProject();
67 67 const DmpProject *project = serverProject->project();
68 68 DmpTileLayer *tileLayer = static_cast<DmpTileLayer *>(project->getLayer(layerName));
69   -
  69 +
70 70 if (req.empty())
71 71 {
72 72 context.response()->writeHtml("wmts,Operation is null");
... ... @@ -79,11 +79,11 @@ namespace DmpWmts
79 79 }
80 80 else if(boost::iequals(req, "GetThumbnail"))
81 81 {
82   -
83 82 }
84 83 else if (boost::iequals(req, "GetCapabilities"))
85 84 {
86 85 const std::string host=context.request()->domain()+":"+context.request()->port();;
  86 + const std::string title=serverProject->title();
87 87 const std::string servicename=serverProject->name();
88 88
89 89 boost::property_tree::ptree pt;
... ... @@ -92,6 +92,11 @@ namespace DmpWmts
92 92 pt.add("Layer.ows:Identifier","");
93 93 pt.add("Layer.Style",tileLayer->getStyle());
94 94 pt.add("Layer.Format",tileLayer->getFormat());
  95 + DmpRectangle rectangle=tileLayer->extent();
  96 + std::string lowerPoint=std::to_string(rectangle.xmin())+" "+std::to_string(rectangle.ymin());
  97 + std::string upperPoint=std::to_string(rectangle.xmax())+" "+std::to_string(rectangle.ymax());
  98 + pt.add("Layer.ows:BoundingBox.ows:LowerCorner",lowerPoint);
  99 + pt.add("Layer.ows:BoundingBox.ows:UpperCorner",upperPoint);
95 100
96 101 std::vector<DmpTileMatrixSet*> tileMatrixSets;
97 102 tileLayer->getTileMatrixSets(tileMatrixSets);
... ... @@ -119,11 +124,12 @@ namespace DmpWmts
119 124 pt.add("TileMatrixSet.TileHeight",(*iter)->tileRows());
120 125 pt.add("TileMatrixSet.TopLeftCorner",std::to_string((*iter)->tileOrigin()->x())+","+std::to_string((*iter)->tileOrigin()->y()));
121 126 pt.add("TileMatrixSet.DPI",(*iter)->dpi());
  127 +
122 128 }
123 129 //boost::property_tree::write_json("/mnt/d/json.txt",pt);
124 130
125 131 DmpCapabiliTilesOperation capOper;
126   - capOper.WriteCapabilities(pt,host,servicename,*context.response());
  132 + capOper.WriteCapabilities(pt,host,servicename,title,*context.response());
127 133
128 134 }
129 135 }
... ...
注册登录 后发表评论