134 lines
3.9 KiB
C
134 lines
3.9 KiB
C
|
#ifndef ARSERVERCLIENTIDENTIFIER_H
|
||
|
#define ARSERVERCLIENTIDENTIFIER_H
|
||
|
|
||
|
|
||
|
/// Class that holds an identifier for a particular serverClient
|
||
|
class ArServerClientIdentifier
|
||
|
{
|
||
|
public:
|
||
|
/// Constructor
|
||
|
ArServerClientIdentifier() { myConnectionID = 0; rebuildIDString(); }
|
||
|
/// Destructor
|
||
|
virtual ~ArServerClientIdentifier() {}
|
||
|
/// Gets an ID string which is just the other information in this combined
|
||
|
const char *getIDString(void) { return myIDString.c_str(); }
|
||
|
/// set the id num
|
||
|
void setConnectionID(ArTypes::UByte4 idNum) { myConnectionID = idNum; rebuildIDString(); }
|
||
|
/// Gets the id num
|
||
|
ArTypes::UByte4 getConnectionID(void) { return myConnectionID; }
|
||
|
/// Sets the self identifier
|
||
|
void setSelfIdentifier(const char *selfIdentifier)
|
||
|
{
|
||
|
if (selfIdentifier != NULL)
|
||
|
mySelfIdentifier = selfIdentifier;
|
||
|
else
|
||
|
mySelfIdentifier = "";
|
||
|
rebuildIDString();
|
||
|
}
|
||
|
/// Gets the self identifier
|
||
|
const char *getSelfIdentifier(void) { return mySelfIdentifier.c_str(); }
|
||
|
/// Sets the here goal
|
||
|
void setHereGoal(const char *selfIdentifier)
|
||
|
{
|
||
|
if (selfIdentifier != NULL)
|
||
|
myHereGoal = selfIdentifier;
|
||
|
else
|
||
|
myHereGoal = "";
|
||
|
rebuildIDString();
|
||
|
}
|
||
|
/// Gets the here goal
|
||
|
const char *getHereGoal(void) { return myHereGoal.c_str(); }
|
||
|
/// Sees if an identifier matches
|
||
|
/**
|
||
|
It can either match id, or the other parameters (for the other
|
||
|
parameters if the self id matches its a match, otherwise it
|
||
|
checks the here goal, and if that matches its a match)... this
|
||
|
is so that if someone's set a self id but changes their here
|
||
|
goal they'll still get their messages
|
||
|
*/
|
||
|
bool matches(ArServerClientIdentifier identifier,
|
||
|
bool matchConnectionID)
|
||
|
{
|
||
|
// if the ID's don't match then they don't match, this doesn't
|
||
|
// make sure they've been set like the others because here if it
|
||
|
// isn't set it means its an old client, but if its set it means
|
||
|
// its a new client... and if its one old client, we want to
|
||
|
// send stuff to all the old clients (since we don't know which
|
||
|
// one did it)
|
||
|
if (matchConnectionID && getConnectionID() != identifier.getConnectionID())
|
||
|
return false;
|
||
|
else if (matchConnectionID)
|
||
|
return true;
|
||
|
|
||
|
// if they both have identifiers see if they match (if they do
|
||
|
// then we're good)
|
||
|
if (getSelfIdentifier() != NULL && getSelfIdentifier()[0] != '\0' &&
|
||
|
identifier.getSelfIdentifier() != NULL &&
|
||
|
identifier.getSelfIdentifier()[0] != '\0' &&
|
||
|
strcasecmp(getSelfIdentifier(), identifier.getSelfIdentifier()) == 0)
|
||
|
return true;
|
||
|
|
||
|
// if they both have here goals see if they match
|
||
|
if (getHereGoal() != NULL && getHereGoal()[0] != '\0' &&
|
||
|
identifier.getHereGoal() != NULL &&
|
||
|
identifier.getHereGoal()[0] != '\0' &&
|
||
|
strcasecmp(getHereGoal(), identifier.getHereGoal()) != 0)
|
||
|
return false;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
void rebuildIDString(void)
|
||
|
{
|
||
|
char buf[1024];
|
||
|
bool first = true;
|
||
|
buf[0] = '\0';
|
||
|
sprintf(buf, "connectionID %u", myConnectionID);
|
||
|
if (myConnectionID != 0 || !mySelfIdentifier.empty() ||
|
||
|
!myHereGoal.empty())
|
||
|
{
|
||
|
if (myConnectionID != 0)
|
||
|
{
|
||
|
if (first)
|
||
|
myIDString = "(";
|
||
|
else
|
||
|
myIDString += " ";
|
||
|
first = false;
|
||
|
myIDString += buf;
|
||
|
}
|
||
|
if (!mySelfIdentifier.empty())
|
||
|
{
|
||
|
if (first)
|
||
|
myIDString = "(";
|
||
|
else
|
||
|
myIDString += " ";
|
||
|
first = false;
|
||
|
myIDString += "selfID ";
|
||
|
myIDString += mySelfIdentifier;
|
||
|
}
|
||
|
if (!myHereGoal.empty())
|
||
|
{
|
||
|
if (first)
|
||
|
myIDString = "(";
|
||
|
else
|
||
|
myIDString += " ";
|
||
|
first = false;
|
||
|
myIDString += "hereGoal ";
|
||
|
myIDString += myHereGoal;
|
||
|
}
|
||
|
myIDString += ")";
|
||
|
}
|
||
|
else
|
||
|
myIDString = "";
|
||
|
}
|
||
|
protected:
|
||
|
// the identifiers
|
||
|
ArTypes::UByte4 myConnectionID;
|
||
|
std::string mySelfIdentifier;
|
||
|
std::string myHereGoal;
|
||
|
|
||
|
// the string that describes them just for debugging
|
||
|
std::string myIDString;
|
||
|
};
|
||
|
|
||
|
#endif // ArServerClientIdentifier
|