diff --git a/CMakeLists.txt b/CMakeLists.txt index d803ff373e..77ae85589d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) add_subdirectory(animation-server) +add_subdirectory(assignment-server) add_subdirectory(avatar-mixer) add_subdirectory(audio-mixer) add_subdirectory(domain-server) diff --git a/assignment-server/CMakeLists.txt b/assignment-server/CMakeLists.txt new file mode 100644 index 0000000000..c551cbf0a5 --- /dev/null +++ b/assignment-server/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 2.8) + +set(TARGET_NAME assignment-server) + +set(ROOT_DIR ..) +set(MACRO_DIR ${ROOT_DIR}/cmake/macros) + +include(${MACRO_DIR}/SetupHifiProject.cmake) +setup_hifi_project(${TARGET_NAME} TRUE) + +# link in the shared library +include(${MACRO_DIR}/LinkHifiLibrary.cmake) +link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) \ No newline at end of file diff --git a/assignment-server/src/main.cpp b/assignment-server/src/main.cpp new file mode 100644 index 0000000000..6cf7ddc952 --- /dev/null +++ b/assignment-server/src/main.cpp @@ -0,0 +1,57 @@ +// +// main.cpp +// assignment-server +// +// Created by Stephen Birarda on 7/1/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#include +#include +#include + +#include +#include +#include + +const int MAX_PACKET_SIZE_BYTES = 1400; + +struct Assignment {}; + +int main(int argc, const char* argv[]) { + + std::queue assignmentQueue; + + sockaddr_in senderSocket; + unsigned char senderData[MAX_PACKET_SIZE_BYTES] = {}; + ssize_t receivedBytes = 0; + + UDPSocket serverSocket(ASSIGNMENT_SERVER_PORT); + + int numHeaderBytes = numBytesForPacketHeader((unsigned char*) &PACKET_TYPE_SEND_ASSIGNMENT); + unsigned char assignmentPacket[numHeaderBytes + sizeof(char)]; + populateTypeAndVersion(assignmentPacket, PACKET_TYPE_SEND_ASSIGNMENT); + + while (true) { + if (serverSocket.receive((sockaddr*) &senderSocket, &senderData, &receivedBytes)) { + + // int numHeaderBytes = numBytesForPacketHeader(senderData); + + if (senderData[0] == PACKET_TYPE_REQUEST_ASSIGNMENT) { + // grab the FI assignment in the queue, if it exists + if (assignmentQueue.size() > 0) { + // Assignment firstAssignment = assignmentQueue.front(); + assignmentQueue.pop(); + + // send the assignment + serverSocket.send((sockaddr*) &senderSocket, assignmentPacket, sizeof(assignmentPacket)); + } + } else if (senderData[0] == PACKET_TYPE_SEND_ASSIGNMENT) { + Assignment newAssignment; + + // add this assignment to the queue + assignmentQueue.push(newAssignment); + } + } + } +} diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 9fc088a8bf..29c3fb7225 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -375,7 +375,7 @@ int main(int argc, const char* argv[]) { InjectedAudioRingBuffer* ringBuffer = (InjectedAudioRingBuffer*) node->getLinkedData(); if (memcmp(ringBuffer->getStreamIdentifier(), - packetData + 1, + packetData + numBytesForPacketHeader(packetData), STREAM_IDENTIFIER_NUM_BYTES) == 0) { // this is the matching stream, assign to matchingInjector and stop looking matchingInjector = &*node; diff --git a/eve/CMakeLists.txt b/eve/CMakeLists.txt index 0a7691b781..2b281f2783 100644 --- a/eve/CMakeLists.txt +++ b/eve/CMakeLists.txt @@ -18,4 +18,4 @@ include_glm(${TARGET_NAME} ${ROOT_DIR}) include(${MACRO_DIR}/LinkHifiLibrary.cmake) link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) link_hifi_library(avatars ${TARGET_NAME} ${ROOT_DIR}) -link_hifi_library(audio ${TARGET_NAME} ${ROOT_DIR}) \ No newline at end of file +link_hifi_library(audio ${TARGET_NAME} ${ROOT_DIR}) diff --git a/hifi.podspec b/hifi.podspec index 42ac7ac1aa..a14381ffb4 100644 --- a/hifi.podspec +++ b/hifi.podspec @@ -35,17 +35,24 @@ Pod::Spec.new do |s| # s.exclude_files = 'Classes/Exclude' s.subspec "shared" do |sp| - sp.source_files = "libraries/shared/src" - sp.public_header_files = "librares/shared/src" + sp.source_files = 'libraries/shared/src', 'libraries/shared/moc_*' sp.exclude_files = "libraries/shared/src/UrlReader.*" + sp.dependency 'glm' + sp.xcconfig = { 'CLANG_CXX_LIBRARY' => "libc++" } end s.subspec "audio" do |sp| sp.source_files = "libraries/audio/src" - sp.public_header_files = "libraries/audio/src" - sp.xcconfig = { 'CLANG_CXX_LIBRARY' => "libc++" } sp.dependency 'glm' end + + s.subspec "avatars" do |sp| + sp.source_files = 'libraries/avatars/src', 'libraries/avatars/moc_*' + sp.dependency 'glm' + end + + s.xcconfig = { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/../../qt5-device/qtbase/include' } + s.libraries = 'libQtCoreCombined', 'libQt5Network', 'libQt5Script' # A list of file patterns which select the header files that should be # made available to the application. If the pattern is a directory then the diff --git a/interface/src/avatar/AvatarVoxelSystem.h b/interface/src/avatar/AvatarVoxelSystem.h index 51144e3954..3a7cb224a6 100644 --- a/interface/src/avatar/AvatarVoxelSystem.h +++ b/interface/src/avatar/AvatarVoxelSystem.h @@ -21,7 +21,7 @@ class QNetworkReply; class Avatar; -class AvatarVoxelSystem : public QObject, public VoxelSystem { +class AvatarVoxelSystem : public VoxelSystem { Q_OBJECT public: diff --git a/libraries/audio/src/AudioInjectionManager.cpp b/libraries/audio/src/AudioInjectionManager.cpp index 65cbade423..79de62e747 100644 --- a/libraries/audio/src/AudioInjectionManager.cpp +++ b/libraries/audio/src/AudioInjectionManager.cpp @@ -61,6 +61,8 @@ void* AudioInjectionManager::injectAudioViaThread(void* args) { Node* audioMixer = NodeList::getInstance()->soloNodeOfType(NODE_TYPE_AUDIO_MIXER); if (audioMixer) { _destinationSocket = *audioMixer->getActiveSocket(); + } else { + pthread_exit(0); } } diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index a2ba56b8ef..b9a6d8a0ba 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -6,12 +6,12 @@ // Copyright (c) 2012 High Fidelity, Inc. All rights reserved. // -#include #include +#include +#include -#include #include -#include +#include #include "AudioInjector.h" @@ -21,7 +21,8 @@ AudioInjector::AudioInjector(const char* filename) : _radius(0.0f), _volume(MAX_INJECTOR_VOLUME), _indexOfNextSlot(0), - _isInjectingAudio(false) + _isInjectingAudio(false), + _lastFrameIntensity(0.0f) { loadRandomIdentifier(_streamIdentifier, STREAM_IDENTIFIER_NUM_BYTES); @@ -51,7 +52,8 @@ AudioInjector::AudioInjector(int maxNumSamples) : _radius(0.0f), _volume(MAX_INJECTOR_VOLUME), _indexOfNextSlot(0), - _isInjectingAudio(false) + _isInjectingAudio(false), + _lastFrameIntensity(0.0f) { loadRandomIdentifier(_streamIdentifier, STREAM_IDENTIFIER_NUM_BYTES); @@ -114,6 +116,18 @@ void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destination injectorSocket->send(destinationSocket, dataPacket, sizeof(dataPacket)); + // calculate the intensity for this frame + float lastRMS = 0; + + for (int j = 0; j < BUFFER_LENGTH_SAMPLES_PER_CHANNEL; j++) { + lastRMS += _audioSampleArray[i + j] * _audioSampleArray[i + j]; + } + + lastRMS /= BUFFER_LENGTH_SAMPLES_PER_CHANNEL; + lastRMS = sqrtf(lastRMS); + + _lastFrameIntensity = lastRMS / std::numeric_limits::max(); + int usecToSleep = usecTimestamp(&startTime) + (++nextFrame * INJECT_INTERVAL_USECS) - usecTimestampNow(); if (usecToSleep > 0) { usleep(usecToSleep); @@ -131,8 +145,8 @@ void AudioInjector::addSample(const int16_t sample) { } } -void AudioInjector::addSamples(int16_t* sampleBuffer, int numSamples) { - if (_audioSampleArray + _indexOfNextSlot + numSamples <= _audioSampleArray + (_numTotalSamples / sizeof(int16_t))) { +void AudioInjector::addSamples(int16_t* sampleBuffer, int numSamples) { + if (_audioSampleArray + _indexOfNextSlot + numSamples <= _audioSampleArray + _numTotalSamples) { // only copy the audio from the sample buffer if there's space memcpy(_audioSampleArray + _indexOfNextSlot, sampleBuffer, numSamples * sizeof(int16_t)); _indexOfNextSlot += numSamples; diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index 875bc815ce..b102d58e19 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -9,8 +9,7 @@ #ifndef __hifi__AudioInjector__ #define __hifi__AudioInjector__ -#include -#include +#include #include #include @@ -36,6 +35,8 @@ public: unsigned char getVolume() const { return _volume; } void setVolume(unsigned char volume) { _volume = volume; } + float getLastFrameIntensity() const { return _lastFrameIntensity; } + const glm::vec3& getPosition() const { return _position; } void setPosition(const glm::vec3& position) { _position = position; } @@ -57,6 +58,7 @@ private: unsigned char _volume; int _indexOfNextSlot; bool _isInjectingAudio; + float _lastFrameIntensity; }; #endif /* defined(__hifi__AudioInjector__) */ diff --git a/libraries/avatars/src/Agent.cpp b/libraries/avatars/src/Agent.cpp new file mode 100644 index 0000000000..f027bc1f55 --- /dev/null +++ b/libraries/avatars/src/Agent.cpp @@ -0,0 +1,88 @@ +// +// Agent.cpp +// hifi +// +// Created by Stephen Birarda on 7/1/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#import +#import + +#include + +#include "AvatarData.h" + +#include "Agent.h" + +Agent::Agent() : + _shouldStop(false) +{ + +} + +void Agent::run(QUrl scriptURL) { + NodeList::getInstance()->setOwnerType(NODE_TYPE_AGENT); + NodeList::getInstance()->setNodeTypesOfInterest(&NODE_TYPE_AVATAR_MIXER, 1); + + QNetworkAccessManager* manager = new QNetworkAccessManager(); + + qDebug() << "Attemping download of " << scriptURL; + + QNetworkReply* reply = manager->get(QNetworkRequest(scriptURL)); + + QEventLoop loop; + QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + + QString scriptString = QString(reply->readAll()); + + QScriptEngine engine; + + AvatarData *testAvatarData = new AvatarData; + + QScriptValue avatarDataValue = engine.newQObject(testAvatarData); + engine.globalObject().setProperty("AvatarData", avatarDataValue); + + QScriptValue agentValue = engine.newQObject(this); + engine.globalObject().setProperty("Agent", agentValue); + + qDebug() << "Downloaded script:" << scriptString; + + qDebug() << "Evaluated script:" << engine.evaluate(scriptString).toString(); + + timeval thisSend; + timeval lastDomainServerCheckIn = {}; + int numMicrosecondsSleep = 0; + + const float DATA_SEND_INTERVAL_USECS = (1 / 60) * 1000 * 1000; + + sockaddr_in senderAddress; + unsigned char receivedData[MAX_PACKET_SIZE]; + ssize_t receivedBytes; + + while (!_shouldStop) { + // update the thisSend timeval to the current time + gettimeofday(&thisSend, NULL); + + // send a check in packet to the domain server if DOMAIN_SERVER_CHECK_IN_USECS has elapsed + if (usecTimestampNow() - usecTimestamp(&lastDomainServerCheckIn) >= DOMAIN_SERVER_CHECK_IN_USECS) { + gettimeofday(&lastDomainServerCheckIn, NULL); + NodeList::getInstance()->sendDomainServerCheckIn(); + } + + emit preSendCallback(); + + testAvatarData->sendData(); + + if (NodeList::getInstance()->getNodeSocket()->receive((sockaddr*) &senderAddress, receivedData, &receivedBytes)) { + NodeList::getInstance()->processNodeData((sockaddr*) &senderAddress, receivedData, receivedBytes); + } + + // sleep for the correct amount of time to have data send be consistently timed + if ((numMicrosecondsSleep = DATA_SEND_INTERVAL_USECS - (usecTimestampNow() - usecTimestamp(&thisSend))) > 0) { + usleep(numMicrosecondsSleep); + } + } + +} \ No newline at end of file diff --git a/libraries/avatars/src/Agent.h b/libraries/avatars/src/Agent.h new file mode 100644 index 0000000000..e083abb541 --- /dev/null +++ b/libraries/avatars/src/Agent.h @@ -0,0 +1,32 @@ +// +// Agent.h +// hifi +// +// Created by Stephen Birarda on 7/1/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#ifndef __hifi__Agent__ +#define __hifi__Agent__ + +#include +#include + +#include "SharedUtil.h" + +#include +#include + +class Agent : public QObject { + Q_OBJECT +public: + Agent(); + + bool volatile _shouldStop; + + void run(QUrl scriptUrl); +signals: + void preSendCallback(); +}; + +#endif /* defined(__hifi__Operative__) */ diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 9c254453e1..75d88525bf 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -10,8 +10,9 @@ #include #include -#include +#include #include +#include #include "AvatarData.h" #include @@ -50,6 +51,22 @@ AvatarData::~AvatarData() { delete _handData; } +void AvatarData::sendData() { + + // called from Agent visual loop to send data + if (Node* avatarMixer = NodeList::getInstance()->soloNodeOfType(NODE_TYPE_AVATAR_MIXER)) { + unsigned char packet[MAX_PACKET_SIZE]; + + unsigned char* endOfPacket = packet; + endOfPacket += populateTypeAndVersion(endOfPacket, PACKET_TYPE_HEAD_DATA); + endOfPacket += packNodeId(endOfPacket, NodeList::getInstance()->getOwnerID()); + + int numPacketBytes = (endOfPacket - packet) + getBroadcastData(endOfPacket); + + NodeList::getInstance()->getNodeSocket()->send(avatarMixer->getActiveSocket(), packet, numPacketBytes); + } +} + int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { unsigned char* bufferStart = destinationBuffer; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 209d822426..2399d1062c 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -16,6 +16,8 @@ #include #include +#include + #include #include "HeadData.h" #include "HandData.h" @@ -39,6 +41,7 @@ enum KeyState class JointData; class AvatarData : public NodeData { + Q_OBJECT public: AvatarData(Node* owningNode = NULL); ~AvatarData(); @@ -53,7 +56,6 @@ public: // Body Rotation float getBodyYaw() const { return _bodyYaw; } - void setBodyYaw(float bodyYaw) { _bodyYaw = bodyYaw; } float getBodyPitch() const { return _bodyPitch; } void setBodyPitch(float bodyPitch) { _bodyPitch = bodyPitch; } float getBodyRoll() const {return _bodyRoll; } @@ -103,6 +105,11 @@ public: void setHeadData(HeadData* headData) { _headData = headData; } void setHandData(HandData* handData) { _handData = handData; } +public slots: + void setPosition(float x, float y, float z) { _position = glm::vec3(x, y, z); } + void setBodyYaw(float bodyYaw) { _bodyYaw = bodyYaw; } + void sendData(); + protected: glm::vec3 _position; glm::vec3 _handPosition; diff --git a/libraries/avatars/src/HandData.h b/libraries/avatars/src/HandData.h index 1a7a99f2db..c32a04a0c4 100755 --- a/libraries/avatars/src/HandData.h +++ b/libraries/avatars/src/HandData.h @@ -13,7 +13,7 @@ #include #include -#include +#include class AvatarData; class FingerData; diff --git a/libraries/shared/CMakeLists.txt b/libraries/shared/CMakeLists.txt index cf1c603b7d..218adb4d5f 100644 --- a/libraries/shared/CMakeLists.txt +++ b/libraries/shared/CMakeLists.txt @@ -26,3 +26,6 @@ if (UNIX AND NOT APPLE) target_link_libraries(${TARGET_NAME} ${CMAKE_THREAD_LIBS_INIT}) endif (UNIX AND NOT APPLE) +# include GLM +include(${MACRO_DIR}/IncludeGLM.cmake) +include_glm(${TARGET_NAME} ${ROOT_DIR}) diff --git a/libraries/shared/src/Node.cpp b/libraries/shared/src/Node.cpp index d7cf429558..7aebb0c022 100644 --- a/libraries/shared/src/Node.cpp +++ b/libraries/shared/src/Node.cpp @@ -21,7 +21,7 @@ #include "SharedUtil.h" #include "UDPSocket.h" -#include +#include int unpackNodeId(unsigned char* packedData, uint16_t* nodeId) { memcpy(nodeId, packedData, sizeof(uint16_t)); @@ -75,6 +75,7 @@ const char* NODE_TYPE_NAME_AUDIO_MIXER = "Audio Mixer"; const char* NODE_TYPE_NAME_AVATAR_MIXER = "Avatar Mixer"; const char* NODE_TYPE_NAME_AUDIO_INJECTOR = "Audio Injector"; const char* NODE_TYPE_NAME_ANIMATION_SERVER = "Animation Server"; +const char* NODE_TYPE_NAME_UNASSIGNED = "Unassigned"; const char* NODE_TYPE_NAME_UNKNOWN = "Unknown"; const char* Node::getTypeName() const { diff --git a/libraries/shared/src/Node.h b/libraries/shared/src/Node.h index 46bf90ed43..df20664bda 100644 --- a/libraries/shared/src/Node.h +++ b/libraries/shared/src/Node.h @@ -18,7 +18,7 @@ #include #endif -#include +#include #include "NodeData.h" #include "SimpleMovingAverage.h" diff --git a/libraries/shared/src/NodeData.h b/libraries/shared/src/NodeData.h index c11b41ced9..8d3ddf51e0 100644 --- a/libraries/shared/src/NodeData.h +++ b/libraries/shared/src/NodeData.h @@ -9,9 +9,12 @@ #ifndef hifi_NodeData_h #define hifi_NodeData_h +#include + class Node; -class NodeData { +class NodeData : public QObject { + Q_OBJECT public: NodeData(Node* owningNode); diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 3051f5ce68..2dfd537d93 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include "NodeList.h" #include "NodeTypes.h" @@ -366,6 +366,15 @@ int NodeList::processDomainServerList(unsigned char* packetData, size_t dataByte return readNodes; } +void NodeList::sendAssignmentRequest() { + const char ASSIGNMENT_SERVER_HOSTNAME[] = "assignment.highfidelity.io"; + + static sockaddr_in assignmentServerSocket = socketForHostname(ASSIGNMENT_SERVER_HOSTNAME); + assignmentServerSocket.sin_port = htons(ASSIGNMENT_SERVER_PORT); + + _nodeSocket.send((sockaddr*) &assignmentServerSocket, &PACKET_TYPE_REQUEST_ASSIGNMENT, 1); +} + Node* NodeList::addOrUpdateNode(sockaddr* publicSocket, sockaddr* localSocket, char nodeType, uint16_t nodeId) { NodeList::iterator node = end(); diff --git a/libraries/shared/src/NodeList.h b/libraries/shared/src/NodeList.h index 4c4795bdb0..260fddf96f 100644 --- a/libraries/shared/src/NodeList.h +++ b/libraries/shared/src/NodeList.h @@ -14,9 +14,10 @@ #include #include -#include +#include #include "Node.h" +#include "NodeTypes.h" #include "UDPSocket.h" #ifdef _WIN32 @@ -54,14 +55,16 @@ public: NodeListIterator begin() const; NodeListIterator end() const; + + NODE_TYPE getOwnerType() const { return _ownerType; } + void setOwnerType(NODE_TYPE ownerType) { _ownerType = ownerType; } + const char* getDomainHostname() const { return _domainHostname; }; void setDomainHostname(const char* domainHostname); void setDomainIP(const char* domainIP); void setDomainIPToLocalhost(); - - char getOwnerType() const { return _ownerType; } - + uint16_t getLastNodeID() const { return _lastNodeID; } void increaseNodeID() { ++_lastNodeID; } @@ -80,9 +83,12 @@ public: void clear(); void setNodeTypesOfInterest(const char* nodeTypesOfInterest, int numNodeTypesOfInterest); + void sendDomainServerCheckIn(); int processDomainServerList(unsigned char *packetData, size_t dataBytes); + void sendAssignmentRequest(); + Node* nodeWithAddress(sockaddr *senderAddress); Node* nodeWithID(uint16_t nodeID); diff --git a/libraries/shared/src/OctalCode.cpp b/libraries/shared/src/OctalCode.cpp index 8acc9a922f..0a198f9832 100644 --- a/libraries/shared/src/OctalCode.cpp +++ b/libraries/shared/src/OctalCode.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include "SharedUtil.h" #include "OctalCode.h" diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index 2e7b95c7f7..6d61056f85 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -8,7 +8,7 @@ #include -#include +#include #include "PacketHeaders.h" diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index 2fbdc4d791..2b021db82c 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -34,6 +34,8 @@ const PACKET_TYPE PACKET_TYPE_TRANSMITTER_DATA_V2 = 'T'; const PACKET_TYPE PACKET_TYPE_ENVIRONMENT_DATA = 'e'; const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L'; const PACKET_TYPE PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY = 'C'; +const PACKET_TYPE PACKET_TYPE_REQUEST_ASSIGNMENT = 'r'; +const PACKET_TYPE PACKET_TYPE_SEND_ASSIGNMENT = 's'; const PACKET_TYPE PACKET_TYPE_VOXEL_STATS = '#'; typedef char PACKET_VERSION; @@ -52,4 +54,6 @@ const int MAX_PACKET_HEADER_BYTES = sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION) #define ADD_SCENE_COMMAND "add scene" #define TEST_COMMAND "a message" +const int ASSIGNMENT_SERVER_PORT = 7007; + #endif diff --git a/libraries/shared/src/PerfStat.cpp b/libraries/shared/src/PerfStat.cpp index dde460dbb0..5199c09937 100644 --- a/libraries/shared/src/PerfStat.cpp +++ b/libraries/shared/src/PerfStat.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include "PerfStat.h" diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index b6674fdb32..93ea8a70ed 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -20,7 +20,7 @@ #include #endif -#include +#include #include "OctalCode.h" #include "PacketHeaders.h" diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index d840a83ed9..49e8ae6f02 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -13,7 +13,7 @@ #include #include -#include +#include #ifdef _WIN32 #include "Systime.h" diff --git a/libraries/shared/src/UDPSocket.cpp b/libraries/shared/src/UDPSocket.cpp index 0cd8efb723..c156ddd1be 100644 --- a/libraries/shared/src/UDPSocket.cpp +++ b/libraries/shared/src/UDPSocket.cpp @@ -20,7 +20,7 @@ #include #endif -#include +#include #include "UDPSocket.h" @@ -118,6 +118,17 @@ unsigned short loadBufferWithSocketInfo(char* addressBuffer, sockaddr* socket) { } } +sockaddr_in socketForHostname(const char* hostname) { + struct hostent* pHostInfo; + sockaddr_in newSocket; + + if ((pHostInfo = gethostbyname(hostname))) { + memcpy(&newSocket.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); + } + + return newSocket; +} + UDPSocket::UDPSocket(int listeningPort) : listeningPort(listeningPort), blocking(true) { init(); // create the socket diff --git a/libraries/shared/src/UDPSocket.h b/libraries/shared/src/UDPSocket.h index 8539ff93c2..58bee3d2de 100644 --- a/libraries/shared/src/UDPSocket.h +++ b/libraries/shared/src/UDPSocket.h @@ -42,5 +42,6 @@ int packSocket(unsigned char* packStore, sockaddr* socketToPack); int unpackSocket(unsigned char* packedData, sockaddr* unpackDestSocket); int getLocalAddress(); unsigned short loadBufferWithSocketInfo(char* addressBuffer, sockaddr* socket); +sockaddr_in socketForHostname(const char* hostname); #endif /* defined(__interface__UDPSocket__) */