30void* Port::needImplementation()
const
32 if (implementation !=
nullptr) {
33 return implementation;
35 Port* self =
const_cast<Port*
>(
this);
39 return self->implementation;
43#define IMPL() (*reinterpret_cast<yarp::os::impl::PortCoreAdapter*>(needImplementation()))
53 if (implementation !=
nullptr) {
58 implementation =
nullptr;
69 implementation = port.implementation;
86 return open(contact, registerName,
nullptr);
94 yCError(
PORT,
"YARP not initialized; create a yarp::os::Network object before using ports");
116 if (
n.empty() &&
contact2.getPort() <= 0) {
118 registerName =
false;
126 if (!
n.empty() &&
n[0] !=
'/' &&
n[0] !=
'=' &&
n !=
"..." &&
n.substr(0, 3) !=
"...") {
128 yCError(
PORT,
"Port name '%s' needs to start with a '/' character",
n.c_str());
132 if (!
n.empty() &&
n !=
"..." &&
n[0] !=
'=' &&
n.substr(0, 3) !=
"...") {
135 if (!prefix.empty()) {
144 if (!
nc.getNestedName().empty()) {
145 if (
nc.getCategory().empty()) {
159 yCError(
PORT,
"Error: Port '%s' is not committed to being either an input or output port.",
n.c_str());
160 yCError(
PORT,
"YARP does not mind, but we are trying to register with a name server that does.");
161 yCError(
PORT,
"You can call Port::setWriteOnly() or Port::setReadOnly(), OR rename the port.");
163 nc2.setCategoryWrite();
164 yCError(
PORT,
"For an output port, call it: %s (+ adds data)",
nc2.toString().c_str());
165 nc2.setCategoryRead();
166 yCError(
PORT,
"For an input port, call it: %s (- takes data)",
nc2.toString().c_str());
181 if (
currentCore->checkAdminPortReader() !=
nullptr) {
217 address.setNestedContact(
contact2.getNested());
221 registerName =
false;
228 if (!
nc.getTypeName().empty()) {
245 if (registerName && !local) {
249 core.setControlRegistration(registerName);
255 nc.fromString(address.getName());
256 if (!
nc.getNestedName().empty()) {
257 if (
nc.getCategory() ==
"+1") {
263 std::string
blame =
"invalid address";
266 blame =
"address conflict";
269 blame =
"manager did not start";
273 address =
core.getAddress();
274 if (registerName && local) {
275 contact2.setSocket(address.getCarrier(),
278 contact2.setName(address.getRegName());
281 address =
core.getAddress();
282 }
else if (
core.getAddress().getRegName().empty() && !registerName) {
283 core.resetPortName(
core.getAddress().toURI(
false));
284 core.setName(
core.getAddress().getRegName());
287 if (address.getRegName().empty()) {
289 "Anonymous port active at %s",
290 address.toURI().c_str());
293 "Port %s active at %s",
294 address.getRegName().c_str(),
295 address.toURI().c_str());
301 blame =
"unmanaged port failed to start";
307 "Port %s failed to activate%s%s (%s)",
309 (address.
isValid() ?
" at " :
""),
337 core.finishReading();
338 core.finishWriting();
356 if (!
core.isInterrupted()) {
367 return core.getAddress();
374 if (
core.commitToRead) {
377 if (
core.isInterrupted()) {
385 name = contact.
toURI();
387 if (!
core.isListening()) {
398 if (
core.isInterrupted()) {
404 result =
core.send(writer,
nullptr, callback);
407 if (callback !=
nullptr) {
422 if (
core.isInterrupted()) {
428 result =
core.send(writer, &reader, callback);
430 if (callback !=
nullptr) {
450 if (
core.isInterrupted()) {
453 return core.
read(reader, willReply);
460 return core.reply(writer,
false,
core.isInterrupted());
466 return core.reply(writer,
true,
core.isInterrupted());
474 core.configReader(reader);
480 core.configAdminReader(reader);
536 core.describe(reporter);
543 core.setReportCallback(&reporter);
550 core.resetReportCallback();
566#define SET_FLAG(implementation, mask, val) \
567 IMPL().setFlags((IMPL().getFlags() & (~(mask))) + ((val) ? (mask) : 0))
595 IMPL().setTimeout(timeout);
599#ifndef YARP_NO_DEPRECATED
633 if (implementation ==
nullptr) {
636 return IMPL().active;
641 return IMPL().configCallbackLock(mutex);
646 return IMPL().unconfigCallbackLock();
655 "Cannot do lockCallback() without setCallbackLock() before opening port");
void cat(Vector &a, const Vector &b)
#define PORTCORE_IS_INPUT
#define PORTCORE_IS_OUTPUT
#define SET_FLAG(implementation, mask, val)
RandScalar * implementation(void *t)
A simple collection of objects that can be described and transmitted in a portable way.
A mini-server for performing network communication in the background.
Type getType() override
Get the type of data the port has committed to send/receive.
void promiseType(const Type &typ) override
Commit the port to a particular type of data.
Property * acquireProperties(bool readOnly) override
Access unstructured port properties.
std::string getName() const override
Get name of port.
bool tryLockCallback() override
Try to lock callbacks until unlockCallback() is called.
bool getEnvelope(PortReader &envelope) override
Get the envelope information (e.g., a timestamp) from the last message received on the port.
void close() override
Stop port activity.
void releaseProperties(Property *prop) override
End access unstructured port properties.
bool setEnvelope(PortWriter &envelope) override
Set an envelope (e.g., a timestamp) to the next message which will be sent.
void interrupt() override
Interrupt any current reads or writes attached to the port.
int getInputCount() override
Determine how many connections are arriving into this port.
bool isWriting() override
Report whether the port is currently writing data.
T * read(bool shouldWait=true) override
Read an available object from the port.
bool addOutput(const std::string &name) override
Add an output connection to the specified port.
int getOutputCount() override
Determine how many output connections this port has.
void unlockCallback() override
Unlock callbacks.
static bool initialized()
Returns true if YARP has been fully initialized.
static bool connect(const std::string &src, const std::string &dest, const std::string &carrier="", bool quiet=true)
Request that an output port connect to an input port.
static Contact registerContact(const Contact &contact)
Register contact information with the name server.
static bool localNetworkAllocation()
Check where the name server in use expects processes to allocate their own network resources.
Interface implemented by all objects that can read themselves from the network, such as Bottle object...
A base class for objects that want information about port status changes.
Interface implemented by all objects that can write themselves to the network, such as Bottle objects...
virtual void onCompletion() const
This is called when the port has finished all writing operations.
A mini-server for network communication.
void setReaderCreator(PortReaderCreator &creator)
Set a creator for readers for port data.
void enableBackgroundWrite(bool backgroundFlag)
control whether writing from this port is done in the background.
int getOutputCount() override
Determine how many output connections this port has.
bool write(const PortWriter &writer, const PortWriter *callback=nullptr) const override
Write an object to the port.
void setReader(PortReader &reader) override
Set an external reader for port data.
Contact where() const override
Returns information about how this port can be reached.
bool getEnvelope(PortReader &envelope) override
Get the envelope information (e.g., a timestamp) from the last message received on the port.
Type getType() override
Get the type of data the port has committed to send/receive.
void setRpcMode(bool expectRpc) override
Configure the port to be RPC only.
bool removeCallbackLock() override
Remove a lock on callbacks added with setCallbackLock()
bool sharedOpen(Port &port)
Open a port wrapping an existing port.
void setAdminMode(bool adminMode=true)
Turn on/off "admin" mode.
void setAdminReader(PortReader &reader) override
Set an external reader for unrecognized administrative port messages.
int getVerbosity()
Get port verbosity level.
void resume() override
Put the port back in an operative state after interrupt() has been called.
bool tryLockCallback() override
Try to lock callbacks until unlockCallback() is called.
bool addOutput(const std::string &name) override
Add an output connection to the specified port.
bool read(PortReader &reader, bool willReply=false) override
Read an object from the port.
~Port() override
Destructor.
bool replyAndDrop(PortWriter &writer) override
Same as reply(), but closes connection after reply.
void setInputMode(bool expectInput) override
Configure the port to allow or forbid inputs.
int getInputCount() override
Determine how many connections are arriving into this port.
void setReporter(PortReport &reporter) override
Set a callback to be called upon any future connections and disconnections to/from the port.
void setVerbosity(int level)
Set whether the port should issue messages about its operations.
bool setTimeout(float timeout)
Set a timeout on network operations.
void interrupt() override
Interrupt any current reads or writes attached to the port.
bool setCallbackLock(std::mutex *mutex=nullptr) override
Add a lock to use when invoking callbacks.
bool lockCallback() override
Lock callbacks until unlockCallback() is called.
bool setEnvelope(PortWriter &envelope) override
Set an envelope (e.g., a timestamp) to the next message which will be sent.
void releaseProperties(Property *prop) override
End access unstructured port properties.
void getReport(PortReport &reporter) override
Get information on the state of the port - connections etc.
bool openFake(const std::string &name)
Start port without making it accessible from the network.
void resetReporter() override
Remove the callback which is called upon any future connections and disconnections to/from the port.
void close() override
Stop port activity.
void promiseType(const Type &typ) override
Commit the port to a particular type of data.
bool reply(PortWriter &writer) override
Send an object as a reply to an object read from the port.
bool open(const std::string &name) override
Start port operation, with a specific name, with automatically-chosen network parameters.
bool isWriting() override
Report whether the port is currently writing data.
Property * acquireProperties(bool readOnly) override
Access unstructured port properties.
void setOutputMode(bool expectOutput) override
Configure the port to allow or forbid outputs.
bool isOpen() const
Check if the port has been opened.
void unlockCallback() override
Unlock callbacks.
A class for storing options and configuration information.
static Type byNameOnWire(const char *name_on_wire)
std::string getNameOnWire() const
std::string getName() const
Small helper class to help deal with legacy YARP configuration files.
std::string getSafeString(const std::string &txt)
#define yCError(component,...)
#define yCAssert(component, x)
#define yCIError(component, id,...)
#define yCDebug(component,...)
#define yCIInfo(component, id,...)
#define YARP_OS_LOG_COMPONENT(name, name_string)
std::string get_string(const std::string &key, bool *found=nullptr)
Read a string from an environment variable.
bool isValid()
Check if time is valid (non-zero).
The components from which ports and connections are built.
An interface to the operating system, including Port based communication.
int rename(const char *oldname, const char *newname)
Portable wrapper for the rename() function.