D:/Zythum/DinoKod/Network/FileTransfer.cpp

00001 //---------------------------------------------------------------------------------------------
00002 //      This file is a part of "DinoKod".
00003 //      Copyright © 2003 Dino Productions. All Rights Reserved.
00004 //      
00005 //      File                    : FileTransfer.cpp
00006 //      Author                  : Sebastien LEIX        sebastien.leix@wanadoo.fr
00007 //      Date                    : 09/09/2002
00008 //      Modification    :
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         // Demarrage de  WINSOCK
00122         if( !KSocket::StartNetwork() )
00123                 return false;
00124 
00125         // Server
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         // Client
00140         if( !m_ClientSocket.Create() )
00141                 return false;
00142 
00143         return true;
00144 }
00145 
00146 //---------------------------------------------------------------------------------------------------------------------
00147 void KFileTransfer::End()
00148 {
00149         // Server
00150         if( m_bServer )
00151         {
00152                 FlushAllClients();
00153                 Close();
00154         }
00155 
00156         // Client
00157         m_ClientSocket.Close();
00158 
00159         // Arret de WINSOCK
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 }

Generated on Sun Mar 25 20:02:15 2007 for Zythum Project by  doxygen 1.5.1-p1