/*! read server cababilities
 */
void SortLastWindow::clientInit( void )
{
    getNetwork()->getAspect()->addFieldFilter(Node::getClassType().getId(),
                                              Node::VolumeFieldMask);
    getNetwork()->getAspect()->addFieldFilter(Node::getClassType().getId(),
                                              Node::TravMaskFieldMask);

    // create default composer
    if(getComposer() == NULL)
    {
/*
        FieldContainerPtr fcPtr = 
            FieldContainerFactory::the()->createFieldContainer("BinarySwapComposer");
        setComposer(ImageComposerPtr::dcast(fcPtr));
*/
    }
    if(getComposer() != NULL)
    {
        SortLastWindow *clusterWindow(this);
        getComposer()->setup(true,
                             getMFServers()->size32(),
                             getClientWindow(),
                             clusterWindow);
        getComposer()->open();
        // build node groups
        buildGroups();
    }
}
/* ------------------------ KinematicModel ------------------------ */
planning_models::KinematicModel::KinematicModel(const urdf::Model &model, 
                                                const std::vector<GroupConfig>& group_configs,
                                                const std::vector<MultiDofConfig>& multi_dof_configs)
{    
  model_name_ = model.getName();
  if (model.getRoot())
  {
    const urdf::Link *root = model.getRoot().get();
    root_ = buildRecursive(NULL, root, multi_dof_configs);
    buildGroups(group_configs);
  }
  else
  {
    root_ = NULL;
    ROS_WARN("No root link found");
  }
}
void OUILookup::buildLookupTable(const std::string &ouiListFile)
{
  lookup_.clear();
  std::vector< std::vector< std::string > > groups = buildGroups(
        readFile( ouiListFile ) );
  for( uint32_t i = 1; i < groups.size(); ++i ) //0 group is informational
  {
    std::vector< std::string > group = groups[i];
    uint32_t oui = parseOUI( group[1] );
    std::string company = parseCompany( group[1] );
    std::string address = "";
    for( uint32_t i = 2; i < (group.size() - 1); ++i )
    {
      address += group[i];
    }
    std::string country = group[ group.size() - 1 ];
    lookup_[ oui ].company = company;
    lookup_[ oui ].address = address;
    lookup_[ oui ].country = country;
  }
}
/*! client frame init
 */
void SortLastWindow::clientPreSync( void )
{
    if(getClientWindow() != NULL)
    {
        UInt32 width =getClientWindow()->getWidth();
        UInt32 height=getClientWindow()->getHeight();
        if(width == 0)
            width = 2;
        if(height == 0)
            height = 2;
        if(width  != getWidth() ||
           height != getHeight())
        {
           setSize(width,height);
        }
    }
    
    Inherited::clientPreSync();

    // rebuild node groups
    buildGroups();
}
void planning_models::KinematicModel::copyFrom(const KinematicModel &source)
{
  model_name_ = source.model_name_;

  if (source.root_)
  {
    root_ = copyRecursive(NULL, source.root_->child_link_model_);
    

    const std::map<std::string, JointModelGroup*>& source_group_map = source.getJointModelGroupMap();
    std::map< std::string, std::vector<std::string> > groupContent;
    std::vector<GroupConfig> group_configs;
    std::vector<std::string> empty_strings;
    for(std::map<std::string, JointModelGroup*>::const_iterator it = source_group_map.begin();
        it != source_group_map.end();
        it++) {
      group_configs.push_back(GroupConfig(it->first, it->second->getJointModelNames(), empty_strings));
    }
    buildGroups(group_configs);
  } else 
  {
    root_ = NULL;
  }
}