git-svn-id: https://svn.microneil.com/svn/CodeDweller/trunk@3 d34b734f-a00e-4b39-a726-e4eeb87269abwx
| ++Index; // past it and scan for our name. | ++Index; // past it and scan for our name. | ||||
| } | } | ||||
| for(int I = 0; I < myName.length(); I++) { // For the length of our name, | |||||
| for(unsigned int I = 0; I < myName.length(); I++) { // For the length of our name, | |||||
| char x = Data.Data(Index + I); // get each corresponding Data byte | char x = Data.Data(Index + I); // get each corresponding Data byte | ||||
| if(x != myName.at(I)) { // check it sudden death style. | if(x != myName.at(I)) { // check it sudden death style. | ||||
| return false; // No-Match means we are not it. | return false; // No-Match means we are not it. | ||||
| ) { // Then it _should_ be our own. | ) { // Then it _should_ be our own. | ||||
| Stopdex = Index; // Capture this position for content. | Stopdex = Index; // Capture this position for content. | ||||
| Index += 2; // Move Index to where the name starts. | Index += 2; // Move Index to where the name starts. | ||||
| for(int I = 0; I < myName.length(); I++) { // For the length of the name, | |||||
| for(unsigned int I = 0; I < myName.length(); I++) { // For the length of the name, | |||||
| char x = Data.Data(Index + I); // check each corresponding Data byte. | char x = Data.Data(Index + I); // check each corresponding Data byte. | ||||
| if(x != myName.at(I)) { // If we fail to match at any point | if(x != myName.at(I)) { // If we fail to match at any point | ||||
| return false; // then things are very broken | return false; // then things are very broken | ||||
| // Find our name. | // Find our name. | ||||
| for(int I = 0; I < myName.length(); I++) { // For the length of the name, | |||||
| for(unsigned int I = 0; I < myName.length(); I++) { // For the length of the name, | |||||
| char x = Data.Data(Index + I); // get each corresponding Data byte | char x = Data.Data(Index + I); // get each corresponding Data byte | ||||
| if(x != myName.at(I)) { // check it sudden death style. | if(x != myName.at(I)) { // check it sudden death style. | ||||
| return false; // No-Match means we are not it. | return false; // No-Match means we are not it. |
| // configuration.hpp | // configuration.hpp | ||||
| // | // | ||||
| // (C) 2006 - 2009 MicroNeil Research Corporation. | // (C) 2006 - 2009 MicroNeil Research Corporation. | ||||
| // | |||||
| // This program is part of the MicroNeil Research Open Library Project. For | |||||
| // more information go to http://www.microneil.com/OpenLibrary/index.html | |||||
| // See http://www.codedweller.com for details. | |||||
| // | // | ||||
| // This program is free software; you can redistribute it and/or modify it | // This program is free software; you can redistribute it and/or modify it | ||||
| // under the terms of the GNU General Public License as published by the | // under the terms of the GNU General Public License as published by the | ||||
| // collection of the basic translators used for built-in mapTo()s. | // collection of the basic translators used for built-in mapTo()s. | ||||
| class ConfigurationTranslator { // Translators exist | class ConfigurationTranslator { // Translators exist | ||||
| public: | |||||
| public: | |||||
| virtual ~ConfigurationTranslator(){}; // Stop No Virt Dtor warnings. | |||||
| virtual void translate(const char* Value) = 0; // Pure virtual translator. | virtual void translate(const char* Value) = 0; // Pure virtual translator. | ||||
| virtual void initialize() = 0; // Pure virtual initializer. | virtual void initialize() = 0; // Pure virtual initializer. | ||||
| }; | }; |
| myLine(0), | myLine(0), | ||||
| myIndex(0), | myIndex(0), | ||||
| myLength(0), | myLength(0), | ||||
| myInitOnInterpretFlag(false), | |||||
| myCleanFlag(true) { | |||||
| myCleanFlag(true), | |||||
| myInitOnInterpretFlag(false) { | |||||
| } | } | ||||
| inline ConfigurationElement::ConfigurationElement(const string Name) : // Construct with a c++ string. | inline ConfigurationElement::ConfigurationElement(const string Name) : // Construct with a c++ string. | ||||
| myLine(0), | myLine(0), | ||||
| myIndex(0), | myIndex(0), | ||||
| myLength(0), | myLength(0), | ||||
| myInitOnInterpretFlag(false), | |||||
| myCleanFlag(true) { | |||||
| myCleanFlag(true), | |||||
| myInitOnInterpretFlag(false) { | |||||
| } | } | ||||
| inline ConfigurationElement::ConfigurationElement( // Construct sub element w/ cstring. | inline ConfigurationElement::ConfigurationElement( // Construct sub element w/ cstring. | ||||
| myLine(0), | myLine(0), | ||||
| myIndex(0), | myIndex(0), | ||||
| myLength(0), | myLength(0), | ||||
| myInitOnInterpretFlag(false), | |||||
| myCleanFlag(true) { | |||||
| myCleanFlag(true), | |||||
| myInitOnInterpretFlag(false) { | |||||
| } | } | ||||
| inline ConfigurationElement::ConfigurationElement( // Construct sub element w/ string. | inline ConfigurationElement::ConfigurationElement( // Construct sub element w/ string. | ||||
| myLine(0), | myLine(0), | ||||
| myIndex(0), | myIndex(0), | ||||
| myLength(0), | myLength(0), | ||||
| myInitOnInterpretFlag(false), | |||||
| myCleanFlag(true) { | |||||
| myCleanFlag(true), | |||||
| myInitOnInterpretFlag(false) { | |||||
| } | } | ||||
| inline string ConfigurationElement::Name() { return myName; } // Get the name of this element. | inline string ConfigurationElement::Name() { return myName; } // Get the name of this element. | ||||
| myName(string(Name)), // We convert the name to a string. | myName(string(Name)), // We convert the name to a string. | ||||
| myParent(Parent), // We just grab the parent. | myParent(Parent), // We just grab the parent. | ||||
| myLine(0), // Everything else gets zeroed. | myLine(0), // Everything else gets zeroed. | ||||
| myLength(0), | |||||
| myIndex(0) { | |||||
| myIndex(0), | |||||
| myLength(0) { | |||||
| } | } | ||||
| inline ConfigurationAttribute::ConfigurationAttribute( // Attributes are constrictued with a | inline ConfigurationAttribute::ConfigurationAttribute( // Attributes are constrictued with a | ||||
| myName(Name), // We grab them and zero the rest. | myName(Name), // We grab them and zero the rest. | ||||
| myParent(Parent), | myParent(Parent), | ||||
| myLine(0), | myLine(0), | ||||
| myLength(0), | |||||
| myIndex(0) { | |||||
| myIndex(0), | |||||
| myLength(0) { | |||||
| } | } | ||||
| inline string ConfigurationAttribute::Name() { // Get the name of this attribute. | inline string ConfigurationAttribute::Name() { // Get the name of this attribute. |
| if(NULL == str) { // If the caller did not provide a | if(NULL == str) { // If the caller did not provide a | ||||
| str = IPStringBuffer; // buffer to use then we will use ours. | str = IPStringBuffer; // buffer to use then we will use ours. | ||||
| } | } | ||||
| int a0, a1, a2, a3, i=0; // Grab a bunch of handy integers. | |||||
| int a0, a1, a2, a3; // Grab a bunch of handy integers. | |||||
| getAddress(a0, a1, a2, a3); // Get the address as octets. | getAddress(a0, a1, a2, a3); // Get the address as octets. | ||||
| sprintf(str, "%d.%d.%d.%d", a0, a1, a2, a3); // Format as dotted decimal notation. | sprintf(str, "%d.%d.%d.%d", a0, a1, a2, a3); // Format as dotted decimal notation. | ||||
| return str; // Return the output buffer. | return str; // Return the output buffer. |
| public: | public: | ||||
| Socket(); // Constructor sets initial state. | Socket(); // Constructor sets initial state. | ||||
| ~Socket(); // Destructor closes Socket if open. | |||||
| virtual ~Socket(); // Destructor closes Socket if open. | |||||
| hSocket getHandle(); // Returns the current SocketId. | hSocket getHandle(); // Returns the current SocketId. | ||||
| bool isNonBlocking(); // Returns true if socket is NonBlocking | bool isNonBlocking(); // Returns true if socket is NonBlocking | ||||
| TCPListener& MyListener; | TCPListener& MyListener; | ||||
| char ReadBuffer[TCPClientBufferSize]; // Buffer for delimited reading. | char ReadBuffer[TCPClientBufferSize]; // Buffer for delimited reading. | ||||
| //int ReadBufferSize; // Size of buffer. | |||||
| char* ReadPointer; // Read position. | char* ReadPointer; // Read position. | ||||
| int DataLength; // Length of data in buffer. | int DataLength; // Length of data in buffer. | ||||
| inline IP4Address::IP4Address(const string& newIP) { (*this) = newIP; } // Constructing with a cppstring. | inline IP4Address::IP4Address(const string& newIP) { (*this) = newIP; } // Constructing with a cppstring. | ||||
| inline IP4Address& | inline IP4Address& | ||||
| IP4Address::operator=(const unsigned long int Right) { IP = Right; } // Convert from unsigned long int. | |||||
| IP4Address::operator=(const unsigned long int Right) { // Convert from unsigned long int. | |||||
| IP = Right; | |||||
| return *this; | |||||
| } | |||||
| inline IP4Address& IP4Address::operator=(const char* Right) { // Convert from c string. | inline IP4Address& IP4Address::operator=(const char* Right) { // Convert from c string. | ||||
| IP = ntohl(inet_addr(Right)); | |||||
| IP = ntohl(inet_addr(Right)); | |||||
| return *this; | |||||
| } | } | ||||
| inline IP4Address& IP4Address::operator=(const string& Right) { // Convert from cpp string. | inline IP4Address& IP4Address::operator=(const string& Right) { // Convert from cpp string. | ||||
| IP = ntohl(inet_addr(Right.c_str())); | |||||
| IP = ntohl(inet_addr(Right.c_str())); | |||||
| return *this; | |||||
| } | } | ||||
| inline bool IP4Address::operator<(const IP4Address Right) const { // < Comparison. | inline bool IP4Address::operator<(const IP4Address Right) const { // < Comparison. | ||||
| } | } | ||||
| inline Socket::~Socket() { // When shutting down, be sure | inline Socket::~Socket() { // When shutting down, be sure | ||||
| close(); // any open socket is closed. | |||||
| if(isOpen()) close(); // any open socket is closed. | |||||
| } | } | ||||
| inline void Socket::close() { // When we close, | inline void Socket::close() { // When we close, |
| Thread::Thread() : // When constructing a WIN32 thread | Thread::Thread() : // When constructing a WIN32 thread | ||||
| MyThreadType(Thread::Type), // Use generic Thread Type. | MyThreadType(Thread::Type), // Use generic Thread Type. | ||||
| MyThreadName("UnNamed Thread"), // Use a generic Thread Name. | MyThreadName("UnNamed Thread"), // Use a generic Thread Name. | ||||
| MyThread(NULL), // Null the thread handle. | |||||
| RunningFlag(false), // Couldn't be running yet. | RunningFlag(false), // Couldn't be running yet. | ||||
| BadFlag(false), // Couldn't be bad yet. | |||||
| MyThread(NULL) { // Null the thread handle. | |||||
| BadFlag(false) { // Couldn't be bad yet. | |||||
| Threads.rememberThread(this); // Remember this thread. | Threads.rememberThread(this); // Remember this thread. | ||||
| CurrentThreadState(ThreadInitialized); // Set our initialized state. | CurrentThreadState(ThreadInitialized); // Set our initialized state. | ||||
| } | } | ||||
| Thread::Thread(const ThreadType& T, const string N) : // Construct with specific Type/Name | Thread::Thread(const ThreadType& T, const string N) : // Construct with specific Type/Name | ||||
| MyThreadType(T), // Use generic Thread Type. | MyThreadType(T), // Use generic Thread Type. | ||||
| MyThreadName(N), // Use a generic Thread Name. | MyThreadName(N), // Use a generic Thread Name. | ||||
| MyThread(NULL), // Null the thread handle. | |||||
| RunningFlag(false), // Couldn't be running yet. | RunningFlag(false), // Couldn't be running yet. | ||||
| BadFlag(false), // Couldn't be bad yet. | |||||
| MyThread(NULL) { // Null the thread handle. | |||||
| BadFlag(false) { // Couldn't be bad yet. | |||||
| Threads.rememberThread(this); // Remember this thread. | Threads.rememberThread(this); // Remember this thread. | ||||
| CurrentThreadState(ThreadInitialized); // Set our initialized state. | CurrentThreadState(ThreadInitialized); // Set our initialized state. | ||||
| } | } | ||||
| } | } | ||||
| unsigned __stdcall runThreadTask(void* thread_object) { // The WIN32 version has this form. | unsigned __stdcall runThreadTask(void* thread_object) { // The WIN32 version has this form. | ||||
| ((Thread*)thread_object)->launchTask(); | |||||
| ((Thread*)thread_object)->launchTask(); // Run the task. | |||||
| _endthreadex(0); // Signal the thread is finished. | |||||
| return 0; // Satisfy the unsigned return. | |||||
| } | } | ||||
| void Thread::run() { // Run a WIN32 thread... | void Thread::run() { // Run a WIN32 thread... |
| Pointer(P), | Pointer(P), | ||||
| Type(&T), | Type(&T), | ||||
| State(&S), | State(&S), | ||||
| Name(N), | |||||
| isRunning(R), | isRunning(R), | ||||
| isBad(B), | isBad(B), | ||||
| Fault(F), | |||||
| Name(N) | |||||
| Fault(F) | |||||
| {} | {} | ||||
| ThreadStatusRecord& operator=(const ThreadStatusRecord& Right) { // Minimal Assignment Operator | ThreadStatusRecord& operator=(const ThreadStatusRecord& Right) { // Minimal Assignment Operator | ||||
| isRunning = Right.isRunning; | isRunning = Right.isRunning; | ||||
| isBad = Right.isBad; | isBad = Right.isBad; | ||||
| Fault = Right.Fault; | Fault = Right.Fault; | ||||
| Name = Right.Name; | |||||
| Name = Right.Name; | |||||
| return *this; | |||||
| } | } | ||||
| bool operator<(const ThreadStatusRecord& Right) { // Minimal Comparison Operator. | bool operator<(const ThreadStatusRecord& Right) { // Minimal Comparison Operator. | ||||
| Thread(); // Constructor (just in case) | Thread(); // Constructor (just in case) | ||||
| Thread(const ThreadType& T, string N); // Construct with specific Type/Name | Thread(const ThreadType& T, string N); // Construct with specific Type/Name | ||||
| ~Thread(); // Destructor (just in case) | |||||
| virtual ~Thread(); // Destructor (just in case) | |||||
| void run(); // Method to launch this thread. | void run(); // Method to launch this thread. | ||||
| void join(); // Method to Join this thread. | void join(); // Method to Join this thread. |