00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "Common/Game.h"
00012 #include "Common/Ini.h"
00013 #include "Common/File.h"
00014 #include "Common/Console.h"
00015 #include "Common/Error.h"
00016 #include "Common/Time.h"
00017
00018 #include "Network/FileTransfer.h"
00019
00020
00021 KFTClientConnection::KFTClientConnection()
00022 : KUDPClientSocket()
00023 {
00024 m_pFile = NULL;
00025 m_Size = 0;
00026 }
00027
00028
00029 KFTClientConnection::~KFTClientConnection()
00030 {
00031 if( m_pFile )
00032 {
00033 m_pFile->Close();
00034 Deletep( m_pFile );
00035 }
00036 }
00037
00038
00039 void KFTClientConnection::OnMessage( KInetAddr& Addr, KNetMsg& Msg )
00040 {
00041 KNFILETRANSFER MsgType;
00042
00043 Msg >> MsgType;
00044
00045 switch( MsgType )
00046 {
00047 case KNFT_NEW:
00048 {
00049 KStr sString;
00050
00051 if( m_pFile )
00052 {
00053 m_pFile->Close();
00054 Deletep( m_pFile );
00055 m_Size = 0;
00056 }
00057
00058 Msg.ReadString( sString );
00059 g_Console << "FT : NEW FILE " << sString.GetpString() << KENDL;
00060
00061 sString += ".jpg" ;
00062 m_pFile = new KFile();
00063 if( !m_pFile->Create( sString.GetpString() ) )
00064 {
00065 KError::Warning( NULL, "KFTClientConnection::OnMessage() : Cannot create file [%s]", sString.GetpString() );
00066 return;
00067 }
00068 return;
00069 }
00070 case KNFT_DATA:
00071 {
00072 char pBuffer[1024];
00073 u32 Size;
00074
00075 Msg >> Size;
00076 KASSERT( Size <= sizeof( pBuffer ) );
00077 Msg.ReadBuffer( pBuffer, Size );
00078 m_Size += Size;
00079 g_Console << "FT : DATA " << m_Size << KENDL;
00080 m_pFile->Write( (u8*)pBuffer, Size );
00081 return;
00082 }
00083 case KNFT_CLOSE:
00084 {
00085 if( m_pFile )
00086 {
00087 m_pFile->Close();
00088 Deletep( m_pFile );
00089 m_Size = 0;
00090 }
00091
00092 g_Console << "FT : CLOSE " << KENDL;
00093
00094 return;
00095 }
00096 default:
00097 KError::Warning( NULL, "KFTClientConnection::OnMessage() : Unknown _KNFILETRANSFER type %i", MsgType );
00098 return;
00099 }
00100 }
00101
00102
00103 KFileTransfer::KFileTransfer()
00104 : KUDPServerSocket()
00105 {
00106 m_bServer = false;
00107 m_pFile = NULL;
00108 m_LastTime = 0;
00109 }
00110
00111
00112 KFileTransfer::~KFileTransfer()
00113 {
00114 }
00115
00116
00117 bool KFileTransfer::Init( bool bServer )
00118 {
00119 m_bServer = bServer;
00120
00121
00122 if( !KSocket::StartNetwork() )
00123 return false;
00124
00125
00126 if( m_bServer )
00127 {
00128 u32 MaxClients = g_pGame->GetpIniFile()->ReadInt( "NETWORK", "FTMaxClients", 32 );
00129 u16 ListenPort = (u16)g_pGame->GetpIniFile()->ReadInt( "NETWORK", "FTListenPort", 28002 );
00130
00131 SetMaxClients( MaxClients );
00132
00133 if( !Create() )
00134 return false;
00135 if( !Listen( KInetAddr( (char*)NULL, ListenPort ) ) )
00136 return false;
00137 }
00138
00139
00140 if( !m_ClientSocket.Create() )
00141 return false;
00142
00143 return true;
00144 }
00145
00146
00147 void KFileTransfer::End()
00148 {
00149
00150 if( m_bServer )
00151 {
00152 FlushAllClients();
00153 Close();
00154 }
00155
00156
00157 m_ClientSocket.Close();
00158
00159
00160 KSocket::StopNetwork();
00161 }
00162
00163
00164 bool KFileTransfer::Manage()
00165 {
00166 if( m_bServer )
00167 {
00168 if( !KUDPServerSocket::Manage() )
00169 return false;
00170 }
00171
00172 if( !m_ClientSocket.Manage() )
00173 return false;
00174
00175
00176 if( m_LastTime < g_Time.GetTime() )
00177 {
00178 m_LastTime = g_Time.GetTime() + 100;
00179 if( m_pFile )
00180 {
00181 KNetMsg Msg;
00182 char pBuffer[240];
00183 u32 Size = 0;
00184
00185 m_pFile->Read( (u8*)pBuffer, sizeof( pBuffer ), &Size );
00186
00187 if( Size )
00188 {
00189 Msg << KNFT_DATA << Size;
00190 Msg.WriteBuffer( pBuffer, Size );
00191 m_ClientSocket.SendMessage( Msg );
00192 }
00193
00194 if( Size != sizeof( pBuffer ) )
00195 {
00196 Msg.Flush();
00197 Msg << KNFT_CLOSE;
00198 m_ClientSocket.SendMessage( Msg );
00199
00200 m_pFile->Close();
00201 Deletep( m_pFile );
00202 }
00203 }
00204 }
00205
00206 return true;
00207 }
00208
00209
00210 bool KFileTransfer::Connect( KStr pHostName )
00211 {
00212 u16 ListenPort = (u16)g_pGame->GetpIniFile()->ReadInt( "NETWORK", "FTListenPort", 28002 );
00213
00214 if( !m_ClientSocket.Connect( KInetAddr( pHostName.GetpString(), ListenPort ) ) )
00215 return false;
00216
00217 return true;
00218 }
00219
00220
00221 bool KFileTransfer::PutFile( KStr sFileName )
00222 {
00223 if( m_pFile )
00224 {
00225 m_pFile->Close();
00226 Deletep( m_pFile );
00227 }
00228
00229 m_pFile = new KFile();
00230 if( !m_pFile->Open( sFileName ) )
00231 {
00232 Deletep( m_pFile );
00233 return false;
00234 }
00235
00236 KNetMsg Msg;
00237
00238 Msg << KNFT_NEW;
00239 Msg.WriteString( sFileName );
00240 m_ClientSocket.SendMessage( Msg );
00241
00242 return true;
00243 }