//////////////////////////////////////////////////////////////// // Technomaint 2004 (c) SofTech di Germinara Francesco 2000,2004 // www.germinara.it info@germinara.it // Story: // //////////////////////////////////////////////////////////////// // Checked Version: 6/5/2004 //////////////////////////////////////////////////////////////// #include "stdafx.h" #include "FGParserFDF.h" #include "FGParserFDFDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CFGParserFDFDlg dialog CFGParserFDFDlg::CFGParserFDFDlg(CWnd* pParent /*=NULL*/) : CDialog(CFGParserFDFDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_strFileFDFName="C:\\CAPROP.FDF"; m_strNomeClasseFGRecord="CxxxRecord"; m_strSQLScript=""; } void CFGParserFDFDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDT_FILEFDF, m_strFileFDFName); DDX_Text(pDX, IDC_EDT_FGRECORD, m_strNomeClasseFGRecord); DDX_Text(pDX, IDC_EDT_SQ, m_strSQLScript); DDX_Control(pDX, IDC_EDT_FILEFDF, m_edtFileFDF); DDX_Control(pDX, IDC_EDT_FGRECORD, m_edtFGRecord); DDX_Control(pDX, IDC_EDT_SQ, m_edtSQLScript); } BEGIN_MESSAGE_MAP(CFGParserFDFDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BTN_ELABORA, OnBnClickedBtnElabora) ON_BN_CLICKED(IDC_BTN_SFOGLIA, OnBnClickedBtnSfoglia) END_MESSAGE_MAP() // CFGParserFDFDlg message handlers BOOL CFGParserFDFDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CFGParserFDFDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CFGParserFDFDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CFGParserFDFDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CFGParserFDFDlg::OnBnClickedBtnElabora() { CString msgErr,strCppname,strHname,strSQLScript,rowData; CStdioFile idFileFDF; CStdioFile idFileFGRecordCpp; CStdioFile idFileFGRecordH; CStdioFile idFileSQLTable; int tokenType=0; UpdateData(TRUE); //Field Information CString strDescr; CString strValue; CString Type; CString Length; CString nDec; strCppname=m_strNomeClasseFGRecord+".cpp"; strHname=m_strNomeClasseFGRecord+".h"; strSQLScript=m_strSQLScript+".sql"; idFileFDF.Open(m_strFileFDFName, CFile::modeRead,NULL); if(idFileFDF.m_hFile != NULL){ //Ok idFileFGRecordCpp.Open(strCppname, CFile::modeReadWrite | CFile::OpenFlags::modeCreate,NULL); //H if(idFileFGRecordCpp.m_hFile != NULL){ //Ok WriteHeaderCPPClass(idFileFGRecordCpp); //Scrive intestazione C++ idFileFGRecordH.Open(strHname, CFile::modeReadWrite | CFile::OpenFlags::modeCreate,NULL); //H if(idFileFGRecordH.m_hFile != NULL){ //Ok WriteHClass(idFileFGRecordH); idFileSQLTable.Open(strSQLScript, CFile::modeReadWrite | CFile::OpenFlags::modeCreate,NULL); //SQL if(idFileSQLTable.m_hFile != NULL){ //Ok WriteHeaderSQLScriptCreate(idFileSQLTable); //Scrive intestazione Script SQL //Ok... start to parse FDF for(;;){ idFileFDF.ReadString(rowData); if(rowData.IsEmpty()) break; tokenType=ParseRow(rowData,strDescr,strValue,Type,Length,nDec); if(tokenType == 1){ //Field Token WriteRowCPPClass(idFileFGRecordCpp,strDescr,strValue,Type,Length,nDec); //Scrivo una riga CPP WriteRowSQLScriptCreate(idFileSQLTable,strDescr,strValue,Type,Length,nDec); //Scrive riga SQL CREATE //MessageBox("["+strValue+"]["+Type+"]["+Length+"]["+nDec+"]"); } } }else{ msgErr.Format("Errore: Impossibile aprire il file %s",strSQLScript); MessageBox(msgErr); } }else{ msgErr.Format("Errore: Impossibile aprire il file %s",strHname); MessageBox(msgErr); } WriteFooterCPPClass(idFileFGRecordCpp);//Scrive fine C++ WriteFooterSQLScriptCreate(idFileSQLTable); //Scrive fine SQL CREATE MessageBox("Ok,fatto."); }else{ msgErr.Format("Errore: Impossibile aprire il file %s",strCppname); MessageBox(msgErr); } }else{ msgErr.Format("Errore: Impossibile aprire il file %s",m_strFileFDFName); MessageBox(msgErr); } idFileFDF.Close(); idFileFGRecordCpp.Close(); idFileFGRecordH.Close(); idFileSQLTable.Close(); } int CFGParserFDFDlg::ParseRow(CString& rowData,CString& strDescr,CString& strValue,CString& Type, CString& strLength,CString& nDec){ int tokenType=0; //Unknow int posIni=0,posFin=0; strDescr="Campo "; posIni=rowData.Find("PCFL "); if(posIni!= -1){ tokenType=1; //FDF Field rowData=rowData.Mid(posIni+5); posIni=rowData.Find(" "); if(posIni!=-1){ strValue = rowData.Mid(0,posIni); rowData=rowData.Mid(posIni); posIni=rowData.Find(" "); if(posIni!=-1){ posFin=rowData.Find(" ",posIni+1); if(posFin!=-1){ Type=rowData.Mid(posIni,posFin - posIni); rowData=rowData.Mid(posFin); posIni=rowData.Find(" "); if(posIni!=-1){ strLength=rowData.Mid(posIni); posIni=strLength.Find("/"); if(posIni!=-1){ strLength=strLength.Mid(0,posIni); nDec=rowData.Mid(posIni+1); }else{ nDec="0"; } } } } } } strDescr+=strValue; strLength=strLength.TrimLeft(); strLength=strLength.TrimRight(); nDec=nDec.TrimRight(); nDec=nDec.TrimLeft(); strValue=strValue.TrimRight(); strValue=strValue.TrimLeft(); return tokenType; } //Scrive l'intestazione della classe H void CFGParserFDFDlg::WriteHClass(CStdioFile& idFileFGRecordH){ CString rowData,newLine; CTime today=CTime::GetCurrentTime(); CString msgData; msgData.Format("Data: %02d/%02d/%04d",today.GetDay(),today.GetMonth(),today.GetYear()); newLine="\n"; rowData=""; rowData="//Classe per la gestione "+m_strNomeClasseFGRecord+" "+ newLine; idFileFGRecordH.WriteString(rowData); rowData="//Written by Francesco Germinara (c) 2003" + newLine; idFileFGRecordH.WriteString(rowData); rowData="//Data Creazione:"+ msgData+" "+ newLine+ newLine; idFileFGRecordH.WriteString(rowData); rowData="#ifndef CLASS_"+m_strNomeClasseFGRecord+"_INCLUDED" + newLine; idFileFGRecordH.WriteString(rowData); rowData="#define CLASS_"+m_strNomeClasseFGRecord+"_INCLUDED" + newLine+ newLine; idFileFGRecordH.WriteString(rowData); rowData="#include\"CFGRecord.h\" " + newLine + newLine; idFileFGRecordH.WriteString(rowData); rowData="#if _MSC_VER > 1000" + newLine; idFileFGRecordH.WriteString(rowData); rowData="#pragma once" + newLine; idFileFGRecordH.WriteString(rowData); rowData="#endif // _MSC_VER > 1000" + newLine+ newLine; idFileFGRecordH.WriteString(rowData); rowData="class "+m_strNomeClasseFGRecord+": public CFGRecord {" + newLine; idFileFGRecordH.WriteString(rowData); rowData=" private:"+ newLine; idFileFGRecordH.WriteString(rowData); rowData=" virtual void InitializeFields(); //Inizializzazione dei campi "+ newLine; idFileFGRecordH.WriteString(rowData); rowData="public:"+ newLine; idFileFGRecordH.WriteString(rowData); rowData=" "+m_strNomeClasseFGRecord+"();"+newLine; idFileFGRecordH.WriteString(rowData); rowData="};"+newLine+newLine; idFileFGRecordH.WriteString(rowData); rowData="#endif"+newLine; idFileFGRecordH.WriteString(rowData); rowData="//Fine"+newLine+newLine; idFileFGRecordH.WriteString(rowData); }; //Scrive l'intestazione della classe CPP void CFGParserFDFDlg::WriteHeaderCPPClass(CStdioFile& idFileFGRecordCPP){ CTime today=CTime::GetCurrentTime(); CString msgData; msgData.Format("Data: %02d/%02d/%04d",today.GetDay(),today.GetMonth(),today.GetYear()); CString rowData,newLine; newLine="\n"; rowData=""; rowData="//Classe per la gestione "+m_strNomeClasseFGRecord+" "+newLine; idFileFGRecordCPP.WriteString(rowData); rowData="//Written by Francesco Germinara (c) 2003"+newLine; idFileFGRecordCPP.WriteString(rowData); rowData="//Data Creazione: "+msgData+newLine+newLine; idFileFGRecordCPP.WriteString(rowData); rowData="#include\"stdafx.h\" "+newLine; idFileFGRecordCPP.WriteString(rowData); rowData="#include\""+m_strNomeClasseFGRecord+".h"+"\""+newLine; idFileFGRecordCPP.WriteString(rowData); rowData=m_strNomeClasseFGRecord+"::"+m_strNomeClasseFGRecord+"(){"+newLine; idFileFGRecordCPP.WriteString(rowData); rowData=" m_nIndex =0;"+newLine; idFileFGRecordCPP.WriteString(rowData); rowData=" memset(m_recBuffer,0x00,_FPMAXRECLEN);"+newLine; idFileFGRecordCPP.WriteString(rowData); rowData=" InitializeFields();"+newLine; idFileFGRecordCPP.WriteString(rowData); rowData="}"+newLine+newLine; idFileFGRecordCPP.WriteString(rowData); rowData="//Virtuale..."+newLine; idFileFGRecordCPP.WriteString(rowData); rowData="void "+m_strNomeClasseFGRecord+"::InitializeFields(){"+newLine; idFileFGRecordCPP.WriteString(rowData); } //Scrive la fine della classe CPP void CFGParserFDFDlg::WriteFooterCPPClass(CStdioFile& idFileFGRecordCPP){ CString rowData,newLine; newLine="\n"; rowData=""; rowData="}" +newLine; idFileFGRecordCPP.WriteString(rowData); rowData="//Fine"+newLine; idFileFGRecordCPP.WriteString(rowData); } //Scrive la riga nella classe CPP void CFGParserFDFDlg::WriteRowCPPClass(CStdioFile& idFileFGRecordCPP,CString strDescr,CString strValue,CString Type,CString Length,CString nDec){ CString rowData,newLine; newLine="\n"; rowData=""; if(atoi(Type) == 1){ rowData=" m_fld[m_nIndex++].SetDataField(\""+strValue+"\",\""+strDescr+"\",\"\",0,"+Length+");"+newLine; idFileFGRecordCPP.WriteString(rowData); }else{ rowData=" m_fld[m_nIndex++].SetDataField(\""+strValue+"\",\""+strDescr+"\",\"\",1,"+Length+","+nDec+",true);"+newLine; idFileFGRecordCPP.WriteString(rowData); } } //Scrive intestazione Script SQL void CFGParserFDFDlg::WriteHeaderSQLScriptCreate(CStdioFile& idFileSQLTable){ CString rowData,newLine; newLine="\n"; rowData=""; rowData="CREATE TABLE [dbo].["+m_strSQLScript+"] ("+newLine; idFileSQLTable.WriteString(rowData); } //Scrive Dettaglio Script SQL void CFGParserFDFDlg::WriteRowSQLScriptCreate(CStdioFile& idFileSQLTable,CString strDescr,CString strValue,CString Type,CString Length,CString nDec){ CString rowData,newLine; newLine="\n"; rowData=""; rowData=" ["+strValue+"] [char] ("+Length+") NULL ,"+newLine; idFileSQLTable.WriteString(rowData); } //Scrive Fine Script SQL void CFGParserFDFDlg::WriteFooterSQLScriptCreate(CStdioFile& idFileSQLTable){ CString rowData,newLine; newLine="\n"; rowData=""; rowData=" ) ON [PRIMARY]"+newLine; idFileSQLTable.WriteString(rowData); rowData=" GO"+newLine; idFileSQLTable.WriteString(rowData); } void CFGParserFDFDlg::OnBnClickedBtnSfoglia() { char BASED_CODE szInputFilter[] = "AS/400 Fields Definition File *.fdf|"; CFileDialog wndInputFileDlg ( TRUE, NULL, "*.FDF", OFN_LONGNAMES | OFN_EXPLORER | OFN_NOCHANGEDIR, szInputFilter ); UpdateData(TRUE); if(wndInputFileDlg.DoModal () == IDOK ){ m_strFileFDFName=wndInputFileDlg.GetPathName(); UpdateData(FALSE); } }