Example sequence

(for parsing JSON using boost/property_tree):

 

 

/// testconsoleapilib.cpp : Defines the entry point for the console application.

//

#include <windows.h>

#include <iostream>

#include <string>

#include <boost/property_tree/json_parser.hpp>

#include <boost/property_tree/ptree.hpp>

#include <sstream>

#include <boost/foreach.hpp>

#include <boost/scope_exit.hpp>

 

typedef int (*era_process_request)(const char* request, char** response);

typedef void (*era_free)(char* s);

typedef int (*era_init_lib)();

typedef void (*era_deinit_lib)();

 

 

int main(int argc, char** argv)

{

 HMODULE hMod = LoadLibrary(L"ServerApi.dll");

 BOOST_SCOPE_EXIT(&hMod) {

         if(hMod)

         {

                 FreeLibrary(hMod);

         }

 } BOOST_SCOPE_EXIT_END

 if (!hMod)

 {

         std::cout<< "Cannot load library error. Last error is:" << GetLastError() << std::endl;

         return 1;

 }

 

 era_init_lib init_lib = (era_init_lib)GetProcAddress(hMod,"era_init_lib");

 era_deinit_lib deinit_lib = (era_deinit_lib)GetProcAddress(hMod,"era_deinit_lib");

 

 if (!init_lib )

 {

         std::cout<<"Cannot init library" << std::endl;

         return 1;

 }

 if (!deinit_lib )

 {

         std::cout<<"Cannot deinit libraries" << std::endl;

         return 1;

 }

 

 int res = init_lib();

 

 BOOST_SCOPE_EXIT(&deinit_lib,&res) {

         if(!res)

         {

                 if(deinit_lib)

                 {

                         deinit_lib();

                 }

         }

 } BOOST_SCOPE_EXIT_END

 

 if(res)

 {

         std::cout<<"Init lib result:" << res << std::endl;

         return 1;

 }

 

 era_process_request send_request = (era_process_request)GetProcAddress(hMod,"era_process_request");

 if (!send_request)

 {

         std::cout<<"Cannot load era_process_request" << std::endl;

         return 1;

 }

 

 era_free free_response = (era_free)GetProcAddress(hMod,"era_free");

 if (!free_response)

 {

         std::cout<<"Cannot load era_free" << std::endl;

         return 1;

 }

 

 

 //Start ServerApi 1

 std::string request("{\"Era.ServerApi.StartRequest\":{}}");

 std::cout<<"Executing json " << request << " ..." << std::endl;

 char* szRes = NULL;

 res = send_request(request.c_str(),&szRes);

 if (!res)

 {

         std::string response(szRes);

 

         std::cout<<"Response is: " << response << std::endl;

         boost::property_tree::ptree pt2;

         std::istringstream is (response);

         read_json (is, pt2);

 

         bool resultMessageHasTrueResult = pt2.get (boost::property_tree::ptree::path_type("Era.ServerApi.SimpleResponse/result", '/'),false);

         

         if(!resultMessageHasTrueResult)

         {

                 std::cout << "ServerApi was not started properly." << std::endl;

                 return 1;

         }

 }

 else

 {

         std::cout << "Error in ServerApi: " << res << std::endl;

         free_response(szRes);

         return 1;

 

 }

 BOOST_SCOPE_EXIT(&send_request,&free_response){

         //Stop ServerApi 7

         std::string request="{\"Era.ServerApi.StopRequest\":{}}";

         std::cout<<"Executing json " << request << " ..." << std::endl;

         char* szRes = NULL;

         int res = send_request(request.c_str(),&szRes);

         if (!res)

         {

                 std::string response(szRes);

 

                 std::cout<<"Response is: " << response << std::endl;

                 boost::property_tree::ptree pt2;

                 std::istringstream is (response);

                 read_json (is, pt2);

 

                 bool resultMessageHasTrueResult = pt2.get (boost::property_tree::ptree::path_type("Era.ServerApi.SimpleResponse/result", '/'),false);

 

                 if(!resultMessageHasTrueResult)

                 {

                         std::cout << "Stop request failed." << std::endl;

                         free_response(szRes);

                 }

 

         }

         else

         {

                 std::cout << "Error in ServerApi: " << res << std::endl;

                 free_response(szRes);

         }

         free_response(szRes);

 } BOOST_SCOPE_EXIT_END

 free_response(szRes);

 

 //CreateConfiguration 2

 request = "{\"Era.ServerApi.CreateConnectionRequest\":{\"host\":\"127.0.0.1\",\"port\":2223}}";

 std::cout<<"Executing json " << request << " ..." << std::endl;

 szRes = NULL;

 res = send_request(request.c_str(),&szRes);

 if (!res)

 {

         std::string response(szRes);

 

         std::cout<<"Response is: " << response << std::endl;

         boost::property_tree::ptree pt2;

         std::istringstream is (response);

         read_json (is, pt2);

 

         try{

                 std::string resultMessageHasTrueResult = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.ServerApi.VerifyUserRequest/result", '/'));

         }

         catch(const std::exception& e)

         {

                 std::cout << "ServerApi cannot connect." << std::endl;

                 free_response(szRes);

                 return 1;

         }

 }

 else

 {

         std::cout << "Error in ServerApi: " << res << std::endl;

         free_response(szRes);

         return 1;

 }

 BOOST_SCOPE_EXIT(&send_request,&free_response){

         //CloseConnection 6

         std::string request="{\"Era.ServerApi.CloseConnectionRequest\":{}}";

         std::cout<<"Executing json " << request << " ..." << std::endl;

         char* szRes = NULL;

         int res = send_request(request.c_str(),&szRes);

         if (!res)

         {

                 std::string response(szRes);

                 std::cout<<"Response is: " << response << std::endl;

                 boost::property_tree::ptree pt2;

                 std::istringstream is (response);

                 read_json (is, pt2);

 

                 bool resultMessageHasTrueResult = pt2.get (boost::property_tree::ptree::path_type("Era.ServerApi.SimpleResponse/result", '/'),false);

 

                 if(!resultMessageHasTrueResult)

                 {

                         std::cout << "Connection was not closed properly." << std::endl;

                         free_response(szRes);

                 }

         }

         else

         {

                 std::cout << "Error in ServerApi: " << res << std::endl;

                 free_response(szRes);

         }

         free_response(szRes);

 } BOOST_SCOPE_EXIT_END

 free_response(szRes);

 

 //VerifyUserResponse 3

 request="{\"Era.ServerApi.VerifyUserResponse\":{\"VerifyResult\":true}}";

 std::cout<<"Executing json " << request << " ..." << std::endl;

 szRes = NULL;

 res = send_request(request.c_str(),&szRes);

 if (!res)

 {

         std::string response(szRes);

 

         std::cout<<"Response is: " << response << std::endl;

         boost::property_tree::ptree pt2;

         std::istringstream is (response);

         read_json (is, pt2);

 

         bool resultMessageHasTrueResult = pt2.get (boost::property_tree::ptree::path_type("Era.ServerApi.SimpleResponse/result", '/'),false);

 

         if(!resultMessageHasTrueResult)

         {

                 std::cout << "ServerApi was not started properly." << std::endl;

                 free_response(szRes);

                 return 1;

         }

 }

 else

 {

         std::cout << "Error in ServerApi: " << res << std::endl;

         free_response(szRes);

         return 1;

 }

 free_response(szRes);

 

 //Authenticate 4

 request="{\"Era.Common.NetworkMessage.ConsoleApi.SessionManagement.RpcAuthLoginRequest\" : {\"username\":\"Administrator\", \"password\":\"secret\", \"isDomainUser\":false, \"locale\":\"en-US\"}}";

 std::cout<<"Executing json " << request << " ..." << std::endl;

 szRes = NULL;

 res = send_request(request.c_str(),&szRes);

 if (!res)

 {

         std::string response(szRes);

         

         std::cout<<"Response is: " << response << std::endl;

         boost::property_tree::ptree pt2;

         std::istringstream is (response);

         read_json (is, pt2);

         

         try{

                 std::string resultMessageHasTrueResult = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.SessionManagement.RpcAuthLoginResponse/userUuid/uuid", '/'));

         }

         catch(const std::exception& e)

         {

                 std::cout << "ServerApi cannot authenticate. Error is: " << e.what() << std::endl;

                 free_response(szRes);

                 return 1;

         }

 }

 else

 {

         std::cout << "Error in ServerApi: " << res << std::endl;

         free_response(szRes);

         return 1;

 }

 free_response(szRes);

 

 //CreateStaticGroup 5

 

request="{\"Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupRequest\":{\"staticObjectData\":{\"name\":\"group1\",\"description\":\"description\"},\"parentGroupUuid\":{\"uuid\":\"00000000-0000-0000-7001-000000000001\"}}}";

 std::cout<<"Executing json " << request << " ..." << std::endl;

 szRes = NULL;

 res = send_request(request.c_str(),&szRes);

 std::string uuidOfGroup = "";

 if (!res)

 {

         std::string response(szRes);

         std::cout<<"Response is: " << response << std::endl;

         boost::property_tree::ptree pt2;

         std::istringstream is (response);

         read_json (is, pt2);

 

         try{

                 uuidOfGroup = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticObjectIdentification/uuid/uuid", '/'));

                 int version = pt2.get<int> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticObjectIdentification/versionGuard", '/'));

                 std::string name = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticObjectData/name", '/'));

                 std::string description = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticObjectData/description", '/'));

                 std::string parentuuid = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticGroupRelations/parentGroup/uuid", '/'));

                 if(parentuuid != "00000000-0000-0000-7001-000000000001" || name !="group1" || description!="description")

                 {

                         throw std::runtime_error("Result is not expected");

                 }

         }

         catch(const std::exception& e)

         {

                 std::cout << "ServerApi cannot create group. Error is: " << e.what() << std::endl;

                 free_response(szRes);

                 return 1;

         }

         

 }

 else

 {

         std::cout << "Error in ServerApi: " << res << std::endl;

         free_response(szRes);

         return 1;

 }

 free_response(szRes);

 

 //CreateComputer 5

 

request="{\"Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateComputerRequest\":{\"parentGroupUuid\":{\"uuid\":\"" + uuidOfGroup + "\"},\"computerNames\":[\"computer1\"],\"commonDescription\":\"first\",\"collisionsHandling\":1}}";

 std::cout<<"Executing json " << request << " ..." << std::endl;

 szRes = NULL;

 res = send_request(request.c_str(),&szRes);

 if (!res)

 {

         std::string response(szRes);

 

         std::cout<<"Response is: " << response << std::endl;

         boost::property_tree::ptree pt2;

         std::istringstream is (response);

         read_json (is, pt2);

 

         try{

                 boost::property_tree::ptree& pos = pt2.get_child(boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateComputerResponse/results", '/'));

                 int size = 0 ;

                 BOOST_FOREACH (const boost::property_tree::ptree::value_type& resultCreateComputer, pos) {

                         if(size == 1)

                         {

                                 throw std::runtime_error("Result in create compures has to have one result");

                         }

                         

                         size++;

                         int resultCreateComp = resultCreateComputer.second.get<int> (boost::property_tree::ptree::path_type("result", '/'));

                         int requestIndex = resultCreateComputer.second.get<int> (boost::property_tree::ptree::path_type("requestIndex", '/'));

                         std::string uuid = resultCreateComputer.second.get<std::string>(boost::property_tree::ptree::path_type("staticObjectIdentification/uuid/uuid", '/'));

                         std::string version = resultCreateComputer.second.get<std::string>(boost::property_tree::ptree::path_type("staticObjectIdentification/versionGuard", '/'));

                         std::string name = resultCreateComputer.second.get<std::string>(boost::property_tree::ptree::path_type("staticObjectData/name", '/'));

                         std::string description = resultCreateComputer.second.get<std::string>(boost::property_tree::ptree::path_type("staticObjectData/description", '/'));

                         if(resultCreateComp!=1 || requestIndex != 0 || name !="computer1" || description!="first")

                         {

                                 throw std::runtime_error("Result is not expected");

                         }

                 }

         }

         catch(const std::exception& e)

         {

                 std::cout << "ServerApi cannot create computer. Error is: " << e.what() << std::endl;

                 free_response(szRes);

                 return 1;

         }

 }

 else

 {

         std::cout << "Error in ServerApi: " << res << std::endl;

         free_response(szRes);

         return 1;

 }

 free_response(szRes);

 

 return 0;

}