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

流媒体/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 Service_cxx_Version = 
  51.     "$Id: Service.cxx,v 1.6 2001/06/27 23:12:00 bko Exp $";
  52. #include "Service.hxx"
  53. #include "VException.hxx"
  54. #include "VLog.hxx"
  55. #include <cassert>
  56. using Vocal::Services::Service;
  57. using Vocal::Services::Event;
  58. using Vocal::Behavioral::EventObserver;
  59. using Vocal::Behavioral::EventSubject;
  60. using Vocal::Logging::VLog;
  61. using Vocal::ReturnCode;
  62. using Vocal::SUCCESS;
  63. Service::Service(
  64.     FifoBase< Sptr<Event> >  &   serviceMgrFifo,
  65.     const char            *   name
  66. )
  67.     : myServiceManagerFifo(serviceMgrFifo),
  68.      myName(name ? name : "Service")
  69. {
  70. }
  71. Service::~Service()
  72. {
  73. }
  74. FifoBase< Sptr<Event> > &   
  75. Service::getServiceManagerFifo()
  76. {
  77.     return ( myServiceManagerFifo );
  78. }
  79. const FifoBase< Sptr<Event> > &   
  80. Service::getServiceManagerFifo() const
  81. {
  82.     return ( myServiceManagerFifo );
  83. }
  84. EventSubject< Sptr<Event> > &   
  85. Service::getEventSubject()
  86. {
  87.     return ( mySubject );
  88. }
  89. const EventSubject< Sptr<Event> > &   
  90. Service::getEventSubject() const
  91. {
  92.     return ( mySubject );
  93. }
  94. ReturnCode       
  95. Service::run()
  96. {
  97.     const string    fn("Service::run");
  98.     VLog         log(fn);
  99.     VDEBUG(log) << fn << ": " << myName << " starting." << VDEBUG_END(log);
  100.     ReturnCode     rc = SUCCESS;
  101.     bool         done = false;
  102.     while ( !done )
  103.     {
  104.      int numberMsgActive = 0;
  105.      // Wait for activity.
  106. //
  107.      try
  108. {
  109.          VVERBOSE(log)<< fn << ": before wait"
  110.            << ", number msgs active = " << numberMsgActive
  111.  << VVERBOSE_END(log);
  112.             numberMsgActive = getFifo().block();
  113.          VVERBOSE(log) << fn << ": after wait"
  114.             << ", number msgs active = " << numberMsgActive
  115.             << VVERBOSE_END(log);
  116. }
  117. catch ( VException & exception )
  118. {
  119.     done = onVException(exception);
  120.          if ( done )
  121.     {
  122.      rc = exception.getError();
  123.     }
  124.     continue;
  125. }
  126. catch ( ... )
  127. {
  128.     done = onException();
  129.     
  130.     if ( done )
  131.     {
  132.      rc = !SUCCESS;
  133.     }
  134.     continue;
  135. }
  136.      // Process the messages.
  137. //
  138.      try
  139. {
  140.          done = processMessages(numberMsgActive);
  141. }
  142. catch ( VException & exception )
  143. {
  144.     done = onVException(exception);
  145.     
  146.     if ( done )
  147.     {
  148.      rc = exception.getError();
  149.     }
  150.     continue;
  151. }
  152. catch ( ... )
  153. {
  154.     done = onException();
  155.     
  156.     if ( done )
  157.     {
  158.      rc = !SUCCESS;
  159.     }
  160.     continue;
  161. }
  162.     }
  163.     VDEBUG(log) << fn << ": " << myName << " exiting"
  164.      << ", rc = " << rc << VDEBUG_END(log);
  165.     return ( rc );
  166. }
  167. void          
  168. Service::subscribe(EventObserver< Sptr<Event> > & observer)
  169. {
  170.     const string    fn("Service::subscribe");
  171.     VLog         log(fn);
  172.     
  173.     VDEBUG(log) << fn << ": observer = " << observer << VDEBUG_END(log);
  174.     
  175.     mySubject.attach(observer);
  176.     VVERBOSE(log) << fn << ": subject = { " << mySubject << " }" << VVERBOSE_END(log);
  177. }
  178. void          
  179. Service::unsubscribe(EventObserver< Sptr<Event> > & observer)
  180. {
  181.     const string    fn("Service::unsubscribe");
  182.     VLog         log(fn);
  183.     
  184.     VDEBUG(log) << fn << ": observer = " << observer << VDEBUG_END(log);
  185.     
  186.     mySubject.detach(observer);
  187.     VVERBOSE(log) << fn << ": subject = { " << mySubject << " }" << VVERBOSE_END(log);
  188. }
  189. ostream &           
  190. Service::writeTo(ostream & out) const
  191. {
  192.     return ( out << myName << ", subject = " << mySubject );
  193. }
  194. const string &
  195. Service::name() const
  196. {
  197.     return ( myName );
  198. }
  199. ReturnCode
  200. Service::onStart()
  201. {
  202.     return ( SUCCESS );
  203. }
  204. ReturnCode
  205. Service::onStop()
  206. {
  207.     return ( SUCCESS );
  208. }
  209. void     
  210. Service::onShutdown()
  211. {
  212. }
  213. bool     
  214. Service::onVException(VException & exception)
  215. {
  216.     const string    fn("Service::onException");
  217.     VLog         log(fn);
  218.     
  219.     VDEBUG(log) << fn << ": ignoring." << VDEBUG_END(log);
  220.     return ( false );
  221. }
  222. bool     
  223. Service::onException()
  224. {
  225.     const string    fn("Service::onException");
  226.     VLog         log(fn);
  227.     
  228.     VDEBUG(log) << fn << ": doing a hardShutdown." << VDEBUG_END(log);
  229.     hardShutdown(!SUCCESS);
  230.     return ( true );
  231. }
  232. bool     
  233. Service::processMessages(int)
  234. {
  235.     const string    fn("Service::processMessages");
  236.     VLog         log(fn);
  237.     
  238.     bool         done = false;
  239.     while ( getFifo().messageAvailable() )
  240.     {
  241.      VVERBOSE(log) << fn << ": before getMessage." << VVERBOSE_END(log);
  242.      Sptr<Event> event;
  243.      try
  244. {
  245.          event = getFifo().getNext();
  246. }
  247. catch ( ... )
  248. {
  249.     // We checked messageAvailable, so we shouldn't ever get here.
  250.     //
  251.     assert(0);
  252. }
  253.      Sptr<ControlEvent> ctrlEvent;
  254.      ctrlEvent.dynamicCast(event);
  255.      // Service control events detected. Call the appropriate
  256. // Service callbacks.
  257. //
  258.      if ( ctrlEvent != 0 )
  259.      {
  260.     VDEBUG(log) << fn << ": event = { " << *ctrlEvent 
  261.      << " }" << VDEBUG_END(log);
  262.          switch ( ctrlEvent->getType() )
  263.          {
  264. case ControlEvent::START:
  265. {
  266.     start(ctrlEvent);
  267.     break;
  268. }
  269. case ControlEvent::STOP:
  270. {
  271.     stop(ctrlEvent);
  272.     break;
  273. }
  274. case ControlEvent::SHUTDOWN:
  275. {
  276.     shutdown(ctrlEvent);
  277.     done = true;
  278.     break;
  279. }
  280. default:
  281. {
  282.     // Perhaps someone has derived off of the 
  283.     // ControlEvent and wants to see it.
  284.     //
  285.     mySubject.setEvent(event);
  286.     break;
  287. }
  288.     }
  289.      }
  290.      // Unknown event, give it to the EventSubject to distribute it
  291. // to interested observers.
  292. //
  293. else
  294. {
  295.     mySubject.setEvent(event);
  296. }
  297.     }
  298.     return ( done );
  299. }
  300. void     
  301. Service::hardShutdown(ReturnCode errorCode)
  302. {
  303.     const string    fn("Service::hardShutdown");
  304.     VLog         log(fn);
  305.     VDEBUG(log) << fn << ": stopping service"
  306.           << ", error = " << errorCode << VDEBUG_END(log);
  307.     shutdown(0);
  308.     Sptr<ControlEvent> stopEvent 
  309.      = new ControlEvent(ControlEvent::STOP, getFifo());
  310.     stopEvent->setReturnCode(errorCode);
  311.     
  312.     myServiceManagerFifo.add(stopEvent);
  313.     VDEBUG(log) << fn << ": shutting down service"
  314.           << ", error = " << errorCode << VDEBUG_END(log);
  315.     
  316.     Sptr<ControlEvent> shutdownEvent 
  317.      = new ControlEvent(ControlEvent::SHUTDOWN, getFifo());
  318.     shutdownEvent->setReturnCode(errorCode);
  319.     myServiceManagerFifo.add(shutdownEvent);
  320. }
  321. void     
  322. Service::start(Sptr<ControlEvent> startEvent)
  323. {
  324.     const string    fn("Service::start");
  325.     VLog         log(fn);
  326.     ReturnCode      rc = SUCCESS;
  327.     
  328.     FifoBase< Sptr<Event> > * serviceMgrFifo = startEvent->getReplyFifo();
  329.     if ( !serviceMgrFifo || *serviceMgrFifo != myServiceManagerFifo )
  330.     {
  331.      VWARN(log)  << fn << ": received unathorized start event, event = "
  332.          << *startEvent << VWARN_END(log);
  333.         rc = !SUCCESS;
  334.     }
  335.     else
  336.     {
  337.         rc = onStart();
  338.     }
  339.     startEvent->setReturnCode(rc);
  340.     serviceMgrFifo->add(startEvent);
  341.     VDEBUG(log) << fn << ": returning start = " << *startEvent 
  342.           << VDEBUG_END(log);
  343. }
  344. void     
  345. Service::stop(Sptr<ControlEvent> stopEvent)
  346. {
  347.     const string    fn("Service::onStop");
  348.     VLog         log(fn);
  349.     
  350.     ReturnCode      rc = SUCCESS;
  351.     
  352.     FifoBase< Sptr<Event> > * serviceMgrFifo = stopEvent->getReplyFifo();
  353.     
  354.     if ( !serviceMgrFifo || *serviceMgrFifo != myServiceManagerFifo )
  355.     {
  356.      VWARN(log)  << fn << ": received unathorized stop event, event = "
  357.          << *stopEvent << VWARN_END(log);
  358.                     
  359.         rc = !SUCCESS;
  360.     }
  361.     else
  362.     {
  363.         rc = onStop();
  364.     }
  365.     stopEvent->setReturnCode(rc);
  366.     serviceMgrFifo->add(stopEvent);
  367.     VDEBUG(log) << fn << ": returning stop = " << *stopEvent 
  368.           << VDEBUG_END(log);
  369. }
  370. void     
  371. Service::shutdown(Sptr<ControlEvent> shutdownEvent)
  372. {
  373.     const string    fn("Service::onShutdown");
  374.     VLog         log(fn);
  375.     
  376.     if ( shutdownEvent == 0 )
  377.     {
  378.      VDEBUG(log) << fn << ": hard shutdown." << VDEBUG_END(log);
  379. return;
  380.     }
  381.     
  382.     FifoBase< Sptr<Event> > * serviceMgrFifo = shutdownEvent->getReplyFifo();
  383.     
  384.     if ( !serviceMgrFifo || *serviceMgrFifo != myServiceManagerFifo )
  385.     {
  386.      VWARN(log)  << fn << ": received unathorized shutdown event, event = "
  387.          << *shutdownEvent << VWARN_END(log);
  388.         return;
  389.     }
  390.     onShutdown();
  391.     
  392.     VDEBUG(log) << fn << ": recevied shutdown = " << *shutdownEvent 
  393.           << VDEBUG_END(log);
  394. }