|
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.
|