示例#1
0
/*
*******************************************************************
* Function: 
*
* Description: 
*    
* Parameters: 
*
* Returns: 
*
*******************************************************************
*/
void xDistributedSession::onGhostRemove()
{
	xNetInterface *netInterface  = getNetInterface();

	if (getNetInterface())
	{

		if(!getNetInterface()->IsServer())
		{
			xDistributedObjectsArrayType *distObjects = netInterface->getDistributedObjects();
			xDistObjectIt begin = distObjects->begin();
			xDistObjectIt end = distObjects->end();

			while (begin!=end)
			{
				xDistributedObject *distObject  = *begin;
				if (distObject)
				{
					xDistributedClass *_class = distObject->getDistributedClass();
					if (_class)
					{
						if (_class->getEnitityType() == E_DC_BTYPE_CLIENT )
						{
							xDistributedClient *distClient  = static_cast<xDistributedClient*>(distObject);
							if (distClient && distClient->getSessionID() == getSessionID() )
							{
								distClient->setSessionID(-1);
								disableFlag(distClient->getClientFlags(),E_CF_SESSION_JOINED);
								enableFlag(distClient->getClientFlags(),E_CF_DELETING);
								enableFlag(distClient->getClientFlags(),E_CF_SESSION_DESTROYED);

							}
						}
					}
				}
				begin++;
			}
		}
		
		if(getNetInterface()->IsServer())
		{
			xLogger::xLog(XL_START,ELOGINFO,E_LI_SESSION,"Server : Session is going to be deleted : %s",this->GetName().getString());
		}
		
		getNetInterface()->getDistObjectInterface()->removeObject(this);
		
	}
}
osg::ref_ptr<ossimPlanetImage> ossimPlanetCacheTextureLayer::getTexture(ossim_uint32 width,
                                                                        ossim_uint32 height,
                                                                        const ossimPlanetTerrainTileId& tileId,
                                                                        const ossimPlanetGrid& grid,
                                                                        ossim_int32 padding)
{
  if(!enableFlag())
  {
    return 0;
  }
  osg::ref_ptr<ossimPlanetImage> result;
  if(m_cache.valid())
  {
    result = m_cache->get(tileId);
  }

  if(!result.valid()&&m_textureLayer.valid())
  {
    result = m_textureLayer->getTexture(width, height, tileId, grid, padding);

    if(result.valid()&&m_cache.valid())
    {
      m_cache->addOrUpdate(result.get());
    }
  }
  result = applyBrightnessContrast(result.get(), true);

  return result;
}
void ossimPlanetIoSocketServerChannel::handleAccept (void)// for tcp servers we can accept
{
   netAddress addr ;
   int h = accept ( &addr ) ;
   if(h != -1)
   {
      theIoListMutex.lock();
      if(!protectedFindHandle(h))
      {
//          std::cout << "Addind a io to the handleAccept " << h << "\n";
         osg::ref_ptr<ossimPlanetIoSocket> socket = new ossimPlanetIoSocket();
         socket->setIoDirection(ossimPlanetIoDirection_IN);
         socket->setHandle(h);
			socket->setBlockingFlag(false);
			//socket->setAutoCloseOnPeerShutdownFlag(true);
			socket->setAutoReconnectFlag(false);
         if(enableFlag())
         {
            theIoList.push_back(socket.get());
//             std::cout << "Io list size === " << theIoList.size() << std::endl;
         }
      }
      theIoListMutex.unlock();
   }
}
示例#4
0
/**
 * Parses the command line, updating the flags or params according to its contents.
 * @param _argc     The argument count of the command line.
 * @param _argv     The arguments of the command line.
 * @exception UnknownArg if an argument doesn't exist
 * @exception MissingVal if a param hasn't got a value
 */
void Parser::parse (int _argc, char **_argv)
{
  int i;
  for (i=1 ; i<_argc ; i++)
  {
    try
    {
      enableFlag(_argv[i]);
    }
    catch (UnknownArg& )
    {
      //if it isn't a flag, perhaps is a param
      setParamValue(_argv[i], _argv[++i]);
    }
  }

  // after parsing the command line, check if all the required params have changed
  vector<Param>::iterator pos;

  for (pos=params.begin() ; pos!=params.end() ; pos++)
    if (pos->required() && !pos->changed())
      break;
      
  // if there is an unchanged required param ...
  if (pos!=params.end())
  {
    throw Parser::MissingReqParam(pos->shortName());
  }

};
void ossimPlanetIoSocketServerChannel::setEnableFlag(bool flag)
{
   bool clearBuffersFlag = false;
   // if we are currently going from enabled to disabled then clear the lists after we disable
   // ourselves
   if(!flag&&enableFlag())
   {
      clearBuffersFlag = true;
   }
   ossimPlanetIo::setEnableFlag(flag);
}
示例#6
0
bool pJointBall::setSwingLimit( pJointLimit limit )
{
	NxSphericalJointDesc descr;	
	NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());
	if (!joint)return false ;
	joint->saveToDesc(descr);

	if ( limit.hardness != 0.0f || limit.restitution != 0.0f || limit.value !=0.0f )
	{
		enableFlag(NX_SJF_SWING_LIMIT_ENABLED,1);
		NxJointLimitDesc sLimit;	sLimit.value  = limit.value;sLimit.restitution = limit.restitution;sLimit.hardness = limit.hardness;
		if (!sLimit.isValid())return false;
		descr.swingLimit= sLimit;
		joint->loadFromDesc(descr);
		return true;
	}else
	{
		enableFlag(NX_SJF_SWING_LIMIT_ENABLED,0);
	}
	return false;
}
osg::ref_ptr<ossimPlanetMessage> ossimPlanetIoSocketServerChannel::popMessage()
{
   osg::ref_ptr<ossimPlanetMessage> message;
   if(!enableFlag()) return message;
   theInQueueMutex.lock();
   if(!theInQueue.empty())
   {
      message = theInQueue.front();
      theInQueue.pop();
   }
   theInQueueMutex.unlock();
   
   return message;
}
void ossimPlanetPointModel::traverse(osg::NodeVisitor& nv)
{
   if(!enableFlag()||!theNode.valid())
   {
      ossimPlanetAnnotationLayerNode::traverse(nv);
      return;
   }
   switch(nv.getVisitorType())
   {
      case osg::NodeVisitor::UPDATE_VISITOR:
      {
         setRedrawFlag(false); // let's reset the redraw notification
         if(!theLsrSpaceTransform->model()&&layer()) theLsrSpaceTransform->setModel(layer()->model());
         
 //        if(checkPointers())
         {
            OpenThreads::ScopedLock<OpenThreads::Mutex> lock(thePointModelPropertyMutex);
            if(theNodeChangedFlag)
            {
               if(theLsrSpaceTransform->getNumChildren() > 0)
               {
                  theLsrSpaceTransform->removeChildren(0, theLsrSpaceTransform->getNumChildren());
               }
               theLsrSpaceTransform->addChild(theNode.get());
               theNodeChangedFlag = false;
           }
         }
         break;
      }
      case osg::NodeVisitor::CULL_VISITOR:
      {
         break;
      }
      default:
      {
         break;
      }
   }
   
   theLsrSpaceTransform->accept(nv);
   ossimPlanetAnnotationLayerNode::traverse(nv);
}
void ossimPlanetIoSocketServerChannel::handleRead (void) // for udp servers we can read
{
   netAddress addr ;
   accept ( &addr ) ;
   int h = getHandle();
   if(h > -1)
   {
      theIoListMutex.lock();
      if(!protectedFindHandle(h))
      {
         osg::ref_ptr<ossimPlanetIoSocket> socket = new ossimPlanetIoSocket();
         socket->setIoDirection(ossimPlanetIoDirection_IN);
			//socket->setAutoCloseOnPeerShutdownFlag(true);
			socket->setAutoReconnectFlag(false);
         socket->setHandle(getHandle());
         if(enableFlag())
         {
            theIoList.push_back(socket.get());
         }
//          std::cout << "List size = " << theIoList.size() << "\n";;
      }
      theIoListMutex.unlock();
   }
}
void ossimPlanetIoSocketServerChannel::performIo()
{
   OpenThreads::ScopedLock<OpenThreads::Mutex> lock(theSocketMutex);
   if(handle() < 0)
   {
      if(theAutoReconnectFlag)
      {
         if(theLastTick == 0)
         {
            theLastTick = osg::Timer::instance()->tick();
            return;
         }
         else 
         {
				double delta = osg::Timer::instance()->delta_m(theLastTick, osg::Timer::instance()->tick());
				
				if(delta < 0.0)
				{
					theLastTick = 0;
				}
				else if(delta > theAutoReconnectInterval)
				{
					theLastTick = 0; // reset the next try
					if(!protectedSetSocket(theHost, thePort, theIoType))
					{
						return;
					}
					else if(handle() < 0)// Quick test again to make sure its valid
					{
						return;
					}
				}
				else // we were not able to update the handle yet so return, still invalid
				{
					return;
				}
			}
		}
		else// we were not able to update the handle yet so return, still invalid
		{
			return;
		}
   }
      
   // poll for additional I/O connections
   poll(10);
   
   // handle any current connections and process the messages.
   OpenThreads::ScopedLock<OpenThreads::Mutex> lockList(theIoListMutex);
   std::vector<osg::ref_ptr<ossimPlanetIo> >::iterator iter = theIoList.begin();
   while(iter!=theIoList.end())
   {
      
      osg::ref_ptr<ossimPlanetMessage> msg;
      // perform IO
      (*iter)->performIo();
      
      // now pop any message for handling
      //
      while((msg=(*iter)->popMessage()).valid())
      {
         theInQueueMutex.lock();
         if(enableFlag())
         {
            theInQueue.push(msg);
         }
         else
         {
            while(!theInQueue.empty())
            {
               theInQueue.pop();
            }
         }
         theInQueueMutex.unlock();
      }
      // check to see if it's been marked as finished and if so remove from the list
      if((*iter)->finishedFlag())
      {
         iter = theIoList.erase(iter);
      }
      else
      {
         ++iter;
      }
   }
}
void ossimPlanetKmlScreenOverlayNode::traverse(osg::NodeVisitor& nv)
{
   if(!enableFlag()) return;
   switch(nv.getVisitorType())
   {
      case osg::NodeVisitor::UPDATE_VISITOR:
      {
         if(theViewport.valid()&&theViewportChangedFlag)
         {
            theCameraNode->setProjectionMatrix(osg::Matrix::ortho2D(theViewport->x(),
                                                                    theViewport->width(),
                                                                    theViewport->y(),
                                                                    theViewport->height()));
            theViewportChangedFlag = false;
            update();
        }

         if(theNeedsUpdateFlag)
         {
            update();
         }
         break;
      }
      case osg::NodeVisitor::CULL_VISITOR:
      {
         osgUtil::CullVisitor* cullVisitor = dynamic_cast<osgUtil::CullVisitor*>(&nv);
         if(cullVisitor)
         {
            double x = cullVisitor->getViewport()->x();
            double y = (int)cullVisitor->getViewport()->y();
            double w = (int)cullVisitor->getViewport()->width();
            double h = (int)cullVisitor->getViewport()->height();
            if(!theViewport.valid())
            {
               theViewport = new osg::Viewport(x,y,w,h);
               theViewportChangedFlag = true;
            }
            else
            {
               if( !ossim::almostEqual(theViewport->x(), x)||
                   !ossim::almostEqual(theViewport->y(), y)||
                   !ossim::almostEqual(theViewport->width(), w)||
                   !ossim::almostEqual(theViewport->height(), h))
               {
                  theViewport->setViewport(x,y,w,h);
                  theViewportChangedFlag = true;
               }
            }
         }
         break;
      }
      default:
      {
         if(dynamic_cast<osgUtil::IntersectVisitor*>(&nv))
         {
            return;
         }
         break;
      }
   }
         // if the viewport is valid and we have been setup to draw for the current viewport
         //
   if(theViewport.valid())
   {
      theGroup->accept(nv);
   }
}
void ossimPlanetAnnotationPlacemark::traverse(osg::NodeVisitor& nv)
{
	if(!enableFlag()) return;
   if(!isStaged())
   {
      return;
   }
   bool needRedraw = false;
	OpenThreads::ScopedLock<OpenThreads::Mutex> lock(theUpdateMutex);
   switch(nv.getVisitorType())
   {
      case osg::NodeVisitor::UPDATE_VISITOR:
      {
			if(isDirtyBitSet(LABEL_DIRTY)&&theLabel.valid())
         {
            needRedraw = true;
            if(theLabel.valid())
            {
               theLabel->setText(name().c_str());
            }
				clearDirtyBit(LABEL_DIRTY);
         }
			if(isDirtyBitSet(COLOR_DIRTY))
			{
				if(theLabelStyle.valid()&&theLabel.valid())
				{
					needRedraw = true;
					if(theLabelStyle->colorMode() == ossimPlanetAnnotationColorMode_NORMAL)
					{
						theLabel->setColor(theLabelStyle->color());
					}
					else
					{
						theLabel->setColor(osg::Vec4d((ossim_float64)rand()/(ossim_float64)RAND_MAX,
																(ossim_float64)rand()/(ossim_float64)RAND_MAX,
																(ossim_float64)rand()/(ossim_float64)RAND_MAX,
																theLabel->getColor()[3]));
					}
				}
				clearDirtyBit(COLOR_DIRTY);
			}
         if(theExpireTime.valid())
         {
            if(theExpireTime->hasExpired())
            {
               if(theLayer)
               {
                  theLayer->needsRemoving(this);
               }
            }
            needRedraw = true;
         }
         break;
      }
      default:
      {
         break;
      }
   }
   if(theExpireTime.valid())
   {
      setRedrawFlag(true);
   }
   osg::ref_ptr<ossimPlanetAnnotationGeometry> geom = geometry();
   if(geom.valid())
   {
      geom->traverse(nv);
   }
   ossimPlanetAnnotationLayerNode::traverse(nv);
   if(needRedraw) setRedrawFlag(true);
}
示例#13
0
/*
*******************************************************************
* Function: 
*
* Description: 
*    
* Parameters: 
*
* Returns: 
*
*******************************************************************
*/
void xDistributedSession::removeUser(xDistributedClient *client)
{
	xNetInterface *nInterface = getNetInterface();
	if (!nInterface)
	{
		return;
	}


	xDistributedClient *myClient  = nInterface->getMyClient();
	if (client && myClient && client->getUserID() == myClient->getUserID())
	{
		myClient->setSessionID(-1);
	}

	if (client)
	{
		if (isClientJoined(client->getUserID()))
		{

			//////////////////////////////////////////////////////////////////////////
			if (client->getUserID() == getUserID())
			{
				xLogger::xLog(XL_START,ELOGINFO,E_LI_SESSION,"Session master %d left session %d",client->getUserID(),getSessionID());
				
				if (nInterface)
				{

					//////////////////////////////////////////////////////////////////////////
					//we tag all existing users as new : 
					
					IDistributedObjects *doInterface  = nInterface->getDistObjectInterface();
					xDistributedObjectsArrayType *distObjects = nInterface->getDistributedObjects();
					xDistObjectIt begin = distObjects->begin();
					xDistObjectIt end = distObjects->end();

					while (begin!=end)
					{
						xDistributedObject *distObject  = *begin;
						if (distObject)
						{
							xDistributedClass *_class = distObject->getDistributedClass();
							if (_class)
							{
								if (_class->getEnitityType() == E_DC_BTYPE_CLIENT )
								{
									xDistributedClient *distClient  = static_cast<xDistributedClient*>(distObject);
									if (distClient && isClientJoined(distClient->getUserID()))
									{
										if (isFlagOn(distClient->getClientFlags(),E_CF_SESSION_JOINED))
										{

											//distClient->setSessionID(-1);
											disableFlag(distClient->getClientFlags(),E_CF_SESSION_JOINED);
											enableFlag(distClient->getClientFlags(),E_CF_DELETING);
											enableFlag(distClient->getClientFlags(),E_CF_SESSION_DESTROYED);
											xLogger::xLogExtro(0,"\tRemoving user %d from session",distClient->getUserID(),getSessionID());
										}
									}
								}
							}
						}
						begin++;
					}

					getClientTable().clear();
					goto ENDUPDATE;
					return;
				}
			}
		}
		if (client->getUserID() != getUserID())
		{
			enableFlag(client->getClientFlags(),E_CF_REMOVED);
			client->setSessionID(-1);
		}
		//////////////////////////////////////////////////////////////////////////
		for(int i = 0 ; i < getClientTable().size() ; i++)
		{

			std::vector<xDistributedClient*>::iterator begin = getClientTable().begin();
			std::vector<xDistributedClient*>::iterator end = getClientTable().end();
			while (begin !=end)
			{
				xDistributedClient *current = *begin;
				if (current && current->getUserID()  == client->getUserID() )
				{
                    getClientTable().erase(begin);						
				}
				begin++;
			}
		}

		goto ENDUPDATE;

		ENDUPDATE :
		xDistributedInteger *numUser= (xDistributedInteger *)getProperty(E_DC_S_NP_NUM_USERS);
		numUser->updateValue(getClientTable().size(),0);
		setNumUsers(getClientTable().size());
		int blockIndex = numUser->getBlockIndex();
		getUpdateBits().set(1<<blockIndex,true);
		setMaskBits(1<<blockIndex);
	}else
		xLogger::xLog(XL_START,ELOGERROR,E_LI_SESSION,"couldn't find client object");

	
	
}