Config.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:11k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const Config_cxx_Version = 
  51.     "$Id: Config.cxx,v 1.3 2001/05/24 11:01:37 icahoon Exp $";
  52. #include "Config.hxx"
  53. #include "ParsePair.hxx"
  54. #include "VLog.hxx"
  55. #include "Lock.hxx"
  56. #include <unistd.h>
  57. using Vocal::Configuration::Config;
  58. using Vocal::Transport::IPAddress;
  59. using Vocal::Threads::ReadLock;
  60. using Vocal::Threads::WriteLock;
  61. using Vocal::Configuration::GetOpt;
  62. using Vocal::Configuration::ParsePair;
  63. using Vocal::Configuration::NameValueMap;
  64. using Vocal::Configuration::NO_VALUE;
  65. using Vocal::Configuration::VALUE_PRESENT;
  66. using Vocal::Configuration::VALUE_OPTIONAL;
  67. using Vocal::Logging::VLog;
  68. using Vocal::ReturnCode;
  69. using Vocal::SUCCESS;
  70. Config::Config()
  71.     : cfgStr("config"),
  72.         pserverStr("pserver"),
  73.         nodaemonStr("nodaemon"),
  74.         loglevelStr("loglvl"),
  75.         debuggerStr("debugger"),
  76.         xmlcfgStr("xmlcfg"),
  77.         cfgChar('f'),
  78.         pserverChar('P'),
  79.         nodaemonChar('n'),
  80.         loglevelChar('l'),
  81.         debuggerChar('D'),
  82.         xmlcfgChar('x'),
  83.         myConfigFile(""),
  84.      myPservers(),
  85. myPid(getpid()),
  86. myAsDaemon(true),
  87. myLogLevel(LOG_ERR),
  88. myUnderDebugger(false),
  89.         myApplicationName(""),
  90.         myXmlCfg(false),
  91. myMutex()
  92. {
  93. }
  94. Config::~Config()
  95. {
  96. }
  97. void        
  98. Config::usage() const
  99. {
  100. }
  101.         
  102. void        
  103. Config::loadCfgFileErrorMsg(ReturnCode) const
  104. {
  105. }
  106. void        
  107. Config::loadProvisioningErrorMsg(ReturnCode) const
  108. {
  109. }
  110. ReturnCode
  111. Config::load(int argc, char ** argv)
  112. {
  113.     myMutex.writelock();
  114.     
  115.     ReturnCode  rc = SUCCESS;
  116.     // Read the command line
  117.     //    
  118.     if ( (rc = parseCmdLine(argc, argv)) != SUCCESS )
  119.     {
  120.         myMutex.unlock();
  121.         usage();
  122.         return ( rc );
  123.     }
  124.     // Load the config file
  125.     //
  126.     if ( (rc = loadCfgFile()) != SUCCESS )
  127.     {
  128.         myMutex.unlock();
  129.         loadCfgFileErrorMsg(rc);
  130.         return ( rc );
  131.     }
  132.     // Load the configuration information from provisioning.
  133.     //        
  134.     if ( (rc = loadProvisioning()) != SUCCESS )
  135.     {
  136.         myMutex.unlock();
  137.         loadProvisioningErrorMsg(rc);
  138.         return ( rc );
  139.     }
  140.     populate();
  141.     
  142.     rc = postParse();
  143.         
  144.     myMutex.unlock();
  145.     return ( rc );
  146. }
  147. string          
  148. Config::configFile() const
  149. {
  150.     ReadLock    lock(myMutex);
  151.     return ( myConfigFile );
  152. }
  153. list<IPAddress>   
  154. Config::pservers() const
  155. {
  156.     ReadLock    lock(myMutex);
  157.     return ( myPservers );
  158. }
  159. void    
  160. Config::pid()
  161. {
  162.     WriteLock    lock(myMutex);
  163.     myPid = getpid();
  164. }
  165. pid_t          
  166. Config::pid() const
  167. {
  168.     ReadLock    lock(myMutex);
  169.     return ( myPid );
  170. }
  171. bool          
  172. Config::asDaemon() const
  173. {
  174.     ReadLock    lock(myMutex);
  175.     return ( myAsDaemon );
  176. }
  177. int           
  178. Config::logLevel() const
  179. {
  180.     ReadLock    lock(myMutex);
  181.     return ( myLogLevel );
  182. }
  183. bool          
  184. Config::underDebugger() const
  185. {
  186.     ReadLock    lock(myMutex);
  187.     return ( myUnderDebugger );
  188. }
  189. string
  190. Config::applicationName() const
  191. {
  192.     ReadLock    lock(myMutex);
  193.     return ( myApplicationName );
  194. }
  195. bool                
  196. Config::xmlConfig() const
  197. {
  198.     ReadLock    lock(myMutex);
  199.     return ( myXmlCfg );
  200. }
  201. ostream & 
  202. Config::writeTo(ostream & out) const
  203. {
  204.     ReadLock    lock(myMutex);
  205.     out << myApplicationName << ": " << __DATE__ << ", " << __TIME__ 
  206.         << "n  pid:                   " << myPid
  207. << "n  log level:             " << VLog::logName(myLogLevel)
  208.      << "n  as daemon:             " << ( myAsDaemon ? "yes" : "no" )
  209.         << "n  config file:           " << myConfigFile;
  210.     
  211.     if ( myConfigFile.size() && myXmlCfg )
  212.     {
  213.         out << " as XML";
  214.     }
  215.     
  216.     out << "n  pservers:              ";
  217.     for (   list<IPAddress>::const_iterator i = myPservers.begin(); 
  218.             i != myPservers.end(); 
  219.             i++ 
  220.         )
  221.     {
  222.      out << ( i == myPservers.begin() ? "" : ", " ) << *i;
  223.     }
  224.     
  225.     out << "n  under debugger:        " << ( myUnderDebugger ? "yes" : "no" );
  226.     
  227.     return ( out );
  228. }
  229. const NameValueMap 
  230. Config::options() const
  231. {
  232.     ReadLock    lock(myMutex);
  233.     return ( myOptions.options() );
  234. }
  235. ReturnCode  
  236. Config::parseCmdLine(int argc, char ** argv)
  237. {
  238.     string  appName = argv[0];
  239.     
  240.     size_t pos = appName.rfind('/');
  241.     if ( pos != string::npos )
  242.     {
  243.         myApplicationName = appName.substr(pos+1);
  244.     }
  245.     else
  246.     {
  247.         myApplicationName = appName;
  248.     }
  249.     ReturnCode  rc = SUCCESS;
  250.     if  (   ( rc = myOptions.add(cfgStr.c_str(), cfgChar, VALUE_OPTIONAL) ) 
  251.                 != SUCCESS
  252.                 
  253.         ||  ( rc = myOptions.add(pserverStr.c_str(), pserverChar, VALUE_PRESENT) ) 
  254.                 != SUCCESS
  255.                 
  256.         ||  ( rc = myOptions.add(nodaemonStr.c_str(), nodaemonChar) ) 
  257.                 != SUCCESS
  258.                 
  259.         ||  ( rc = myOptions.add(loglevelStr.c_str(), loglevelChar, VALUE_PRESENT) ) 
  260.                 != SUCCESS
  261.                 
  262.         ||  ( rc = myOptions.add(debuggerStr.c_str(), debuggerChar) ) 
  263.                 != SUCCESS
  264.                 
  265.         ||  ( rc = myOptions.add(xmlcfgStr.c_str(), xmlcfgChar) ) 
  266.                 != SUCCESS
  267.         ||  ( rc = preParse() ) != SUCCESS
  268.         
  269.         ||  ( rc = myOptions.parse(argc, argv) ) != SUCCESS
  270.         
  271.         )
  272.     {
  273.         return ( rc );
  274.     }
  275.     const NameValueMap &    optionMap = myOptions.options();     
  276.     NameValueMap::const_iterator i;
  277.     // Load config file value.
  278.     //
  279.     if  ( (i = optionMap.find(cfgStr)) != optionMap.end() )
  280.     {
  281.         if ( i->second.type == NO_VALUE )
  282.         {
  283.             myConfigFile = myApplicationName + ".conf";
  284.         }
  285.         else
  286.         {
  287.             myConfigFile = i->second.value.back();
  288.         }
  289.     }
  290.     // Load xmlcfg value.
  291.     //
  292.     if ( (i = optionMap.find(xmlcfgStr)) != optionMap.end() )
  293.     {
  294.         myXmlCfg = true;
  295.     }
  296.     return ( rc );
  297. }
  298. ReturnCode      
  299. Config::preParse()
  300. {
  301.     return ( SUCCESS );
  302. }
  303.         
  304.         
  305. ReturnCode      
  306. Config::postParse()
  307. {
  308.     return ( SUCCESS );
  309. }
  310. ReturnCode  
  311. Config::loadCfgFile()
  312. {
  313.     if ( myConfigFile.size() == 0 )
  314.     {
  315.         // No config file to load. That's ok.
  316.         //
  317.         return ( SUCCESS );
  318.     }
  319.     ParsePair   cfgFile;
  320.     cfgFile.tagName(myApplicationName);
  321.     
  322.     ReturnCode  rc = cfgFile.parse(
  323.                         myXmlCfg ? ParsePair::CFG_XML_FILE 
  324.                                  : ParsePair::CFG_FILE,
  325.                         myConfigFile);
  326.     
  327.     if ( rc == SUCCESS )
  328.     {
  329.         const NameValueMap    & pairs = cfgFile.pairs();
  330.         for (   NameValueMap::const_iterator i = pairs.begin();
  331.                 i != pairs.end();
  332.                 ++i
  333.             )
  334.         {
  335.             myOptions.addValue(i->first, i->second);
  336.         }    
  337.         const NameValueMap &    optionMap = myOptions.options();     
  338.         NameValueMap::const_iterator i;
  339.         // Load pservers value.
  340.         //
  341.         if  (   (i = optionMap.find(pserverStr)) != optionMap.end() 
  342.             &&  i->second.type != NO_VALUE
  343.             )
  344.         {
  345.             IPAddress   pserverAddr;
  346.             const list<string> & pservers = i->second.value;
  347.             for (   list<string>::const_iterator j = pservers.begin();
  348.                     j != pservers.end();
  349.                     ++j
  350.                 )
  351.             {
  352.                 pserverAddr.setIP(j->c_str());
  353.                 myPservers.push_back(pserverAddr);
  354.             }
  355.         }
  356.     }    
  357.     
  358.     return ( rc );
  359. }
  360. ReturnCode  
  361. Config::loadProvisioning()
  362. {
  363.     if ( myPservers.size() == 0 )
  364.     {
  365.         // No pservers to load. That's ok.
  366.         //
  367.         return ( SUCCESS );
  368.     }
  369.     
  370.     // Connect to pserver here.
  371.     //
  372.     return ( SUCCESS );
  373. }
  374. void
  375. Config::populate()
  376. {
  377.     const NameValueMap &    optionMap = myOptions.options();     
  378.     NameValueMap::const_iterator i;
  379.     
  380.     // Load nodaemon value.
  381.     //
  382.     if ( (i = optionMap.find(nodaemonStr)) != optionMap.end() )
  383.     {
  384.         myAsDaemon = false;
  385.     }
  386.     
  387.     // Load log level value.
  388.     //
  389.     if  (   (i = optionMap.find(loglevelStr)) != optionMap.end() 
  390.         &&  i->second.type != NO_VALUE
  391.         )
  392.     {
  393.         myLogLevel = VLog::logValue(i->second.value.back().c_str());
  394.     }
  395.     // Load underdebugger value.
  396.     //
  397.     if ( (i = optionMap.find(debuggerStr)) != optionMap.end() )
  398.     {
  399.         myUnderDebugger = true;
  400.     }
  401. }