111 lines
3.4 KiB
C++
111 lines
3.4 KiB
C++
/*
|
|
* Copyright (c) 2014, Oculus VR, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
/// \file DynDNS.h
|
|
/// \brief Helper to class to update DynDNS
|
|
/// This can be used to determine what permissions are should be allowed to the other system
|
|
///
|
|
|
|
|
|
#include "NativeFeatureIncludes.hpp"
|
|
#if _RAKNET_SUPPORT_DynDNS==1 && _RAKNET_SUPPORT_TCPInterface==1
|
|
|
|
#ifndef __DYN_DNS_H
|
|
#define __DYN_DNS_H
|
|
|
|
#include "RakString.hpp"
|
|
|
|
namespace RakNet
|
|
{
|
|
|
|
class TCPInterface;
|
|
|
|
enum DynDnsResultCode
|
|
{
|
|
// ----- Success -----
|
|
RC_SUCCESS,
|
|
RC_DNS_ALREADY_SET, // RakNet detects no action is needed
|
|
|
|
// ----- Ignorable failure (treat same as success) -----
|
|
RC_NO_CHANGE, // DynDNS detects no action is needed (treated as abuse though)
|
|
|
|
// ----- User error -----
|
|
RC_NOT_DONATOR, // You have to pay to do this
|
|
RC_NO_HOST, // This host does not exist at all
|
|
RC_BAD_AUTH, // You set the wrong password
|
|
RC_NOT_YOURS, // This is not your host
|
|
|
|
// ----- Permanent failure -----
|
|
RC_ABUSE, // Your host has been blocked, too many failures disable your account
|
|
RC_TCP_FAILED_TO_START, // TCP port already in use
|
|
RC_TCP_DID_NOT_CONNECT, // DynDNS down?
|
|
RC_UNKNOWN_RESULT, // DynDNS returned a result code that was not documented as of 12/4/2010 on http://www.dyndns.com/developers/specs/flow.pdf
|
|
RC_PARSING_FAILURE, // Can't read the result returned, format change?
|
|
RC_CONNECTION_LOST_WITHOUT_RESPONSE, // Lost the connection to DynDNS while communicating
|
|
RC_BAD_AGENT, // ???
|
|
RC_BAD_SYS, // ???
|
|
RC_DNS_ERROR, // ???
|
|
RC_NOT_FQDN, // ???
|
|
RC_NUM_HOST, // ???
|
|
RC_911, // ???
|
|
RC_DYNDNS_TIMEOUT // DynDNS did not respond
|
|
};
|
|
|
|
// Can only process one at a time with the current implementation
|
|
class RAK_DLL_EXPORT DynDNS
|
|
{
|
|
public:
|
|
DynDNS();
|
|
~DynDNS();
|
|
|
|
// Pass 0 for newIPAddress to autodetect whatever you are uploading from
|
|
// usernameAndPassword should be in the format username:password
|
|
void UpdateHostIPAsynch(const char *dnsHost, const char *newIPAddress, const char *usernameAndPassword );
|
|
void Update(void);
|
|
|
|
// Output
|
|
bool IsRunning(void) const {return connectPhase!=CP_IDLE;}
|
|
bool IsCompleted(void) const {return connectPhase==CP_IDLE;}
|
|
RakNet::DynDnsResultCode GetCompletedResultCode(void) {return result;}
|
|
const char *GetCompletedDescription(void) const {return resultDescription;}
|
|
bool WasResultSuccessful(void) const {return result==RC_SUCCESS || result==RC_DNS_ALREADY_SET || result==RC_NO_CHANGE;}
|
|
char *GetMyPublicIP(void) const {return (char*) myIPStr;} // We get our public IP as part of the process. This is valid once completed
|
|
|
|
protected:
|
|
void Stop(void);
|
|
void SetCompleted(RakNet::DynDnsResultCode _result, const char *_resultDescription) {Stop(); result=_result; resultDescription=_resultDescription;}
|
|
|
|
enum ConnectPhase
|
|
{
|
|
CP_CONNECTING_TO_CHECKIP,
|
|
CP_WAITING_FOR_CHECKIP_RESPONSE,
|
|
CP_CONNECTING_TO_DYNDNS,
|
|
CP_WAITING_FOR_DYNDNS_RESPONSE,
|
|
CP_IDLE
|
|
};
|
|
|
|
TCPInterface *tcp;
|
|
RakNet::RakString getString;
|
|
SystemAddress serverAddress;
|
|
ConnectPhase connectPhase;
|
|
RakNet::RakString host;
|
|
RakNet::Time phaseTimeout;
|
|
SystemAddress checkIpAddress;
|
|
const char *resultDescription;
|
|
RakNet::DynDnsResultCode result;
|
|
char myIPStr[32];
|
|
};
|
|
|
|
} // namespace RakNet
|
|
|
|
#endif // __DYN_DNS_H
|
|
|
|
#endif // _RAKNET_SUPPORT_DynDNS
|