|  | 81 | {{{ | 
          
            |  | 82 | #!cpp | 
          
            |  | 83 | void PingPong::startup() | 
          
            |  | 84 | { | 
          
            |  | 85 | using boost::property_tree::ptree; | 
          
            |  | 86 | using boost::property_tree::json_parser::read_json; | 
          
            |  | 87 |  | 
          
            |  | 88 | logging_info( "[PINGPONG]\t starting up PingPong service ... " ); | 
          
            |  | 89 |  | 
          
            |  | 90 | // read config | 
          
            |  | 91 | ptree config; | 
          
            |  | 92 | try | 
          
            |  | 93 | { | 
          
            |  | 94 | read_json(config_file, config); | 
          
            |  | 95 | } | 
          
            |  | 96 | catch ( exception& e ) | 
          
            |  | 97 | { | 
          
            |  | 98 | logging_warn("ERROR: Failed to read config file »" << config_file << "«: "); | 
          
            |  | 99 | logging_warn(e.what()); | 
          
            |  | 100 | logging_warn("---> Using fallback config."); | 
          
            |  | 101 |  | 
          
            |  | 102 | config.put("ariba.spovnet_name", "pingpong"); | 
          
            |  | 103 | } | 
          
            |  | 104 |  | 
          
            |  | 105 | // use node name also in the application | 
          
            |  | 106 | name = config.get("ariba.node_name", "NO_NAME"); | 
          
            |  | 107 |  | 
          
            |  | 108 | // bind communication and node listener | 
          
            |  | 109 | node.bind( this );                              /*NodeListener*/ | 
          
            |  | 110 | node.bind( this, PingPong::PINGPONG_SERVICEID); /*CommunicationListener*/ | 
          
            |  | 111 |  | 
          
            |  | 112 | // connecting | 
          
            |  | 113 | logging_debug( "connecting ... " ); | 
          
            |  | 114 |  | 
          
            |  | 115 | node.connect(config.get_child("ariba")); | 
          
            |  | 116 |  | 
          
            |  | 117 | // ping pong started up... | 
          
            |  | 118 | logging_info( "[PINGPONG]\t pingpong starting up with" | 
          
            |  | 119 | << " [spovnetid " << node.getSpoVNetId().toString() << "]" | 
          
            |  | 120 | << " and [nodeid " << node.getNodeId().toString() << "]" ); | 
          
            |  | 121 | } | 
          
            |  | 122 | }}} | 
          
            |  | 123 |  | 
          
            |  | 124 | - `ptree config;` is an yet empty instance of boost::property_tree::ptree. | 
          
            |  | 125 | - `read_json(config_file, config);` reads a config file (like the JSON file showed in the previous section) into the ptree instance `config`. The path of the JSON file is stored in `config_file`. | 
          
            |  | 126 | - If the read fails, the except handler prints a warning and initiates a default config directly within the code via: `config.put("ariba.spovnet_name", "pingpong");` | 
          
            |  | 127 | - The node variable is defined as attribute: `ariba::Node node;` (initialized with the standard constructor). Thoe follwing registers the callbacks from ariba: | 
          
            |  | 128 | - `node.bind( this );` | 
          
            |  | 129 | - `node.bind( this, PingPong::PINGPONG_SERVICEID);` | 
          
            |  | 130 | - The following command starts ariba with the config stored in the ptree | 
          
            |  | 131 | - `node.connect(config.get_child("ariba"));` | 
          
            |  | 132 |  | 
          
            |  | 133 | The callbacks (functions in the application that are called from ariba) are declared in `ariba/CommunicationListener.h`. | 
          
            |  | 134 | The ariba interface (functions in ariba that can be called from the application) are declared in `ariba/Node.h`. | 
          
            |  | 135 |  |