This chapter describes examples available in
examples subdirectory:
libmlp-cpp-1.1.0
|
+----examples/
|
*----curl-client/
*----example1/
*----example2/
*----example3/
*----example-guide/
*----example_other/
Curl-client example need cURL library. It is simple HTTP client that asks user for Mobile Station International Subscriber Directory Number (MSISDN) and send HTTP POST request containing MLP SLIR message to Location Server. Location server should answer with SLIA message. This message is processed with MlpParser object and acquired location information is displayed to a standard output.
This three examples are completely coincidental except each
contains different MLP message. They read the MLP message from
message.xml file into the
std::string and pass it to the
MlpParser. Example1
contains SLIR message,
contains
SLIA message and
example2 contains
SLIREP message.example3
In example-guide you can see simple usage
of MLP Library. Following code listing is from
example-guide/main.cpp.
Directory example_other contains examples
that are not part of library build system. You can copy them to
arbitrary location, unpack them an try to compile them according to
instructions in their READMEs. You can find there example with
simple Makefile and example formated as GNU autotools package. They
have the same source code as the example1 but
they have separated build system. This means you need to properly
set paths to libraries, headers and pkg-config so your compiler
finds MLP headers and your linker finds library to link.
Examples from examples_other need to know
the path to MLP DTDs. To successfully run them after compilation.
You need to edit this path in example source codes before
compilation!!!
All examples that are part of build system (curl-client, example1-3, example-guide) are set to reach DTD files located in libmlp-cpp-1.1.0/libmlp-cpp/dtd. They should run after the make command. Path to DTDs can be specified directly in source code for simplicity of examples.
Foloving code listing is source for
example-guide.
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <libmlp-cpp/MlpLib.hpp>
#include <libmlp-cpp/MlpMessage.hpp>
#include <libmlp-cpp/MlpException.hpp>
#include <libmlp-cpp/MlpSubscriber.hpp>
#include <libmlp-cpp/MlpShapePoint.hpp>
int main( int argc, char* argv[] )
{
// Initialize
MLP_LIB_CPP_INIT;
// Message for parsing
std::string myMsg = "<?xml version = \"1.0\" ?> \
<!DOCTYPE svc_init PUBLIC \"-//OMA//DTD MLP 3.2.0//EN\" \
\"http://www.openmobilealliance.org/Tech/dtd/MLP_SVC_INIT_320.dtd\"> \
<svc_init ver=\"3.2.0\"> \
<hdr ver=\"3.2.0\"> \
<client> \
<id>theasp</id> \
<pwd>thepwd</pwd> \
<serviceid>0005</serviceid> \
<requestmode type=\"ACTIVE\"/> \
</client> \
<subclient last_client=\"YES\"> \
<id>theSubAsp</id> \
<pwd>thepwd2</pwd> \
<serviceid>0005</serviceid> \
</subclient> \
<requestor type=\"MSISDN\"> \
<id>461018765710</id> \
</requestor> \
</hdr> \
<slir ver=\"3.2.0\" res_type=\"ASYNC\"> \
<msids> \
<msid enc=\"CRP\" type=\"IPV4\">93.10.0.250</msid> \
<codeword>rtep1</codeword> \
<session type=\"APN\">mySession1</session> \
<msid_range> \
<start_msid> \
<msid enc=\"CRP\" type=\"IPV4\">461018765710</msid> \
</start_msid> \
<stop_msid> \
<msid enc=\"CRP\" type=\"IPV4\">461018765712</msid> \
</stop_msid> \
</msid_range> \
<msid type=\"ASID\">441728922342</msid> \
<codeword>rtep2</codeword> \
<msid_range> \
<start_msid> \
<msid>461018765720</msid> \
</start_msid> \
<stop_msid> \
<msid>461018765728</msid> \
</stop_msid> \
</msid_range> \
<codeword>ahoj1</codeword> \
<codeword>ahoj2</codeword> \
<codeword>ahoj3</codeword> \
<codeword>ahoj4</codeword> \
</msids> \
<eqop> \
<resp_req type=\"LOW_DELAY\" /> \
<hor_acc qos_class=\"ASSURED\">1000</hor_acc> \
</eqop> \
<geo_info> \
<CoordinateReferenceSystem> \
<Identifier> \
<code>4004</code> \
<codeSpace>EPSG</codeSpace> \
<edition>6.1</edition> \
</Identifier> \
</CoordinateReferenceSystem> \
</geo_info> \
<loc_type type=\"CURRENT_OR_LAST\" /> \
<prio type=\"HIGH\" /> \
</slir> \
</svc_init>" ;
MlpConfig config;
config.setDTDpath ("../../dtd/" );
// New MlpParser
MlpParser * myMlpParser = new MlpParser();
try
{
myMlpParser->configure( &config );
myMlpParser->init();
}
catch (MlpException &e)
{
// Error in initialization
std::cout << e.getMessage() << std::endl;
delete myMlpParser;
myMlpParser = NULL;
}
if( myMlpParser != NULL )
{
std::cout << "Press Enter to start parsing." << std::endl;
std::cin.get();
try{
MlpMessage inMsg;
MlpHdr* inMlpHdr;
const MlpHdrClientList* inMlpHdrClientList;
const MlpSubscriberList* inMlpSubscriberList;
const MlpPositionList* inMlpPositionList;
// Parsing
myMlpParser->parse( &inMsg, myMsg );
std::cout << " Msg Type: "
<< inMsg.getMsgType() << std::endl;
std::cout << " Msg Service Type: "
<< inMsg.getServiceType() << std::endl;
inMlpHdr = inMsg.getMlpHdr();
// If message contains header, print some information
if (inMlpHdr != NULL)
{
std::cout << " Hdr Request Mode: "
<< inMlpHdr->getRequestMode() << std::endl;
inMlpHdrClientList = (inMsg.getMlpHdr())->getHdrClientList();
for ( t_MlpHdrClientListIterator it = inMlpHdr->getBegin() ;
it != inMlpHdr->getEnd() ;
it++
)
{
std::cout << " Klient type: "
<< (*it)->getClientType() << std::endl;
std::cout << " Client ID: "
<< (*it)->getId() << std::endl;
}
}
// Present only if the message contains subscribers that should be located.
// Present only in Request messages.
inMlpSubscriberList = inMsg.getSubscriberList();
if ( inMlpSubscriberList != NULL)
{
for ( t_MlpSubscriberListIterator
it = (inMsg.getSubscriberList())->begin();
it != (inMsg.getSubscriberList())->end() ;
it++
)
{
if( (*it)->getSubscriberType() == MlpConstants::SUBSCRIBER_MSID )
{
std::cout << " Subscriber type: MSID: "
<< (*it)->getMsid() << std::endl;
}
else if( (*it)->getSubscriberType()
== MlpConstants::SUBSCRIBER_MSID_RANGE )
{
std::cout << " Subscriber type: MSID_RANGE" << std::endl;
std::cout << " Start MSID: "
<< (*it)->getStartMsid() << std::endl;
std::cout << " Stop MSID: "
<< (*it)->getStopMsid() << std::endl;
}
}
}
// Present only in response messages
// Prints information oubt localized subscribers
inMlpPositionList = inMsg.getPositionList();
if ( inMlpPositionList != NULL)
{
for ( t_MlpPositionListIterator
it = (inMsg.getPositionList())->begin();
it != (inMsg.getPositionList())->end() ;
it++
)
{
std::cout << " Position: " << std::endl;
std::cout << " MSID: "
<< (*it)->getMsid() << std::endl;
// error during localization
if( (*it)->wasError() )
{
std::cout << " Error: "
<< (*it)->getResult() << std::endl;
std::cout << " Error Id: "
<< (*it)->getResultId() << std::endl;
}
// localization was successful
else
{
std::cout << " Shape type: "
<< ( (*it)->getShape() )->getShapeType()
<< std::endl;
switch( ( (*it)->getShape() )->getShapeType() ){
case( MlpConstants::SHAPE_POINT ):
std::cout << " X: "
<< ( (MlpShapePoint* )(*it)->getShape() )->getX()
<< std::endl;
std::cout << " Y: "
<< ( (MlpShapePoint* )(*it)->getShape() )->getY()
<< std::endl;
std::cout << " Z: "
<< ( (MlpShapePoint* )(*it)->getShape() )->getZ()
<< std::endl;
break;
// Other shapes not supported yet
case( MlpConstants::SHAPE_LINESTRING ):
break;
case( MlpConstants::SHAPE_POLYGON ):
break;
case( MlpConstants::SHAPE_BOX ):
break;
case( MlpConstants::SHAPE_CIRCULAR_AREA ):
break;
case( MlpConstants::SHAPE_CIRCULAR_ARC_AREA ):
break;
case( MlpConstants::SHAPE_ELLIPTICAL_AREA ):
break;
case( MlpConstants::SHAPE_MULTILINE_STRING ):
break;
case( MlpConstants::SHAPE_MULTIPOINT ):
break;
case( MlpConstants::SHAPE_MULTIPOLYGON ):
break;
case( MlpConstants::SHAPE_LINEAR_RING ):
break;
}
}
}
}
}
catch ( MlpException &e ){
std::cout << e.getMessage() << std::endl;
}
}
std::cout << "Press Enter to stop." << std::endl;
std::cin.get();
// Delete the parser
delete myMlpParser;
// Terminate the environment
MLP_LIB_CPP_TERMINATE;
return 0;
}