From: <at...@us...> - 2007-08-21 04:09:25
|
Revision: 475 http://cadcdev.svn.sourceforge.net/cadcdev/?rev=475&view=rev Author: atani Date: 2007-08-20 21:08:54 -0700 (Mon, 20 Aug 2007) Log Message: ----------- Initial cut of Tiki::Net support currently implemented: * Address resolution (win32, sdl, OSX maybe [needs testing]) * basic TCPSocket support (connect, disconnect, read, write) for sdl, win32, partial OSX support * example of connecting to http://www.example.com/ and downloading index.html Modified Paths: -------------- tiki/examples/TikiTest/TikiTest_vc80.vcproj tiki/examples/console/TikiSnake/TikiSnake.vcproj tiki/osx/src/init_shutdown.cpp tiki/sdl/Makefile tiki/sdl/src/init_shutdown.cpp tiki/win32/tiki_vc80.sln tiki/win32/tiki_vs80.vcproj Added Paths: ----------- tiki/examples/net/ tiki/examples/net/basic/ tiki/examples/net/basic/Makefile tiki/examples/net/basic/basic.vcproj tiki/examples/net/basic/src/ tiki/examples/net/basic/src/BasicNetTest.cpp tiki/examples/net/basic/src/main.cpp tiki/include/Tiki/net/ tiki/include/Tiki/net/address.h tiki/include/Tiki/net/buffer.h tiki/include/Tiki/net/net.h tiki/include/Tiki/net/socket.h tiki/include/Tiki/net/tcpserversocket.h tiki/include/Tiki/net/tcpsocket.h tiki/include/Tiki/net/udpsocket.h tiki/osx/include/Tiki/platnet.h tiki/osx/src/platnet.cpp tiki/sdl/include/Tiki/platnet.h tiki/sdl/src/platnet.cpp tiki/src/net/ tiki/src/net/address.cpp tiki/src/net/socket.cpp tiki/src/net/tcpserversocket.cpp tiki/src/net/tcpsocket.cpp tiki/win32/include/Tiki/platnet.h tiki/win32/src/platnet.cpp Modified: tiki/examples/TikiTest/TikiTest_vc80.vcproj =================================================================== --- tiki/examples/TikiTest/TikiTest_vc80.vcproj 2007-08-16 23:06:56 UTC (rev 474) +++ tiki/examples/TikiTest/TikiTest_vc80.vcproj 2007-08-21 04:08:54 UTC (rev 475) @@ -59,7 +59,7 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib" + AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib ws2_32.lib" LinkIncremental="2" AdditionalLibraryDirectories="$(ProjectDir)\..\..\win32\Debug;"C:\Program Files\OpenAL 1.1 SDK\libs\Win32"" GenerateDebugInformation="true" @@ -134,7 +134,7 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib" + AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib ws2_32.lib" LinkIncremental="1" AdditionalLibraryDirectories="$(ProjectDir)\..\..\win32\Release;C:\Program Files\OpenAL 1.1 SDK\libs\Win32" IgnoreDefaultLibraryNames="" Modified: tiki/examples/console/TikiSnake/TikiSnake.vcproj =================================================================== --- tiki/examples/console/TikiSnake/TikiSnake.vcproj 2007-08-16 23:06:56 UTC (rev 474) +++ tiki/examples/console/TikiSnake/TikiSnake.vcproj 2007-08-21 04:08:54 UTC (rev 475) @@ -59,7 +59,7 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib" + AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib ws2_32.lib" LinkIncremental="2" AdditionalLibraryDirectories="$(ProjectDir)\..\..\..\win32\Debug;"C:\Program Files\OpenAL 1.1 SDK\libs\Win32"" GenerateDebugInformation="true" @@ -134,7 +134,7 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib" + AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib ws2_32.lib" LinkIncremental="1" AdditionalLibraryDirectories="$(ProjectDir)\..\..\..\win32\Release;C:\Program Files\OpenAL 1.1 SDK\libs\Win32" IgnoreDefaultLibraryNames="" Added: tiki/examples/net/basic/Makefile =================================================================== --- tiki/examples/net/basic/Makefile (rev 0) +++ tiki/examples/net/basic/Makefile 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,13 @@ + +TIKI_DIR=../../../ +CFLAGS=-I$(TIKI_DIR)$(TIKI_PLAT)/include -I$(TIKI_DIR)include +OBJS = $(patsubst %.cpp,%.o,$(wildcard src/*.cpp)) + +all: $(OBJS) + $(CXX) $(LDFLAGS) -L$(TIKI_DIR)$(TIKI_PLAT) -L$(TIKI_DIR)$(TIKI_PLAT)/lib $(OBJS) $(TIKI_BASE_LIBS) -o basic + +clean: + -rm -f $(OBJS) basic + +DEPSDIR=$(CURDIR) +include $(TIKI_DIR)$(TIKI_PLAT)/Makefile.rules Added: tiki/examples/net/basic/basic.vcproj =================================================================== --- tiki/examples/net/basic/basic.vcproj (rev 0) +++ tiki/examples/net/basic/basic.vcproj 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,205 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="BasicNet" + ProjectGUID="{7B823C96-860C-4578-95CC-1087A45AF1AA}" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="$(ProjectDir)\..\..\..\win32\include;$(ProjectDir)\..\..\..\include;"C:\Program Files\OpenAL 1.1 SDK\include"" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib ws2_32.lib" + LinkIncremental="2" + AdditionalLibraryDirectories="$(ProjectDir)\..\..\..\win32\Debug;"C:\Program Files\OpenAL 1.1 SDK\libs\Win32"" + GenerateDebugInformation="true" + SubSystem="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="1" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="$(ProjectDir)\..\..\..\win32\include;$(ProjectDir)\..\..\..\include;"C:\Program Files\OpenAL 1.1 SDK\include"" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;" + RuntimeLibrary="0" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="gdi32.lib kernel32.lib user32.lib opengl32.lib glu32.lib comdlg32.lib ws2_32.lib" + LinkIncremental="1" + AdditionalLibraryDirectories="$(ProjectDir)\..\..\..\win32\Release;C:\Program Files\OpenAL 1.1 SDK\libs\Win32" + IgnoreDefaultLibraryNames="" + GenerateDebugInformation="true" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\src\BasicNetTest.cpp" + > + </File> + <File + RelativePath=".\src\main.cpp" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: tiki/examples/net/basic/src/BasicNetTest.cpp =================================================================== --- tiki/examples/net/basic/src/BasicNetTest.cpp (rev 0) +++ tiki/examples/net/basic/src/BasicNetTest.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,27 @@ +/* +* Basic.cpp +* Basic Network test +* +* Copyright (C)2007 Atani Software +* +*/ + +#include <Tiki/tiki.h> +#include <pch.h> + +#if TIKI_PLAT == TIKI_WIN32 +#include <windows.h> + +static char szAppName[] = "BasicNetTest"; +int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) +#else +extern "C" int tiki_main( int argc, char *argv[] ); +int main( int argc, char *argv[] ) +#endif +{ +#if TIKI_PLAT != TIKI_WIN32 + return tiki_main( argc, argv ); +#else + return Tiki::DoMain( szAppName, hInst, hPrevInstance, lpCmdLine, nCmdShow ); +#endif +} Added: tiki/examples/net/basic/src/main.cpp =================================================================== --- tiki/examples/net/basic/src/main.cpp (rev 0) +++ tiki/examples/net/basic/src/main.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,55 @@ +/* +* Basic.cpp +* Basic Network test +* +* Copyright (C)2007 Atani Software +* +*/ + +#include <Tiki/tiki.h> +#include <Tiki/refcnt.h> +#include <Tiki/tikitime.h> +#include <Tiki/net/net.h> + +using namespace Tiki; +using namespace Tiki::Debug; +using namespace Tiki::Net; +using namespace Tiki::Net::TCP; +using namespace Tiki::Time; + +extern "C" int tiki_main( int argc, char **argv) { + + Tiki::Net::init(); + + RefPtr<Address> address = new Address(); + address->setHostName("www.example.com"); + address->setPort(80); + Tiki::Debug::printf("%s -> %s\n", + address->getHostName().c_str(), + address->getIPAddressString().c_str()); + + RefPtr<TCPSocket> socket = new TCPSocket(address); + + Tiki::Debug::printf("localaddress: %s\n", socket->getLocalAddress()->getIPAddressString().c_str()); + socket->open(); + + RefPtr<Buffer> buf = new Buffer(1024); + Tiki::Debug::printf("Requesting www.example.com/index.html"); + string str = "GET /index.html HTTP/1.1\r\nHost: " + address->getHostName() + "\r\n\r\n"; + buf->setData((uint8 *)str.c_str(), str.length()); + + socket->send(buf); + + Tiki::Time::sleep(50000); + + RefPtr<Buffer> reply = new Buffer(1024); + socket->recv(reply); + if(reply != NULL) { + Tiki::Debug::printf("%s\n", reply->getData()); + } + + socket->close(); + + Tiki::Net::shutdown(); + return 0; +} Added: tiki/include/Tiki/net/address.h =================================================================== --- tiki/include/Tiki/net/address.h (rev 0) +++ tiki/include/Tiki/net/address.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,55 @@ +/* + Tiki + + address.h + + Copyright (C)2007 Atani Software +*/ +#ifndef __TIKI_NET_ADDRESS_H +#define __TIKI_NET_ADDRESS_H + +#include "Tiki/refcnt.h" + +namespace Tiki { + +namespace Net { + +class Address : public RefCnt +{ + public: + Address(); + + typedef enum AddressType { + AddressUnknown = 0x00000000, + AddressAny = 0x00000001, + AddressNone = 0x00000002, + AddressBroadcast = 0x00000003 + }; + + + int getPort() { + return m_port; + } + + void setPort(int port) { + m_port = port; + } + + string getHostName(); + void setHostName(string hostname); + + uint32 getIPAddress(); + string getIPAddressString(); + void setIPAddress(uint32 ip); + + private: + string m_hostname; + uint32 m_ip; + int m_port; +}; + +} // namespace Net + +} // namespace Tiki + +#endif // __TIKI_NET_ADDRESS_H Added: tiki/include/Tiki/net/buffer.h =================================================================== --- tiki/include/Tiki/net/buffer.h (rev 0) +++ tiki/include/Tiki/net/buffer.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,68 @@ +/* + Tiki + + buffer.h + + Copyright (C)2007 Atani Software +*/ +#ifndef __TIKI_NET_BUFFER_H +#define __TIKI_NET_BUFFER_H + +#include "Tiki/object.h" + +namespace Tiki { + +namespace Net { + +class Buffer : public Object +{ + public: + Buffer(size_t len) { + m_data = new uint8[len]; + memset(m_data, 0, len); + m_dataLen = len; + } + Buffer(size_t len, uint8 *data) { + m_data = new uint8[len]; + memset(m_data, 0, len); + m_dataLen = len; + memcpy(m_data, data, len); + } + + uint8 *getData() const { + return m_data; + } + + size_t getDataLen() const { + return m_dataLen; + } + + size_t getUsedDataLen() const { + return m_usedDataLen; + } + + void setData(uint8 *data, size_t len) { + memset(m_data, 0, m_dataLen); + if(len > m_dataLen) + { + memcpy(m_data, data, m_dataLen); + m_usedDataLen = m_dataLen; + } + else + { + memcpy(m_data, data, len); + m_usedDataLen = len; + } + } + + private: + uint8 *m_data; + size_t m_dataLen; + size_t m_usedDataLen; +}; + +} // namespace Net + +} // namespace Tiki + +#endif // __TIKI_NET_UDPPACKET_H Added: tiki/include/Tiki/net/net.h =================================================================== --- tiki/include/Tiki/net/net.h (rev 0) +++ tiki/include/Tiki/net/net.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,28 @@ +/* + Tiki + + net.h + + Copyright (C)2007 Atani Software +*/ +#ifndef __TIKI_NET_H +#define __TIKI_NET_H + +#include "Tiki/platnet.h" + +namespace Tiki { + +namespace Net { + +void init(); +void shutdown(); + +} // namespace Net + +} // namespace Tiki + +#endif // __TIKI_NET_H + +#include <Tiki/net/buffer.h> +#include <Tiki/net/address.h> +#include <Tiki/net/tcpsocket.h> Added: tiki/include/Tiki/net/socket.h =================================================================== --- tiki/include/Tiki/net/socket.h (rev 0) +++ tiki/include/Tiki/net/socket.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,79 @@ +/* + Tiki + + socket.h + + Copyright (C)2007 Atani Software +*/ +#ifndef __TIKI_NET_SOCKET_H +#define __TIKI_NET_SOCKET_H + +#include "Tiki/object.h" +#include "Tiki/net/address.h" +#include "Tiki/net/buffer.h" + +namespace Tiki { + +namespace Net { + +class Socket : public Object +{ + public: + Socket(); + Socket(RefPtr<Address> address); + + RefPtr<Address> getPeerAddress() + { + return m_peerAddress; + } + + void setPeerAddress(RefPtr<Address> address) + { + m_peerAddress = address; + } + + RefPtr<Address> getLocalAddress() + { + return m_localAddress; + } + + bool isNonBlocking() + { + return m_blocking; + } + + void setNonBlocking(bool blocking) + { + m_blocking = blocking; + } + + bool isReuse() + { + return m_reuse; + } + + void setReuse(bool reuse) + { + m_reuse = reuse; + } + + virtual void send(RefPtr<Buffer> data) = 0; + + virtual void recv(RefPtr<Buffer> data) = 0; + + virtual void open() = 0; + + virtual void close() = 0; + + private: + RefPtr<Address> m_peerAddress; + RefPtr<Address> m_localAddress; + bool m_blocking; + bool m_reuse; +}; + +} // namespace Net + +} // namespace Tiki + +#endif // __TIKI_NET_SOCKET_H Added: tiki/include/Tiki/net/tcpserversocket.h =================================================================== --- tiki/include/Tiki/net/tcpserversocket.h (rev 0) +++ tiki/include/Tiki/net/tcpserversocket.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,36 @@ +/* + Tiki + + tcpservesocket.h + + Copyright (C)2007 Atani Software +*/ +#ifndef __TIKI_NET_TCPSERVERSOCKET_H +#define __TIKI_NET_TCPSERVERSOCKET_H + +#include "Tiki/net/tcpsocket.h" + +namespace Tiki { + +namespace Net { + +namespace TCP { + +class TCPServerSocket : public TCPSocket +{ + public: + TCPServerSocket() : TCPSocket() {}; + TCPServerSocket(RefPtr<Address> address) : TCPSocket(address) {}; + + void bind(); + + RefPtr<TCPSocket> accept(); +}; + +} // namespace TCP + +} // namespace Net + +} // namespace Tiki + +#endif // __TIKI_NET_TCPSERVERSOCKET_H Added: tiki/include/Tiki/net/tcpsocket.h =================================================================== --- tiki/include/Tiki/net/tcpsocket.h (rev 0) +++ tiki/include/Tiki/net/tcpsocket.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,71 @@ +/* + Tiki + + tcpsocket.h + + Copyright (C)2007 Atani Software +*/ +#ifndef __TIKI_NET_TCPSOCKET_H +#define __TIKI_NET_TCPSOCKET_H + +#include "Tiki/platnet.h" +#include "Tiki/net/buffer.h" +#include "Tiki/net/socket.h" + +namespace Tiki { + +namespace Net { + +namespace TCP { + +using Tiki::Net::Buffer; + +class TCPSocket : public Tiki::Net::Socket +{ + public: + +#ifndef INVALID_SOCKET + enum { + INVALID_SOCKET = -1, + SOCKET_ERROR = -1 + }; +#endif + TCPSocket() : Socket() {}; + TCPSocket(RefPtr<Address> address) : Socket(address) {}; + + virtual void send(RefPtr<Buffer> data); + + virtual void recv(RefPtr<Buffer> data); + + uint32 getPort() + { + return m_port; + } + + void setPort(uint32 port) + { + m_port = port; + } + virtual void open(); + + virtual void close(); + + private: + uint32 m_port; +#if TIKI_PLAT == TIKI_OSX + ; +#elif TIKI_PLAT == TIKI_WIN32 + SOCKET m_socket; +#else + int m_socket; +#endif + +}; + +} // namespace TCP + +} // namespace Net + +} // namespace Tiki + +#endif // __TIKI_NET_TCPSOCKET_H Added: tiki/include/Tiki/net/udpsocket.h =================================================================== --- tiki/include/Tiki/net/udpsocket.h (rev 0) +++ tiki/include/Tiki/net/udpsocket.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,36 @@ +/* + Tiki + + tcpsocket.h + + Copyright (C)2007 Atani Software +*/ +#ifndef __TIKI_NET_UDPSOCKET_H +#define __TIKI_NET_UDPSOCKET_H + +namespace Tiki { + +namespace Net { + +namespace UDP { + +#define MAX_UDP_CHANNELS 32 + +class UDPSocket : public Tiki::Net::Socket +{ + public: + virtual void send(RefPtr<Buffer> data); + virtual void recv(RefPtr<Buffer> data); + + void open(uint32 port); + + void bind(RefPtr<UDPSocket> socket, int channel, RefPtr<Address> address); +}; + +} // namespace UDP + +} // namespace Net + +} // namespace Tiki + +#endif // __TIKI_NET_UDPSOCKET_H Added: tiki/osx/include/Tiki/platnet.h =================================================================== --- tiki/osx/include/Tiki/platnet.h (rev 0) +++ tiki/osx/include/Tiki/platnet.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,33 @@ +/* + Tiki + + platnet.h + + Copyright (C)2007 Atani Software +*/ + +#ifndef TIKI_PLATFORM_NET_H +#define TIKI_PLATFORM_NET_H +#include <OpenTransport.h> +#include <OpenTptInternet.h> +#include <Events.h> + +namespace Tiki { + +namespace Net { + +enum DNS_STATUS { + NOT_READY = 0, + READY, + RESOLVED, + ERROR +}; + +extern DNS_STATUS g_tikiDNSStatus; +extern InetSvcRef g_tikiDNSRef; + +}; // namespace Net + +}; // namespace Tiki + +#endif // TIKI_PLATFORM_NET_H Modified: tiki/osx/src/init_shutdown.cpp =================================================================== --- tiki/osx/src/init_shutdown.cpp 2007-08-16 23:06:56 UTC (rev 474) +++ tiki/osx/src/init_shutdown.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -71,4 +71,5 @@ } }; + }; Added: tiki/osx/src/platnet.cpp =================================================================== --- tiki/osx/src/platnet.cpp (rev 0) +++ tiki/osx/src/platnet.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,82 @@ +/* + Tiki + + platnet.cpp + + Copyright (C)2007 Atani Software +*/ + +#include "Tiki/tiki.h" +#include "Tiki/net/net.h" + +namespace Tiki { + +namespace Net { + +DNS_STATUS g_tikiDNSStatus; +InetSvcRef g_tikiDNSRef; + +static pascal void dnsNotifier(void *context, OTEventCode code, OTResult result, void *cookie) { + switch(code) { + case T_OPENCOMPLETE: + if(result == kOTNoError) { + g_tikiDNSStatus = READY; + g_tikiDNSRef = (InetSvcRef)cookie; + } + else { + g_tikiDNSStatus = ERROR; + Tiki::Debug::printf("T_DNRSTRINGTOADDRCOMPLETE event returned an error\n"); + } + break; + case T_DNRSTRINGTOADDRCOMPLETE: + g_tikiDNSStatus = RESOLVED; + break; + default: + if(result != kOTNoError) { + g_tikiDNSStatus = ERROR; + Tiki::Debug::printf("Error in DNS Resolver\n"); + } + } +} + +void startDNS() { + OSStatus status; + + status = OTAsyncOpenInternetServices( + kDefaultInternetServicesPath, 0, dnsNotifier, NULL); + if(status != noErr) { + Tiki::Debug::printf("Unable to initialize DNS Handler\n"); + } +} + +void stopDNS() { + if(g_dnsRef != 0) { + OTCloseProvider(g_tikiDNSRef); + g_tikiDNSStatus = NOT_READY; + g_tikiDNSRef = 0; + } +} + +void init() { + OSStatus status; + + g_tikiDNSStatus = NOT_READY; + g_tikiDNSRef = 0; + + status = InitOpenTransport(); + if(status == noErr) { + StartDNS(); + } + else { + Tiki::Debug::printf("Unable to initialize OpenTransport\n"); + } +} + +void shutdown() { + stopDNS(); +} + + +} + +}; Modified: tiki/sdl/Makefile =================================================================== --- tiki/sdl/Makefile 2007-08-16 23:06:56 UTC (rev 474) +++ tiki/sdl/Makefile 2007-08-21 04:08:54 UTC (rev 475) @@ -10,6 +10,7 @@ BASE_IMAGE_OBJ=$(patsubst %.cpp,%.o,$(wildcard ../src/image/*.cpp)) BASE_MATH_OBJ=$(patsubst %.cpp,%.o,$(wildcard ../src/math/*.cpp)) BASE_THREAD_OBJ=$(patsubst %.cpp,%.o,$(wildcard ../src/thread/*.cpp)) +BASE_NET_OBJ=$(patsubst %.cpp,%.o,$(wildcard ../src/net/*.cpp)) JPEG_OBJ=$(patsubst %.c,%.o,$(wildcard ../3rdparty/libjpeg/*.c)) PNG_OBJ=$(patsubst %.c,%.o,$(wildcard ../3rdparty/libpng/*.c)) @@ -39,7 +40,7 @@ BASE_OBJS = $(BASE_AUDIO_OBJ) $(BASE_BASE_OBJ) $(BASE_GL_OBJ) \ $(BASE_HID_OBJ) $(BASE_IMAGE_OBJ) $(BASE_MATH_OBJ) \ - $(BASE_THREAD_OBJ) + $(BASE_THREAD_OBJ) $(BASE_NET_OBJ) THIRD_PARTY_OBJS = $(JPEG_OBJ) $(OGG_OBJ) $(VORBIS_OBJ) $(PNG_OBJ) $(ZLIB_OBJ) Added: tiki/sdl/include/Tiki/platnet.h =================================================================== --- tiki/sdl/include/Tiki/platnet.h (rev 0) +++ tiki/sdl/include/Tiki/platnet.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,12 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <netdb.h> +#include <sys/socket.h> +#include <sys/time.h> + Modified: tiki/sdl/src/init_shutdown.cpp =================================================================== --- tiki/sdl/src/init_shutdown.cpp 2007-08-16 23:06:56 UTC (rev 474) +++ tiki/sdl/src/init_shutdown.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -59,4 +59,15 @@ } } +namespace Net { + +void init() +{ } + +void shutdown() +{ +} +} + +} Added: tiki/sdl/src/platnet.cpp =================================================================== --- tiki/sdl/src/platnet.cpp (rev 0) +++ tiki/sdl/src/platnet.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,26 @@ +/* + Tiki + + platnet.cpp + + Copyright (C)2007 Atani Software +*/ + +#include "Tiki/tiki.h" +#include "Tiki/net/net.h" + +namespace Tiki { + +namespace Net { + +void init() +{ +} + +void shutdown() +{ +} + +} // namespace Net + +} // namespace Tiki Added: tiki/src/net/address.cpp =================================================================== --- tiki/src/net/address.cpp (rev 0) +++ tiki/src/net/address.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,129 @@ +/* + Tiki + + address.cpp + + Copyright (C)2007 Atani Software +*/ + +#include "pch.h" +#include "Tiki/tiki.h" +#include "Tiki/platnet.h" +#include "Tiki/net/address.h" + +#include <sstream> + +namespace Tiki { + +namespace Net { + +Address::Address() +{ + m_hostname = ""; + m_ip = AddressUnknown; + m_port = 0; +} + +string Address::getHostName() +{ + if(m_hostname.empty() && + m_ip != AddressUnknown && + m_ip != AddressBroadcast && + m_ip != AddressAny && + m_ip != AddressNone ) + { +#if TIKI_PLAT == TIKI_OSX + InetHost ip; + InetDomainName domainName; + OSStatus status; + + domainName[0] = '\0'; + ip = m_ip; + status = OTInetAddressToName(g_tikiDNSRef, ip, domainName); + if(status == kOTNoError) { + while(g_tikiDNSStatus != RESOLVED) + { + ; + } + return domainName; + } +#else + struct hostent *hp = gethostbyaddr((char *)&m_ip, 4, AF_INET); + if(hp != NULL) + { + m_hostname = string(hp->h_name); + } +#endif + } + + return m_hostname; +} + +void Address::setHostName(string hostname) +{ + m_hostname = hostname; + m_ip = AddressUnknown; +} + +uint32 Address::getIPAddress() +{ + if(m_ip == AddressUnknown) + { + Tiki::Debug::printf("resolving host: %s\n", m_hostname.c_str()); +#if TIKI_PLAT == TIKI_OSX + InetHostInfo host; + if(OTInetStringToAddress(g_tikiDNSRef, m_hostname.c_str(), &info) == noErr) { + while( g_tikiDNSStatus != RESOLVED) + { + WaitNextEvent(everyEvent, 0, 1, NULL); + } + return info.addrs[0]; + } +#else + struct hostent *hp = gethostbyname(m_hostname.c_str()); + if(hp != NULL) + { + memcpy(&m_ip, hp->h_addr, hp->h_length); + } +#endif + } + return m_ip; +} + +string Address::getIPAddressString() +{ + if(m_ip == AddressAny) + { + return "0.0.0.0"; + } + else if(m_ip == AddressBroadcast || m_ip == AddressNone) + { + return "255.255.255.255"; + } + + uint32 ipnums = getIPAddress(); + uint8 *ip = (uint8 *)(&ipnums); + //Tiki::Debug::printf("host ip: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); + + std::ostringstream address; + + address << (int)ip[0]; + address << "."; + address << (int)ip[1]; + address << "."; + address << (int)ip[2]; + address << "."; + address << (int)ip[3]; + + return address.str(); +} + +void Address::setIPAddress(uint32 ip) +{ + m_ip = ip; + m_hostname = ""; +} + +} // namespace Net + +} // namespace Tiki Added: tiki/src/net/socket.cpp =================================================================== --- tiki/src/net/socket.cpp (rev 0) +++ tiki/src/net/socket.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,37 @@ +/* + Tiki + + socket.cpp + + Copyright (C)2007 Atani Software +*/ + +#include "pch.h" +#include "Tiki/tiki.h" +#include "Tiki/platnet.h" +#include "Tiki/net/socket.h" + +namespace Tiki { + +namespace Net { + +Socket::Socket() +{ + m_localAddress = new Address(); + m_localAddress->setHostName("localhost"); + m_blocking = true; + m_reuse = true; +} + +Socket::Socket(RefPtr<Address> address) +{ + m_peerAddress = address; + m_localAddress = new Address(); + m_localAddress->setHostName("localhost"); + m_blocking = true; + m_reuse = true; +} + +} // namespace Net + +} // namespace Tiki Added: tiki/src/net/tcpserversocket.cpp =================================================================== --- tiki/src/net/tcpserversocket.cpp (rev 0) +++ tiki/src/net/tcpserversocket.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,34 @@ +/* + Tiki + + tcpserversocket.cpp + + Copyright (C)2007 Atani Software +*/ + +#include "pch.h" +#include "Tiki/tiki.h" +#include "Tiki/platnet.h" +#include "Tiki/net/tcpserversocket.h" + +namespace Tiki { + +namespace Net { + +namespace TCP { + +void TCPServerSocket::bind() +{ + +} + +RefPtr<TCPSocket> TCPServerSocket::accept() +{ + return NULL; +} + +} // namespace TCP + +} // namespace Net + +} // namespace Tiki Added: tiki/src/net/tcpsocket.cpp =================================================================== --- tiki/src/net/tcpsocket.cpp (rev 0) +++ tiki/src/net/tcpsocket.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,131 @@ +/* + Tiki + + tcpsocket.cpp + + Copyright (C)2007 Atani Software +*/ + +#include "pch.h" +#include "Tiki/tiki.h" +#include "Tiki/platnet.h" + +#include <errno.h> + +namespace Tiki { + +namespace Net { + +namespace TCP { + +void TCPSocket::send(const RefPtr<Buffer> buffer) { +#if TIKI_PLAT == TIKI_OSX +#else + uint8 *data = buffer->getData(); + size_t dataLen = buffer->getUsedDataLen(); + int len; + + do { + Tiki::Debug::printf("sending %d bytes\n", dataLen); + len = ::send(m_socket, (const char *)data, (int)dataLen, 0); + if(len > 0) { + Tiki::Debug::printf("sent %d bytes\n", len); + dataLen -= len; + data += len; + } + else { + Tiki::Debug::printf("sent %d bytes\n", len); + } + } while(dataLen > 0 && (len > 0 || errno == EINTR)); + Tiki::Debug::printf("errno: %d [%x]\n", errno, errno); +#endif +} + +void TCPSocket::recv(RefPtr<Buffer> data) { +#if TIKI_PLAT == TIKI_OSX +#else + uint8 *tmp = new uint8[data->getDataLen()]; + memset(tmp, 0, data->getDataLen()); + int recvlen = 0; + errno = 0; + do { + Tiki::Debug::printf("receiving %d bytes\n", data->getDataLen()); + recvlen = ::recv(m_socket, (char *)tmp, (int)data->getDataLen(), 0); + } while(errno == EINTR && (recvlen < 0 && !isNonBlocking())); + Tiki::Debug::printf("received %d bytes\nerrno %d\n", recvlen, errno); + if(recvlen > 0) { + data->setData(tmp, recvlen); + } +#endif + delete [] tmp; +} + +void TCPSocket::open() { +#if TIKI_PLAT == TIKI_OSX +#else + struct sockaddr_in sock_addr; + m_socket = socket(AF_INET, SOCK_STREAM, 0); + if(m_socket == INVALID_SOCKET) { + Tiki::Debug::printf("Error opening socket\n"); + return; + } + int yes = 1; + +#if TIKI_PLAT != TIKI_WIN32 + if(isReuse()) { + Tiki::Debug::printf("setting reuse flag\n"); + setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)); + } +#endif + + if(!(getLocalAddress()->getIPAddress() == Address::AddressAny || + getLocalAddress()->getIPAddress() == Address::AddressNone || + getLocalAddress()->getIPAddress() == Address::AddressBroadcast)) { + // connecting to remote address + memset(&sock_addr, 0, sizeof(struct sockaddr_in)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = getPeerAddress()->getIPAddress(); + sock_addr.sin_port = htons(getPeerAddress()->getPort()); + Tiki::Debug::printf("connecting to peer [%s->%s]\n", getPeerAddress()->getHostName().c_str(), getPeerAddress()->getIPAddressString().c_str()); + if( ::connect( m_socket, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { + Tiki::Debug::printf("Error opening socket\n"); + close(); + return; + } + Tiki::Debug::printf("Connected..\n"); + } + + Tiki::Debug::printf("setting TCP_NODELAY\n"); + setsockopt(m_socket, IPPROTO_TCP, TCP_NODELAY, (char *)&yes, sizeof(yes)); + + if(isNonBlocking()) { + Tiki::Debug::printf("setting NO BLOCKING mode\n"); +#if TIKI_PLAT == TIKI_WIN32 + unsigned long mode = 1; + ioctlsocket(m_socket, FIONBIO, &mode); +#else + fcntl(m_socket, F_SETFL, O_NONBLOCK); +#endif + } +#endif +} + +void TCPSocket::close() { + Tiki::Debug::printf("closing socket\n"); +#if TIKI_PLAT == TIKI_OSX +#elif TIKI_PLAT == TIKI_WIN32 + if(m_socket != INVALID_SOCKET) { + closesocket(m_socket); + } +#else + if(m_socket != INVALID_SOCKET) { + ::close(m_socket); + } +#endif +} + +} // namespace TCP + +} // namespace Net + +} // namespace Tiki Added: tiki/win32/include/Tiki/platnet.h =================================================================== --- tiki/win32/include/Tiki/platnet.h (rev 0) +++ tiki/win32/include/Tiki/platnet.h 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,6 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> + +#include <winsock2.h> \ No newline at end of file Added: tiki/win32/src/platnet.cpp =================================================================== --- tiki/win32/src/platnet.cpp (rev 0) +++ tiki/win32/src/platnet.cpp 2007-08-21 04:08:54 UTC (rev 475) @@ -0,0 +1,39 @@ +/* + Tiki + + platnet.cpp + + Copyright (C)2007 Atani Software +*/ + +#include "pch.h" +#include "Tiki/tiki.h" +#include "Tiki/net/net.h" + +namespace Tiki { + +namespace Net { + +void init() +{ + WORD version_wanted = MAKEWORD(1,1); + WSADATA wsaData; + + if ( WSAStartup(version_wanted, &wsaData) != 0 ) { + Tiki::Debug::printf("Couldn't initialize Winsock 1.1\n"); + } +} + +void shutdown() +{ + if ( WSACleanup() == SOCKET_ERROR ) { + if ( WSAGetLastError() == WSAEINPROGRESS ) { + WSACancelBlockingCall(); + WSACleanup(); + } + } +} + +} // namespace Net + +} // namespace Tiki \ No newline at end of file Modified: tiki/win32/tiki_vc80.sln =================================================================== --- tiki/win32/tiki_vc80.sln 2007-08-16 23:06:56 UTC (rev 474) +++ tiki/win32/tiki_vc80.sln 2007-08-21 04:08:54 UTC (rev 475) @@ -13,6 +13,11 @@ {F2816CAC-B560-4ED9-8A73-9635F832943C} = {F2816CAC-B560-4ED9-8A73-9635F832943C} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BasicNet", "..\examples\net\basic\basic.vcproj", "{7B823C96-860C-4578-95CC-1087A45AF1AA}" + ProjectSection(ProjectDependencies) = postProject + {F2816CAC-B560-4ED9-8A73-9635F832943C} = {F2816CAC-B560-4ED9-8A73-9635F832943C} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -31,6 +36,10 @@ {FCAE4EF3-7B5D-4C0D-8793-4157F7D8709F}.Debug|Win32.Build.0 = Debug|Win32 {FCAE4EF3-7B5D-4C0D-8793-4157F7D8709F}.Release|Win32.ActiveCfg = Release|Win32 {FCAE4EF3-7B5D-4C0D-8793-4157F7D8709F}.Release|Win32.Build.0 = Release|Win32 + {7B823C96-860C-4578-95CC-1087A45AF1AA}.Debug|Win32.ActiveCfg = Debug|Win32 + {7B823C96-860C-4578-95CC-1087A45AF1AA}.Debug|Win32.Build.0 = Debug|Win32 + {7B823C96-860C-4578-95CC-1087A45AF1AA}.Release|Win32.ActiveCfg = Release|Win32 + {7B823C96-860C-4578-95CC-1087A45AF1AA}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE Modified: tiki/win32/tiki_vs80.vcproj =================================================================== --- tiki/win32/tiki_vs80.vcproj 2007-08-16 23:06:56 UTC (rev 474) +++ tiki/win32/tiki_vs80.vcproj 2007-08-21 04:08:54 UTC (rev 475) @@ -396,6 +396,26 @@ > </File> </Filter> + <Filter + Name="net" + > + <File + RelativePath="..\src\net\address.cpp" + > + </File> + <File + RelativePath="..\src\net\socket.cpp" + > + </File> + <File + RelativePath="..\src\net\tcpserversocket.cpp" + > + </File> + <File + RelativePath="..\src\net\tcpsocket.cpp" + > + </File> + </Filter> </Filter> <Filter Name="Include" @@ -624,6 +644,38 @@ > </File> </Filter> + <Filter + Name="net" + > + <File + RelativePath="..\include\Tiki\net\address.h" + > + </File> + <File + RelativePath="..\include\Tiki\net\buffer.h" + > + </File> + <File + RelativePath="..\include\Tiki\net\net.h" + > + </File> + <File + RelativePath="..\include\Tiki\net\socket.h" + > + </File> + <File + RelativePath="..\include\Tiki\net\tcpserversocket.h" + > + </File> + <File + RelativePath="..\include\Tiki\net\tcpsocket.h" + > + </File> + <File + RelativePath="..\include\Tiki\net\udpsocket.h" + > + </File> + </Filter> </Filter> </Filter> <Filter @@ -653,6 +705,10 @@ > </File> <File + RelativePath=".\src\platnet.cpp" + > + </File> + <File RelativePath=".\src\platthread.cpp" > </File> @@ -695,6 +751,10 @@ > </File> <File + RelativePath=".\include\Tiki\platnet.h" + > + </File> + <File RelativePath=".\include\Tiki\platthread.h" > </File> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |