466 lines
11 KiB
C++
466 lines
11 KiB
C++
// spDoc.cpp : implementation of the CSpDoc class
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "sp.h"
|
|
|
|
#include "spDoc.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
#define _CRTDBG_MAP_ALLOC
|
|
#include <stdlib.h>
|
|
#include <crtdbg.h>
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSpDoc
|
|
|
|
IMPLEMENT_DYNCREATE(CSpDoc, CDocument)
|
|
|
|
BEGIN_MESSAGE_MAP(CSpDoc, CDocument)
|
|
//{{AFX_MSG_MAP(CSpDoc)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
// DO NOT EDIT what you see in these blocks of generated code!
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSpDoc construction/destruction
|
|
|
|
CSpDoc::CSpDoc()
|
|
{
|
|
// TODO: add one-time construction code here
|
|
m_pApp= (CSpApp*)AfxGetApp();
|
|
}
|
|
|
|
CSpDoc::~CSpDoc()
|
|
{
|
|
}
|
|
|
|
BOOL CSpDoc::OnNewDocument()
|
|
{
|
|
if (!CDocument::OnNewDocument())
|
|
return FALSE;
|
|
|
|
// TODO: add reinitialization code here
|
|
// (SDI documents will reuse this document)
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSpDoc serialization
|
|
|
|
void CSpDoc::Serialize(CArchive& ar)
|
|
{
|
|
if (ar.IsStoring())
|
|
{
|
|
// TODO: add storing code here
|
|
}
|
|
else
|
|
{
|
|
// TODO: add loading code here
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSpDoc diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CSpDoc::AssertValid() const
|
|
{
|
|
CDocument::AssertValid();
|
|
}
|
|
|
|
void CSpDoc::Dump(CDumpContext& dc) const
|
|
{
|
|
CDocument::Dump(dc);
|
|
}
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSpDoc commands
|
|
|
|
bool CSpDoc::LocateData()
|
|
{
|
|
|
|
//and set connection string
|
|
//FUTURE: USE INI FILE INSTEAD TO LOCATE DATA
|
|
CString StartIn,temp;
|
|
CFileStatus cfs;
|
|
CFile::GetStatus("scdata.sc",cfs);
|
|
|
|
StartIn.Format("%s",cfs.m_szFullName);
|
|
if( StartIn.IsEmpty())
|
|
{
|
|
AfxMessageBox("Cannot locate data file scdata.sc\r\nHave you set your StartIn Icon property correctly?");
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
StartIn=StartIn.Left(StartIn.GetLength()-10);//ADDRESS.GZ0 trim 11 characters leave path
|
|
m_DBPath=StartIn;
|
|
|
|
|
|
m_ConnectString.Format("%s%s%s;",
|
|
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=",
|
|
m_DBPath,"\\scdata.sc");
|
|
|
|
m_pApp->strConnectString=m_ConnectString;
|
|
|
|
|
|
|
|
temp.Format("%s%s%s;","Provider=Microsoft.Jet.OLEDB.4.0;Data Source=",
|
|
m_DBPath,"\\scdata.sc;Mode = Share Exclusive;");
|
|
|
|
m_pApp->strConnectStringExclusive=temp;
|
|
|
|
//used by CSpApp::ReportDirectory()
|
|
m_pApp->m_strDBPATH=m_DBPath+"\\";
|
|
|
|
}
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//****************************************************
|
|
// compact the database through a jro object
|
|
//**********************************************
|
|
bool CSpDoc::Compact(bool bKeepOld)
|
|
{
|
|
bool status=true;
|
|
CString src,dest,tempfile;
|
|
CFileStatus fstat;
|
|
CWaitCursor wait;
|
|
|
|
|
|
//delete old one if exists
|
|
tempfile.Format("%s\\scdata.tmp",m_DBPath);
|
|
if(CFile::GetStatus(tempfile,fstat)==TRUE)//file exists
|
|
{
|
|
TRY
|
|
{
|
|
CFile::Remove( tempfile );
|
|
}
|
|
CATCH( CFileException, e )
|
|
{
|
|
status=false;
|
|
CString cstrErrMsg;
|
|
cstrErrMsg.Format("Error in Compact: %s cannot be removed",tempfile);
|
|
AfxMessageBox(cstrErrMsg);
|
|
}
|
|
END_CATCH
|
|
}
|
|
|
|
if(status==true)
|
|
{
|
|
|
|
src.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\scdata.sc;",
|
|
m_DBPath);
|
|
|
|
dest.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\scdata.tmp;",
|
|
m_DBPath);
|
|
|
|
|
|
_bstr_t bstsrc(src);
|
|
_bstr_t bstdest(dest);
|
|
|
|
try
|
|
{
|
|
IJetEnginePtr jet(__uuidof(JetEngine));
|
|
jet->CompactDatabase(bstsrc, bstdest);
|
|
}
|
|
catch(_com_error &e)
|
|
{
|
|
status=false;
|
|
CString cstrErrMsg;
|
|
//get info from com error
|
|
_bstr_t bstrSource(e.Source());
|
|
_bstr_t bstrDescription(e.Description());
|
|
TRACE( "*************************************************\n");
|
|
TRACE( "Exception thrown for classes generated by #import\n");
|
|
TRACE( "\tCode = %081x\n", e.Error);
|
|
TRACE( "\tCode Meaning = %s\n",e.ErrorMessage());
|
|
TRACE( "\tSource = %s\n", (LPCTSTR) bstrSource);
|
|
TRACE( "Description = %s\n", (LPCTSTR) bstrDescription);
|
|
TRACE( "*************************************************\n");
|
|
cstrErrMsg.Format("Error in Compact: %s,\r\n%s",e.ErrorMessage(),(LPCTSTR) bstrDescription);
|
|
AfxMessageBox(cstrErrMsg);
|
|
}
|
|
catch(...)
|
|
{
|
|
status=false;
|
|
TRACE( "*** Unhandled exception ***" );
|
|
AfxMessageBox("Unhandled Error in Compact");
|
|
PostQuitMessage(-1);//exit now before anything worse happens
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//Added as indexing can leave a 100+mb old file
|
|
//this way can delete it
|
|
if(bKeepOld)
|
|
{
|
|
//copy mdb over old
|
|
src.Format("%s\\scdata.sc",m_DBPath);
|
|
dest.Format("%s\\scdata.old",m_DBPath);
|
|
status=CopyFile(src.GetBuffer(100),dest.GetBuffer(100));
|
|
}
|
|
|
|
|
|
|
|
if(status==true)
|
|
{
|
|
|
|
|
|
src.Format("%s\\scdata.tmp",m_DBPath);
|
|
dest.Format("%s\\scdata.sc",m_DBPath);
|
|
status=CopyFile(src.GetBuffer(100),dest.GetBuffer(100));
|
|
|
|
|
|
}//if status==true
|
|
|
|
//delete gz1
|
|
tempfile.Format("%s\\scdata.tmp",m_DBPath);
|
|
if(CFile::GetStatus(tempfile,fstat)==TRUE)//file exists
|
|
{
|
|
TRY
|
|
{
|
|
CFile::Remove( tempfile );
|
|
}
|
|
CATCH( CFileException, e )
|
|
{
|
|
status=false;
|
|
CString cstrErrMsg;
|
|
cstrErrMsg.Format("Error at end of Compact: %s cannot be removed\r\nOtherwise compact OK",tempfile);
|
|
AfxMessageBox(cstrErrMsg);
|
|
}
|
|
END_CATCH
|
|
}
|
|
|
|
|
|
return status;
|
|
}
|
|
|
|
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*******************************************
|
|
//copy a file, overwrite dest if exists
|
|
bool CSpDoc::CopyFile(char *src, char *dest)
|
|
{
|
|
|
|
CFile sourceFile;
|
|
CFile destFile;
|
|
CFileException ex;
|
|
CString tempfile;
|
|
|
|
|
|
|
|
// open the source file for reading
|
|
|
|
if (!sourceFile.Open(src,
|
|
CFile::modeRead | CFile::shareDenyWrite, &ex))
|
|
{
|
|
// complain if an error happened
|
|
// no need to delete the ex object
|
|
|
|
TCHAR szError[1024];
|
|
ex.GetErrorMessage(szError, 1024);
|
|
CString errormsg;
|
|
errormsg.Format("Error copying file %s to %s\r\n The error was: %s",src,dest,szError);
|
|
AfxMessageBox(errormsg);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
if (!destFile.Open(dest, CFile::modeWrite |
|
|
CFile::shareExclusive | CFile::modeCreate, &ex))
|
|
{
|
|
TCHAR szError[1024];
|
|
ex.GetErrorMessage(szError, 1024);
|
|
CString errormsg;
|
|
errormsg.Format("Error copying file %s to %s\r\n The error was: %s",src,dest,szError);
|
|
AfxMessageBox(errormsg);
|
|
sourceFile.Close();
|
|
return false;
|
|
}
|
|
|
|
BYTE buffer[4096];
|
|
DWORD dwRead;
|
|
|
|
// Read in 4096-byte blocks,
|
|
// remember how many bytes were actually read,
|
|
// and try to write that many out. This loop ends
|
|
// when there are no more bytes to read.
|
|
|
|
do
|
|
{
|
|
dwRead = sourceFile.Read(buffer, 4096);
|
|
destFile.Write(buffer, dwRead);
|
|
}
|
|
while (dwRead > 0);
|
|
|
|
// Close both files
|
|
|
|
destFile.Close();
|
|
sourceFile.Close();
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
void CSpDoc::Validate()
|
|
{
|
|
//registration key:companyhash,UINTfeatures,licensecount,EVALLIMIT
|
|
CString key=m_pApp->m_strRegKey;
|
|
CString comp=m_pApp->m_strRegCompany;
|
|
CString kCompHash;
|
|
CString temp;
|
|
int firstcomma,secondcomma,thirdcomma;
|
|
|
|
GZK cryp;
|
|
cryp.GZHash(&comp);
|
|
cryp.GZDecrypt(&key,false);
|
|
firstcomma=key.Find(',',0);
|
|
secondcomma=key.Find(',',firstcomma+1);
|
|
thirdcomma=key.Find(',',secondcomma+1);
|
|
if(firstcomma==-1 || secondcomma==-1 || thirdcomma==-1)
|
|
{
|
|
|
|
|
|
m_pApp->m_strRegKey.Empty();
|
|
m_pApp->m_strRegCompany.Empty();
|
|
return;
|
|
}
|
|
|
|
kCompHash=key.Left(firstcomma);
|
|
|
|
if(kCompHash!=comp)
|
|
{
|
|
m_pApp->m_strRegKey.Empty();
|
|
m_pApp->m_strRegCompany.Empty();
|
|
return;
|
|
|
|
}
|
|
|
|
temp=key.Mid(firstcomma+1,(secondcomma-firstcomma)-1);
|
|
m_pApp->m_uiFeatures=(UINT)_atoi64(temp);
|
|
|
|
temp=key.Mid(secondcomma+1,(thirdcomma-secondcomma)-1);
|
|
m_pApp->m_lRegLicCount=atol(temp);
|
|
|
|
|
|
//expiry date?
|
|
temp=key.Right(key.GetLength()-thirdcomma-1);
|
|
if(temp==cryp.InLineDecrypt("Md2gXbFO5Vu4MqQpfyEWdw"/*15 eval key*/)
|
|
|| temp==cryp.InLineDecrypt("hm0s/6NFOzjXMUUd/HaGEA") /*69 licensed key*/
|
|
|| temp==cryp.InLineDecrypt("o2jDhqik1/EKD7zT1MBbJQ") /*5 eval key*/)
|
|
return;//All is ok, no need to check date
|
|
|
|
//m_pApp->m_strRegEvalLimit=key.Right(key.GetLength()-thirdcomma-1);
|
|
|
|
//If we are here, then this key has an expiry date, check if expired and announce time left?
|
|
COleDateTime dtData;
|
|
COleDateTime dtNow=COleDateTime::GetCurrentTime();
|
|
COleDateTimeSpan dtSpan;
|
|
dtData.ParseDateTime(temp);
|
|
CString m_strExpiryDays;
|
|
CString strTemp;
|
|
temp.Empty();//don't leave it floating around in memory
|
|
if(dtData.GetStatus()!=0)//couldn't parse the date and time
|
|
{
|
|
m_pApp->m_strRegKey.Empty();
|
|
m_pApp->m_strRegCompany.Empty();
|
|
return;
|
|
|
|
}
|
|
else
|
|
{ //a valid expiry date was parsed, see if we've passed it
|
|
//a better check would be to see the date of the last wo entry or something so that
|
|
//setting the clock back wouldn't get around it
|
|
|
|
dtSpan=dtData-dtNow;
|
|
/*int nDays=dtSpan.GetTotalDays();
|
|
int nHours=dtSpan.GetTotalHours();
|
|
int nMinutes=dtSpan.GetTotalMinutes();
|
|
int nSeconds=dtSpan.GetTotalSeconds();*/
|
|
|
|
|
|
//note, checks total minutes, instead of DAYS because it would expire too soon otherwise.
|
|
if(dtSpan.GetTotalMinutes()>atoi(cryp.InLineDecrypt("Z2OFaf5Y/3QAPzJuAxkGxw")))//"0"
|
|
{
|
|
//Not expired, build display string
|
|
|
|
//set up an html text variable with days left
|
|
m_strExpiryDays=cryp.InLineDecrypt(
|
|
"xxr2uBTQMwSvJaQAPs5FpCJXhwHqYSsCX6VpQ3A8/0Z0mbTvyI7ekUGPbggnbGN+KYlf744E"
|
|
"EkD0xn6BTtengPH2cGfWfpcnFlKvjHYsky05ZpqstyxpfuBo9kQ1SJloan6A6qp7VIfHaguT"
|
|
"kTnt6PhzynEdggIgVMFE5IrAup1Pn//RCXhnzh1gcQxvR216KSvZa+AZMiSbMCmK0T+dexZk"
|
|
"/4+Iy2JeRM9KNJJkKi/x2xwjD0jPbhyqa3JIr7FibUjzAGLCAMU3m1jICQeT8EG88IfkJo47"
|
|
"2K+hZhXQQwvCMhtBuMctNZi+dcVS/M2B"/*
|
|
Warning:
|
|
|
|
As per the terms of purchase order acceptance,
|
|
AyaNova is licensed temporarily until payment is received.
|
|
|
|
This license key will expire in X1 days X2 hours X3 minutes.
|
|
|
|
There will be no extensions or exceptions. */);
|
|
|
|
strTemp.Format("%i",(int)dtSpan.GetDays());
|
|
m_strExpiryDays.Replace("X1",strTemp);
|
|
|
|
strTemp.Format("%i",(int)dtSpan.GetHours());
|
|
m_strExpiryDays.Replace("X2",strTemp);
|
|
|
|
strTemp.Format("%i",(int)dtSpan.GetMinutes());
|
|
m_strExpiryDays.Replace("X3",strTemp);
|
|
AfxMessageBox(m_strExpiryDays,MB_SYSTEMMODAL|MB_ICONINFORMATION );
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
//EXPIRED trash key and tell them.
|
|
|
|
AfxMessageBox(cryp.InLineDecrypt("RCfDvTWdAiEnbCrfjtC0YKtRAiRHBSpo+ZvaToaFhEhwen69J2yE8Sr4pB8VRsm9GdLzz/T/"
|
|
"ZzSq1tpfMi7QTPE8G++jFd/2vN9ivQU0TbPK36cR39u+//vyrvhdy5sWtpWLw0TawhwfIVfu"
|
|
"Xkp5T73R4bNuvTZ7Hn30dDEX4oMe7QGLsaZEIx+PwjDfLjh25y5DUUSwqpnN9YUsdp+/FDLB"
|
|
"D3V4UC2gu/zHrA0vaxabA42sa1j6uhk21aJwaLj4dW6SYf1B+IKWe+D4XQUPKNeBQRfDYI3o"
|
|
"qsBBuJconLBBwIwY8MlYf47C9R5DdJySZyPWdaupnOErny4AEVkc8XakMydcH7wX8PovhiGE"
|
|
"ibfLCD9kGwBVc7LDFh3Ryn4iYg3cGixpu0Csz/3rJexZcuWVLD5X1VmGfQxD2zhB1De/NFLu"
|
|
"Dc8jweQ5Vpon64Tiq8BtG9dGIrWmCDqbgNi6BA=="));
|
|
m_pApp->m_strRegKey.Empty();
|
|
m_pApp->m_strRegCompany.Empty();
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|