Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

ImHerePacket.cpp

Go to the documentation of this file.
00001 #include "headers.h"
00002 
00015 
00016 
00020 ImHerePacket::ImHerePacket() : NpPacket() {
00021     // Set packet type
00022     m_controlType = NpPacket::ImHere;
00023     
00024     // Set the discovery id
00025     m_id = 0;
00026 
00027     // Set our version number
00028     m_versionNumber = VERSION_NUMBER;
00029     
00030     // Set capabilities
00031     m_isNatted = GlobalObjects::instance()->getConfig()->getSelf()->getNode()->isNatted();
00032     m_isFirewalled = GlobalObjects::instance()->getConfig()->getSelf()->getNode()->isFirewalled();
00033     m_isTrusted = GlobalObjects::instance()->getConfig()->getSelf()->getNode()->isTrusted();
00034 
00035     // Set my IP address
00036     m_ip = GlobalObjects::instance()->getConfig()->getSelf()->getNode()->getSocketAddress()->getIpAddress();
00037     
00038     m_port = 0;
00039 
00040     // Set header length
00041     m_headerLength = IH_HEADER_LENGTH;
00042 
00043     m_length = 0;
00044 } // ctor
00045 
00046 
00050 ImHerePacket::ImHerePacket(unsigned char* rawData) : NpPacket(rawData) {
00051     // Set the packet type
00052     m_controlType = NpPacket::ImHere;
00053 
00054     // Decode the ID
00055         memcpy(&m_id, &rawData[IdOffset], S_UINT);
00056         m_id = ntohl(m_id);
00057 
00058     // Decode the version number
00059         m_versionNumber = (rawData[VersionNumberOffset] & 0xF0) >> 4;
00060 
00061     // Decode the capabilities
00062     m_isNatted = ((rawData[CapabilityOffset] & NatBit) != 0);
00063         m_isFirewalled = ((rawData[CapabilityOffset] & FirewallBit) != 0);
00064     m_isTrusted = ((rawData[CapabilityOffset] & TrustedBit) != 0);
00065     
00066     // set IP version
00067     if ((rawData[CapabilityOffset] & IpVersionBit) == 0) {
00068         m_ip.setVersion(IpAddress::IPv4);
00069         
00070         // Decode the IP address
00071         unsigned long tmpIp;
00072             memcpy(&tmpIp, &rawData[IpOffset], S_UINT); 
00073             m_ip.setIpAddress(ntohl(tmpIp));
00074     }
00075     else {
00076         m_ip.setVersion(IpAddress::IPv6);
00077         debug(DEBUG_ERR, "ERROR: Functionality not defined!!!!!!!!!!");
00078     }
00079 
00080     // Decode the port
00081     memcpy(&m_port, &rawData[PortOffset], S_USHORT);
00082     m_port = ntohs(m_port);
00083 
00084     // Set the header length
00085         m_headerLength = IH_HEADER_LENGTH;
00086 } // ctor
00087 
00088 
00092 unsigned char* 
00093 ImHerePacket::getRawData() {
00094         unsigned int tmpUint;
00095         unsigned short tmpUshort;
00096 
00097     // Allocate memory and generate Network Layer header
00098         unsigned char* buf = NpPacket::getRawData();
00099 
00100     // Encode the ID
00101     tmpUint = htonl(m_id);
00102     memcpy(&buf[IdOffset], &tmpUint, S_UINT);
00103 
00104     // Encode the version number 
00105         buf[VersionNumberOffset] = (m_versionNumber << 4);
00106 
00107     // Encode the capabilities
00108     buf[CapabilityOffset] = buf[CapabilityOffset] | (m_isNatted ? NatBit : 0);
00109     buf[CapabilityOffset] = buf[CapabilityOffset] | (m_isFirewalled ? FirewallBit : 0);
00110     buf[CapabilityOffset] = buf[CapabilityOffset] | (m_isTrusted ? TrustedBit : 0);
00111     buf[CapabilityOffset] = buf[CapabilityOffset] | ((m_ip.getVersion() == IpAddress::IPv4) ? 0 : 0x01);
00112         
00113     // Encode the port
00114     tmpUshort = htons(m_port);
00115     memcpy(&buf[PortOffset], &tmpUshort, S_USHORT);
00116 
00117     // Encode the IP address
00118     if (m_ip.getVersion() == IpAddress::IPv4) {
00119         tmpUint = htonl(m_ip.getUnsignedLongForm());
00120             memcpy(&buf[IpOffset], &tmpUint, S_UINT);
00121     }
00122     else {
00123         debug(DEBUG_ERR, "FUNCTIONALITY NOT DEFINED!!!");
00124     }
00125 
00126         return buf;
00127 } // fn getRawData
00128 
00129 
00133 unsigned int 
00134 ImHerePacket::getId() {
00135         return m_id;
00136 } // fn getId
00137 
00138 
00142 void 
00143 ImHerePacket::setId(unsigned int id) {
00144         m_id = id;
00145 } // fn setId
00146 
00147 
00151 unsigned short 
00152 ImHerePacket::getVersionNumber() {
00153         return m_versionNumber;
00154 } // fn getVersionNumber
00155 
00156 
00157 void 
00158 ImHerePacket::setVersionNumber(unsigned short versionNumber) {
00159         m_versionNumber = versionNumber;
00160 } // fn setVersionNumber
00161 
00162 
00163 bool
00164 ImHerePacket::isNatted() {
00165     return m_isNatted;
00166 } // fn isNatted
00167 
00168 
00169 void
00170 ImHerePacket::setIsNatted(bool value) {
00171     m_isNatted = value;
00172 } // fn setIsNatted
00173 
00174 
00175 bool
00176 ImHerePacket::isFirewalled() {
00177     return m_isFirewalled;
00178 } // fn isFirewalled
00179 
00180 
00181 void
00182 ImHerePacket::setIsFirewalled(bool value) {
00183     m_isFirewalled = value;
00184 } // fn setIsFirewalled
00185 
00186 
00187 bool
00188 ImHerePacket::isTrusted() {
00189     return m_isTrusted;
00190 } // fn isTrusted
00191 
00192 
00193 void
00194 ImHerePacket::setIsTrusted(bool value) {
00195     m_isTrusted = value;
00196 } // fn setIsTrusted
00197 
00198 
00199 IpAddress 
00200 ImHerePacket::getIp() {
00201         return m_ip;
00202 } // fn getIp
00203 
00204 
00205 void 
00206 ImHerePacket::setIp(IpAddress ip) {
00207         m_ip = ip;
00208 } // fn setIp
00209 
00210 
00211 unsigned short
00212 ImHerePacket::getPort() {
00213         return m_port;
00214 } // fn getPorts
00215 
00216 
00217 void 
00218 ImHerePacket::setPort(unsigned short port) {
00219         m_port = port;
00220 } // fn addPort
00221 
00222 
00223 void
00224 ImHerePacket::toStream(std::ostream& out) {
00225     IpAddress ip;
00226 
00227     NpPacket::toStream(out);
00228         out << "Discovery ID   = " << getId() << " (0x" << hex << getId() << ")" << dec << "\n";
00229         out << "Version Number = " << getVersionNumber() << "\n";
00230     out << "isNATed       ?= " << isNatted() << "\n";
00231     out << "isFirewalled  ?= " << isFirewalled() << "\n";
00232     out << "isTrusted     ?= " << isTrusted() << "\n";
00233 
00234         ip = getIp();
00235         out << "IP             = " << ip << "\n";
00236         out << "port           = " << getPort() << " (0x" << hex << getPort() << dec << ");" << "\n";
00237 } // fn toStream
00238 
00239 

Generated at Thu Jul 11 13:31:50 2002 for Peekabooty by doxygen1.2.9 written by Dimitri van Heesch, © 1997-2001