--- 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);
| 823 | // Returns: OK (0), ERROR (1). |
| 824 | // int session_add_slave(array servers); |
| 825 | NymphMessage* 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 |
nothing calls this directly
no test coverage detected