//---------------------------------------------------------------------------
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include "common.h"
//---------------------------------------------------------------------------
char*        chk_ticker( PLG_SRC_DATA* data);
SERIES*      down( PLG_SRC_DATA* data);
void         config( HWND wndOwner);
LST_TICKERS* lst_tickers( char* platform);
//---------------------------------------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	return 1;
}
//---------------------------------------------------------------------------
// функция вызывается 1 раз при начальной инициализации плагина. 
// заполняет структуру информацией о плагине и если всё хорошо, возвращает OK.
extern "C" __declspec(dllexport) DWORD QupsInfo( PLG_SRC_INF* info)
{
   info->uType           = PLG_SRC;
   info->sName           = strdup( "Simple Data Source");
   info->uSecCount       = 1;
   info->uTfCount        = 1;
   info->bConfig         = 0;
   info->bTickers        = 0;

   info->sSections       = new char*[1];
   info->sSections[0]    = strdup( "Histroy");

   info->pTimeFrames     = new uchar[1];
   info->pTimeFrames[0]  = TF_DAY;

   return PLG_SRC_OK;
}
//---------------------------------------------------------------------------
// основная функция, через которую происходит управление плагином.
// первый параметр - команда для выполнения.
// второй - данные для выполнения команды (структура PLG_SRC_DATA или указатель на строку - зависит от команды)
// возвращает NULL или данные (тип данных также зависит от команды)
extern "C" __declspec(dllexport) void* QupsHandle( DWORD cmd, void* data)
{
  void* ret = NULL;


	switch( cmd )
	{
	  case SRC_CHKT     : ret = (void*)chk_ticker( (PLG_SRC_DATA*)data); break;
	  case SRC_DOWN     : ret = (void*)down( (PLG_SRC_DATA*)data);       break;
	  case SRC_CONFIG   : config( (HWND)data);                           break;
	  case SRC_TICKERS  : ret = (void*)lst_tickers( (char*)data);        break;
	}

  return ret;
}
//---------------------------------------------------------------------------
char* chk_ticker( PLG_SRC_DATA* data)     { return NULL; }
//---------------------------------------------------------------------------
SERIES* down( PLG_SRC_DATA* data)         { return NULL; }
//---------------------------------------------------------------------------
void config( HWND wndOwner)               { }
//---------------------------------------------------------------------------
LST_TICKERS* lst_tickers( char* platform) { return NULL; }
//---------------------------------------------------------------------------
/*
double round_int( double param)
{
  double integer, fractional;
  double Result = 0.0;


	fractional = modf( param, &integer);

	if(param > 0)
	{
	  if( fractional >= 0.5 )  Result = ceil(param);
	  else                     Result = floor(param);
	}
	else
	{
	  if( fractional <= -0.5 ) Result = floor(param);
	  else                     Result = ceil(param);
	}

	return Result;
}
//---------------------------------------------------------------------------
double mj2dt( double JD)
{
  unsigned long d,m,y;
  unsigned long h,mm,s;
  unsigned long j = JD;


	if( j == 0 ) return 0;

	j += 2415019l; // modified Julian day

	j -= 1721119l;
	y = (4l*j-1l)/146097l;
	d = (4l*j-1l-146097l*y)/4l;
	j = (4l*d+3l)/1461l;
	d = (4l*d+7l-1461l*j)/4l;
	m = (5l*d-3l)/153l;
	d = (5l*d+2l-153l*m)/5l;
	y = 100l*y+j;
	if( m < 10 ) m += 3;
	else       { m -= 9; y++; }

	JD = JD - Int(JD);

//	unsigned long t= JD * 86400;
	double tt = JD*86400.0;             // fucking float conversion!
	unsigned long t = round_int(tt);

	s  = t%60l; t/=60l;
	mm = t%60l;
	h  = t/60l;

  return TDateTime( y, m, d, h, mm, s, 0);
}
//---------------------------------------------------------------------------
double dt2mj( double dd)
{
  ushort    Year=0, Month=0, Day=0, Hour=0, Minute=0, Second=0, ms;
  TDateTime dt = dd;


	dt.DecodeDate( &Year, &Month, &Day);
	dt.DecodeTime( &Hour, &Minute, &Second, &ms);

	if( Month > 2 ) Month -= 3;
	else
	{
	   Month += 9;
	   Year--;
	}

  long   c  = Year/100l;
  long   ya = Year-100l*c;
  double jd, FracDay = Hour / 24.0 + Minute / 1440.0 + Second / 86400.0;

	jd = (146097l*c)/4l+(1461l*ya)/4l+(153l*Month+2l)/5l+Day+1721119l-2415019l;
	jd += FracDay;

   return jd;
}
//---------------------------------------------------------------------------
*/

