libnative-utilities/include/raknet/DynDNS.hpp

111 lines
3.4 KiB
C++
Raw Normal View History

2024-08-15 18:40:30 +08:00
/*
* 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