reman3/Rayman_X/cpa/Appli/MngData5/Src/TimeFunc.cpp

298 lines
8.3 KiB
C++

/*
=======================================================================================
Name :TimeFunc.cpp
Author :vincent lhullier Date :26/07/97
Description :time functions
=======================================================================================
Modification -> Author : Date :
Description :
=======================================================================================
*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "stdafx.h"
#include "TimeFunc.h"
#include "IniData.h"
#include <winsock.h>
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
=======================================================================================
Globals
=======================================================================================
*/
time_t g_xServerTime;
time_t g_xUpdateTime;
char g_szUpdateTimeString[20];
COleDateTime g_oOleUpdatingTime;
/*
=======================================================================================
Functions to read an int or a date in a buffer
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
read an int in char buffer
---------------------------------------------------------------------------------------
*/
BOOL fn_bReadInt( char *p_cBuf, int iNumDigit, int *p_iResult)
{
int iNum;
*p_iResult = 0;
for (iNum = 0; iNum < iNumDigit; iNum++)
{
if (!isdigit( *p_cBuf ))
return FALSE;
*p_iResult = *p_iResult * 10 + (*p_cBuf++ - '0');
}
return TRUE;
}
/*
---------------------------------------------------------------------------------------
read a date int in char buffer
---------------------------------------------------------------------------------------
*/
BOOL fn_bReadDate( char *p_cBuf, struct tm *p_stTime)
{
memset( p_stTime, 0, sizeof( struct tm) );
if ( (fn_bReadInt( p_cBuf, 2, &p_stTime->tm_mday )) && (*(p_cBuf+=2) == '/') )
{
if (( fn_bReadInt( ++p_cBuf, 2, &p_stTime->tm_mon)) && (*(p_cBuf+=2) == '/') )
{
if (( fn_bReadInt( ++p_cBuf, 4, &p_stTime->tm_year)) && (*(p_cBuf+=4) == ' ') )
{
p_stTime->tm_year -= 1900;
if (( fn_bReadInt( ++p_cBuf, 2, &p_stTime->tm_hour)) && (*(p_cBuf+=2) == ':') )
{
if ( fn_bReadInt( ++p_cBuf, 2, &p_stTime->tm_min) )
{
p_stTime->tm_sec = 0;
p_stTime->tm_isdst = 1;
return TRUE;
}
}
}
}
}
return FALSE;
}
/*
=======================================================================================
Time functions
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
synchronyze with time serveur
---------------------------------------------------------------------------------------
*/
BOOL fn_bSynchronizeTime( BOOL _bMessage )
{
if (!fn_bRequestTimeServer( _bMessage ) )
return FALSE;
SYSTEMTIME stSysTime;
struct tm *p_stTime;
_tzset();
p_stTime = gmtime( &g_xServerTime );
//p_stTime = localtime( &g_xServerTime );
stSysTime.wYear = p_stTime->tm_year + 1900;
stSysTime.wMonth = p_stTime->tm_mon + 1;
stSysTime.wDay = p_stTime->tm_mday;
stSysTime.wHour = p_stTime->tm_hour;
stSysTime.wMinute = p_stTime->tm_min;
stSysTime.wSecond = p_stTime->tm_sec;
if ( !SetSystemTime( &stSysTime ) )
return FALSE;
return TRUE;
}
/*
---------------------------------------------------------------------------------------
updating variable for updating time
---------------------------------------------------------------------------------------
*/
void fn_vInitUpdateTime( void )
{
time (&g_xUpdateTime );
fn_vFormatDateTime( g_xUpdateTime, g_szUpdateTimeString );
}
/*
---------------------------------------------------------------------------------------
format time in a string (if time is 0 get current time )
---------------------------------------------------------------------------------------
*/
void fn_vFormatDateTime( time_t xTime, char *szString )
{
struct tm *p_stTime;
if (xTime == 0)
time ( &xTime );
p_stTime = localtime( &xTime );
sprintf
(
szString,
"%02d/%02d/%04d %02d:%02d",
p_stTime->tm_mday,
p_stTime->tm_mon + 1,
p_stTime->tm_year + 1900,
p_stTime->tm_hour,
p_stTime->tm_min
);
}
/*
---------------------------------------------------------------------------------------
Ask server time
---------------------------------------------------------------------------------------
*/
BOOL fn_bRequestTimeServer( BOOL _bMessage )
{
int iSocketDescriptor; // socket descriptor
struct sockaddr_in stDestAddr; // destination address
int iAddrLength; // address length
char a_cBuffer[200];
char *p_cBuffer;
int iOption; /* option for setsockopt() */
int iErrNo;
fd_set stFDSet;
struct timeval stTimeout;
unsigned short uwDestPort;
// open socket
iSocketDescriptor=socket(PF_INET, SOCK_DGRAM, 0);
if(iSocketDescriptor<0)
{
p_cBuffer = a_cBuffer + sprintf( a_cBuffer, "Error with time server (socket error)\r\n" );
iErrNo = WSAGetLastError();
switch (iErrNo)
{
case WSANOTINITIALISED:
strcpy( a_cBuffer, "Window socket not initialized");
break;
case WSAENETDOWN:
strcpy( a_cBuffer, "Network subsystem has failed" );
break;
case WSAEAFNOSUPPORT:
strcpy( a_cBuffer, "The specified address family is not supported" );
break;
case WSAEINPROGRESS :
strcpy( a_cBuffer, "There's a blocking socket" );
break;
case WSAEMFILE:
strcpy( a_cBuffer, "No more socket descriptors are available." );
break;
case WSAENOBUFS:
strcpy( a_cBuffer, "No buffer space is available. The socket cannot be created." );
break;
case WSAEPROTONOSUPPORT:
strcpy( a_cBuffer, "The specified protocol is not supported." );
break;
case WSAEPROTOTYPE :
strcpy( a_cBuffer, "The specified protocol is the wrong type for this socket." );
break;
case WSAESOCKTNOSUPPORT:
strcpy( a_cBuffer, "The specified socket type is not supported in this address family." );
break;
default :
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
}
if (_bMessage)
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
return FALSE;
}
// set socket option
iOption = ~0;
if( setsockopt(iSocketDescriptor, SOL_SOCKET, SO_BROADCAST, (char *) &iOption, sizeof(iOption)) < 0)
{
iErrNo = WSAGetLastError();
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
if (_bMessage)
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
return FALSE;
}
uwDestPort = 1515;
iAddrLength = sizeof( struct sockaddr_in );
// Give the destination socket a name.
stDestAddr.sin_family = AF_INET;
stDestAddr.sin_port = htons ( uwDestPort );
stDestAddr.sin_addr.s_addr = INADDR_BROADCAST;
// send request
sprintf(a_cBuffer, "time_v2");
if( sendto(iSocketDescriptor, a_cBuffer, strlen(a_cBuffer) + 1, 0, (struct sockaddr *) &stDestAddr, sizeof ( struct sockaddr_in ))<0)
{
iErrNo = WSAGetLastError();
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
if (_bMessage)
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
return FALSE;
}
iAddrLength = sizeof(struct sockaddr_in);
// get server response
FD_ZERO( &stFDSet );
FD_SET( iSocketDescriptor, &stFDSet);
stTimeout.tv_sec=5;
stTimeout.tv_usec=0;
if (select(0, &stFDSet, NULL, NULL, &stTimeout) == 0)
{
iErrNo = WSAGetLastError();
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
if (_bMessage)
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
return FALSE;
}
if ( !FD_ISSET( iSocketDescriptor, &stFDSet ) )
{
iErrNo = WSAGetLastError();
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
if (_bMessage)
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
return FALSE;
}
if( recvfrom(iSocketDescriptor, a_cBuffer, sizeof(a_cBuffer), 0, (struct sockaddr *) &stDestAddr, &iAddrLength) < 0)
{
iErrNo = WSAGetLastError();
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
if (_bMessage)
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
return FALSE;
}
memcpy( &g_xServerTime, a_cBuffer, sizeof( time_t ) );
// close socket
closesocket(iSocketDescriptor);
return TRUE;
}