MCPcopy Create free account
hub / github.com/MayaPosch/NymphCast / session_add_slave

Function session_add_slave

src/server/NymphCastServer.cpp:825–923  ·  view source on GitHub ↗

--- SESSION ADD SLAVE --- Client sends list of slave server which this server instance should control. Returns: OK (0), ERROR (1). int session_add_slave(array servers);

Source from the content-addressed store, hash-verified

823// Returns: OK (0), ERROR (1).
824// int session_add_slave(array servers);
825NymphMessage* session_add_slave(int session, NymphMessage* msg, void* data) {
826 NymphMessage* returnMsg = msg->getReplyMessage();
827
828 // Extract the array.
829 std::vector<NymphType*>* remotes = msg->parameters()[0]->getArray();
830 for (int i = 0; i < (*remotes).size(); ++i) {
831 std::map<std::string, NymphPair>* pairs = (*remotes)[i]->getStruct();
832 NymphCastSlaveRemote remote;
833 NymphType* value = 0;
834 (*remotes)[i]->getStructValue("name", value);
835 remote.name = std::string(value->getChar(), value->string_length());
836
837 (*remotes)[i]->getStructValue("ipv4", value);
838 remote.ipv4 = std::string(value->getChar(), value->string_length());
839
840 (*remotes)[i]->getStructValue("ipv6", value);
841 remote.ipv6 = std::string(value->getChar(), value->string_length());
842
843 (*remotes)[i]->getStructValue("port", value);
844 remote.port = value->getUint16();
845 remote.handle = 0;
846 remote.delay = 0;
847
848 slave_remotes.push_back(remote);
849 }
850
851 // Validate that each slave remote is accessible and determine latency.
852 for (int i = 0; i < slave_remotes.size(); ++i) {
853 // Establish RPC connection to remote. Starts the PTP-like handshake.
854 NymphCastSlaveRemote& rm = slave_remotes[i];
855 std::string result;
856 if (!NymphRemoteServer::connect(rm.ipv4, 4004, rm.handle, 0, result)) {
857 // Failed to connect, error out. Disconnect from any already connected slaves.
858 NYMPH_LOG_ERROR("Slave connection error: " + result);
859 for (; i >= 0; --i) {
860 NymphCastSlaveRemote& drm = slave_remotes[i];
861 NymphRemoteServer::disconnect(drm.handle, result);
862 }
863
864 returnMsg->setResultValue(new NymphType((uint8_t) 1));
865 msg->discard();
866
867 return returnMsg;
868 }
869
870 // Attempt to start slave mode on the remote.
871 // Send the current timestamp to the slave remote as part of the latency determination.
872 Poco::Timestamp ts;
873 int64_t now = (int64_t) ts.epochMicroseconds();
874 std::vector<NymphType*> values;
875 values.push_back(new NymphType(now));
876 NymphType* returnValue = 0;
877 if (!NymphRemoteServer::callMethod(rm.handle, "connectMaster", values, returnValue, result)) {
878 NYMPH_LOG_ERROR("Slave connect master failed: " + result);
879 // TODO: disconnect from slave remotes.
880 returnMsg->setResultValue(new NymphType((uint8_t) 1));
881 msg->discard();
882

Callers

nothing calls this directly

Calls 5

formatFunction · 0.85
push_backMethod · 0.80
disconnectFunction · 0.70
sizeMethod · 0.45
updateMethod · 0.45

Tested by

no test coverage detected