pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/common/ModelDatabase.hh

163 lines
5.9 KiB
C++

/*
* Copyright (C) 2012 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifndef _GAZEBO_MODELDATABSE_HH_
#define _GAZEBO_MODELDATABSE_HH_
#include <string>
#include <map>
#include <utility>
#include <boost/function.hpp>
#include "gazebo/common/Event.hh"
#include "gazebo/common/SingletonT.hh"
#include "gazebo/common/CommonTypes.hh"
#include "gazebo/util/system.hh"
/// \brief The file name of model XML configuration.
#define GZ_MODEL_MANIFEST_FILENAME "model.config"
/// \brief The file name of model database XML configuration.
#define GZ_MODEL_DB_MANIFEST_FILENAME "database.config"
namespace gazebo
{
namespace common
{
/// \brief Forward declare private data class.
class ModelDatabasePrivate;
/// \addtogroup gazebo_common Common
/// \{
/// \class ModelDatabase ModelDatabase.hh common/common.hh
/// \brief Connects to model database, and has utility functions to find
/// models.
class GZ_COMMON_VISIBLE ModelDatabase : public SingletonT<ModelDatabase>
{
/// \brief Constructor. This will update the model cache
private: ModelDatabase();
/// \brief Destructor
private: virtual ~ModelDatabase();
/// \brief Start the model database.
/// \param[in] _fetchImmediately True to fetch the models without
/// waiting.
public: void Start(bool _fetchImmediately = false);
/// \brief Finalize the model database.
public: void Fini();
/// \brief Returns the the global model database URI.
/// \return the URI.
public: std::string GetURI();
/// \brief Returns the dictionary of all the model names
///
/// This is a blocking call. Which means it will wait for the
/// ModelDatabase to download the model list.
/// \return a map of model names, indexed by their full URI.
public: std::map<std::string, std::string> GetModels();
/// \brief Get the dictionary of all model names via a callback.
///
/// This is the non-blocking version of ModelDatabase::GetModels
/// \param[in] _func Callback function that receives the list of
/// models.
/// \return A boost shared pointer. This pointer must remain valid in
/// order to receive the callback.
public: event::ConnectionPtr GetModels(boost::function<
void (const std::map<std::string, std::string> &)> _func);
/// \brief Get the name of a model based on a URI.
///
/// The URI must be fully qualified:
/// http://gazebosim.org/gazebo_models/ground_plane or
/// model://gazebo_models
/// \param[in] _uri the model uri
/// \return the model's name.
public: std::string GetModelName(const std::string &_uri);
/// \brief Return the model.config file as a string.
/// \return The model config file from the model database.
public: std::string GetModelConfig(const std::string &_uri);
/// \brief Return the database.config file as a string.
/// \return The database config file from the model database.
public: std::string GetDBConfig(const std::string &_uri);
/// \brief Get the local path to a model.
///
/// Get the path to a model based on a URI. If the model is on
/// a remote server, then the model fetched and installed locally.
/// \param[in] _uri the model uri
/// \param[in] _forceDownload True to skip searching local paths.
/// \return path to a model directory
public: std::string GetModelPath(const std::string &_uri,
bool _forceDownload = false);
/// \brief Get a model's SDF file based on a URI.
///
/// Get a model file based on a URI. If the model is on
/// a remote server, then the model fetched and installed locally.
/// \param[in] _uri The URI of the model
/// \return The full path and filename to the SDF file
public: std::string GetModelFile(const std::string &_uri);
/// \brief Download all dependencies for a give model path
///
/// Look's in the model's manifest file (_path/model.config)
/// for all models listed in the <depend> block, and downloads the
/// models if necessary.
/// \param[in] _path Path to a model.
public: void DownloadDependencies(const std::string &_path);
/// \brief Returns true if the model exists on the database.
///
/// \param[in] _modelName URI of the model (eg:
/// model://my_model_name).
/// \return True if the model was found.
public: bool HasModel(const std::string &_modelName);
/// \brief A helper function that uses CURL to get a manifest file.
/// \param[in] _uri URI of a manifest XML file.
/// \return The contents of the manifest file.
private: std::string GetManifestImpl(const std::string &_uri);
/// \brief Used by a thread to update the model cache.
/// \param[in] _fetchImmediately True to fetch the models without
/// waiting.
private: void UpdateModelCache(bool _fetchImmediately);
/// \brief Used by ModelDatabase::UpdateModelCache,
/// no one else should use this function.
private: bool UpdateModelCacheImpl();
/// \brief Private data.
private: ModelDatabasePrivate *dataPtr;
/// \brief Singleton implementation
private: friend class SingletonT<ModelDatabase>;
/// \brief Handy trick to automatically call a singleton's
/// constructor.
private: static ModelDatabase *myself;
};
}
}
#endif