Commit 1444bccb authored by Milan Pumpalovic's avatar Milan Pumpalovic

prvi commit

parents
*.obj
*.dcu
*.pch
*.res
*.pdi
*.map
*.ils
*.ilf
*.ild
*.ilc
*.#0A
*.#00
*.#01
*.#02
*.#03
*.#04
*.#05
*.#06
*.#07
*.#08
*.#09
*.tds
*.dat
*.~1~
*.~2~
*.~4~
*.~3~
*.~5~
*.~6~
*.local
.project
Osnovne/__history/
Win32/Debug/cxPS_r
__history/
*.#0B
Win32/Debug/CashIT.log
CashIT.cbproj.local
Win32/Debug/verzija_projekta.res
verzija_projekta.rc.bak
verzija_projekta.rc
!VersionInfo/*.dll
Win32/Debug/CashIT.#0D
Win32/Debug/CashIT.#0C
Win32/Debug/frm_popis_robe10.ini
Win32/Debug/slike/RasporedLokala1.jpg
Win32/Debug/debug.txt
Win32/Debug/CashIT.exe
Win32/Debug/CashIT1.exe
Osnovne/BUS_osnovna_interne.dfm.orig
Win32/Debug/cxPS_popis
Win32/Debug/FTPUpdate.exe
Win32/Debug/connectionString
Win32/Debug/statusLog.txt
Win32/Debug/CashIT.log1
Win64/Debug/uBusFileUtils.o
Win64/Debug/uXMLApotekaLager.o
Win32/Debug/debug1.txt
Win32/Debug/frmMP.jpg
.project
.idea/
Win32/Debug/winvnc.exe
BUS_glavni.cpp.orig
Update/1_CashIT_polja_2015.sql.orig
Win32/Debug/debug/
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGrid1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGrid6DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGrid9DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGridDBTableView2.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGridDBTableView6.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxStavke1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxZaglavlje.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_dbPromenaSarze.ini
Win32/Debug/FormSettings/UserSettings/11/fmKartica_.ini
Win32/Debug/FormSettings/UserSettings/11/fmKartica_cxGridDBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/fmKartica_cxgKarticaLokalna.ini
Win32/Debug/FormSettings/UserSettings/11/fmKartica_dbKartica1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmMagacin_.ini
Win32/Debug/FormSettings/UserSettings/11/frmMagacin_cxGrid1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmMagacin_cxGrid2DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_cxGrid1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_cxGridDBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_cxGridDBTableView2.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_dbg.ini
Cashit.cbproj
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_dbStavke.ini
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_cxZaglavlje.ini
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_cxStavke1DBTableView1.ini
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_cxGrid3DBTableView1.ini
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_cxGrid1DBTableView1.ini
Prodaja/ch_MP.h.orig
Win32/Debug/log.txt
Win32/Debug/xml/fajl.zip
Win32/Debug/xml/novafaktura_s_lekari_13_11_2017.xml
Win32/Debug/xml/novafaktura_s_lekovi_01_11_2017.xml
Win32/Debug/xml/novafaktura_s_mtp_02_11_2017.xml
log1.log
Win32/Debug/Log/CashIT/CashIT.log
Win32/Debug/recepti/odradjeni/+1rA161240_04-12-2017_10-39-12.txt
Win32/Debug/recepti/odradjeni/nv131160_19-12-2017_09-36-46.txt
Win32/Debug/recepti/odradjeni/nv131160_14-02-2018_11-29-38 - Copy_error.txt
Win32/Debug/recepti/odradjeni/nv131160_14-02-2018_11-29-38 - Copy.txt
Win32/Debug/recepti/odradjeni/nv131160_14-02-2018_11-29-38 - Copy - Copy_error.txt
Win32/Debug/recepti/odradjeni/nv131160_14-02-2018_11-29-38 - Copy - Copy.txt
Win32/Debug/xml/novafaktura_s_lekari_05_04_2018.xml
VersionInfo/changeVer2.bat
Win32/Debug/Log/CashIT/CashIT.logD
Win32/Debug/slike/artikli/2.png
Update/update 2012/bus_korpa.txt
Update/update 2012/evidencija_cekova
Update/update 2012/konta.txt
Update/update 2012/sin_tbl.txt
Win32/Debug/Log/CashIT/POSLEDNJI_RACUN.XML
Update/update 2012/tk_knjiga
Update/update 2012/predracun.txt
Win32/Debug/xml/novafaktura_s_lekari_10_09_2018.xml
BUS_host.h.orig
TMP1.$$$
Win32/Debug/podesavanje/UserSettings/
CashIT.~dsk
CashIT.exe
Update/A407_D160.bpl
Win32/Debug/Stampa/110228951/fr_racun_mp_sank_offline.pdf
Win32/Debug/PRODAJA_2.txt
Win32/Debug/ART.xml
Win32/Debug/RAC.xml
c_mpf_1.cpp.orig
twfiles.@@@
CashIT.twfd
CashIT.twopts
BUS_kartica_artikla.vlb
CashIT.dsk
TMP2.$$$
TMP3.$$$
TMP4.$$$
Update/Skripta_moja
Slanje_podataka_desktop/Win32/Debug/pSlanjePodataka.exe
Slanje_podataka_desktop/Win32/Debug/pSlanjePodataka.log
Slanje_podataka_desktop/Win32/Debug/pSlanjePodataka.log1
Slanje_podataka_desktop/Win32/Debug/upx.exe
*.000
*.skincfg
Slanje_podataka_desktop/pSlanjePodataka.twfd
Slanje_podataka_desktop/pSlanjePodataka.twopts
Slanje_podataka_desktop/Win32/Debug/debug.txt
TMP5.$$$
TMP6.$$$
TMP7.$$$
TMP8.$$$
TMP10.$$$
TMP11.$$$
TMP12.$$$
TMP13.$$$
TMP14.$$$
TMP9.$$$
TMP15.$$$
TMP16.$$$
TMP17.$$$
TMP18.$$$
TMP19.$$$
TMP20.$$$
RZZOCenovnik/RzzoCenovnikApoteka.twfd
RZZOCenovnik/RzzoCenovnikApoteka.twopts
Prodaja/ch_MP_BACKUP_1966.h
Prodaja/ch_MP_BACKUP_2024.h
Prodaja/ch_MP_BASE_1966.h
Prodaja/ch_MP_BASE_2024.h
Prodaja/ch_MP_LOCAL_1966.h
Prodaja/ch_MP_LOCAL_2024.h
Prodaja/ch_MP_REMOTE_1966.h
Prodaja/ch_MP_REMOTE_2024.h
Win32/Debug/Deklaracije.exe
Update/tools/1sql.sql
Win32/Debug/Log/response.json
Win32/Debug/Log/status.json
Win32/Debug/Log/request.json
Win32/Debug/Log/verificationUrl.txt
Win32/Debug/Log/response - Copy.json
Win32/Debug/Log/journal.txt
Win32/Debug/frx28.bpl
Win32/Debug/fs28.bpl
Win32/Debug/dllStampaFisk.dll
Win32/Debug/vclx280.bpl
Win32/Debug/vcl280.bpl
Win32/Debug/rtl280.bpl
Win32/Debug/Log/pin.json
Update/tools/test.bat
Win32/Debug/Deklaracije2.exe
Win32/Debug/Log/backup/request2022-05-17-09-35-41.json
Win32/Debug/Log/backup/*.json
Win32/Debug/Log/CashIT/*.json
Win32/Debug/CashIT.logd1
Win32/Debug/RzzoCenovnikApoteka1.exe
*.xml
*.txt
RZZOCenovnik/Debug/xml/fajl.zip
Win32/Debug/Log/request_m.json
Doc/sef/makeXML.zip
Doc/sef/makeXML.lib
Doc/sef/eFaktura.lib
Doc/sef/eFaktura.dll
Doc/sef/TfrmSEF.dfm
Doc/sef/TfrmSEF.cpp
Doc/sef/makeXML.dll
Doc/sef/makeXML (1).zip
Doc/sef/eRacun.lib
Doc/sef/eRacun.dll
Doc/sef/Update.zip
Doc/sef/TfrmSEF.h
RZZOCenovnik/Debug/fqb190.lib
*.bak
*__recovery*
*__astcache*
__recovery/__recovery.ini
__recovery/c_dnevni_pazar.cpp
__recovery/c_dnevni_pazar.dfm
__recovery/c_dnevni_pazar.h
__recovery/c_restoran_pregled.cpp
__recovery/c_restoran_pregled.dfm
__recovery/c_restoran_pregled.h
__recovery/*.*
*__recovery*
CashIT.@@@
*.$$$
*.zip
*.obj-*
*.7z
Win32/Debug/slike/artikli/2035007.bmp
Win32/Debug/7z.exe
Win32/Debug/Log/CashIT/CashIT.logInsert
Win32/Debug/CashIT.str
Win32/Debug/slike/artikli/35768.bmp
Win32/Debug/slike/artikli/35800.bmp
Win32/Debug/slike/artikli/35806.bmp
Win32/Debug/slike/artikli/35885.bmp
Win32/Debug/slike/artikli/35892.bmp
*.log
*Win32/Debug/Log/*
Win32/Debug/slike/artikli/12556.jpg
Win32/Debug/slike/artikli/14613.bmp
Win32/Debug/slike/artikli/35758.bmp
Win32/Debug/slike/artikli/35760.bmp
Win32/Debug/slike/artikli/35761.bmp
Win32/Debug/slike/artikli/35770.bmp
Win32/Debug/slike/artikli/35784.bmp
Win32/Debug/slike/artikli/35845.bmp
Win32/Debug/slike/artikli/35861.bmp
Win32/Debug/Log/getInvoiceStatus.json
*.obj
*.dcu
*.pch
*.res
*.pdi
*.map
*.ils
*.ilf
*.ild
*.ilc
*.#0A
*.#00
*.#01
*.#02
*.#03
*.#04
*.#05
*.#06
*.#07
*.#08
*.#09
*.tds
*.dat
*.~1~
*.~2~
*.~4~
*.~3~
*.~5~
*.~6~
*.local
.project
Osnovne/__history/
Win32/Debug/cxPS_r
__history/
*.#0B
Win32/Debug/CashIT.log
CashIT.cbproj.local
Win32/Debug/verzija_projekta.res
verzija_projekta.rc.bak
verzija_projekta.rc
!VersionInfo/*.dll
Win32/Debug/CashIT.#0D
Win32/Debug/CashIT.#0C
Win32/Debug/frm_popis_robe10.ini
Win32/Debug/slike/RasporedLokala1.jpg
Win32/Debug/debug.txt
Win32/Debug/CashIT.exe
Win32/Debug/CashIT1.exe
Osnovne/BUS_osnovna_interne.dfm.orig
Win32/Debug/cxPS_popis
Win32/Debug/FTPUpdate.exe
Win32/Debug/connectionString
Win32/Debug/statusLog.txt
Win32/Debug/CashIT.log1
Win64/Debug/uBusFileUtils.o
Win64/Debug/uXMLApotekaLager.o
Win32/Debug/debug1.txt
Win32/Debug/frmMP.jpg
.project
.idea/
Win32/Debug/winvnc.exe
BUS_glavni.cpp.orig
Update/1_CashIT_polja_2015.sql.orig
Win32/Debug/debug/
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGrid1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGrid6DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGrid9DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGridDBTableView2.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxGridDBTableView6.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxStavke1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_cxZaglavlje.ini
Win32/Debug/FormSettings/UserSettings/10/fmInterneOtpremnice_dbPromenaSarze.ini
Win32/Debug/FormSettings/UserSettings/11/fmKartica_.ini
Win32/Debug/FormSettings/UserSettings/11/fmKartica_cxGridDBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/fmKartica_cxgKarticaLokalna.ini
Win32/Debug/FormSettings/UserSettings/11/fmKartica_dbKartica1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmMagacin_.ini
Win32/Debug/FormSettings/UserSettings/11/frmMagacin_cxGrid1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmMagacin_cxGrid2DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_cxGrid1DBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_cxGridDBTableView1.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_cxGridDBTableView2.ini
Win32/Debug/FormSettings/UserSettings/11/frmo_artikli_dbg.ini
Cashit.cbproj
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_dbStavke.ini
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_cxZaglavlje.ini
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_cxStavke1DBTableView1.ini
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_cxGrid3DBTableView1.ini
Win32/Debug/podesavanje/UserSettings/6/fmNalogOtpreme_cxGrid1DBTableView1.ini
Prodaja/ch_MP.h.orig
Win32/Debug/log.txt
Win32/Debug/xml/fajl.zip
Win32/Debug/xml/novafaktura_s_lekari_13_11_2017.xml
Win32/Debug/xml/novafaktura_s_lekovi_01_11_2017.xml
Win32/Debug/xml/novafaktura_s_mtp_02_11_2017.xml
log1.log
Win32/Debug/Log/CashIT/CashIT.log
Win32/Debug/recepti/odradjeni/+1rA161240_04-12-2017_10-39-12.txt
Win32/Debug/recepti/odradjeni/nv131160_19-12-2017_09-36-46.txt
Win32/Debug/recepti/odradjeni/nv131160_14-02-2018_11-29-38 - Copy_error.txt
Win32/Debug/recepti/odradjeni/nv131160_14-02-2018_11-29-38 - Copy.txt
Win32/Debug/recepti/odradjeni/nv131160_14-02-2018_11-29-38 - Copy - Copy_error.txt
Win32/Debug/recepti/odradjeni/nv131160_14-02-2018_11-29-38 - Copy - Copy.txt
Win32/Debug/xml/novafaktura_s_lekari_05_04_2018.xml
VersionInfo/changeVer2.bat
Win32/Debug/Log/CashIT/CashIT.logD
Win32/Debug/slike/artikli/2.png
Update/update 2012/bus_korpa.txt
Update/update 2012/evidencija_cekova
Update/update 2012/konta.txt
Update/update 2012/sin_tbl.txt
Win32/Debug/Log/CashIT/POSLEDNJI_RACUN.XML
Update/update 2012/tk_knjiga
Update/update 2012/predracun.txt
Win32/Debug/xml/novafaktura_s_lekari_10_09_2018.xml
BUS_host.h.orig
TMP1.$$$
Win32/Debug/podesavanje/UserSettings/
CashIT.~dsk
CashIT.exe
Update/A407_D160.bpl
Win32/Debug/Stampa/110228951/fr_racun_mp_sank_offline.pdf
Win32/Debug/PRODAJA_2.txt
Win32/Debug/ART.xml
Win32/Debug/RAC.xml
c_mpf_1.cpp.orig
twfiles.@@@
CashIT.twfd
CashIT.twopts
BUS_kartica_artikla.vlb
CashIT.dsk
TMP2.$$$
TMP3.$$$
TMP4.$$$
Update/Skripta_moja
Slanje_podataka_desktop/Win32/Debug/pSlanjePodataka.exe
Slanje_podataka_desktop/Win32/Debug/pSlanjePodataka.log
Slanje_podataka_desktop/Win32/Debug/pSlanjePodataka.log1
Slanje_podataka_desktop/Win32/Debug/upx.exe
*.000
*.skincfg
Slanje_podataka_desktop/pSlanjePodataka.twfd
Slanje_podataka_desktop/pSlanjePodataka.twopts
Slanje_podataka_desktop/Win32/Debug/debug.txt
TMP5.$$$
TMP6.$$$
TMP7.$$$
TMP8.$$$
TMP10.$$$
TMP11.$$$
TMP12.$$$
TMP13.$$$
TMP14.$$$
TMP9.$$$
TMP15.$$$
TMP16.$$$
TMP17.$$$
TMP18.$$$
TMP19.$$$
TMP20.$$$
RZZOCenovnik/RzzoCenovnikApoteka.twfd
RZZOCenovnik/RzzoCenovnikApoteka.twopts
Prodaja/ch_MP_BACKUP_1966.h
Prodaja/ch_MP_BACKUP_2024.h
Prodaja/ch_MP_BASE_1966.h
Prodaja/ch_MP_BASE_2024.h
Prodaja/ch_MP_LOCAL_1966.h
Prodaja/ch_MP_LOCAL_2024.h
Prodaja/ch_MP_REMOTE_1966.h
Prodaja/ch_MP_REMOTE_2024.h
Win32/Debug/Deklaracije.exe
Update/tools/1sql.sql
Win32/Debug/Log/response.json
Win32/Debug/Log/status.json
Win32/Debug/Log/request.json
Win32/Debug/Log/verificationUrl.txt
Win32/Debug/Log/response - Copy.json
Win32/Debug/Log/journal.txt
Win32/Debug/frx28.bpl
Win32/Debug/fs28.bpl
Win32/Debug/dllStampaFisk.dll
Win32/Debug/vclx280.bpl
Win32/Debug/vcl280.bpl
Win32/Debug/rtl280.bpl
Win32/Debug/Log/pin.json
Update/tools/test.bat
Win32/Debug/Deklaracije2.exe
Win32/Debug/Log/backup/request2022-05-17-09-35-41.json
Win32/Debug/Log/backup/*.json
Win32/Debug/Log/CashIT/*.json
Win32/Debug/CashIT.logd1
Win32/Debug/RzzoCenovnikApoteka1.exe
*.xml
*.txt
RZZOCenovnik/Debug/xml/fajl.zip
Win32/Debug/Log/request_m.json
Doc/sef/makeXML.zip
Doc/sef/makeXML.lib
Doc/sef/eFaktura.lib
Doc/sef/eFaktura.dll
Doc/sef/TfrmSEF.dfm
Doc/sef/TfrmSEF.cpp
Doc/sef/makeXML.dll
Doc/sef/makeXML (1).zip
Doc/sef/eRacun.lib
Doc/sef/eRacun.dll
Doc/sef/Update.zip
Doc/sef/TfrmSEF.h
RZZOCenovnik/Debug/fqb190.lib
*.bak
*__recovery*
*__astcache*
__recovery/__recovery.ini
__recovery/c_dnevni_pazar.cpp
__recovery/c_dnevni_pazar.dfm
__recovery/c_dnevni_pazar.h
__recovery/c_restoran_pregled.cpp
__recovery/c_restoran_pregled.dfm
__recovery/c_restoran_pregled.h
__recovery/*.*
*__recovery*
CashIT.@@@
*.$$$
*.zip
*.obj-*
*.7z
Win32/Debug/slike/artikli/2035007.bmp
Win32/Debug/7z.exe
Win32/Debug/Log/CashIT/CashIT.logInsert
Win32/Debug/CashIT.str
Win32/Debug/slike/artikli/35768.bmp
Win32/Debug/slike/artikli/35800.bmp
Win32/Debug/slike/artikli/35806.bmp
Win32/Debug/slike/artikli/35885.bmp
Win32/Debug/slike/artikli/35892.bmp
*.log
*Win32/Debug/Log/*
Win32/Debug/slike/artikli/12556.jpg
Win32/Debug/slike/artikli/14613.bmp
Win32/Debug/slike/artikli/35758.bmp
Win32/Debug/slike/artikli/35760.bmp
Win32/Debug/slike/artikli/35761.bmp
Win32/Debug/slike/artikli/35770.bmp
Win32/Debug/slike/artikli/35784.bmp
Win32/Debug/slike/artikli/35845.bmp
Win32/Debug/slike/artikli/35861.bmp
Win32/Debug/Log/getInvoiceStatus.json
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Enumeratori.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
#ifndef EnumeratoriH
#define EnumeratoriH
//---------------------------------------------------------------------------
enum LoggingLevel
{
llDebug = 1,
llInfo = 2,
llCritical = 3
};
enum ProcessHandle
{
phKill,
phBroj
};
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include "TCompInfo.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
#ifndef TCompInfoH
#define TCompInfoH
#include <System.Classes.hpp>
#include <vector>
//---------------------------------------------------------------------------
class TCompInfo
{
public:
AnsiString _hostname;
AnsiString _defMagacin;
AnsiString _pib;
AnsiString _uid;
AnsiString _verzijaMP;
AnsiString _verzijaSinhro;
AnsiString _dir;
bool _SinhroDozvoljen;
std::vector<AnsiString> _ipAdrese;
};
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include "TFBBaza.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
#ifndef TFBBazaH
#define TFBBazaH
#include <System.Classes.hpp>
#include <System.IOUtils.hpp>
#include <StrUtils.hpp>
//---------------------------------------------------------------------------
class TFBBaza
{
public:
AnsiString _nazivBaze;
AnsiString _lokacijaBaze;
AnsiString _server = "localhost";
AnsiString _port = "3050";
AnsiString _user = "SYSDBA";
AnsiString _password = "masterkey";
AnsiString _server_pun = "";
AnsiString BazaPunNaziv()
{
if (Linux()) {
return _lokacijaBaze + '/' + _nazivBaze;
}
else
{
return TPath::Combine(_lokacijaBaze, _nazivBaze);
}
}
AnsiString ServerPun()
{
AnsiString server = CompareText(_server, "127.0.0.1") == 0 ?
"localhost" : _server;
return server + "/" + _port;
}
AnsiString ConnectionString()
{
return ServerPun() + ":" + BazaPunNaziv();
}
bool LokalnaBaza()
{
return CompareText(_server, "127.0.0.1") == 0 || CompareText(_server, "localhost") == 0;
}
bool Linux()
{
return !_lokacijaBaze.IsEmpty() && _lokacijaBaze[1] == '/';
}
};
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "THelper.h"
#include <IdSSLOpenSSL.hpp>
#pragma package(smart_init)
TFormatSettings _fmtHelper = TFormatSettings::Create(GetThreadLocale());
TRezultatOperacije<AnsiString> *THelper::ProcitajJSON(AnsiString sekcija, AnsiString kljuc,
AnsiString fajl)
{
if (!FileExists(fajl))
{
bool nasao = false;
if (ContainsText(fajl, "confIT.json"))
{
if (FileExists("c:\\bus\\c11\\confIT.json"))
{
nasao = true;
fajl = "c:\\bus\\c11\\confIT.json";
}
}
if (!nasao)
{
return new TRezultatOperacije<AnsiString>(false, "", "Fajl " + fajl + " nije pronadjen.");
}
}
try
{
std::unique_ptr<TStringStream> jsonStream(new TStringStream);
jsonStream->LoadFromFile(fajl);
TJSONObject *jsonReader = (TJSONObject*)TJSONObject::ParseJSONValue(jsonStream->DataString);
TJSONObject *sekcijaJSON = (TJSONObject*)jsonReader->GetValue(sekcija);
if (sekcijaJSON == nullptr)
{
delete jsonReader;
jsonStream->Clear();
return new TRezultatOperacije<AnsiString>(false, "", "Sekcija " + sekcija + " ne postoji u fajlu " + fajl);
}
TJSONValue *vrednost = sekcijaJSON->GetValue(kljuc);
if (vrednost == nullptr)
{
delete jsonReader;
jsonStream->Clear();
return new TRezultatOperacije<AnsiString>(false, "", "Kljuc " + kljuc + " ne postoji unutar sekcije " + sekcija + " u fajlu " + fajl);
}
AnsiString temp = sekcijaJSON->GetValue(kljuc)->Value();
delete jsonReader;
jsonStream->Clear();
return new TRezultatOperacije<AnsiString>(true, temp);
}catch (Exception &ex)
{
return new TRezultatOperacije<AnsiString>(false, "", ex.Message);
}catch (std::exception &ex)
{
return new TRezultatOperacije<AnsiString>(false, "", ex.what());
}
}
//---------------------------------------------------------------------------
TRezultatOperacije<std::vector<AnsiString>> *THelper::ProcitajJSONNiz(AnsiString sekcija, AnsiString kljuc, AnsiString fajl)
{
std::vector<AnsiString> rezultat;
if (!FileExists(fajl))
{
return new TRezultatOperacije<std::vector<AnsiString>>(false, rezultat, "Fajl " + fajl + " nije pronadjen.");
}
try
{
std::unique_ptr<TStringStream> jsonStream(new TStringStream);
jsonStream->LoadFromFile(fajl);
TJSONObject *jsonReader = (TJSONObject*)TJSONObject::ParseJSONValue(jsonStream->DataString);
TJSONObject *sekcijaJSON = (TJSONObject*)jsonReader->GetValue(sekcija);
if (sekcijaJSON == nullptr)
{
delete jsonReader;
jsonStream->Clear();
return new TRezultatOperacije<std::vector<AnsiString>>(false, rezultat, "Sekcija " + sekcija + " ne postoji u fajlu " + fajl);
}
TJSONArray* nizJSON = (TJSONArray*)sekcijaJSON->GetValue(kljuc);
int broj = nizJSON->Size();
for (int indeks = 0; indeks < broj; indeks++)
{
rezultat.push_back(nizJSON->Get(indeks)->Value());
}
if (rezultat.size() > 0)
{
delete jsonReader;
jsonStream->Clear();
return new TRezultatOperacije<std::vector<AnsiString>>(true, rezultat);
}else
{
delete jsonReader;
jsonStream->Clear();
return new TRezultatOperacije<std::vector<AnsiString>>(false, rezultat, "Nema elemenata u list, sekcija: " + sekcija +
" kljuc: " + kljuc);
}
}catch (Exception &ex)
{
return new TRezultatOperacije<std::vector<AnsiString>>(false, rezultat, ex.Message);
}catch (std::exception &ex)
{
return new TRezultatOperacije<std::vector<AnsiString>>(false, rezultat, ex.what());
}
}
//---------------------------------------------------------------------------
UnicodeString THelper::TrenutniDatumCist()
{
_fmtHelper.DateSeparator = '-';
_fmtHelper.LongDateFormat = "dd-mm-yyyy";
_fmtHelper.ShortDateFormat = "dd-mm-yyyy";
return FormatDateTime("dd-mm-yyyy", Now(), _fmtHelper);
}
//---------------------------------------------------------------------------
TRezultatOperacije<bool> *THelper::PokreniProces(AnsiString putanja, AnsiString fajl)
{
try
{
if (!FileExists(TPath::Combine(putanja, fajl)))
{
return new TRezultatOperacije<bool>(false, false);
}
PROCESS_INFORMATION procInfo;
STARTUPINFO startInfo;
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
UnicodeString fullPath = TPath::Combine(putanja, fajl);
CreateProcess(fullPath.t_str(), nullptr, nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP,
nullptr, UnicodeString(putanja).t_str(), &startInfo, &procInfo);
return new TRezultatOperacije<bool>(true, true);
}catch(...)
{
return new TRezultatOperacije<bool>(false, false);
}
}
//---------------------------------------------------------------------------
TRezultatOperacije<bool> *THelper::UgasiProces(AnsiString naziv_programa)
{
try
{
// Pronađi proces sa zadatim imenom
HANDLE hProcess = NULL;
DWORD dwProcessId = 0;
UnicodeString processName = naziv_programa ;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE)
{
return new TRezultatOperacije<bool>(false, false);
}
if (Process32First(hSnapshot, &pe32))
{
do
{
if (processName.CompareIC(pe32.szExeFile) == 0)
{
dwProcessId = pe32.th32ProcessID;
break;
}
}
while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
// Ako je proces pronađen, otvori ručicu i ugasi ga
if (dwProcessId != 0)
{
hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
if (hProcess == NULL)
{
return new TRezultatOperacije<bool>(false, false);
}
if (!TerminateProcess(hProcess, 0))
{
CloseHandle(hProcess);
return new TRezultatOperacije<bool>(false, false);
}
CloseHandle(hProcess);
return new TRezultatOperacije<bool>(true, true);
}
else
{
// Ako proces nije pronađen, vrati false
return new TRezultatOperacije<bool>(false, false);
}
}
catch(...)
{
return new TRezultatOperacije<bool>(false, false);
}
}
//---------------------------------------------------------------------------
TRezultatOperacije<int> *THelper::DohvatiProces(AnsiString naziv, ProcessHandle radnja)
{
try
{
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof (pEntry);
BOOL hRes = Process32First(hSnapShot, &pEntry);
int count = 0;
while (hRes)
{
if (CompareText(pEntry.szExeFile, naziv) == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
(DWORD) pEntry.th32ProcessID);
if (hProcess != NULL)
{
count++;
if (radnja == phKill)
{
TerminateProcess(hProcess, 9);
}
CloseHandle(hProcess);
}
}
hRes = Process32Next(hSnapShot, &pEntry);
}
CloseHandle(hSnapShot);
return new TRezultatOperacije<int>(true, count);
} catch (Exception &ex)
{
return new TRezultatOperacije<int>(false, 0, ex.Message);
} catch (std::exception &stdex)
{
return new TRezultatOperacije<int>(false, 0, stdex.what());
}
}
//---------------------------------------------------------------------------
std::unique_ptr<TRezultatOperacije<TFBBaza>> THelper::ProcitajIniFB(bool udaljena)
{
return ProcitajIniFB(udaljena ? AnsiString("bat_2006") : AnsiString("BAZA2006"));
}
std::unique_ptr<TRezultatOperacije<TFBBaza>> THelper::ProcitajIniFB(AnsiString konekcija)
{
auto fbRezultat = std::make_unique<TFBBaza>();
try
{
UnicodeString cashITdir = ParamStr(1);
if (cashITdir.IsEmpty())
{
AnsiString exeFile=Application->ExeName;
cashITdir = ExtractFilePath(exeFile);
}else
{
cashITdir.Delete(1, 2);
}
AnsiString dbx = "";
AnsiString shared = TPath::Combine(TPath::GetSharedDocumentsPath(),
"Embarcadero\\Studio\\dbExpress\\22.0");
if (FileExists(TPath::Combine(shared, "dbxconnections.ini")))
{
dbx = TPath::Combine(shared, "dbxconnections.ini");
}else if (FileExists(TPath::Combine(cashITdir, "dbxconnections.ini")))
{
dbx = TPath::Combine(cashITdir,"dbxconnections.ini");
}else
{
return std::make_unique<TRezultatOperacije<TFBBaza>>(false, std::move(fbRezultat), "Ne postoji dbxconnections.ini!");
}
auto konekcijaFajl = new TIniFile(dbx);
AnsiString baza = konekcijaFajl->ReadString(konekcija, "Database", "");
fbRezultat->_server_pun = baza;
if (baza.IsEmpty())
{
try
{
ifstream input(dbx.c_str());
std::string line;
bool nasaoKonekciju = false;
if (input.is_open())
{
while (getline(input, line))
{
if (nasaoKonekciju &&
line.rfind("Database", 0) == 0)
{
AnsiString db = AnsiString(line.c_str());
baza = SplitString(db, "=")[1].Trim();
break;
}else if (line.find("[" + konekcija + "]") != std::string::npos)
{
nasaoKonekciju = true;
}
}
}
}catch(...){}
if (baza.IsEmpty())
{
delete konekcijaFajl;
return std::make_unique<TRezultatOperacije<TFBBaza>>(false, std::move(fbRezultat),
"Ne mogu da procitam podatke o " + konekcija + " iz dbxconnections.ini");
}
}
fbRezultat->_lokacijaBaze = "";
//1. da li je alias sam
if (SplitString(baza, ":").Length == 1 &&
SplitString(baza, "/").Length == 1 &&
SplitString(baza, "\\").Length == 1)
{
fbRezultat->_nazivBaze = baza;
delete konekcijaFajl;
return std::make_unique<TRezultatOperacije<TFBBaza>>(true, std::move(fbRezultat));
}
//2. alias i host
if (SplitString(baza, ":").Length == 2 &&
SplitString(baza, "/").Length == 1 &&
SplitString(baza, "\\").Length == 1)
{
auto hostsplit = SplitString(baza, ":");
//2a. alias, host i port
if (SplitString(hostsplit[0], "/").Length == 2)
{
auto hostPort = SplitString(hostsplit[0], "/");
fbRezultat->_server = hostPort[0];
fbRezultat->_port = hostPort[1];
}else
{
fbRezultat->_server = hostsplit[0];
}
fbRezultat->_nazivBaze = hostsplit[1];
fbRezultat->_lokacijaBaze = "";
delete konekcijaFajl;
return std::make_unique<TRezultatOperacije<TFBBaza>>(true, std::move(fbRezultat));
}
//3. nema host
if ((SplitString(baza, ":").Length == 2 &&
SplitString(baza, "\\").Length > 1) || //windows putanja
SplitString(baza, ":").Length == 1)
{
auto dirSplit = SplitString(baza, "\\").Length > 0 ?
SplitString(baza, "\\") :
SplitString(baza, "/");
fbRezultat->_nazivBaze = dirSplit[dirSplit.Length-1];
char split = '\\';
if (SplitString(baza, "/").Length > 1)
{
split = '/';
fbRezultat->_lokacijaBaze = "/";
}
for (int dex = 0; dex < dirSplit.Length-1; dex++)
{
fbRezultat->_lokacijaBaze = fbRezultat->_lokacijaBaze
+ dirSplit[dex] + split;
}
delete konekcijaFajl;
return std::make_unique<TRezultatOperacije<TFBBaza>>(true, std::move(fbRezultat));
}
//4. ima host
if (SplitString(baza, ":").Length == 3 ||
(SplitString(baza, ":").Length == 2 &&
SplitString(baza, "/").Length > 1))
{
auto hostsplit = SplitString(baza, ":");
//5a. putanja, host i port
if (SplitString(hostsplit[0], "/").Length == 2)
{
auto hostPort = SplitString(hostsplit[0], "/");
fbRezultat->_server = hostPort[0];
fbRezultat->_port = hostPort[1];
}else //5b. putanja i host
{
fbRezultat->_server = hostsplit[0];
}
auto temp = SplitString(baza, ":");
auto putanja = temp.Length == 3 ?
temp[1] + ':' + temp[2] :
temp[1];
auto dirSplit = SplitString(putanja, "\\").Length > 1 ?
SplitString(putanja, "\\") :
SplitString(putanja, "/");
fbRezultat->_nazivBaze = dirSplit[dirSplit.Length-1];
char split = '\\';
if (SplitString(putanja, "/").Length > 1)
{
split = '/';
fbRezultat->_lokacijaBaze = "";
}
for (int dex = 0; dex < dirSplit.Length-1; dex++)
{
fbRezultat->_lokacijaBaze = fbRezultat->_lokacijaBaze
+ dirSplit[dex] + split;
}
delete konekcijaFajl;
return std::make_unique<TRezultatOperacije<TFBBaza>>(true, std::move(fbRezultat));
}
delete konekcijaFajl;
return std::make_unique<TRezultatOperacije<TFBBaza>>(false, std::move(fbRezultat),
"Parsiranje dbx nije proslo ok za: " + baza);
}catch (...)
{
return std::make_unique<TRezultatOperacije<TFBBaza>>(false, std::move(fbRezultat), "Problem u citanju konekcije");
}
}
//---------------------------------------------------------------------------//---------------------------------------------------------------------------
TRezultatOperacije<TFDConnection*> *THelper::NapraviKonekciju(bool udaljeni)
{
TFDConnection* conn = new TFDConnection(nullptr);
auto nazivKonekcijeJSON = ProcitajJSON("FB", udaljeni ? "dbKonekcijaUdaljena" : "dbKonekcija");
if (!nazivKonekcijeJSON->OperacijaUspela())
{
AnsiString greska = "Greska pri citanju konfiga1: " + nazivKonekcijeJSON->DohvatiGresku();
return new TRezultatOperacije<TFDConnection*>(false, conn, greska);
}
AnsiString nazivKonekcije = nazivKonekcijeJSON->DohvatiRezultat();
delete nazivKonekcijeJSON;
return NapraviKonekciju(nazivKonekcije);
}
//---------
TRezultatOperacije<TFDConnection*> *THelper::NapraviKonekciju(AnsiString nazivKonekcije)
{
TFDConnection* conn = new TFDConnection(nullptr);
auto konekcijaIni = ProcitajIniFB(nazivKonekcije); //izmena
if (!konekcijaIni->OperacijaUspela())
{
AnsiString greska = "Greska pri citanju konfiga2: " + konekcijaIni->DohvatiGresku();
//delete nazivKonekcijeJSON;
return new TRezultatOperacije<TFDConnection*>(false, conn, greska);
}
auto konekcija = konekcijaIni->DohvatiRezultat();
try
{
conn->LoginPrompt = false;
conn->DriverName = "FB";
conn->Params->Add("Server=" + konekcija.ServerPun() ); // AnsiString test_server = konekcija._server_pun; //
conn->Params->Add("Database=" + konekcija.BazaPunNaziv() ); // konekcija.BazaPunNaziv() konekcija._server_pun
conn->Params->Add("User_name=" + konekcija._user);
conn->Params->Add("Password=" + konekcija._password);
// conn->Params->Add("Protocol=ipTCPIP" );
// ShowMessage( "s="+konekcija.ServerPun() + " b=" + konekcija.BazaPunNaziv() );
// delete nazivKonekcijeJSON;
return new TRezultatOperacije<TFDConnection*>(true, conn, "");
}catch (Exception &ex)
{
// delete nazivKonekcijeJSON;
return new TRezultatOperacije<TFDConnection*>(false, conn, ex.Message);
}catch (std::exception &stdex)
{
// delete nazivKonekcijeJSON;
return new TRezultatOperacije<TFDConnection*>(false, conn, stdex.what());
}
}
//---------------------------------------------------------------------------
TRezultatOperacije<TCompInfo> *THelper::DohvatiHostInformacije()
{
TCompInfo compInfo;
try
{
UnicodeString cashITdir = ParamStr(1);
if (cashITdir.IsEmpty())
{
AnsiString exeFile=Application->ExeName;
cashITdir = ExtractFilePath(exeFile);
}else
{
cashITdir.Delete(1, 2);
}
compInfo._dir = cashITdir;
AnsiString podesavanja = TPath::Combine(cashITdir, "podesavanje");
if (!DirectoryExists(podesavanja))
{
ForceDirectories(podesavanja);
}
TIniFile *ini = new TIniFile(TPath::Combine(podesavanja, "settings.ini"));
AnsiString guidTxt;
if (ini->ValueExists("Generalno", "GUID"))
{
guidTxt = ini->ReadString("Generalno", "GUID", "");
}else
{
TGUID guid;
CreateGUID(guid);
guidTxt = Sysutils::GUIDToString(guid);
ini->WriteString("Generalno", "GUID", Sysutils::GUIDToString(guid));
}
compInfo._uid = guidTxt;
delete ini;
//Verzija cashIT
TDateTime modDate = TFile::GetLastWriteTime(TPath::Combine(cashITdir, "CashIT.exe"));
Word godina, mesec, dan;
modDate.DecodeDate(&godina, &mesec, &dan);
compInfo._verzijaMP = Format(L"%04d%02d%02d", ARRAYOFCONST((godina, mesec, dan)));
//Verzija pSlanje
if (FileExists(TPath::Combine(cashITdir, "pSlanjePodataka.exe")))
{
modDate = TFile::GetLastWriteTime(TPath::Combine(cashITdir, "pSlanjePodataka.exe"));
modDate.DecodeDate(&godina, &mesec, &dan);
compInfo._verzijaSinhro = Format(L"%04d%02d%02d", ARRAYOFCONST((godina, mesec, dan)));
}
//IP adrese
auto GStack = new TIdStackWindows();
TIdStackLocalAddressList *addressList = new TIdStackLocalAddressList();
GStack->GetLocalAddressList(addressList);
for (int i = 0; i < addressList->Count; i++)
{
if (addressList->Addresses[i]->IPVersion == Id_IPv4)
{
compInfo._ipAdrese.push_back(addressList->Addresses[i]->IPAddress);
}
}
delete addressList;
delete GStack;
auto connOp = NapraviKonekciju();
if (!connOp->OperacijaUspela())
{
throw Exception(connOp->DohvatiGresku());
}
TFDQuery *dbInfo = new TFDQuery(nullptr);
dbInfo->Connection = connOp->DohvatiRezultat();
delete connOp;
dbInfo->SQL->Text = "SELECT FIRST 1 PIB FROM TBLHOST h";
dbInfo->Open();
AnsiString pib = dbInfo->FieldByName("PIB")->AsString;
dbInfo->Close();
dbInfo->SQL->Text = "select m.magacin from tblmagacin m "
"right join hp_fiskal f on m.sifra_magacina = f.def_mp_mg;";
dbInfo->Open();
AnsiString mag = dbInfo->FieldByName("magacin")->AsString;
dbInfo->Close();
dbInfo->SQL->Text = "SELECT * FROM TBLRACUNARI WHERE GUID = '" + compInfo._uid + "'" ;
dbInfo->Open();
if (dbInfo->RecordCount == 1)
{
compInfo._SinhroDozvoljen = dbInfo->FieldByName("SINHRO_DOZVOLJEN")->AsInteger == 1;
}
if (dbInfo->Connection->InTransaction)
{
dbInfo->Connection->Rollback();
}
dbInfo->Close();
dbInfo->Unprepare();
dbInfo->Connection->Close();
delete dbInfo->Connection;
dbInfo->Connection = nullptr;
delete dbInfo;
compInfo._hostname = getenv("COMPUTERNAME");
compInfo._pib = pib;
compInfo._defMagacin = mag;
}catch (Exception &ex)
{
AnsiString greska = "Greska pri citanju iz baze1: " + ex.Message;
return new TRezultatOperacije<TCompInfo>(false, compInfo, greska);
}catch (std::exception &stdex)
{
AnsiString greska = "Greska pri citanju iz baze2: " + AnsiString(stdex.what());
return new TRezultatOperacije<TCompInfo>(false, compInfo, greska);
}
return new TRezultatOperacije<TCompInfo>(true, compInfo);
}
//---------------------------------------------------------------------------
TRezultatOperacije<double> *THelper::PrazanProstor()
{
__int64 prazanProstor = DiskFree(0);
if (prazanProstor != -1)
{
double prazno = static_cast<double>(prazanProstor / (1024 * 1024 * 1024));
return new TRezultatOperacije<double>(true, prazno);
}
return new TRezultatOperacije<double>(false, 0, "Greska pri citanju slobodnog prostora");
}
TRezultatOperacije<double> *THelper::VelicinaFajla(AnsiString fajl)
{
struct stat st;
if (stat(fajl.c_str(), &st) == 0)
{
double velicina = static_cast<double>(st.st_size) / (1024 * 1024 * 1024);
return new TRezultatOperacije<double>(true, velicina);
} else
{
return new TRezultatOperacije<double>(false, 0, "Greska pri citanju velicine fajla");
}
}
TRezultatOperacije<AnsiString> *THelper::DeparametrizujUpit(TSQLDataSet *dataset)
{
try
{
AnsiString upitUFulu = dataset->CommandText;
for (int dex = 0; dex < dataset->Params->Count; dex++)
{
upitUFulu = StringReplace(AnsiString(upitUFulu),
AnsiString(" :" + dataset->Params->Items[dex]->Name + " "),
AnsiString(" " + dataset->Params->Items[dex]->AsString + " "),
TReplaceFlags() << rfReplaceAll);
}
return new TRezultatOperacije<AnsiString>(true, upitUFulu);
}catch(Exception &ex)
{
return new TRezultatOperacije<AnsiString>(false, "", ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<AnsiString>(false, "", stdex.what());
}catch(...)
{
return new TRezultatOperacije<AnsiString>(false, "", "Nepoznada greska pri deparametrizaciji upita.");
}
}
TRezultatOperacije<TJSONArray*> *THelper::RezultatJSON(TClientDataSet *upit)
{
TJSONArray *niz = new TJSONArray();
AnsiString greska = "";
char LDecimalSeparator = FormatSettings.DecimalSeparator;
char LThousandSeparator = FormatSettings.ThousandSeparator;
String lOldDateFormat = FormatSettings.ShortDateFormat;
char lOldDateSeparator = FormatSettings.DateSeparator;
FormatSettings.ShortDateFormat = "mm/dd/yyyy";
FormatSettings.DateSeparator = '/';
FormatSettings.DecimalSeparator = '.';
FormatSettings.ThousandSeparator = ',';
try
{
if (!upit->Active)
{
upit->Open();
}else
{
upit->First();
}
while(!upit->Eof)
{
TJSONObject *red = new TJSONObject();
for (auto polje : upit->Fields )
{
if (polje->IsNull)
{
continue;
}
switch (polje->DataType)
{
case ftInteger:
case ftSmallint:
case ftLargeint:
red->AddPair(polje->FieldName, new TJSONNumber(polje->AsInteger));
break;
case ftFloat:
red->AddPair(polje->FieldName, new TJSONNumber(polje->AsFloat));
break;
case ftBCD:
case ftFMTBcd:
{
TBcd bcdValue = polje->AsBCD;
Currency currValue;
BCDToCurr(bcdValue, currValue);
double dabl = static_cast<double>(currValue);
red->AddPair(polje->FieldName, new TJSONNumber(dabl));
break;
}
case ftDate:
{
_fmtHelper.DateSeparator = '/';
_fmtHelper.TimeSeparator = ':';
_fmtHelper.LongDateFormat = "mm/dd/yyyy";
_fmtHelper.ShortDateFormat = "mm/dd/yyyy";
_fmtHelper.LongTimeFormat = "hh:nn";
_fmtHelper.ShortTimeFormat = "hh:nn";
TDateTime dateTimeValue = polje->AsDateTime;
AnsiString fVreme;
fVreme = FormatDateTime("mm/dd/yyyy", dateTimeValue, _fmtHelper);
red->AddPair(polje->FieldName, new TJSONString(fVreme));
break;
}
case ftTime:
case ftDateTime:
case ftTimeStamp:
{
_fmtHelper.DateSeparator = '/';
_fmtHelper.TimeSeparator = ':';
_fmtHelper.LongDateFormat = "mm/dd/yyyy";
_fmtHelper.ShortDateFormat = "mm/dd/yyyy";
_fmtHelper.LongTimeFormat = "hh:nn";
_fmtHelper.ShortTimeFormat = "hh:nn";
TDateTime dateTimeValue = polje->AsDateTime;
AnsiString fVreme;
// if (dateTimeValue == TDateTime(dateTimeValue.Date))
// {
// fVreme = FormatDateTime("mm/dd/yyyy", dateTimeValue, _fmtHelper);
// }
// else
// {
fVreme = FormatDateTime("mm/dd/yyyy hh:nn", dateTimeValue, _fmtHelper);
// }
red->AddPair(polje->FieldName, new TJSONString(fVreme));
break;
}
case ftString:
red->AddPair(polje->FieldName, new TJSONString( escapeSpecialCharacters(polje->AsString) ));
break;
default:
{
int fieldTypeInt = static_cast<int>(polje->DataType);
String err = IntToStr(fieldTypeInt);
throw Exception("Ne mogu da parsiram tip sa id-em: " + err);
break;
}
}
}
niz->AddElement(red);
upit->Next();
}
FormatSettings.DecimalSeparator = LDecimalSeparator;
FormatSettings.ThousandSeparator = LThousandSeparator;
FormatSettings.DateSeparator = lOldDateSeparator;
FormatSettings.ShortDateFormat = lOldDateFormat;
return new TRezultatOperacije<TJSONArray*>(true, niz);
}catch(Exception &ex)
{
greska = "Greska pri prevodu cdsa u JSON: " + ex.Message;
}catch (std::exception &stdex)
{
greska = "Greska pri prevodu cdsa u JSON: " + AnsiString(stdex.what());
}catch(...)
{
greska = "Greska pri prevodu cdsa u JSON";
}
FormatSettings.DecimalSeparator = LDecimalSeparator;
FormatSettings.ThousandSeparator = LThousandSeparator;
FormatSettings.DateSeparator = lOldDateSeparator;
FormatSettings.ShortDateFormat = lOldDateFormat;
return new TRezultatOperacije<TJSONArray*>(false, niz, greska);
}
TRezultatOperacije<TJSONObject*> *THelper::PostAPI(AnsiString server, AnsiString api, TJSONObject *sadrzaj, std::map<AnsiString, AnsiString> hederi)
{
TIdHTTP *http1 = nullptr;
TIdSSLIOHandlerSocketOpenSSL *ssl = nullptr;
try {
http1 = new TIdHTTP(NULL);
if (ContainsText(server, "https")) {
ssl = new TIdSSLIOHandlerSocketOpenSSL(nullptr);
http1->IOHandler = ssl;
ssl->SSLOptions->Method = sslvTLSv1_2;
}
http1->Request->ContentType = "application/json";
for (const auto& kv : hederi)
{
http1->Request->CustomHeaders->Values[kv.first] = kv.second;
}
http1->Request->CharSet = "utf-8";
bool uspeh = false;
AnsiString greska = "";
TJSONObject *jsonObject = nullptr;
TStringStream *jsonStream = new TStringStream(sadrzaj->ToString());
TStringStream *responseStream = new TStringStream(UnicodeString(""));
try
{
AnsiString full = server + api;
http1->Post(full, jsonStream, responseStream);
TJSONValue *jsonValue = TJSONObject::ParseJSONValue(responseStream->DataString);
jsonObject = dynamic_cast<TJSONObject*>(jsonValue);
if (jsonObject == nullptr)
{
jsonObject = new TJSONObject();
delete jsonValue;
}
uspeh = true;
}catch(Exception &ex)
{
greska = ex.Message;
}catch (std::exception &stdex)
{
greska = stdex.what();
}catch(...)
{
greska = "Greska pri slanju zahteva na Rest API";
}
delete jsonStream;
delete responseStream;
return new TRezultatOperacije<TJSONObject*>(uspeh, jsonObject, greska);
} catch (...) {
delete ssl;
delete http1;
throw;
}
}
TRezultatOperacije<bool> *THelper::ProveraAPI()
{
bool rezultat = false;
bool uspeh = false;
AnsiString greska = "";
try
{
std::unique_ptr<TFDQuery> provera = std::make_unique<TFDQuery>(nullptr);
provera->Connection = NapraviKonekciju()->DohvatiRezultat();
provera->SQL->Text = "SELECT FIRST 1 REST_API FROM TBLHOST";
provera->Open();
rezultat = provera->FieldByName("REST_API")->AsInteger == 1;
if (provera->Connection->InTransaction)
{
provera->Connection->Rollback();
}
provera->Unprepare();
provera->Connection->Close();
provera->Close();
delete provera->Connection;
provera->Connection = nullptr;
provera.reset();
uspeh = true;
}catch(Exception &ex)
{
greska = ex.Message;
}catch (std::exception &stdex)
{
greska = stdex.what();
}catch(...)
{
greska = "Greska pri proveri Rest API vrednosti u tblhost.";
}
return new TRezultatOperacije<bool>(uspeh, rezultat, greska);
}
String THelper::escapeSpecialCharacters(String input) {
String escaped;
for (int i = 1; i <= input.Length(); ++i) {
switch (input[i]) {
case '\"': escaped += "\\\""; break;
case '\\': escaped += "\\\\"; break;
case '\b': escaped += "\\b"; break;
case '\f': escaped += "\\f"; break;
case '\n': escaped += "\\n"; break;
case '\r': escaped += "\\r"; break;
case '\t': escaped += "\\t"; break;
default:
if (input[i] >= 0 && input[i] <= 31) {
escaped += "\\u" + IntToHex(static_cast<int>(input[i]), 4);
} else {
escaped += input[i];
}
}
}
return escaped;
}
TRezultatOperacije<bool> *THelper::UpdateLokalniInfo(TCompInfo info)
{
bool rezultat = false;
bool uspeh = false;
AnsiString greska = "";
try
{
AnsiString ipRed = "";
for (const auto& ip : info._ipAdrese)
{
if (!ipRed.IsEmpty())
{
ipRed += "|";
}
ipRed += ip;
}
std::unique_ptr<TFDQuery> provera = std::make_unique<TFDQuery>(nullptr);
provera->Connection = NapraviKonekciju()->DohvatiRezultat();
provera->SQL->Text = "SELECT * FROM TBLRACUNARI WHERE GUID = '" + info._uid + "'" ;
provera->Open();
if (provera->RecordCount == 0)
{
provera->Close();
provera->SQL->Text = "INSERT INTO TBLRACUNARI "
"(GUID, VERZIJA_MP, VERZIJA_SINHRO, NAZIV_RACUNARA, IP) "
"VALUES ('" + info._uid + "', '" + info._verzijaMP + "', '" + info._verzijaSinhro +
"', '" + info._hostname + "', '" + ipRed + "'); ";
provera->ExecSQL();
}else
{
int brojIzmena = provera->FieldByName("INFO_BROJ_PROMENA")->AsInteger;
AnsiString stariNaziv = "";
AnsiString stariIP = "";
if (CompareText(provera->FieldByName("NAZIV_RACUNARA")->AsString, info._hostname) != 0 ||
CompareText(provera->FieldByName("IP")->AsString, ipRed) != 0)
{
stariNaziv = provera->FieldByName("NAZIV_RACUNARA")->AsString;
stariIP = provera->FieldByName("IP")->AsString;
brojIzmena++;
}
provera->Close();
provera->SQL->Text = "UPDATE TBLRACUNARI "
"SET VERZIJA_MP = '" + info._verzijaMP + "', VERZIJA_SINHRO = '" + info._verzijaSinhro +
"', NAZIV_RACUNARA = '" + info._hostname + "', IP = '" + ipRed + "', INFO_BROJ_PROMENA = " + IntToStr(brojIzmena) +
", STARI_NAZIV = '" + stariNaziv + "', STARI_IP = '" + stariIP + "' "
" WHERE GUID = '" + info._uid + "'; ";
provera->ExecSQL();
}
if (provera->Connection->InTransaction)
{
provera->Connection->Rollback();
}
provera->Unprepare();
provera->Connection->Close();
provera->Close();
delete provera->Connection;
provera->Connection = nullptr;
provera.reset();
uspeh = true;
rezultat = true;
}catch(Exception &ex)
{
greska = ex.Message;
}catch (std::exception &stdex)
{
greska = stdex.what();
}catch(...)
{
greska = "Greska pri proveri Rest API vrednosti u tblhost.";
}
return new TRezultatOperacije<bool>(uspeh, rezultat, greska);
}
TRezultatOperacije<float> *THelper::ZauzetoRadne(bool privatna)
{
float ram = 0;
bool uspeh = false;
if (privatna)
{
PROCESS_MEMORY_COUNTERS_EX pmcex;
if (GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmcex, sizeof(pmcex)))
{
ram = pmcex.PrivateUsage / (1024.0 * 1024.0);
uspeh = true;
}
}else
{
PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)))
{
ram = pmc.WorkingSetSize / (1024.0 * 1024.0);
uspeh = true;
}
}
return new TRezultatOperacije<float>(uspeh, ram, "");
}
//---------------------------------------------------------------------------
#ifndef THelperH
#define THelperH
//---------------------------------------------------------------------------
#include <System.SysUtils.hpp>
#include <System.Classes.hpp>
#include <System.JSON.hpp>
#include <StrUtils.hpp>
#include <System.IOUtils.hpp>
#include <System.IniFiles.hpp>
#include <Data.DB.hpp>
#include <Data.SqlExpr.hpp>
#include <Data.FMTBcd.hpp>
#include <Data.SqlExpr.hpp>
#include <Datasnap.DBClient.hpp>
#include <Datasnap.Provider.hpp>
#include <FireDAC.Comp.Client.hpp>
#include <FireDAC.Comp.DataSet.hpp>
#include <FireDAC.DApt.hpp>
#include <FireDAC.DApt.Intf.hpp>
#include <FireDAC.DatS.hpp>
#include <FireDAC.Phys.FB.hpp>
#include <FireDAC.Phys.FBDef.hpp>
#include <FireDAC.Phys.hpp>
#include <FireDAC.Phys.Intf.hpp>
#include <FireDAC.Stan.Async.hpp>
#include <FireDAC.Stan.Def.hpp>
#include <FireDAC.Stan.Error.hpp>
#include <FireDAC.Stan.Intf.hpp>
#include <FireDAC.Stan.Option.hpp>
#include <FireDAC.Stan.Param.hpp>
#include <FireDAC.Stan.Pool.hpp>
#include <FireDAC.UI.Intf.hpp>
#include <FireDAC.VCLUI.Wait.hpp>
#include <IdStack.hpp>
#include <IdStackWindows.hpp>
#include <vector>
#include <windows.h>
#include <process.h>
#include <psapi.h>
#include <Tlhelp32.h>
#include <winbase.h>
#include <shellapi.h>
#include "TRezultatOperacije.h"
#include "TFBBaza.h"
#include "Enumeratori.h"
#include "TCompInfo.h"
#include <fstream>
#include <string>
#include <sys/stat.h>
#include <iomanip>
#include <IdHTTP.hpp>
#include <IdMultipartFormData.hpp>
#include <map>
//---------------------------------------------------------------------------
class THelper
{
public:
THelper(){}
//Parsiranje fajlova
TRezultatOperacije<AnsiString> *ProcitajJSON(AnsiString sekcija, AnsiString kljuc,
AnsiString fajl = "confIT.json");
TRezultatOperacije<std::vector<AnsiString>> *ProcitajJSONNiz(AnsiString sekcija, AnsiString kljuc,
AnsiString fajl = "confIT.json");
std::unique_ptr<TRezultatOperacije<TFBBaza>> ProcitajIniFB(bool udaljena = false);
std::unique_ptr<TRezultatOperacije<TFBBaza>> ProcitajIniFB(AnsiString konekcija);
//Rad sa fajlovima
TRezultatOperacije<double> *PrazanProstor();
TRezultatOperacije<double> *VelicinaFajla(AnsiString fajl);
//Info o racunaru
TRezultatOperacije<TCompInfo> *DohvatiHostInformacije();
TRezultatOperacije<bool> *UpdateLokalniInfo(TCompInfo info);
TRezultatOperacije<float> *ZauzetoRadne(bool privatna = false);
//Rad sa procesima
TRezultatOperacije<int> *DohvatiProces(AnsiString naziv, ProcessHandle radnja);
TRezultatOperacije<bool> *PokreniProces(AnsiString putanja, AnsiString fajl);
TRezultatOperacije<bool> *UgasiProces(AnsiString naziv_programa);
//Baza
TRezultatOperacije<TFDConnection*> *NapraviKonekciju(bool udaljeni = false);
TRezultatOperacije<TFDConnection*> *NapraviKonekciju(AnsiString konekcija);
TRezultatOperacije<AnsiString> *DeparametrizujUpit(TSQLDataSet *dataset);
TRezultatOperacije<TJSONArray*> *RezultatJSON(TClientDataSet *upit);
//API
TRezultatOperacije<TJSONObject*> *PostAPI(AnsiString server, AnsiString api, TJSONObject *sadrzaj, std::map<AnsiString, AnsiString> hederi = std::map<AnsiString, AnsiString>());
TRezultatOperacije<bool> *ProveraAPI();
//Male pomocne
UnicodeString TrenutniDatumCist();
String escapeSpecialCharacters(String input);
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include <TRezultatOperacije.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
#ifndef TRezultatOperacijeH
#define TRezultatOperacijeH
#include <System.Classes.hpp>
#include <Data.DB.hpp>
#include <Data.SqlExpr.hpp>
#include <FireDAC.Comp.Client.hpp>
#include <FireDAC.Comp.DataSet.hpp>
#include <FireDAC.DApt.hpp>
#include <FireDAC.DApt.Intf.hpp>
#include <FireDAC.DatS.hpp>
#include <FireDAC.Phys.FB.hpp>
#include <FireDAC.Phys.FBDef.hpp>
#include <FireDAC.Phys.hpp>
#include <FireDAC.Phys.Intf.hpp>
#include <FireDAC.Stan.Async.hpp>
#include <FireDAC.Stan.Def.hpp>
#include <FireDAC.Stan.Error.hpp>
#include <FireDAC.Stan.Intf.hpp>
#include <FireDAC.Stan.Option.hpp>
#include <FireDAC.Stan.Param.hpp>
#include <FireDAC.Stan.Pool.hpp>
#include <FireDAC.UI.Intf.hpp>
#include <FireDAC.VCLUI.Wait.hpp>
//---------------------------------------------------------------------------
template <typename T>
class TRezultatOperacije
{
private:
bool _uspeh;
AnsiString _greska;
T _rezultat;
public:
TRezultatOperacije(bool uspeh, T rezultat, AnsiString greska = "")
{
_uspeh = uspeh;
_greska = greska;
_rezultat = rezultat;
}
TRezultatOperacije(bool uspeh, std::unique_ptr<T> rezultat, AnsiString greska = "")
{
_uspeh = uspeh;
_greska = greska;
_rezultat = {*rezultat};
}
bool OperacijaUspela()
{
return _uspeh;
}
AnsiString DohvatiGresku()
{
return _greska;
}
T DohvatiRezultat()
{
if (!_uspeh)
{
throw std::runtime_error(_greska.c_str());
}
return _rezultat;
}
};
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include "TDataClasses.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
#ifndef TDataClassesH
#define TDataClassesH
#include <System.Classes.hpp>
#include "TFBBaza.h"
//---------------------------------------------------------------------------
class TFileData
{
public:
AnsiString _targetFolder = "";
AnsiString _archiveName = "";
AnsiString _targetArch = "";
AnsiString _cashITDir = "";
AnsiString _tempDirPath = "";
};
class TFtpData
{
public:
AnsiString _server = "";
AnsiString _rootDir = "";
AnsiString _port = "";
AnsiString _username = "";
AnsiString _password = "";
};
class TDbData
{
public:
AnsiString _pib = "";
AnsiString _scriptFile = "";
AnsiString _logServer = "";
AnsiString _FBdll = "fbclient.dll";
AnsiString _ibeScriptdll = "";
TFBBaza _fbBaza;
};
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include "TDllWrap.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
bool TDllWrap::_lastCommandSuccess = true;
bool TDllWrap::_stopOnError = true;
int __stdcall OnConnectionError(char* error)
{
TLogger *logger = new TLogger();
logger->Log("ibescript.dll prijavljuje gresku pri konekciji: " + AnsiString(error), llCritical);
delete logger;
return 1;
}
int __stdcall OnError(char * text, char * errorMessage)
{
TLogger *logger = new TLogger();
logger->Log("ibescript.dll prijavljuje gresku: " + AnsiString(errorMessage), llCritical);
logger->Log("ibescript.dll tekst: " + AnsiString(text), llCritical);
TDllWrap::_lastCommandSuccess = false;
delete logger;
return 0;
}
int __stdcall OnBefore(char * statement, char * text)
{
TLogger *logger = new TLogger();
logger->Log("ibescript.dll radi: " + AnsiString(statement), llCritical);
if (CompareStr(AnsiString(text), "Executing IBEBlock...") != 0)
{
logger->Log(AnsiString(text), llCritical);
}
delete logger;
//if ((!TDllWrap::_lastCommandSuccess)&&TDllWrap::_stopOnError)
//{
// TDllWrap::_logger->Log("Aktivno zaustavljanje zbog greske, staje proces.", llCritical);
// return 1;
// }
return 0;
}
int __stdcall OnAfter(char * statement, int success)
{
if (success != 1)
{
TLogger *logger = new TLogger();
logger->Log("ibescript.dll nije uspeo da izvrsi: " + AnsiString(statement), llCritical);
delete logger;
TDllWrap::_lastCommandSuccess = false;
}
return 0;
}
TDllWrap::TDllWrap(TFileData &fileData, TFtpData &ftpData,
TDbData &dbData, bool stopOnError)
{
_ibeDll = LoadLibraryA(dbData._ibeScriptdll.c_str());
_connectDB = (TConnectDB)GetProcAddress(_ibeDll, "Connect");
_disconnectDB = (TDisconnectDB)GetProcAddress(_ibeDll, "Disconnect");
_executeFile = (TExecute)GetProcAddress(_ibeDll, "ExecScriptFile");
_executeText = (TExecute)GetProcAddress(_ibeDll, "ExecScriptText");
_dbData = &dbData;
_ftpData = &ftpData;
_fileData = &fileData;
_stopOnError = stopOnError;
}
void TDllWrap::CleanWorkFolder()
{
TLogger *logger = new TLogger();
logger->Log("Brisanje fajlova.", llDebug);
delete logger;
if (TDirectory::Exists(_fileData->_tempDirPath))
{
TDirectory::Delete(_fileData->_tempDirPath, true);
}
ForceDirectories(_fileData->_tempDirPath);
}
bool TDllWrap::ExecuteCommand(Commands command)
{
_lastCommandSuccess = true;
AnsiString commandText = "";
TLogger *logger = new TLogger();
switch (command)
{
case ecOnline:
case ecOnlineSingle:
{
AnsiString single = command == ecOnlineSingle ? "Mode=Single" : "";
logger->Log("Izvrsavam online baze.", llInfo);
commandText = "execute ibeblock as begin "
"err = ibec_OnlineDatabase("
"'" + _dbData->_fbBaza.ConnectionString() + "',"
"'ClientLib="
+ _dbData->_FBdll + ";"
"User=" + _dbData->_fbBaza._user + "; Password=" + _dbData->_fbBaza._password +";"
+ single + "'); "
"if (err is not null) then "
"exception ERR_EXP err;"
" end";
break;
}
case ecShutdown:
case ecShutdownFull:
{
AnsiString full = command == ecShutdownFull ? "Mode=Full" : "Mode=Single";
logger->Log("Izvrsavam shutdown baze.", llInfo);
commandText = "execute ibeblock as begin "
"err = ibec_ShutdownDatabase("
"'" + _dbData->_fbBaza.ConnectionString() + "',"
"'ClientLib="
+ _dbData->_FBdll + ";"
"User=" + _dbData->_fbBaza._user + "; Password=" + _dbData->_fbBaza._password +";"
+ full + "'); "
"if (err is not null) then "
"exception ERR_EXP err;"
" end";
break;
}
case ecRestore:
logger->Log("Izvrsavam restore baze.", llInfo);
commandText = "execute ibeblock as begin "
"err = ibec_RestoreDatabase("
"'" + TPath::Combine(_fileData->_targetFolder, _fileData->_archiveName) + "',"
"'" + _dbData->_fbBaza.BazaPunNaziv() + ".temp" + "',"
"'ClientLib="
+ _dbData->_FBdll + ";"
"User=" + _dbData->_fbBaza._user + "; Password=" + _dbData->_fbBaza._password +";"
"OneAtATime;INACTIVE;CREATE_DATABASE',null);"
"if (err is not null) then "
"exception ERR_EXP err;"
" end";
break;
case ecScript:
if (ExecuteCommand(ecShutdown) && ExecuteCommand(ecOnlineSingle))
{
logger->Log("Konektujem se na bazu.", llInfo);
ConnectToDb();
}
break;
case ecRecompileProcs:
if (ExecuteCommand(ecShutdown) && ExecuteCommand(ecOnlineSingle))
{
ConnectToDb();
logger->Log("Izvrsavam rekompajliranje svih procedura u bazi.", llInfo);
commandText = "execute ibeblock as begin "
"err = ibec_RecompileProcedure(0, '');"
"if (err <> '') then "
"exception ERR_EXP err; "
" end";
}
break;
case ecGetServerLog:
logger->Log("Uzimam fb serverski log.", llInfo);
commandText = "execute ibeblock as begin "
"ibec_GetServerLog("
"'ServerName=" + _dbData->_fbBaza.ServerPun() + ";"
"User=" + _dbData->_fbBaza._user + "; Password=" + _dbData->_fbBaza._password +";"
"ClientLib=" + _dbData->_FBdll +"','"
+ TPath::Combine(_fileData->_tempDirPath, "serverLog-" + _helper->TrenutniDatumCist() + ".txt") + "');"
"if (not ibec_FileExists('"
+ TPath::Combine(_fileData->_tempDirPath, "serverLog-" + _helper->TrenutniDatumCist() + ".txt") + "')) then "
"exception ERR_EXP 'Greska prilikom uzimanja serverskog loga.';"
"end";
break;
}
if (command == ecScript && _lastCommandSuccess)
{
logger->Log("Izvrsavam skriptu na bazi.", llInfo);
_executeFile(_dbData->_scriptFile.c_str(), OnError, OnBefore, OnAfter);
}else if (_lastCommandSuccess)
{
_executeText(commandText.c_str(), OnError, OnBefore, OnAfter);
}
if (!_lastCommandSuccess && (command == ecShutdownFull || command == ecShutdown))
{
logger->Log("Shutdown nije uspeo, pokusavam Online pa Shutdown.", llCritical);
if (ExecuteCommand(ecOnlineSingle)&&ExecuteCommand(command))
{
logger->Log("Shutdown je sada uspeo", llInfo);
} else
{
logger->Log("Shutdown jos uvek neuspesan, zaustavljam izvrsavanje.", llCritical);
return false;
}
} else if (!_lastCommandSuccess && _stopOnError)
{
logger->Log("Proces staje zbog prethodnih gresaka.", llCritical);
return false;
}
if (command == ecRestore)
{
_stopOnError = false;
ExecuteCommand(ecShutdownFull);
AnsiString fqDbName = _dbData->_fbBaza.BazaPunNaziv();
DeleteFile(fqDbName);
RenameFile(fqDbName + ".temp", fqDbName);
}
if (command == ecRestore || command == ecScript || command == ecRecompileProcs)
{
ExecuteCommand(ecOnline);
}
_disconnectDB();
delete logger;
return _lastCommandSuccess;
}
void TDllWrap::ConnectToDb()
{
AnsiString connString = "db_name="
"'" + _dbData->_fbBaza.ConnectionString() + "';"
"user_name=SYSDBA; password=masterkey;"
"clientlib='" + _dbData->_FBdll + "'; sql_role_name=ADMIN; sql_dialect=3;";
_connectDB(connString.c_str(), OnConnectionError);
}
//---------------------------------------------------------------------------
#ifndef TDllWrapH
#define TDllWrapH
#include <System.Classes.hpp>
#include <System.SysUtils.hpp>
#include <System.IOUtils.hpp>
#include <exception>
#include "Paketi\Logger\TLogger.h"
#include "TDataClasses.h"
#include "Paketi\Helper\THelper.h"
//---------------------------------------------------------------------------
//Int koji ovi callbackovi vracaju se koristi kao indikator uspesnosti, 0 je da nema greske
// te ako negde vratimo nesto <> 0
//dolazi do zaustavljanja izvrsavanja sql skripte.
//Success kod AfterExec radi kontra, on je kao bool
//te je 1 korektno, 0 je lose
typedef int (__stdcall *TConnErrorCallback)(char * errorMessage);
typedef int (__stdcall *TErrorCallback)(char * text, char * errorMessage);
typedef int (__stdcall *TBeforeExecCallback)(char * statement, char * text);
typedef int (__stdcall *TAfterExecCallback)(char * statement, int success);
typedef int (__stdcall *TBlockProgressCallback)(char * message);
typedef int __stdcall (*TConnectDB)(char *ConnectionString, TConnErrorCallback connectErrorCallback);
typedef int __stdcall (*TDisconnectDB)();
typedef void __stdcall (*TExecute)(char * text, TErrorCallback errorCallbackFunc,
TBeforeExecCallback beforeCallbackFunc, TAfterExecCallback afterCallbackFunc);
typedef void __stdcall (*TExecuteWithProgress)(char * text, TErrorCallback errorCallbackFunc,
TBeforeExecCallback beforeCallbackFunc, TAfterExecCallback afterCallbackFunc, TBlockProgressCallback blockProgressFunc);
enum Commands
{
ecOnline,
ecOnlineSingle,
ecShutdown,
ecShutdownFull,
ecRestore,
ecScript,
ecRecompileProcs,
ecGetServerLog
};
class TDllWrap
{
private:
TFileData *_fileData = new TFileData();
TFtpData *_ftpData = new TFtpData();
TDbData *_dbData = new TDbData();
THelper *_helper = new THelper();
HMODULE _ibeDll;
TConnectDB _connectDB;
TDisconnectDB _disconnectDB;
TExecute _executeFile;
TExecute _executeText;
void ConnectToDb();
bool _setupFTP = false;
public:
static bool _lastCommandSuccess;
static bool _stopOnError;
TDllWrap(TFileData &fileData, TFtpData &ftpData,
TDbData &dbData, bool stopOnError);
bool ExecuteCommand(Commands command);
void CleanWorkFolder();
};
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "TIbeWrapper.h"
#pragma package(smart_init)
void TIbeWrapper::InitWrapper()
{
if (!_initDone)
{
//Exception treba da ide dalje ako nema ovo, kriticno
_fileData->_cashITDir = ParamStr(1);
if (_fileData->_cashITDir.IsEmpty())
{
AnsiString exeFile=Application->ExeName;
_fileData->_cashITDir = ExtractFilePath(exeFile);
}else
{
_fileData->_cashITDir.Delete(1, 2);
}
try
{
_ftpData->_server = _helper->ProcitajJSON("udaljeno", "FTPserver")->DohvatiRezultat();
_ftpData->_rootDir = _helper->ProcitajJSON("udaljeno", "FTPRoot")->DohvatiRezultat();
_ftpData->_port = _helper->ProcitajJSON("udaljeno", "port")->DohvatiRezultat();
_ftpData->_username = _helper->ProcitajJSON("udaljeno", "username")->DohvatiRezultat();
_ftpData->_password = _helper->ProcitajJSON("udaljeno", "password")->DohvatiRezultat();
}catch(Exception &ex)
{
_ftpOK = false;
_logger->Log("Nema konfiguracije za ftp, funkcionalnost onemogucena!", llCritical);
_logger->Log(ex.Message, llCritical);
}catch(std::exception &stdex)
{
_ftpOK = false;
_logger->Log("Nema konfiguracije za ftp, funkcionalnost onemogucena!", llCritical);
_logger->Log(stdex.what(), llCritical);
}
try
{
_dbData->_FBdll = TPath::Combine(_fileData->_cashITDir, "fbclient.dll");
_dbData->_ibeScriptdll = TPath::Combine(_fileData->_cashITDir, "ibescript.dll");
AnsiString baza = _helper->ProcitajJSON("FB", "dbKonekcija")->DohvatiRezultat();
_dbData->_fbBaza = _helper->ProcitajIniFB(baza)->DohvatiRezultat();
}catch(Exception &ex)
{
_dbOK = false;
_logger->Log("Nema konfiguracije za bazu, funkcionalnost onemogucena!", llCritical);
_logger->Log(ex.Message, llCritical);
}catch(std::exception &stdex)
{
_dbOK = false;
_logger->Log("Nema konfiguracije za bazu, funkcionalnost onemogucena!", llCritical);
_logger->Log(stdex.what(), llCritical);
}
try
{
_dbData->_pib = _helper->DohvatiHostInformacije()
->DohvatiRezultat()._pib;
}catch(Exception &ex)
{
_logger->Log("Pib nije procitan!", llCritical);
_logger->Log(ex.Message, llCritical);
_dbData->_pib = "???";
}catch(std::exception &stdex)
{
_logger->Log("Pib nije procitan!", llCritical);
_logger->Log(stdex.what(), llCritical);
_dbData->_pib = "???";
}
_fileData->_targetFolder = _fileData->_tempDirPath = TPath::Combine(TPath::GetTempPath(), "BusTemp");
_zip7 = TPath::Combine(_fileData->_cashITDir, "7za.exe");
if (!FileExists(_dbData->_FBdll))
{
AnsiString error = "Ne postoji " + _dbData->_FBdll;
_logger->Log(error, llCritical);
throw Exception(error);
}else if (!FileExists(_dbData->_ibeScriptdll))
{
AnsiString error = "Ne postoji " + _dbData->_ibeScriptdll;
_logger->Log(error, llCritical);
throw Exception(error);
}else if (!FileExists(_zip7))
{
AnsiString error = "Ne postoji " + _zip7;
_logger->Log(error, llCritical);
throw Exception(error);
}
_wrapper = new TDllWrap(*_fileData, *_ftpData, *_dbData, _stopOnError);
_initDone = true;
}
}
void TIbeWrapper::PripremiUpdejt(std::map<AnsiString, AnsiString> hederi)
{
TIniFile *ini = new TIniFile(TPath::Combine("podesavanje", "settings.ini"));
ini->WriteString("Generalno", "BackupBaze", hederi["backupbaze"]);
ini->WriteString("Generalno", "BackupApp", hederi["backupapp"]);
ini->WriteString("Generalno", "RestartApp", hederi["restart"]);
ini->WriteString("Generalno", "KopiranjeFajlova", hederi["fajlovi"]);
ini->WriteString("Generalno", "UpdateBaze", hederi["skripte"]);
ini->WriteString("Generalno", "Fajl", hederi["fajl"]);
if (CompareText(hederi["hitno"], "da") == 0)
{
TIniFile *ini = new TIniFile(TPath::Combine("podesavanje", "settings.ini"));
ini->WriteString("Generalno", "UpdateStatus", "start");
auto updateOp = PokreniUpdejt();
if (!updateOp->OperacijaUspela())
{
TLogger *logger = new TLogger();
logger->Log(updateOp->DohvatiGresku(), llCritical);
delete logger;
}
}else
{
if (hederi["zakazano"].IsEmpty())
{
TIniFile *ini = new TIniFile(TPath::Combine("podesavanje", "settings.ini"));
ini->WriteString("Generalno", "UpdateStatus", "start");
delete ini;
}else
{
auto updateOp = PokreniUpdejt(hederi["zakazano"]);
if (!updateOp->OperacijaUspela())
{
TLogger *logger = new TLogger();
logger->Log(updateOp->DohvatiGresku(), llCritical);
delete logger;
}
}
}
}
TRezultatOperacije<bool> *TIbeWrapper::IzvrsiSkriptu(UnicodeString skripta)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}
catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
if (!_dbOK)
{
return new TRezultatOperacije<bool>(false, false, "Konfig za bazu nije ok, proveri confIT.json");
}
_dbData->_scriptFile = skripta;
_wrapper->ExecuteCommand(ecScript);
return new TRezultatOperacije<bool>(true, true);
}
TRezultatOperacije<bool> *TIbeWrapper::IzvrsiSkripte()
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}
catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
if (!_dbOK)
{
return new TRezultatOperacije<bool>(false, false, "Konfig za bazu nije ok, proveri confIT.json");
}
TStringDynArray fajlovi = TDirectory::GetFiles(_fileData->_tempDirPath, "*.sql");
std::vector<AnsiString> vektorFajlovi(fajlovi.begin(), fajlovi.end());
std::sort(vektorFajlovi.begin(), vektorFajlovi.end(), [](const AnsiString& a, const AnsiString& b)
{
return a < b;
});
for (const AnsiString& fqScript : vektorFajlovi) {
_logger->Log("Izvrsavam skriptu " + fqScript, llDebug);
_dbData->_scriptFile = fqScript;
try
{
_wrapper->ExecuteCommand(ecScript);
}catch(Exception &ex)
{
_logger->Log("Greska pri izvrsavanju skripte: " + fqScript, llCritical);
_logger->Log(ex.Message, llCritical);
}catch(std::exception &stdex)
{
_logger->Log("Greska pri izvrsavanju skripte: " + fqScript, llCritical);
_logger->Log(stdex.what(), llCritical);
}
catch(...)
{
_logger->Log("Greska pri izvrsavanju skripte: " + fqScript, llCritical);
}
}
return new TRezultatOperacije<bool>(true, true);
}
TRezultatOperacije<bool> *TIbeWrapper::BekapujBazu(AnsiString nazivBackupa, bool sacuvajBackup)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
if (!_dbOK)
{
return new TRezultatOperacije<bool>(false, false, "Konfig za bazu nije ok, proveri confIT.json");
}
_fileData->_archiveName = nazivBackupa;
if (!_dbData->_fbBaza._lokacijaBaze.IsEmpty() && !FileExists(_dbData->_fbBaza.BazaPunNaziv()))
{
return new TRezultatOperacije<bool>(false, false, "Neuspeo pristup bazi: " + _dbData->_fbBaza.BazaPunNaziv());
}
double velicinaBaze = 0;
try
{
if (!_dbData->_fbBaza._lokacijaBaze.IsEmpty())
{
auto prazno = _helper->PrazanProstor()->DohvatiRezultat();
velicinaBaze = _helper->VelicinaFajla(_dbData->_fbBaza.BazaPunNaziv())->DohvatiRezultat();
if (velicinaBaze*2 >= prazno )
{
return new TRezultatOperacije<bool>(false, false, "Kriticno malo praznog prostora na disku");
}
}
}catch(...)
{
return new TRezultatOperacije<bool>(false, false, "Problem pri proveri velicina fajla i slobodnog prostora");
}
if (!_dbData->_fbBaza.Linux() && !_dbData->_fbBaza._lokacijaBaze.IsEmpty() &&
((!_dbData->_fbBaza.Linux() && velicinaBaze < 3.9) || velicinaBaze < 1.9)) //Baze manje od 4GB
{ //ili 2GB za linux, moze nbackup
//Trenutno nista nbackup za linux
UnicodeString lock = "nbackup -u SYSDBA -P masterkey -L \""
+ _dbData->_fbBaza.BazaPunNaziv() + "\"";
UnicodeString unlock = "nbackup -u SYSDBA -P masterkey -UN \""
+ _dbData->_fbBaza.BazaPunNaziv() + "\"";
PROCESS_INFORMATION procInfo;
STARTUPINFO startInfo;
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
CreateProcess(nullptr, lock.t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 2000);
DWORD exit_code;
GetExitCodeProcess(procInfo.hProcess, &exit_code);
if (exit_code != 0)
{
_logger->Log("Neuspeh kod zakljucavanja baze", llCritical);
return new TRezultatOperacije<bool>(false, false, "Neuspeh kod zakljucavanja baze");
}
_fileData->_archiveName = nazivBackupa + ".fdb";
TFile::Copy(_dbData->_fbBaza.BazaPunNaziv(), TPath::Combine(_fileData->_tempDirPath,
_fileData->_archiveName), true);
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
CreateProcess(nullptr, unlock.t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 2000);
GetExitCodeProcess(procInfo.hProcess, &exit_code);
if (exit_code != 0)
{
_logger->Log("Neuspeh kod otkljucavanja baze", llCritical);
return new TRezultatOperacije<bool>(false, false, "Neuspeh kod otkljucavanja baze");
}
}else
{
_fileData->_archiveName = nazivBackupa + ".fbk";
UnicodeString gbak = "gbak -b " + _dbData->_fbBaza.BazaPunNaziv() + " "
+ TPath::Combine(_fileData->_tempDirPath, _fileData->_archiveName) + " -user SYSDBA -password masterkey";
PROCESS_INFORMATION procInfo;
STARTUPINFO startInfo;
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
CreateProcess(nullptr, gbak.t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 600000); //10 minuta max za gbak
DWORD exit_code;
GetExitCodeProcess(procInfo.hProcess, &exit_code);
if (exit_code != 0)
{
_logger->Log("Neuspeh kod bekapovanja baze", llCritical);
return new TRezultatOperacije<bool>(false, false, "Neuspeh kod bekapovanja baze");
}
}
if (sacuvajBackup)
{
try
{
TFile::Copy(TPath::Combine(_fileData->_tempDirPath, _fileData->_archiveName),
_dbData->_fbBaza.BazaPunNaziv(), true);
}catch (Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri kopiranju baze: " + Trim(ex.Message));
}catch (std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri kopiranju baze: " + Trim(AnsiString(stdex.what())));
}
}
return new TRezultatOperacije<bool>(true, true);
}
TRezultatOperacije<bool> *TIbeWrapper::RestorujBazu(AnsiString nazivBackupa, bool trajniDir)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
if (!_dbOK)
{
return new TRezultatOperacije<bool>(false, false, "Konfig za bazu nije ok, proveri confIT.json");
}
_fileData->_archiveName = nazivBackupa;
_fileData->_targetFolder = trajniDir ? _dbData->_fbBaza._lokacijaBaze : _fileData->_tempDirPath;
bool success = _wrapper->ExecuteCommand(ecRestore);
if (!success)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri restore operaciji.");
}
return new TRezultatOperacije<bool>(true, true);
}
TRezultatOperacije<bool> *TIbeWrapper::RekompajlirajProcedure()
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
if (!_dbOK)
{
return new TRezultatOperacije<bool>(false, false, "Konfig za bazu nije ok, proveri confIT.json");
}
bool success = _wrapper->ExecuteCommand(ecRecompileProcs);
if (!success)
{
return new TRezultatOperacije<bool>(false, false, "Neuspesno rekompajliranje procedura.");
}
return new TRezultatOperacije<bool>(true, true);
}
TIdFTP * TIbeWrapper::CreateFTP()
{
TIdFTP *ftp = new TIdFTP(nullptr);
ftp->Username = _ftpData->_username;
ftp->Password = _ftpData->_password;
ftp->Host = _ftpData->_server;
ftp->Port = StrToIntDef(_ftpData->_port, 21);
ftp->Passive = true;
ftp->TransferType = ftBinary;
return ftp;
}
TRezultatOperacije<bool> *TIbeWrapper::PreuzmiFajl(AnsiString filename, AnsiString destFilename, bool fqPutanja)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
if (!_ftpOK)
{
return new TRezultatOperacije<bool>(false, false, "Konfig za ftp nije ok, proveri confIT.json");
}
_fileData->_archiveName = filename;
_fileData->_targetArch = destFilename.IsEmpty() ? filename : destFilename;
InitWrapper();
_logger->Log("Krece preuzimanje sa ftp-a.", llDebug);
TIdFTP *ftp = CreateFTP();
try
{
ftp->Connect();
ftp->ChangeDir(_ftpData->_rootDir);
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri pokretanju ftp-a: " + Trim(ex.Message));
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri pokretanju ftp-a: " + Trim(AnsiString(stdex.what())));
}
if (!fqPutanja)
{
bool found = false;
bool error = false;
try
{
ftp->ChangeDir(_dbData->_pib);
ftp->List();
int size = ftp->DirectoryListing->Count;
for (int i = 2; i < size; i++) //od 2 zato sto su 0 i 1 ".." i "."
{
if (ftp->DirectoryListing->Items[i]->FileName.CompareIC(filename) == 0)
{
found = true;
_logger->Log("Nasao poseban fajl.", llDebug);
break;
}
}
} catch(Exception &ex)
{
_logger->Log("Greska pri pristupu direktorijumu po pibu: " + _dbData->_pib, llCritical);
_logger->Log("Greska: " + Trim(ex.Message), llCritical);
_logger->Log("Pokusavam da nadjem fajl na root folderu.", llDebug);
error = true;
} catch(std::exception &stdex)
{
_logger->Log("Greska pri pristupu direktorijumu po pibu: " + _dbData->_pib, llCritical);
_logger->Log("Greska: " + Trim(stdex.what()), llCritical);
_logger->Log("Pokusavam da nadjem fajl na root folderu.", llDebug);
error = true;
}
if (!found && !error)
{
ftp->ChangeDirUp();
}
}else
{
_fileData->_archiveName = _fileData->_targetArch = filename;
}
try
{
ftp->Get(_fileData->_archiveName, TPath::Combine(_fileData->_tempDirPath, _fileData->_targetArch), true);
} catch (Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri preuzimanju fajla: " + Trim(ex.Message));
} catch (std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri preuzimanju fajla: " + Trim(AnsiString(stdex.what())));
}
ftp->DisconnectNotifyPeer();
delete ftp;
_logger->Log("Preuzimanje zavrseno.", llDebug);
return new TRezultatOperacije<bool>(true, true);
}
TRezultatOperacije<AnsiString> *TIbeWrapper::PosaljiArhivu(AnsiString filename)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<AnsiString>(false, "", "Greska pri inicijalizaciji: " + ex.Message);
} catch (std::exception &stdex)
{
return new TRezultatOperacije<AnsiString>(false, "", "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
if (!_ftpOK)
{
return new TRezultatOperacije<AnsiString>(false, "", "Konfig za ftp nije ok, proveri confIT.json");
}
_logger->Log("Krece slanje na ftp.", llDebug);
TIdFTP *ftp = CreateFTP();
try
{
ftp->Connect();
ftp->ChangeDir(_ftpData->_rootDir);
}catch(Exception &ex)
{
return new TRezultatOperacije<AnsiString>(false, "", "Greska pri startu ftpa: " + Trim(ex.Message));
}catch(std::exception &stdex)
{
return new TRezultatOperacije<AnsiString>(false, "", "Greska pri startu ftpa: " + Trim(AnsiString(stdex.what())));
}
try
{
ftp->ChangeDir(_dbData->_pib);
}catch (Exception &ex)
{
_logger->Log("Greska pri prelaska u dir po pibu: " + _dbData->_pib, llCritical);
_logger->Log("Pokusavam da ga napravim.", llDebug);
try
{
ftp->MakeDir(_dbData->_pib);
ftp->ChangeDir(_dbData->_pib);
} catch (Exception &ex2)
{
_logger->Log("Neuspelo, zaustavljam proces", llCritical);
_logger->Log("Greska pri ulasku: " + Trim(ex.Message), llCritical);
_logger->Log("Greska pri kreiranju: " + ex2.Message, llCritical);
ftp->DisconnectNotifyPeer();
delete ftp;
return new TRezultatOperacije<AnsiString>(false, "", "Greska pri navigaciji kroz ftp server");
}catch (std::exception &ex2)
{
_logger->Log("Neuspelo, zaustavljam proces", llCritical);
_logger->Log("Greska pri ulasku: " + Trim(ex.Message), llCritical);
_logger->Log("Greska pri kreiranju: " + AnsiString(ex2.what()), llCritical);
ftp->DisconnectNotifyPeer();
delete ftp;
return new TRezultatOperacije<AnsiString>(false, "", "Greska pri navigaciji kroz ftp server");
}
}
AnsiString fqFajl = TPath::Combine(_ftpData->_rootDir, _dbData->_pib);
try
{
AnsiString hostname = GetEnvironmentVariable("COMPUTERNAME");
AnsiString fullName = TPath::GetFileNameWithoutExtension(filename) + "-" + _helper->TrenutniDatumCist() + "-" + hostname +
TPath::GetExtension(filename);
fqFajl = TPath::Combine(fqFajl, fullName);
ftp->Put(TPath::Combine(_fileData->_tempDirPath, filename), fullName);
} catch (Exception &ex)
{
ftp->DisconnectNotifyPeer();
delete ftp;
return new TRezultatOperacije<AnsiString>(false, "", "Greska pri preuzimanju fajla");
} catch (std::exception &stdex)
{
ftp->DisconnectNotifyPeer();
delete ftp;
return new TRezultatOperacije<AnsiString>(false, "", "Greska pri preuzimanju fajla");
}
ftp->DisconnectNotifyPeer();
delete ftp;
_logger->Log("Slanje zavrseno.", llDebug);
return new TRezultatOperacije<AnsiString>(true, fqFajl);
}
TRezultatOperacije<bool> *TIbeWrapper::OtpakujFajl(AnsiString filename, bool cashIT)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
CashITDir(cashIT);
_fileData->_archiveName = filename;
_logger->Log("Otpakivanje u toku: " + filename, llDebug);
AnsiString comm = "cmd.exe /c " + _zip7 + " x -aoa -bb0 -y -o\""
+ _fileData->_targetFolder + "\" \""
+ TPath::Combine(_fileData->_tempDirPath, _fileData->_archiveName) + "\" >> archLog.txt";
PROCESS_INFORMATION procInfo;
STARTUPINFO startInfo;
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
CreateProcess(nullptr, UnicodeString(comm).t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 300000);
DWORD exit_code;
GetExitCodeProcess(procInfo.hProcess, &exit_code);
if (exit_code != 0)
{
return new TRezultatOperacije<bool>(false, false, "Otpakivanje arhive nije uspelo, exit code " +
UnicodeString(exit_code));
}
CloseHandle(procInfo.hProcess);
return new TRezultatOperacije<bool>(true, true);
}
TRezultatOperacije<bool> *TIbeWrapper::OtpakujFajlPrepiska(AnsiString filename, bool cashIT)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
CashITDir(cashIT);
_fileData->_archiveName = filename;
AnsiString unpackDir = TPath::Combine(_fileData->_tempDirPath, "tempUnpack");
_logger->Log("Otpakivanje u toku: " + filename, llDebug);
AnsiString comm = "cmd.exe /c " + _zip7 + " x -aoa -bb0 -y -o\""
+ unpackDir + "\" \""
+ TPath::Combine(_fileData->_tempDirPath, _fileData->_archiveName) + "\" >> archLog.txt";
PROCESS_INFORMATION procInfo;
STARTUPINFO startInfo;
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
CreateProcess(nullptr, UnicodeString(comm).t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 300000);
DWORD exit_code;
GetExitCodeProcess(procInfo.hProcess, &exit_code);
if (exit_code != 0)
{
return new TRezultatOperacije<bool>(false, false, "Otpakivanje arhive nije uspelo, exit code " +
UnicodeString(exit_code));
}
CloseHandle(procInfo.hProcess);
try
{
TStringDynArray files = TDirectory::GetFiles(unpackDir, "*.*", TSearchOption::soAllDirectories);
for (int i = 0; i < files.Length; i++)
{
AnsiString noviFajl = files[i];
AnsiString fileName = TPath::GetFileName(files[i]);
AnsiString relativePath = ExtractRelativePath(unpackDir + "\\", files[i]);
AnsiString targetFilePath = TPath::Combine(_fileData->_targetFolder, relativePath);
AnsiString targetDirPath = TPath::GetDirectoryName(targetFilePath);
if (!TDirectory::Exists(targetDirPath))
{
TDirectory::CreateDirectory(targetDirPath);
}
if (FileExists(targetFilePath))
{
AnsiString novoIme = TPath::GetFileNameWithoutExtension(targetFilePath);
TGUID guid;
CreateGUID(guid);
AnsiString chars = Sysutils::GUIDToString(guid).SubString(2, 4);
novoIme += _helper->TrenutniDatumCist() + chars + TPath::GetExtension(targetFilePath);
RenameFile(targetFilePath, TPath::Combine(TPath::GetDirectoryName(targetFilePath), novoIme));
}
TFile::Copy(noviFajl, targetFilePath);
}
}
catch(...){return new TRezultatOperacije<bool>(false, false);}
return new TRezultatOperacije<bool>(true, true);
}
using namespace std;
TRezultatOperacije<bool> *TIbeWrapper::PokreniUpdejt(AnsiString zakazano, bool izApp)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
try
{
if (izApp)
{
TIniFile *ini = new TIniFile(TPath::Combine("podesavanje", "settings.ini"));
ini->WriteString("Generalno", "BackupBaze", "ne");
ini->WriteString("Generalno", "BackupApp", "ne");
ini->WriteString("Generalno", "RestartApp", "da");
ini->WriteString("Generalno", "KopiranjeFajlova", "da");
ini->WriteString("Generalno", "UpdateBaze", "da");
ini->WriteString("Generalno", "Fajl", "update.7z");
ini->WriteString("Generalno", "UpdateStatus", "start");
delete ini;
}
_wrapper->CleanWorkFolder();
AnsiString swapperTemp = TPath::Combine(_fileData->_cashITDir, "swapper");
TFile::Copy("confIT.json",
TPath::Combine(swapperTemp, "confIT.json"), true);
TStringDynArray dllFiles = TDirectory::GetFiles(_fileData->_cashITDir, "*.dll");
for (int i = 0; i < dllFiles.Length; i++)
{
AnsiString dllFileName = TPath::GetFileName(dllFiles[i]);
TFile::Copy(dllFiles[i], TPath::Combine(swapperTemp, dllFileName), true);
}
AnsiString podesavanjeDir = TPath::Combine(swapperTemp, "podesavanje");
if (!TDirectory::Exists(podesavanjeDir)) {
TDirectory::CreateDirectory(podesavanjeDir);
}
AnsiString settingsFilePath = TPath::Combine(_fileData->_cashITDir, "podesavanje\\settings.ini");
TFile::Copy(settingsFilePath, TPath::Combine(podesavanjeDir, "settings.ini"), true);
TDirectory::Copy(swapperTemp, _fileData->_tempDirPath, true);
PROCESS_INFORMATION procInfo;
STARTUPINFO startInfo;
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
if (zakazano.IsEmpty())
{
UnicodeString path =TPath::Combine(_fileData->_tempDirPath,
"swapper.exe --" + _fileData->_cashITDir);
CreateProcess(nullptr, path.t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP,
nullptr, UnicodeString(_fileData->_tempDirPath).t_str(), &startInfo, &procInfo);
}else
{
TFormatSettings fmt;
fmt.DateSeparator = '/';
fmt.ShortDateFormat = "dd/mm/yyyy";
fmt.TimeSeparator = ':';
fmt.ShortTimeFormat = "hh:nn:ss";
TDateTime dt = StrToDateTime(zakazano, fmt);
AnsiString vreme = dt.FormatString("yyyy-mm-dd\"T\"hh:nn:ss");
UnicodeString comm = "\"" + TPath::Combine(_fileData->_tempDirPath,
"swapper.exe") + "\"";
UnicodeString taskFull = "schtasks /create /F /SC ONCE /SD 12/12/2020"
" /ST 12:12 /TN CashITUpdate /TR "+ comm;
CreateProcess(nullptr, taskFull.t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 2000);
DWORD exit_code;
GetExitCodeProcess(procInfo.hProcess, &exit_code);
if (exit_code != 0)
{
_logger->Log("Neuspeh kod zakazivanja updejta, komanda:", llCritical);
_logger->Log(taskFull, llCritical);
return new TRezultatOperacije<bool>(false, false, "Greska pri zakazivanju updejta: " +
UnicodeString(exit_code));
}
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
comm = "cmd.exe /c schtasks /Query /XML /TN CashITUpdate > \"" +
TPath::Combine(_fileData->_tempDirPath, "task.xml") + "\"";
CreateProcess(nullptr, comm.t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 2000);
GetExitCodeProcess(procInfo.hProcess, &exit_code);
if (exit_code != 0)
{
_logger->Log("Neuspeh kod zakazivanja updejta, komanda:", llCritical);
_logger->Log(comm, llCritical);
return new TRezultatOperacije<bool>(false, false, "Greska pri zakazivanju updejta: " +
UnicodeString(exit_code));
}
try
{
UnicodeString pathOriginal = TPath::Combine(_fileData->_tempDirPath, "task.xml");
ifstream input(pathOriginal.c_str());
UnicodeString pathNew = TPath::Combine(_fileData->_tempDirPath, "taskMod.xml");
ofstream output(pathNew.c_str());
string line;
if (output.is_open())
{
while (getline(input, line))
{
if (line.find("<StartBoundary>") != string::npos)
{
line = "<StartBoundary>" + vreme + "</StartBoundary>";
}
output << line << endl;
if (line.find("<Command>") != string::npos)
{
output << "<Arguments>--" + _fileData->_cashITDir + "</Arguments>" << endl;
output << "<WorkingDirectory>" + _fileData->_tempDirPath + "</WorkingDirectory>" << endl;
}
}
output.close();
}
}catch (Exception &ex)
{
_logger->Log("Neuspeh kod promene xmla za update, greska:", llCritical);
_logger->Log(ex.Message, llCritical);
return new TRezultatOperacije<bool>(false, false, "Greska pri zakazivanju updejta: " +
UnicodeString(ex.Message));
}catch (exception &stdex)
{
_logger->Log("Neuspeh kod promene xmla za update, greska:", llCritical);
_logger->Log(stdex.what(), llCritical);
return new TRezultatOperacije<bool>(false, false, "Greska pri zakazivanju updejta: " +
UnicodeString(stdex.what()));
}
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
comm = "schtasks /Create /F /XML \"" +
TPath::Combine(_fileData->_tempDirPath, "taskMod.xml") + "\" /TN CashITUpdate";
CreateProcess(nullptr, comm.t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 2000);
GetExitCodeProcess(procInfo.hProcess, &exit_code);
if (exit_code != 0)
{
_logger->Log("Neuspeh kod zakazivanja updejta, komanda:", llCritical);
_logger->Log(comm, llCritical);
return new TRezultatOperacije<bool>(false, false, "Greska pri zakazivanju updejta: " +
UnicodeString(exit_code));
}
CloseHandle(procInfo.hProcess);
}
} catch (Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri pokretanju updejta: " +
Trim(ex.Message));
} catch (std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri pokretanju updejta: " +
Trim(AnsiString(stdex.what())));
}
return new TRezultatOperacije<bool>(true, true);
}
TRezultatOperacije<bool> *TIbeWrapper::DohvatiServerLog()
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
if (!_dbOK)
{
return new TRezultatOperacije<bool>(false, false, "Konfig za bazu nije ok, proveri confIT.json");
}
bool success =_wrapper->ExecuteCommand(ecGetServerLog);
return success ? new TRezultatOperacije<bool>(true, true):
new TRezultatOperacije<bool>(false, false, "Greska pri uzimanju FB server logova.");
}
TRezultatOperacije<bool> *TIbeWrapper::DohvatiPodesavanja()
{
TDirectory::CreateDirectory(TPath::Combine(_fileData->_tempDirPath, "podesavanje"));
TDirectory::Copy(TPath::Combine(_fileData->_cashITDir, "podesavanje"), TPath::Combine(_fileData->_tempDirPath, "podesavanje"));
TFile::Copy(TPath::Combine(_fileData->_cashITDir, "confIT.json"),
TPath::Combine(_fileData->_tempDirPath, "confIT.json"), true);
return new TRezultatOperacije<bool>(true, true);
}
TRezultatOperacije<bool> *TIbeWrapper::DohvatiLogove()
{
auto fajlovi = TDirectory::GetFiles(_fileData->_cashITDir, "*.log*");
for (auto fajl : fajlovi)
{
try
{
TFile::Copy(fajl, TPath::Combine(_fileData->_tempDirPath, TPath::GetFileName(fajl)), true);
}catch(...){}
}
fajlovi = TDirectory::GetFiles(_fileData->_cashITDir, "*.txt*");
for (auto fajl : fajlovi)
{
try
{
TFile::Copy(fajl, TPath::Combine(_fileData->_tempDirPath, TPath::GetFileName(fajl)), true);
}catch(...){}
}
TDirectory::CreateDirectory(TPath::Combine(_fileData->_tempDirPath, "log"));
TDirectory::Copy(TPath::Combine(_fileData->_cashITDir, "log"), TPath::Combine(_fileData->_tempDirPath, "log"));
auto lokOp = _helper->ProcitajJSON("lokalno", "logDirektorijum");
if (lokOp->OperacijaUspela())
{
AnsiString logDir = lokOp->DohvatiRezultat();
if (CompareText(logDir, TPath::Combine(_fileData->_cashITDir, "log")) != 0)
{
TDirectory::Copy(logDir, TPath::Combine(_fileData->_tempDirPath, "log"));
}
}
return new TRezultatOperacije<bool>(true, true);
}
void TIbeWrapper::CashITDir(bool cashIT)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
_logger->Log("Greska pri inicijalizaciji: " + ex.Message, llCritical);
}catch(std::exception &stdex)
{
_logger->Log("Greska pri inicijalizaciji: " + AnsiString(stdex.what()), llCritical);
}
_fileData->_targetFolder = cashIT ? _fileData->_cashITDir : _fileData->_tempDirPath;
}
TRezultatOperacije<bool> *TIbeWrapper::ArhivirajDirektorijum(AnsiString filename, bool cashIT)
{
try
{
InitWrapper();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + ex.Message);
}
catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri inicijalizaciji: " + AnsiString(stdex.what()));
}
_fileData->_archiveName = filename + ".7z";
CashITDir(cashIT);
_logger->Log("Arhiviranje u toku...", llDebug);
AnsiString path = cashIT ? TPath::Combine(_fileData->_targetFolder, "backup\\" + _fileData->_archiveName)
: TPath::Combine(_fileData->_targetFolder, _fileData->_archiveName);
AnsiString comm;
if (!cashIT)
{
comm = "cmd.exe /c " + _zip7 + " a -bb0 -r -y \""
+ path + "\" \"" + TPath::Combine(_fileData->_targetFolder, "*.*") + "\" >> archLog.txt";
}else
{
comm = "cmd.exe /c " + _zip7 + " a -xr!*.7z -bb0 -r -y \""
+ path + "\" \"" + TPath::Combine(_fileData->_targetFolder, "*.*") + "\" >> archLog.txt";
}
PROCESS_INFORMATION procInfo;
STARTUPINFO startInfo;
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
CreateProcess(nullptr, UnicodeString(comm).t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 300000);
CloseHandle(procInfo.hProcess);
bool success = FileExists(path);
if (!success)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri arhiviranju direktorijuma: " +
_fileData->_targetFolder);
}
return new TRezultatOperacije<bool>(true, true);
}
TRezultatOperacije<bool> * TIbeWrapper::OcistiRadni()
{
try
{
InitWrapper();
_wrapper->CleanWorkFolder();
}catch(Exception &ex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri ciscenju temp foldera: " + ex.Message);
}catch(std::exception &stdex)
{
return new TRezultatOperacije<bool>(false, false, "Greska pri ciscenju temp foldera: " + AnsiString(stdex.what()));
}
return new TRezultatOperacije<bool>(true, true);
}
//---------------------------------------------------------------------------
#ifndef TIbeWrapperH
#define TIbeWrapperH
//---------------------------------------------------------------------------
#include <System.SysUtils.hpp>
#include <System.Classes.hpp>
#include <System.JSON.hpp>
#include <winbase.h>
#include <Processthreadsapi.h>
#include <Data.DB.hpp>
#include <FireDAC.Comp.Client.hpp>
#include <FireDAC.Comp.DataSet.hpp>
#include <FireDAC.DApt.hpp>
#include <FireDAC.DApt.Intf.hpp>
#include <FireDAC.DatS.hpp>
#include <FireDAC.Phys.FB.hpp>
#include <FireDAC.Phys.FBDef.hpp>
#include <FireDAC.Phys.hpp>
#include <FireDAC.Phys.Intf.hpp>
#include <FireDAC.Stan.Async.hpp>
#include <FireDAC.Stan.Def.hpp>
#include <FireDAC.Stan.Error.hpp>
#include <FireDAC.Stan.Intf.hpp>
#include <FireDAC.Stan.Option.hpp>
#include <FireDAC.Stan.Param.hpp>
#include <FireDAC.Stan.Pool.hpp>
#include <FireDAC.UI.Intf.hpp>
#include <FireDAC.VCLUI.Wait.hpp>
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdExplicitTLSClientServerBase.hpp>
#include <IdFTP.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
#include "Paketi\Logger\TLogger.h"
#include "TDllWrap.h"
#include <System.IOUtils.hpp>
#include <fstream>
#include <string>
#include <windows.h>
#include <sys/stat.h>
#include <iomanip>
#include <vector>
#include <algorithm>
//---------------------------------------------------------------------------
class TIbeWrapper
{
private:
TLogger *_logger = new TLogger();
THelper *_helper = new THelper();
TDllWrap *_wrapper = nullptr;
TIdFTP *CreateFTP();
AnsiString _zip7 = "";
void InitWrapper();
bool _initDone = false;
void CashITDir(bool cashIT = false);
bool _ftpOK = true;
bool _dbOK = true;
protected:
public:
TFtpData *_ftpData = new TFtpData();
TDbData *_dbData = new TDbData();
TFileData *_fileData = new TFileData();
bool _stopOnError = false;
TRezultatOperacije<bool> *BekapujBazu(AnsiString nazivBackupa, bool sacuvajBackup = false);
TRezultatOperacije<bool> *RestorujBazu(AnsiString nazivBackupa, bool trajniDir = false);
TRezultatOperacije<bool> *IzvrsiSkripte();
TRezultatOperacije<bool> *IzvrsiSkriptu(UnicodeString skripta);
TRezultatOperacije<bool> *RekompajlirajProcedure();
TRezultatOperacije<bool> *PreuzmiFajl(AnsiString filename, AnsiString destFilename = "", bool fqPutanja = false);
TRezultatOperacije<bool> *DohvatiServerLog();
TRezultatOperacije<bool> *DohvatiPodesavanja();
TRezultatOperacije<bool> *DohvatiLogove();
TRezultatOperacije<AnsiString> *PosaljiArhivu(AnsiString filename);
TRezultatOperacije<bool> *ArhivirajDirektorijum(AnsiString filename, bool cashIT);
TRezultatOperacije<bool> *OtpakujFajl(AnsiString filename, bool cashIT = false);
TRezultatOperacije<bool> *OtpakujFajlPrepiska(AnsiString filename, bool cashIT = false);
TRezultatOperacije<bool> *PokreniUpdejt(AnsiString zakazano = "", bool izApp = false);
TRezultatOperacije<bool> *OcistiRadni();
void PripremiUpdejt(std::map<AnsiString, AnsiString> hederi);
bool StopOnScriptError;
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "TLogWorker.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
using namespace std;
TLogWorker* TLogWorker::_instance{nullptr};
mutex TLogWorker::_mutexSI;
TLogWorker::TLogWorker()
{
_levels[llDebug] = "Debug";
_levels[llInfo] = "Info";
_levels[llCritical] = "Critical";
map<UnicodeString, LoggingLevel> stringToLevel;
stringToLevel["Debug"] = llDebug;
stringToLevel["Info"] = llInfo;
stringToLevel["Critical"] = llCritical;
auto logConfOp = _helper->ProcitajJSON("konfiguracija", "logNivo");
AnsiString exeFile=Application->ExeName;
AnsiString cashITdir = ExtractFilePath(exeFile);
_logDirectory = TPath::Combine(cashITdir, "Log\\CashIT");
if (logConfOp->OperacijaUspela())
{
auto severity = logConfOp->DohvatiRezultat();
_loggingLevel = stringToLevel[severity];
}
delete logConfOp;
}
TLogWorker *TLogWorker::GetInstance()
{
lock_guard<mutex> lock(_mutexSI);
if (_instance == nullptr)
{
_instance = new TLogWorker();
}
return _instance;
}
void TLogWorker::Log(UnicodeString message, const LoggingLevel level, AnsiString fajl)
{
if (level < _loggingLevel)
{
return;
}
auto date = Now();
UnicodeString filename = "";
if (!_logDirectory.IsEmpty()) {
TDirectory::CreateDirectory(_logDirectory);
}
if (fajl.IsEmpty())
{
filename = TPath::Combine(_logDirectory, "log " + _helper->TrenutniDatumCist() + ".log");
}else
{
filename = TPath::Combine(_logDirectory, TPath::GetFileNameWithoutExtension(fajl) + " " + _helper->TrenutniDatumCist() + ".log");
}
message = date.DateString() + " - " + date.TimeString() + " - " + _levels[level] + " - " + message + "\n";
if (_salji != nullptr)
{
_salji(message);
}
lock_guard<mutex> lock(_mutexFS);
TFileStream *fs = nullptr;
int greska = 0;
try
{
if (FileExists(filename, false))
{
fs = new TFileStream(filename, fmOpenReadWrite | fmShareDenyWrite);
}else
{
try
{
BackupLogs();
}catch(...){}
fs = new TFileStream(filename, fmCreate | fmShareDenyWrite);
}
SE_OBJECT_TYPE objectType = SE_FILE_OBJECT;
SECURITY_INFORMATION securityInfo = DACL_SECURITY_INFORMATION;
SECURITY_DESCRIPTOR securityDescriptor;
InitializeSecurityDescriptor(&securityDescriptor, SECURITY_DESCRIPTOR_REVISION);
PSID everyoneSid = NULL;
SID_IDENTIFIER_AUTHORITY sidAuthority = SECURITY_WORLD_SID_AUTHORITY;
AllocateAndInitializeSid(&sidAuthority, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &everyoneSid);
EXPLICIT_ACCESS explicitAccess;
ZeroMemory(&explicitAccess, sizeof(EXPLICIT_ACCESS));
explicitAccess.grfAccessPermissions = GENERIC_ALL;
explicitAccess.grfAccessMode = SET_ACCESS;
explicitAccess.grfInheritance= NO_INHERITANCE;
explicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
explicitAccess.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
explicitAccess.Trustee.ptstrName = (LPTSTR) everyoneSid;
PACL acl = NULL;
SetEntriesInAcl(1, &explicitAccess, NULL, &acl);
SetSecurityDescriptorDacl(&securityDescriptor, TRUE, acl, FALSE);
SetNamedSecurityInfo(filename.t_str(), objectType, securityInfo, NULL, NULL, acl, NULL);
FreeSid(everyoneSid);
LocalFree(acl);
fs->Seek(0, soFromEnd);
auto byteArr = message.BytesOf();
fs->Write(byteArr, byteArr.size());
delete fs;
}catch (...)
{
delete fs;
greska = 1;
}
if (greska == 1)
{
TStringList* fajl = new TStringList();
if (FileExists(filename))
{
fajl->LoadFromFile(filename, TEncoding::Default);
}
int greskaPisanje = 0;
try
{
fajl->Append(message);
} catch (Exception& e)
{
Sleep(500);
greskaPisanje = 1;
}
try
{
fajl->SaveToFile(filename, TEncoding::Default);
} catch (Exception& e) {
Sleep(500);
greskaPisanje = 2;
}
if (greskaPisanje == 2)
{
if (FileExists(filename))
{
fajl->SaveToFile(filename, TEncoding::Default);
}
}
delete fajl;
}
}
void TLogWorker::BackupLogs()
{
if (_logDirectory.IsEmpty()) {
_logDirectory = "c:\\bus\\c11\\log\\cashit\\";
}
AnsiString path = TPath::Combine(_logDirectory, "stariLogovi.7z");
AnsiString exeFile = Application->ExeName;
AnsiString cashITdir = ExtractFilePath(exeFile);
AnsiString zip = TPath::Combine(cashITdir, "7za.exe");
AnsiString comm = "cmd.exe /c " + zip + " a -xr!*.7z -xr!*" + _helper->TrenutniDatumCist() + "* -bb0 -r -y \""
+ path + "\" \"" + TPath::Combine(_logDirectory, "*.log") + "\" >> archLog.txt";
PROCESS_INFORMATION procInfo;
STARTUPINFO startInfo;
memset(&procInfo, 0, sizeof(procInfo));
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
CreateProcess(nullptr, UnicodeString(comm).t_str(), nullptr, nullptr, false,
NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
nullptr, nullptr, &startInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, 300000);
CloseHandle(procInfo.hProcess);
CloseHandle(procInfo.hThread);
bool success = FileExists(path);
if (!success)
{
Log("Neuspeh kod arhiviranja log fajlova.", llCritical);
return;
}
TStringDynArray files;
try
{
files = TDirectory::GetFiles(_logDirectory, "*.log", TSearchOption::soAllDirectories);
for (int i = 0; i < files.Length; i++)
{
AnsiString fileName = files[i];
if (!AnsiContainsText(fileName, _helper->TrenutniDatumCist()))
{
DeleteFile(fileName);
}
}
} catch(...){}
}
void TLogWorker::ObrisiLogger()
{
if (_instance != nullptr)
{
std::lock_guard<std::mutex> lock(_mutexSI);
delete _instance;
_instance = nullptr;
}
}
//---------------------------------------------------------------------------
#ifndef TLogWorkerH
#define TLogWorkerH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <StrUtils.hpp>
#include <System.SysUtils.hpp>
#include <System.IOUtils.hpp>
#include <map>
#include <mutex>
#include <thread>
#include <FireDAC.Comp.Client.hpp>
#include <FireDAC.Comp.DataSet.hpp>
#include <FireDAC.DApt.hpp>
#include <FireDAC.DApt.Intf.hpp>
#include <FireDAC.DatS.hpp>
#include <FireDAC.Phys.FB.hpp>
#include <FireDAC.Phys.FBDef.hpp>
#include <FireDAC.Phys.hpp>
#include <FireDAC.Phys.Intf.hpp>
#include <FireDAC.Stan.Async.hpp>
#include <FireDAC.Stan.Def.hpp>
#include <FireDAC.Stan.Error.hpp>
#include <FireDAC.Stan.Intf.hpp>
#include <FireDAC.Stan.Option.hpp>
#include <FireDAC.Stan.Param.hpp>
#include <FireDAC.Stan.Pool.hpp>
#include <FireDAC.UI.Intf.hpp>
#include <FireDAC.VCLUI.Wait.hpp>
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdExplicitTLSClientServerBase.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
#include "Paketi\Helper\THelper.h"
#include <Aclapi.h>
#include <Windows.h>
#include <map>
typedef void (*SlanjeLogova)(UnicodeString red);
class TLogWorker
{
private:
static TLogWorker* _instance;
static std::mutex _mutexSI;
std::mutex _mutexFS;
THelper *_helper = new THelper();
void BackupLogs();
std::map<int, UnicodeString> _levels;
protected:
TLogWorker();
~TLogWorker()
{
delete _helper;
};
public:
static TLogWorker *GetInstance();
static void ObrisiLogger();
TLogWorker(TLogWorker &other) = delete;
void operator=(const TLogWorker &) = delete;
LoggingLevel _loggingLevel = llCritical;
UnicodeString _logDirectory = "";
void Log(UnicodeString message, const LoggingLevel level, AnsiString fajl = "");
SlanjeLogova _salji = nullptr;
};
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "TLogger.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
void TLogger::Log(UnicodeString message, const LoggingLevel level, AnsiString fajl)
{
_logger->Log(message, level, fajl);
}
void TLogger::LiveLogovi(SlanjeLogova slanje)
{
_logger->_salji = slanje;
}
//---------------------------------------------------------------------------
#ifndef TLoggerH
#define TLoggerH
//---------------------------------------------------------------------------
#include <System.SysUtils.hpp>
#include <System.Classes.hpp>
//---------------------------------------------------------------------------
#include "TLogWorker.h"
class TLogger
{
private:
TLogWorker* _logger = TLogWorker::GetInstance();
protected:
public:
TLogger(){}
void Log(UnicodeString message, const LoggingLevel level, AnsiString fajl = "");
void LiveLogovi(SlanjeLogova slanje);
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include "TPingLog.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
void TPingLog::DodajPing(unsigned int rt)
{
if (rt < _min)
{
_min = rt;
}
if (rt > _max)
{
_max = rt;
}
_pingovi.push_back(rt);
_sent++;
}
int TPingLog::BrojPingova()
{
return _sent;
}
void TPingLog::DodajNeuspeli()
{
_sent++;
}
int TPingLog::SrednjiRoundTrip()
{
if (_sent == 0 || _pingovi.size() == 0)
{
_logger->Log("Nema izvrsenih pingova", llCritical);
throw std::runtime_error("Nema izvrsenih pingova");
}
return _pingovi.size()/std::accumulate(_pingovi.begin(), _pingovi.end(), 0);
}
bool TPingLog::KatastrofalnaGreska()
{
return _pingovi.size() == 0;
}
int TPingLog::MaxRoundTrip()
{
return _max;
}
int TPingLog::MinRoundTrip()
{
return _min;
}
int TPingLog::ProcenatIzgubljenih()
{
if (_sent == 0)
{
_logger->Log("Nema izvrsenih pingova", llCritical);
throw std::runtime_error("Nema izvrsenih pingova");
}else if (_pingovi.size() == 0)
{
return 100;
}else if(_pingovi.size() == _sent)
{
return 0;
}else
{
return int((float(_sent)/_pingovi.size())*100);
}
}
//---------------------------------------------------------------------------
#ifndef TPingLogH
#define TPingLogH
#include <numeric>
#include <vector>
#include "Paketi\Logger\TLogger.h"
class TPingLog
{
private:
TLogger *_logger = new TLogger();
std::vector<unsigned int> _pingovi;
int _sent = 0;
int _min = 999999;
int _max = 0;
public:
~TPingLog()
{
delete _logger;
}
void DodajPing(unsigned int rt);
void DodajNeuspeli();
bool KatastrofalnaGreska();
int MaxRoundTrip();
int MinRoundTrip();
int SrednjiRoundTrip();
int ProcenatIzgubljenih();
int BrojPingova();
};
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "TPinger.h"
#pragma comment(lib, "Ws2_32.lib")
#pragma package(smart_init)
using namespace std;
using namespace std::chrono_literals;
bool TPinger::TestPing(AnsiString meta)
{
bool result = false;
auto icmpClient = new TIdIcmpClient(nullptr);
auto logger = new TLogger();
icmpClient->ReceiveTimeout = 1000;
try
{
icmpClient->Host = meta;
icmpClient->Ping();
bool success = icmpClient->ReplyStatus->ReplyStatusType == rsEcho;
if (success)
{
logger->Log("Ping ok ka: " + meta, llDebug);
result = true;
}else
{
logger->Log("Ping ne prolazi ka: " + meta, llCritical);
}
}catch (Exception &ex)
{
logger->Log("Ping ne prolazi ka: " + meta, llCritical);
}catch (std::exception &stdex)
{
logger->Log("Ping ne prolazi ka: " + meta, llCritical);
}
delete icmpClient;
delete logger;
return result;
}
bool TPinger::TestPort(AnsiString meta, int portInt)
{
try
{
AnsiString port = IntToStr(portInt);
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
struct sockaddr_in clientService;
int iResult;
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0)
{
return false;
}
struct addrinfo* result = nullptr;
struct addrinfo hints;
struct sockaddr_in sa;
int ipAdresa = inet_pton(AF_INET, meta.c_str(), &(sa.sin_addr));
if (ipAdresa == 1)
{
sa.sin_family = AF_INET;
sa.sin_port = htons(atoi(port.c_str()));
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET)
{
WSACleanup();
return false;
}
iResult = connect(ConnectSocket, (struct sockaddr*)&sa, sizeof(sa));
} else
{
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
iResult = getaddrinfo(meta.c_str(), port.c_str(), &hints, &result);
if (iResult != 0)
{
WSACleanup();
return false;
}
ConnectSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ConnectSocket == INVALID_SOCKET)
{
freeaddrinfo(result);
WSACleanup();
return false;
}
iResult = connect(ConnectSocket, result->ai_addr, (int)result->ai_addrlen);
}
bool ok = false;
if (iResult == SOCKET_ERROR)
{
int error = WSAGetLastError();
if (error == WSAEWOULDBLOCK || error == WSAEINPROGRESS)
{
ok = true;
}
}
else
{
ok = true;
}
if (result != nullptr)
{
freeaddrinfo(result);
}
closesocket(ConnectSocket);
WSACleanup();
return ok;
}catch(...)
{
return false;
}
}
void TPinger::StartTrajniTest(AnsiString meta, int razmakSekunde, bool logujSve)
{
auto logger = new TLogger();
if (_pingRunning)
{
logger->Log("Ping vec pokrenut!", llCritical);
delete logger;
return;
}
_pingRunning = true;
_stopPing = false;
_pingLog = new TPingLog();
_backPing = TTask::Create ([&, razmakSekunde, logujSve, meta]()
{
std::chrono::duration<int, std::ratio<1, 1>> razmak = razmakSekunde * 1s;
TIdIcmpClient *client = new TIdIcmpClient(nullptr);
client->Host = meta;
client->ReceiveTimeout = 1000;
do
{
if (_stopPing)
{
break;
}
try
{
client->Ping("BUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERS"
"BUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERSBUSCOPMUTERS");
if (client->ReplyStatus->ReplyStatusType == rsEcho)
{
unsigned int rtt = client->ReplyStatus->MsRoundTripTime;
_pingLog->DodajPing(rtt);
if (logujSve)
{
logger->Log("Ping: " + meta + " -- " + UIntToStr(rtt) + "ms", llDebug);
}
}else
{
_pingLog->DodajNeuspeli();
logger->Log("Ping: " + meta + " -- nije uspeo", llCritical);
}
} catch(Exception &ex)
{
logger->Log("Ping: " + meta + " -- nije uspeo", llCritical);
logger->Log("Greska: " + ex.Message, llCritical);
_pingLog->DodajNeuspeli();
}
unique_lock<mutex> lock(_awaiterMutex);
_awaiter.wait_for(lock, razmak);
}while(true);
delete logger;
delete client;
});
_backPing->Start();
}
void TPinger::StartTrajniPortTest(AnsiString meta, unsigned int port,
int razmakSekunde, bool logujSve)
{
auto logger = new TLogger();
if (_pingRunning)
{
logger->Log("Ping vec pokrenut!", llCritical);
return;
}
_pingRunning = true;
_stopPing = false;
_pingLog = new TPingLog();
_backPing = TTask::Create ([&, razmakSekunde, logujSve, meta, port]()
{
std::chrono::duration<int, std::ratio<1, 1>> razmak = razmakSekunde * 1s;
TIdTCPClient *tcpClient = new TIdTCPClient(nullptr);
tcpClient->Host = meta;
tcpClient->Port = port;
tcpClient->ConnectTimeout = 1000;
do
{
if (_stopPing)
{
break;
}
try
{
auto start = std::chrono::high_resolution_clock::now();
tcpClient->Connect();
tcpClient->Disconnect();
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> duration = end - start;
int durationMs = int(duration.count()*1000);
_pingLog->DodajPing(durationMs);
if (logujSve)
{
logger->Log("FB konekt/diskonekt: " + meta + " -- " + IntToStr(durationMs) + "ms", llInfo);
}
}catch (Exception &e)
{
logger->Log( "Nema konekcije ka serveru: " + meta + ":" + UIntToStr(port), llCritical);
_pingLog->DodajNeuspeli();
}catch (std::exception &stdex)
{
logger->Log( "Nema konekcije ka serveru: " + meta + ":" + UIntToStr(port), llCritical);
_pingLog->DodajNeuspeli();
}
unique_lock<mutex> lock(_awaiterMutex);
_awaiter.wait_for(lock, razmak);
}
while(true);
delete logger;
delete tcpClient;
});
_backPing->Start();
}
TPingLog *TPinger::ZaustaviTrajniTest(bool logujRezultate)
{
auto logger = new TLogger();
_stopPing = true;
_awaiter.notify_all();
_backPing->Wait();
_pingRunning = false;
if (logujRezultate)
{
logger->Log("Broj izvrsenih: " + IntToStr(_pingLog->BrojPingova()), llCritical);
logger->Log("Procenat izgubljenih: " + IntToStr(_pingLog->ProcenatIzgubljenih()) + "%", llCritical);
if (!_pingLog->KatastrofalnaGreska())
{
logger->Log("Prosecno: " + IntToStr(_pingLog->SrednjiRoundTrip()) + "ms", llCritical);
logger->Log("Minimum: " + IntToStr(_pingLog->MinRoundTrip()) + "ms", llCritical);
logger->Log("Maksimum: " + IntToStr(_pingLog->MaxRoundTrip()) + "ms", llCritical);
}
}
delete logger;
return _pingLog;
}
//---------------------------------------------------------------------------
#ifndef TPingerH
#define TPingerH
//---------------------------------------------------------------------------
#include <System.SysUtils.hpp>
#include <System.Classes.hpp>
#include <IdIcmpClient.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
#include <System.Threading.hpp>
#include <condition_variable>
#include <chrono>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include "Paketi\Logger\TLogger.h"
#include "TPingLog.h"
//---------------------------------------------------------------------------
class TPinger
{
private:
_di_ITask _backPing = nullptr;
TPingLog *_pingLog = new TPingLog();
std::condition_variable _awaiter;
std::mutex _awaiterMutex;
bool _stopPing = false;
bool _pingRunning = false;
protected:
public:
TPinger(){}
~TPinger()
{
if (_pingLog != nullptr)
{
delete _pingLog;
}
}
bool TestPing(AnsiString meta);
bool TestPort(AnsiString meta, int portInt);
void StartTrajniTest(AnsiString meta, int razmakSekunde, bool logujSve = false);
TPingLog *ZaustaviTrajniTest(bool logujRezultate = false);
void StartTrajniPortTest(AnsiString meta, unsigned int port, int razmakSekunde, bool logujSve = false);
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include "DllWrapper.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
DllWrapper::DllWrapper()
{
UnicodeString dll = "RabbitWrap.dll";
hDLL = LoadLibrary(dll.t_str());
Diskonekcija = (NoParamsFunc)GetProcAddress(hDLL, "Disconnect");
PosaljiPorukuBrzo = (SendMsgQ)GetProcAddress(hDLL, "QuickSendMessageMQ");
PotvrdiPrijem = (AckMsg)GetProcAddress(hDLL, "AckMessageMQ");
StatusSoketa = (SocketStatusFunc)GetProcAddress(hDLL, "GetSocketStatus");
ProveraKanala = (IsConsumingCheck)GetProcAddress(hDLL, "IsConsuming");
AdminKonekcija = GetProcAddress(hDLL, "AdminConnect");
Konekcija = GetProcAddress(hDLL, "Connect");
EventPoruka = GetProcAddress(hDLL, "ReadMessageMQ");
NapraviPrijemneRazmene = GetProcAddress(hDLL, "DeclareRcvExchange");
PosaljiPoruku = GetProcAddress(hDLL, "SendMessageMQ");
}
DllWrapper::~DllWrapper()
{
FreeLibrary(hDLL);
}
//---------------------------------------------------------------------------
#ifndef DllWrapperH
#define DllWrapperH
#pragma once
#include <System.Classes.hpp>
#include <Windows.h>
#include <string>
#include <functional>
#include <map>
#include <System.Threading.hpp>
#include "Paketi\Helper\THelper.h"
typedef void (*NoParamsFunc)();
typedef void (CallbackStatus)(bool, const char*);
typedef void (*IsConsumingCheck)(const char*, CallbackStatus);
typedef bool (*SocketStatusFunc)();
typedef const char* (*ConnectFunc)(NoParamsFunc, NoParamsFunc, const char*, const char*, const char*, int, int);
typedef void (*SendMsg)(const char*, const char*, const char* const [], const char* const [], CallbackStatus, bool, const char*);
typedef void (*SendMsgQ)(const char*, const char*, const char* const [], const char* const []);
typedef void (*RcvMsgExternal) (std::map<AnsiString, AnsiString>, const char*, int);
typedef void (*RcvMsgInternal) (const char**, const char**, const char*, int);
typedef void (*AckMsg) (int);
typedef void (*SubscribeChn)(RcvMsgInternal, const char*);
typedef void (*AdminConnect)(const char*, RcvMsgInternal);
typedef void (*DecExch)(NoParamsFunc, const char*, const char*, const char*);
class DllWrapper
{
public:
FARPROC Konekcija;
FARPROC EventPoruka;
FARPROC NapraviPrijemneRazmene;
FARPROC PosaljiPoruku;
FARPROC AdminKonekcija;
SocketStatusFunc StatusSoketa;
NoParamsFunc Diskonekcija;
SendMsgQ PosaljiPorukuBrzo;
AckMsg PotvrdiPrijem;
RcvMsgExternal PoPrijemu;
IsConsumingCheck ProveraKanala;
bool _rdy = false;
bool _stop = false;
AnsiString _uid = "";
int _paralelnoPoruka = 1;
NoParamsFunc _rekonekcija;
DllWrapper();
~DllWrapper();
private:
HINSTANCE hDLL;
};
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "TZec.h"
#pragma package(smart_init)
bool TZec::_stopZec = false;
DllWrapper* TZec::_dllWrapper;
THelper* TZec::_helperZec = new THelper();
TLogger* TZec::_loggerZec = new TLogger();
TPinger* TZec::_pingerZec = new TPinger();
bool TZec::_connUtoku = false;
bool TZec::_inError = false;
bool TZec::_prijavljen = false;
bool TZec::_gotInfo = false;
const AnsiString TZec::_dan = "86400000";
const AnsiString TZec::_8sati = "28800000";
const AnsiString TZec::_sat = "3600000";
AnsiString TZec::_server;
AnsiString TZec::_app = "";
int TZec::_port;
TCompInfo TZec::_info;
TFormatSettings _fmt = TFormatSettings::Create(GetThreadLocale());
void TZec::Gotov()
{
TZec::_loggerZec->Log("Konektovan na RabbitMQ", llDebug);
TZec::_inError = false;
TZec::_connUtoku = false;
TZec::_dllWrapper->_rdy = true;
TZec::_dllWrapper->_rekonekcija();
}
void TZec::Konektovan()
{
TZec::_loggerZec->Log("Pravim razmene.", llDebug);
DecExch razmene = (DecExch)TZec::_dllWrapper->NapraviPrijemneRazmene;
razmene(Gotov, TZec::_info._pib.c_str(), TZec::_dllWrapper->_uid.c_str(), TZec::_app.c_str());
TZec::_loggerZec->Log("Razmene proglasene", llDebug);
}
void TZec::PosaljiPoruku(const std::map<AnsiString, AnsiString>& hederiMapa, AnsiString poruka, AnsiString uid, CallbackStatus statusCallback,
bool naSve, AnsiString trajanje)
{
Bloker();
if (TZec::_stopZec)
{
return;
}
const char* rou = uid.c_str();
const char* msg = poruka.c_str();
auto hederi = Hederi(hederiMapa, false);
auto vrednosti = Hederi(hederiMapa, true);
SendMsg salji = (SendMsg)_dllWrapper->PosaljiPoruku;
const char* ttl = trajanje.c_str();
try
{
if (TZec::_dllWrapper->_rdy)
{
salji(rou, msg, hederi, vrednosti, statusCallback, naSve, ttl);
TZec::_loggerZec->Log("Poruka poslata", llDebug);
}else
{
TZec::_loggerZec->Log("Ne saljemo poruku, stanje nije ok", llCritical);
}
}catch(...){}
int size = hederiMapa.size();
for (int dex = 0; dex < size; dex++)
{
delete[] hederi[dex];
delete[] vrednosti[dex];
}
delete[] hederi;
delete[] vrednosti;
}
void TZec::PoslajiLog(UnicodeString logPoruka, LoggingLevel nivo, CallbackStatus statusCallback)
{
try
{
TZec::Bloker();
if (TZec::_stopZec)
{
return;
}
std::map<AnsiString, AnsiString> hederi;
TDateTime timestamp = Now();
_fmt.DateSeparator = '/';
_fmt.LongDateFormat = "mm/dd/yyyy hh:nn:ss";
_fmt.ShortDateFormat = "mm/dd/yyyy hh:nn:ss";
AnsiString ts = FormatDateTime("mm/dd/yyyy hh:nn:ss", timestamp, _fmt);
hederi["vreme"]=ts;
hederi["tip"] = TipPorukeUStringInternal(tpLiveLogovi);
hederi["pib"] = TZec::_info._pib;
hederi["hostname"] = TZec::_info._defMagacin + " - " + TZec::_info._hostname;
hederi["uid"] = TZec::_info._uid;
hederi["ver"] = TZec::_info._verzijaMP;
hederi["nivo"] = nivo;
if (nivo == llCritical)
{
TZec::PosaljiPoruku(hederi, logPoruka.t_str(), "bus.fan", statusCallback, true, _sat);
}else
{
TZec::PosaljiPoruku(hederi, logPoruka.t_str(), "bus.fan", statusCallback, true);
}
}catch(...)
{
TZec::_loggerZec->Log("Neuspelo slanje zahteva", llCritical);
}
}
void TZec::Prijava(CallbackStatus statusCallback)
{
try
{
TZec::Bloker();
if (TZec::_stopZec)
{
return;
}
std::map<AnsiString, AnsiString> hederi;
TDateTime timestamp = Now();
_fmt.DateSeparator = '/';
_fmt.LongDateFormat = "mm/dd/yyyy hh:nn:ss";
_fmt.ShortDateFormat = "mm/dd/yyyy hh:nn:ss";
AnsiString ts = FormatDateTime("mm/dd/yyyy hh:nn:ss", timestamp, _fmt);
hederi["vreme"]=ts;
hederi["tip"] = TipPorukeUStringInternal(tpPrijava);
hederi["pib"] = TZec::_info._pib;
hederi["hostname"] = TZec::_info._defMagacin + " - " + TZec::_info._hostname;
hederi["uid"] = TZec::_info._uid;
hederi["ver"] = TZec::_info._verzijaMP;
TZec::_loggerZec->Log("Slanje prijave", llDebug);
TZec::PosaljiPoruku(hederi, "", "bus.fan", statusCallback, true, 60000);
}catch(...){}
}
void TZec::KonekcijaZatvorena()
{
TZec::_loggerZec->Log("Zatvaram konekciju", llDebug);
TZec::_connUtoku = false;
TZec::_dllWrapper->_rdy = false;
}
void TZec::KonektujSe(NoParamsFunc rekonekcija, int paralelnoPoruka, AnsiString app)
{
_app = app;
if (TZec::_connUtoku)
{
TZec::_loggerZec->Log("Konekcija je vec u toku, zaustavljam pokusaj.", llCritical);
return;
}
_connUtoku = true;
if (TZec::_dllWrapper != nullptr)
{
_loggerZec->Log("Brisem dll wrapper", llDebug);
try
{
_dllWrapper->Diskonekcija();
Sleep(2000);
}catch(...){}
delete TZec::_dllWrapper;
TZec::_dllWrapper = nullptr;
}
_loggerZec->Log("Novi dll wrapper", llDebug);
TZec::_dllWrapper = new DllWrapper();
auto serverOp = _helperZec->ProcitajJSON("zec", "server");
auto portOp = _helperZec->ProcitajJSON("zec", "port");
_server = serverOp->DohvatiRezultat();
_port = StrToIntDef(portOp->DohvatiRezultat(), 3050);
delete serverOp;
delete portOp;
_loggerZec->Log("Procitao confit", llDebug);
_dllWrapper->_paralelnoPoruka = paralelnoPoruka;
_dllWrapper->_rekonekcija = rekonekcija;
AnsiString uid = "???";
if (!_gotInfo)
{
auto uidOp = _helperZec->DohvatiHostInformacije();
if (uidOp->OperacijaUspela())
{
_info = uidOp->DohvatiRezultat();
uid = _info._uid;
}
_gotInfo = true;
delete uidOp;
}
_dllWrapper->_uid = uid + "." + app;
auto userOp = TZec::_helperZec->ProcitajJSON("zec", "user");
auto passOp = TZec::_helperZec->ProcitajJSON("zec", "pass");
AnsiString serverAddress = _server;
int port = _port;
AnsiString user = userOp->DohvatiRezultat();
AnsiString pass = passOp->DohvatiRezultat();
delete userOp;
delete passOp;
ConnectFunc conn = (ConnectFunc)_dllWrapper->Konekcija;
AnsiString err = "";
try
{
TZec::_loggerZec->Log("Krece konekcija.", llDebug);
err = conn(Konektovan, KonekcijaZatvorena, user.c_str(), pass.c_str(), serverAddress.c_str(), port, paralelnoPoruka);
if (!err.IsEmpty())
{
_connUtoku = false;
_inError = true;
_loggerZec->Log("Greska pri konekciji", llCritical);
_loggerZec->Log(err, llCritical);
}
}catch(...){_connUtoku = false;}
TTask::Create([&](){Provera();})->Start();
}
void TZec::Provera()
{
do
{
try
{
try
{
if (TZec::_stopZec)
{
TZec::_loggerZec->Log("Zec staje zbog stop.", llInfo);
break;
}
}catch(...){break;}
if (!TZec::_dllWrapper->StatusSoketa() || TZec::_inError)
{
TZec::_dllWrapper->_rdy = false;
TZec::_loggerZec->Log("Konekcija ka RabbitMQu nije ok server:" + TZec::_server + " port:" + IntToStr(TZec::_port), llCritical);
if (TZec::_stopZec)
{
TZec::_loggerZec->Log("Izlazim iz provere stanja, sve ok, regularno zaustavljanje",llDebug);
return;
}
if (TZec::_pingerZec->TestPort(TZec::_server, TZec::_port))
{
TZec::_loggerZec->Log("Ping ka serveru ok.", llDebug);
if (!TZec::_connUtoku)
{
TZec::_loggerZec->Log("Konekcija nije u toku, idem ponovo.", llDebug);
try
{
TZec::_loggerZec->Log("Ponovna konekcija.", llDebug);
TZec::KonektujSe(TZec::_dllWrapper->_rekonekcija, TZec::_dllWrapper->_paralelnoPoruka);
}catch(Exception &ex)
{
TZec::_loggerZec->Log("Greska pri konekciji: " + ex.Message, llCritical);
TZec::_connUtoku=false;
}catch (std::exception &stex)
{
TZec::_loggerZec->Log(AnsiString("Greska pri konekciji: ") + stex.what(), llCritical);
TZec::_connUtoku=false;
}catch(...)
{
TZec::_loggerZec->Log("Greska pri konekciji.", llCritical);
TZec::_connUtoku=false;
}
return;
}else
{
TZec::_loggerZec->Log("Konekcija je u toku.", llDebug);
}
}else
{
TZec::_loggerZec->Log("Nema pinga ka serveru.", llCritical);
}
}else
{
TZec::_loggerZec->Log("Sve ok.", llDebug);
}
}catch(Exception &ex)
{
TZec::_loggerZec->Log("Greska pri proveri stanja: " + ex.Message, llCritical);
}catch (std::exception &stex)
{
TZec::_loggerZec->Log(AnsiString("Greska pri proveri stanja: ") + stex.what(), llCritical);
}catch(...)
{
TZec::_loggerZec->Log("Greska pri proveri stanja.", llCritical);
}
Sleep(10000);
}while(true);
}
void TZec::Bloker()
{
int slept = 0;
int quartSec = 0;
int minuteSec = 0;
while(!TZec::_dllWrapper->_rdy)
{
try
{
if (TZec::_stopZec)
{
break;
}
}catch(...){break;}
Sleep(250);
if (++quartSec == 4)
{
quartSec = 0;
if (++minuteSec == 60)
{
minuteSec = 0;
TZec::_loggerZec->Log("Nema konekcije ka rabbitu " + IntToStr(++slept) + " minuta.", llCritical);
}
}
}
}
void TZec::PrijemPorukeInterno(const char** zaglavljeNazivi, const char** zaglavljeVrednosti, const char* poruka, int brPoruke)
{
std::map<AnsiString, AnsiString> zaglavlja;
int indeks = 0;
while (zaglavljeNazivi[indeks] != nullptr)
{
zaglavlja[zaglavljeNazivi[indeks]] = zaglavljeVrednosti[indeks];
indeks++;
}
TZec::_dllWrapper->PoPrijemu(zaglavlja, poruka, brPoruke);
}
void TZec::Prijem(AnsiString kanal, RcvMsgExternal prijem)
{
Bloker();
const char* channel = kanal.c_str();
SubscribeChn sub = (SubscribeChn)_dllWrapper->EventPoruka;
_dllWrapper->PoPrijemu = prijem;
sub(PrijemPorukeInterno, channel);
}
void TZec::PotvrdiPrijem(int tag)
{
Bloker();
_dllWrapper->PotvrdiPrijem(tag);
}
const char* const* TZec::Hederi(const std::map<AnsiString, AnsiString>& hederiMapa, bool vrednosti)
{
int size = hederiMapa.size();
int indeks = 0;
char** hederi = new char*[size+1];
for (const auto& kv : hederiMapa)
{
AnsiString vrednost = vrednosti ? kv.second : kv.first;
hederi[indeks] = new char[vrednost.Length()+1];
memcpy(hederi[indeks], vrednost.c_str(), vrednost.Length());
hederi[indeks][vrednost.Length()] = '\0';
indeks++;
}
hederi[indeks] = nullptr;
return const_cast<const char* const*>(hederi);
}
AnsiString TZec::TipPorukeUString(TipPoruke tip)
{
return TipPorukeUStringInternal(tip);
}
TipPoruke TZec::StringUTipPoruke(AnsiString tip)
{
return StringUTipPorukeInternal(tip);
}
void TZec::IzvrsiSql(AnsiString uid, UnicodeString sql, CallbackStatus statusCallback)
{
Bloker();
std::map<AnsiString, AnsiString> hederi;
TDateTime timestamp = Now();
_fmt.DateSeparator = '/';
_fmt.LongDateFormat = "mm/dd/yyyy hh:nn:ss";
_fmt.ShortDateFormat = "mm/dd/yyyy hh:nn:ss";
AnsiString ts = FormatDateTime("mm/dd/yyyy hh:nn:ss", timestamp, _fmt);
hederi["vreme"]=ts;
hederi["tip"] = TipPorukeUStringInternal(tpSqlExec);
hederi["zahtev"] = _dllWrapper->_uid;
PosaljiPoruku(hederi, sql.t_str(), uid, statusCallback, false);
}
void TZec::PrijaviIzvrsenjeSql(AnsiString uid, UnicodeString sta, bool greska,
bool rezultat, CallbackStatus statusCallback)
{
Bloker();
std::map<AnsiString, AnsiString> hederi;
hederi["tip"] = TipPorukeUStringInternal(tpSqlReport);
hederi["izvrsio"] = _dllWrapper->_uid;
TDateTime timestamp = Now();
_fmt.DateSeparator = '/';
_fmt.LongDateFormat = "mm/dd/yyyy hh:nn:ss";
_fmt.ShortDateFormat = "mm/dd/yyyy hh:nn:ss";
AnsiString ts = FormatDateTime("mm/dd/yyyy hh:nn:ss", timestamp, _fmt);
hederi["vreme"]=ts;
hederi["greska"] = greska ? "da" : "ne";
hederi["rezultat"] = rezultat ? "da" : "ne";
PosaljiPoruku(hederi, sta.t_str(), uid, statusCallback, false);
}
void TZec::PosaljiTekst(AnsiString uid, AnsiString tekst, bool kratkotrajno,
CallbackStatus statusCallback)
{
Bloker();
std::map<AnsiString, AnsiString> hederi;
TDateTime timestamp = Now();
_fmt.DateSeparator = '/';
_fmt.LongDateFormat = "mm/dd/yyyy hh:nn:ss";
_fmt.ShortDateFormat = "mm/dd/yyyy hh:nn:ss";
AnsiString ts = FormatDateTime("mm/dd/yyyy hh:nn:ss", timestamp, _fmt);
hederi["vreme"]=ts;
hederi["tip"] = TipPorukeUStringInternal(tpPoruka);
PosaljiPoruku(hederi, tekst.c_str(), uid, statusCallback, false, "10000");
}
void TZec::StatusSinhronizacije(std::map<AnsiString, AnsiString> stanja, CallbackStatus statusCallback)
{
TZec::Bloker();
if (TZec::_stopZec)
{
return;
}
std::map<AnsiString, AnsiString> hederi;
TDateTime timestamp = Now();
_fmt.DateSeparator = '/';
_fmt.LongDateFormat = "mm/dd/yyyy hh:nn:ss";
_fmt.ShortDateFormat = "mm/dd/yyyy hh:nn:ss";
AnsiString ts = FormatDateTime("mm/dd/yyyy hh:nn:ss", timestamp, _fmt);
hederi["vreme"]=ts;
hederi["tip"] = TipPorukeUStringInternal(tpStanjeSinhro);
hederi["pib"] = TZec::_info._pib;
hederi["hostname"] = TZec::_info._defMagacin + " - " + TZec::_info._hostname;
hederi["uid"] = TZec::_info._uid;
hederi["ver"] = TZec::_info._verzijaMP;
AnsiString telo = "";
std::map<AnsiString, AnsiString>::iterator it;
for (it = stanja.begin(); it != stanja.end(); ++it)
{
hederi[it->first] = it->second;
}
PosaljiPoruku(hederi, telo.c_str(), "bus.fan", statusCallback, true, 60000);
}
void TZec::PokreniUpdate(AnsiString uid, TPodesavanja* updejtPodesavanja,
CallbackStatus statusCallback)
{
Bloker();
std::map<AnsiString, AnsiString> hederi;
hederi["tip"] = TipPorukeUStringInternal(tpUpdate);
hederi["hitno"] = "ne";
hederi["nag"] = "ne";
hederi["poruka"] = updejtPodesavanja->_poruka;
hederi["zakazano"] = "";
hederi["backupbaze"] = updejtPodesavanja->_backupBaze ? "da" : "ne";
hederi["backupapp"] = updejtPodesavanja->_backupApp ? "da" : "ne";
hederi["restart"] = updejtPodesavanja->_restart ? "da" : "ne";
hederi["fajlovi"] = updejtPodesavanja->_fajlovi ? "da" : "ne";
hederi["skripte"] = updejtPodesavanja->_skripte ? "da" : "ne";
switch(updejtPodesavanja->_tipUpdejta)
{
case tuPokretanje:
hederi["nag"] = updejtPodesavanja->_porukaPonavljanje ?
"da" : "ne";
break;
case tuOdmah:
hederi["hitno"] = "da";
break;
case tuZakazan:
_fmt.ShortDateFormat = "mm/dd/yyyy hh:nn:ss";
hederi["zakazano"] = FormatDateTime("mm/dd/yyyy hh:nn:ss",
updejtPodesavanja->_vreme, _fmt);
break;
}
PosaljiPoruku(hederi, "", uid, statusCallback, false, _8sati);
}
void TZec::Diskonektuj()
{
if (TZec::_dllWrapper != nullptr) {
_dllWrapper->_stop = true;
try
{
_dllWrapper->Diskonekcija();
}catch(...){}
delete TZec::_dllWrapper;
TZec::_dllWrapper = nullptr;
}
if (TZec::_helperZec != nullptr) {
delete TZec::_helperZec;
TZec::_helperZec = nullptr;
}
if (TZec::_loggerZec != nullptr) {
delete TZec::_loggerZec;
TZec::_loggerZec = nullptr;
}
if (TZec::_pingerZec != nullptr) {
delete TZec::_pingerZec;
TZec::_pingerZec = nullptr;
}
}
void TZec::PosaljiFajlove(AnsiString uid,
CallbackStatus statusCallback)
{
Bloker();
std::map<AnsiString, AnsiString> hederi;
hederi["tip"] = TipPorukeUStringInternal(tpUploadFiles);
hederi["primaoc"] = _dllWrapper->_uid;
PosaljiPoruku(hederi, "", uid, statusCallback, false, "5000");
}
void TZec::PosaljiBazu(AnsiString uid,
CallbackStatus statusCallback)
{
Bloker();
std::map<AnsiString, AnsiString> hederi;
hederi["tip"] = TipPorukeUStringInternal(tpUploadDb);
hederi["primaoc"] = _dllWrapper->_uid;
PosaljiPoruku(hederi, "", uid, statusCallback, false, "5000");
}
void TZec::PreuzmiFajl(AnsiString uid, AnsiString naziv, AnsiString fajl,
CallbackStatus statusCallback)
{
Bloker();
std::map<AnsiString, AnsiString> hederi;
TDateTime timestamp = Now();
_fmt.DateSeparator = '/';
_fmt.LongDateFormat = "mm/dd/yyyy hh:nn:ss";
_fmt.ShortDateFormat = "mm/dd/yyyy hh:nn:ss";
AnsiString ts = FormatDateTime("mm/dd/yyyy hh:nn:ss", timestamp, _fmt);
hederi["vreme"]=ts;
hederi["pib"] = TZec::_info._pib;
hederi["hostname"] = TZec::_info._defMagacin + " - " + TZec::_info._hostname;
hederi["ver"] = TZec::_info._verzijaMP;
hederi["uid"] = _info._uid;
hederi["tip"] = TipPorukeUStringInternal(tpDownload);
hederi["naziv"] = naziv.c_str();
hederi["fajl"] = fajl.c_str();
PosaljiPoruku(hederi, "", uid, statusCallback, false, _sat);
}
void TZec::PrijaviOperaciju(AnsiString uid, TipPoruke operacija, bool uspeh,
AnsiString poruka, CallbackStatus statusCallback)
{
Bloker();
std::map<AnsiString, AnsiString> hederi;
TDateTime timestamp = Now();
_fmt.DateSeparator = '/';
_fmt.LongDateFormat = "mm/dd/yyyy hh:nn:ss";
_fmt.ShortDateFormat = "mm/dd/yyyy hh:nn:ss";
AnsiString ts = FormatDateTime("mm/dd/yyyy hh:nn:ss", timestamp, _fmt);
hederi["vreme"]=ts;
hederi["pib"] = TZec::_info._pib;
hederi["hostname"] = TZec::_info._defMagacin + " - " + TZec::_info._hostname;
hederi["ver"] = TZec::_info._verzijaMP;
hederi["tip"] = TipPorukeUStringInternal(tpKrajOperacije);
hederi["uid"] = _info._uid;
hederi["operacija"] = TipPorukeUStringInternal(operacija);
hederi["uspeh"] = uspeh ? "da" : "ne";
hederi["poruka"] = poruka;
if (uid.IsEmpty())
{
PosaljiPoruku(hederi, "", "bus.fan", statusCallback, true, _sat);
}else
{
PosaljiPoruku(hederi, "", uid, statusCallback, false, _sat);
}
}
//---------------------------------------------------------------------------
#ifndef TZecH
#define TZecH
//---------------------------------------------------------------------------
#include <System.SysUtils.hpp>
#include <System.Classes.hpp>
#include <map>
#include "DllWrapper.h"
#include "TipoviPoruka.h"
#include "Paketi\Helper\THelper.h"
#include "UpdatePodesavanja.h"
#include <System.Math.hpp>
#include "Paketi\Logger\TLogger.h"
#include "Paketi\Ping\TPinger.h"
//---------------------------------------------------------------------------
class TZec
{
private:
protected:
public:
static void KonektujSe(NoParamsFunc rekonekcija, int paralelnoPoruka = 1, AnsiString app = "");
static void PoslajiLog(UnicodeString logPoruka, LoggingLevel nivo, CallbackStatus statusCallback);
static void PosaljiPoruku(const std::map<AnsiString, AnsiString>& hederi, AnsiString poruka, AnsiString uid, CallbackStatus statusCallback,
bool naSve = false, AnsiString trajanje = "");
static void PosaljiTekst(AnsiString uid, AnsiString teskt, bool kratkotrajno, CallbackStatus statusCallback);
static void Prijem(AnsiString kanal, RcvMsgExternal prijem);
static void PotvrdiPrijem(int tag);
static void PokreniUpdate(AnsiString uid, TPodesavanja* updejtPodesavanja, CallbackStatus statusCallback);
static void Diskonektuj();
static void PosaljiFajlove(AnsiString uid, CallbackStatus statusCallback);
static void PosaljiBazu(AnsiString uid, CallbackStatus statusCallback);
static void PreuzmiFajl(AnsiString uid, AnsiString naziv, AnsiString fajl, CallbackStatus statusCallback);
static void StatusSinhronizacije(std::map<AnsiString, AnsiString> stanja, CallbackStatus statusCallback);
static void IzvrsiSql(AnsiString uid, UnicodeString sql, CallbackStatus statusCallback);
static void PrijaviIzvrsenjeSql(AnsiString uid, UnicodeString sta, bool greska,
bool rezultat, CallbackStatus statusCallback);
static void PrijaviOperaciju(AnsiString uid, TipPoruke operacija, bool uspeh,
AnsiString poruka, CallbackStatus statusCallback);
static void Prijava(CallbackStatus statusCallback);
static AnsiString TipPorukeUString(TipPoruke tip);
static TipPoruke StringUTipPoruke(AnsiString tip);
static void Bloker();
static void Provera();
static void KonekcijaZatvorena();
static void Konektovan();
static void Gotov();
static void StatusKonekcije(bool ok, const char* poruka);
static void PrijemPorukeInterno(const char** zaglavljeNazivi, const char** zaglavljeVrednosti, const char* poruka, int brPoruke);
static bool _stopZec;
static const AnsiString _dan;
static const AnsiString _8sati;
static const AnsiString _sat;
static const char* const* Hederi(const std::map<AnsiString, AnsiString>& hederiMapa, bool vrednosti);
static void ProveraStatusa();
static DllWrapper* _dllWrapper;
static THelper* _helperZec;
static TLogger* _loggerZec;
static TPinger* _pingerZec;
static TCompInfo _info;
static bool _connUtoku;
static bool _inError;
static bool _prijavljen;
static bool _gotInfo;
static AnsiString _server;
static int _port;
static AnsiString _app;
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include "TipoviPoruka.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
AnsiString TipPorukeUStringInternal(TipPoruke tip)
{
switch(tip)
{
case tpPrijava:
return "prijava";
case tpPoruka:
return "poruka";
case tpUpdate:
return "update";
case tpUploadFiles:
return "uploadFiles";
case tpUploadDb:
return "uploadDb";
case tpDownload:
return "download";
case tpSqlExec:
return "sqlExec";
case tpSqlReport:
return "sqlReport";
case tpKrajOperacije:
return "krajOperacije";
case tpListajLogove:
return "listajLogove";
case tpPrikaziLogove:
return "prikaziLogove";
case tpLiveLogovi:
return "liveLogovi";
case tpStanjeSinhro:
return "stanjeSinhro";
case tpSinhroToggle:
return "sinhroToggle";
case tpPrijavaGreske:
return "prijavaGreske";
default:
throw Exception("Los tip poruke");
}
}
TipPoruke StringUTipPorukeInternal(AnsiString tip)
{
if (CompareText(tip, "prijava") == 0)
{
return tpPrijava;
}else if (CompareText(tip, "poruka") == 0)
{
return tpPoruka;
}else if (CompareText(tip, "update") == 0)
{
return tpUpdate;
}else if (CompareText(tip, "uploadFiles") == 0)
{
return tpUploadFiles;
}else if (CompareText(tip, "uploadDb") == 0)
{
return tpUploadDb;
}else if (CompareText(tip, "download") == 0)
{
return tpDownload;
}else if (CompareText(tip, "sqlExec") == 0)
{
return tpSqlExec;
}else if (CompareText(tip, "sqlReport") == 0)
{
return tpSqlReport;
}else if (CompareText(tip, "krajOperacije") == 0)
{
return tpKrajOperacije;
}else if (CompareText(tip, "listajLogove") == 0)
{
return tpListajLogove;
}else if (CompareText(tip, "prikaziLogove") == 0)
{
return tpPrikaziLogove;
}else if (CompareText(tip, "liveLogovi") == 0)
{
return tpLiveLogovi;
}else if (CompareText(tip, "stanjeSinhro") == 0)
{
return tpStanjeSinhro;
}else if (CompareText(tip, "sinhroToggle") == 0)
{
return tpSinhroToggle;
}else if (CompareText(tip, "prijavaGreske") == 0)
{
return tpPrijavaGreske;
}
throw Exception("Los tip poruke");
}
//---------------------------------------------------------------------------
#ifndef TipoviPorukaH
#define TipoviPorukaH
#include <System.Classes.hpp>
//---------------------------------------------------------------------------
enum TipPoruke
{
tpPrijava,
tpPoruka,
tpUpdate,
tpUploadFiles,
tpUploadDb,
tpDownload,
tpSqlExec,
tpSqlReport,
tpKrajOperacije,
tpListajLogove,
tpPrikaziLogove,
tpLiveLogovi,
tpStanjeSinhro,
tpSinhroToggle,
tpPrijavaGreske
};
AnsiString TipPorukeUStringInternal(TipPoruke tip);
TipPoruke StringUTipPorukeInternal(AnsiString tip);
#endif
//---------------------------------------------------------------------------
#pragma hdrstop
#include "UpdatePodesavanja.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
#ifndef UpdatePodesavanjaH
#define UpdatePodesavanjaH
#include <System.Classes.hpp>
//---------------------------------------------------------------------------
enum TipUpdejta
{
tuPokretanje,
tuOdmah,
tuZakazan
};
struct TPodesavanja
{
public:
TipUpdejta _tipUpdejta;
AnsiString _poruka;
bool _porukaPonavljanje;
bool _backupBaze;
bool _backupApp;
bool _fajlovi;
bool _skripte;
bool _restart;
TDateTime _vreme;
int _brojRacunara;
AnsiString _firma;
int _vremeTrajanja;
};
#endif
Paketi\Helper\Enumeratori.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name Enumeratori.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\Enumeratori.obj --auto-dependency-output -MT .\Win32\Debug\Enumeratori.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Helper\TCompInfo.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TCompInfo.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TCompInfo.obj --auto-dependency-output -MT .\Win32\Debug\TCompInfo.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Helper\TFBBaza.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TFBBaza.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TFBBaza.obj --auto-dependency-output -MT .\Win32\Debug\TFBBaza.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Helper\THelper.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name THelper.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\THelper.obj --auto-dependency-output -MT .\Win32\Debug\THelper.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Helper\TRezultatOperacije.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TRezultatOperacije.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TRezultatOperacije.obj --auto-dependency-output -MT .\Win32\Debug\TRezultatOperacije.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\IbeWrapper\TDataClasses.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TDataClasses.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TDataClasses.obj --auto-dependency-output -MT .\Win32\Debug\TDataClasses.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\IbeWrapper\TDllWrap.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TDllWrap.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TDllWrap.obj --auto-dependency-output -MT .\Win32\Debug\TDllWrap.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\IbeWrapper\TIbeWrapper.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TIbeWrapper.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TIbeWrapper.obj --auto-dependency-output -MT .\Win32\Debug\TIbeWrapper.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Logger\TLogger.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TLogger.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TLogger.obj --auto-dependency-output -MT .\Win32\Debug\TLogger.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Logger\TLogWorker.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TLogWorker.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TLogWorker.obj --auto-dependency-output -MT .\Win32\Debug\TLogWorker.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Ping\TPinger.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TPinger.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TPinger.obj --auto-dependency-output -MT .\Win32\Debug\TPinger.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Ping\TPingLog.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TPingLog.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TPingLog.obj --auto-dependency-output -MT .\Win32\Debug\TPingLog.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Zec\DllWrapper.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name DllWrapper.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\DllWrapper.obj --auto-dependency-output -MT .\Win32\Debug\DllWrapper.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Zec\TipoviPoruka.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TipoviPoruka.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TipoviPoruka.obj --auto-dependency-output -MT .\Win32\Debug\TipoviPoruka.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Zec\TZec.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name TZec.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\TZec.obj --auto-dependency-output -MT .\Win32\Debug\TZec.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Paketi\Zec\UpdatePodesavanja.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name UpdatePodesavanja.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\UpdatePodesavanja.obj --auto-dependency-output -MT .\Win32\Debug\UpdatePodesavanja.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Project2.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name Project2.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\Project2.obj --auto-dependency-output -MT .\Win32\Debug\Project2.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
Unit4.cpp*-cc1 -D _DEBUG -D FRAMEWORK_VCL -output-dir .\Win32\Debug -I D:\C11\PRICER\Pricer_uvoz -I "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -I Paketi\Zec -I Paketi\Ping -I Paketi\Logger -I Paketi\IbeWrapper -I Paketi\Helper -isystem "c:\program files (x86)\embarcadero\studio\22.0\include" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\crtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\sdk" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\rtl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\vcl" -isystem "c:\program files (x86)\embarcadero\studio\22.0\include\windows\fmx" -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -isystem "C:\Program Files (x86)\DevExpress\VCL\Library\RS28" -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\source\hpp\Win32\Release -isystem C:\Users\vladi\OneDrive\Dokumenti\Embarcadero\Studio\22.0\CatalogRepository\AsyncPro-cb-Alexandria\packages\Alexandria\cpp\Win32\Debug -isystem C:\Users\Public\Documents\Embarcadero\Studio\22.0\hpp\Win32 -debug-info-kind=standalone -fcxx-exceptions -fborland-extensions -nobuiltininc -nostdsysteminc -triple i686-pc-windows-omf -emit-obj -mrelocation-model static -masm-verbose -ffunction-sections -fexceptions -fseh -mstack-alignment=16 -fno-spell-checking -fno-use-cxa-atexit -fno-threadsafe-statics -main-file-name Unit4.cpp -x c++ -std=c++17 -O0 -fmath-errno -tR -tM -tU -tW -o .\Win32\Debug\Unit4.obj --auto-dependency-output -MT .\Win32\Debug\Unit4.obj -include-pch .\Win32\Debug\Project2PCH1.pch -platform=Win32
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{C3D69F43-A3F6-4578-9106-059041BFACE8}</ProjectGuid>
<ProjectVersion>19.5</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<AppType>Application</AppType>
<MainSource>Project2.cpp</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
<CC_Suffix Condition="'$(CC_Suffix)'==''">c</CC_Suffix>
<TargetedPlatforms>1</TargetedPlatforms>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
<DynamicRTL>true</DynamicRTL>
<UsePackages>true</UsePackages>
<IntermediateOutputDir>.\$(Platform)\$(Config)</IntermediateOutputDir>
<FinalOutputDir>.\$(Platform)\$(Config)</FinalOutputDir>
<BCC_wpar>false</BCC_wpar>
<BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
<BCC_ExtendedErrorInfo>true</BCC_ExtendedErrorInfo>
<ILINK_TranslatedLibraryPath>$(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath)</ILINK_TranslatedLibraryPath>
<ProjectType>CppVCLApplication</ProjectType>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
<AllPackageLibs>rtl.lib;vcl.lib;dbrtl.lib;dsnap.lib;dbexpress.lib;DbxCommonDriver.lib;cxLibraryRS28.lib;dxGDIPlusRS28.lib;dxCoreRS28.lib;vclwinx.lib;vclimg.lib;bindengine.lib;vcldb.lib;vclie.lib;vcledge.lib;vclx.lib;DBXFirebirdDriver.lib;IndySystem.lib;IndyCore.lib;FireDAC.lib;FireDACCommonDriver.lib;FireDACCommon.lib;xmlrtl.lib;vclFireDAC.lib;FireDACCommonODBC.lib;FireDACIBDriver.lib;FireDACODBCDriver.lib</AllPackageLibs>
<_TCHARMapping>wchar_t</_TCHARMapping>
<Multithreaded>true</Multithreaded>
<Icon_MainIcon>$(BDS)\bin\cbuilder_PROJECTICON.ico</Icon_MainIcon>
<UWP_CppLogo44>$(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_44.png</UWP_CppLogo44>
<UWP_CppLogo150>$(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_150.png</UWP_CppLogo150>
<SanitizedProjectName>Project2</SanitizedProjectName>
<IncludePath>Paketi\Zec\;Paketi\Ping\;Paketi\Logger\;Paketi\IbeWrapper\;Paketi\Helper\;$(IncludePath)</IncludePath>
<ILINK_LibraryPath>Paketi\Zec\;Paketi\Ping\;Paketi\Logger\;Paketi\IbeWrapper\;Paketi\Helper\;$(ILINK_LibraryPath)</ILINK_LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<PackageImports>adortl;appanalytics;AsyncProCR;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindcompvclsmp;bindcompvclwinx;bindengine;CloudService;CustomIPTransport;cxExportRS28;cxGridEMFRS28;cxGridRS28;cxLibraryRS28;cxPivotGridChartRS28;cxPivotGridOLAPRS28;cxPivotGridRS28;cxSchedulerGridRS28;cxSchedulerRibbonStyleEventEditorRS28;cxSchedulerRS28;cxSchedulerTreeBrowserRS28;cxSchedulerWebServiceStorageRS28;cxTreeListdxBarPopupMenuRS28;cxTreeListRS28;cxVerticalGridRS28;DataSnapClient;DataSnapCommon;DataSnapConnectors;DatasnapConnectorsFreePascal;DataSnapFireDAC;DataSnapIndy10ServerTransport;DataSnapNativeClient;DataSnapProviderClient;DataSnapServer;DataSnapServerMidas;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXDb2Driver;DBXFirebirdDriver;DBXInformixDriver;DBXInterBaseDriver;DBXMSSQLDriver;DBXMySQLDriver;DBXOdbcDriver;DBXOracleDriver;DBXSqliteDriver;DBXSybaseASADriver;DBXSybaseASEDriver;dsnap;dsnapcon;dsnapxml;dxADOEMFRS28;dxADOServerModeRS28;dxBarDBNavRS28;dxBarExtDBItemsRS28;dxBarExtItemsRS28;dxBarRS28;dxChartControlRS28;dxCloudServiceLibraryRS28;dxComnRS28;dxCoreRS28;dxdborRS28;dxdbtrRS28;dxDBXServerModeRS28;dxDockingRS28;dxEMFRS28;dxFireDACEMFRS28;dxFireDACServerModeRS28;dxFlowChartAdvancedCustomizeFormRS28;dxFlowChartDesignerRS28;dxFlowChartLayoutsRS28;dxFlowChartRS28;dxGanttControlRS28;dxGaugeControlRS28;dxGDIPlusRS28;dxHttpIndyRequestRS28;dxMapControlRS28;dxmdsRS28;dxNavBarRS28;dxOrgChartAdvancedCustomizeFormRS28;dxorgcRS28;dxPDFViewerRS28;dxPSCoreRS28;dxPScxCommonRS28;dxPScxExtCommonRS28;dxPScxGridLnkRS28;dxPScxPCProdRS28;dxPScxPivotGridLnkRS28;dxPScxSchedulerLnkRS28;dxPScxTLLnkRS28;dxPScxVGridLnkRS28;dxPSDBTeeChartRS28;dxPSdxDBOCLnkRS28;dxPSdxDBTVLnkRS28;dxPSdxFCLnkRS28;dxPSdxGaugeControlLnkRS28;dxPSdxLCLnkRS28;dxPSdxMapControlLnkRS28;dxPSdxOCLnkRS28;dxPSdxPDFViewerLnkRS28;dxPSdxSpreadSheetLnkRS28;dxPSLnksRS28;dxPsPrVwAdvRS28;dxPSPrVwRibbonRS28;dxPSRichEditControlLnkRS28;dxPSTeeChartRS28;dxRibbonCustomizationFormRS28;dxRibbonRS28;dxRichEditControlCoreRS28;dxRichEditControlRS28;dxRichEditCoreRS28;dxRichEditDocumentModelRS28;dxServerModeRS28;dxSkinsCoreRS28;dxSpellCheckerRS28;dxSpreadSheetConditionalFormattingDialogsRS28;dxSpreadSheetCoreConditionalFormattingDialogsRS28;dxSpreadSheetCoreRS28;dxSpreadSheetReportDesignerRS28;dxSpreadSheetRS28;dxTabbedMDIRS28;dxTileControlRS28;dxtrmdRS28;dxWizardControlRS28;emsclient;emsclientfiredac;emsedge;emshosting;emsserverresource;FireDAC;FireDACADSDriver;FireDACASADriver;FireDACCommon;FireDACCommonDriver;FireDACCommonODBC;FireDACDb2Driver;FireDACDBXDriver;FireDACDSDriver;FireDACIBDriver;FireDACInfxDriver;FireDACMongoDBDriver;FireDACMSAccDriver;FireDACMSSQLDriver;FireDACMySQLDriver;FireDACODBCDriver;FireDACOracleDriver;FireDACPgDriver;FireDACSqliteDriver;FireDACTDataDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;FMXTee;FmxTeeUI;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;Tee;TeeDB;TeeUI;tethering;vcl;vclactnband;vcldb;vcldsnap;vcledge;vclFireDAC;vclie;vclimg;VCLRESTComponents;VclSmp;vcltouch;vclwinx;vclx;xmlrtl;$(PackageImports)</PackageImports>
<IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<BCC_PCHName_Clang>Project2PCH1.h</BCC_PCHName_Clang>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<PackageImports>adortl;appanalytics;AsyncProCR;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindcompvclsmp;bindcompvclwinx;bindengine;CloudService;CustomIPTransport;cxExportRS28;cxGridEMFRS28;cxGridRS28;cxLibraryRS28;cxPivotGridChartRS28;cxPivotGridOLAPRS28;cxPivotGridRS28;cxSchedulerGridRS28;cxSchedulerRibbonStyleEventEditorRS28;cxSchedulerRS28;cxSchedulerTreeBrowserRS28;cxSchedulerWebServiceStorageRS28;cxTreeListdxBarPopupMenuRS28;cxTreeListRS28;cxVerticalGridRS28;DataSnapClient;DataSnapCommon;DataSnapConnectors;DatasnapConnectorsFreePascal;DataSnapFireDAC;DataSnapIndy10ServerTransport;DataSnapNativeClient;DataSnapProviderClient;DataSnapServer;DataSnapServerMidas;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXDb2Driver;DBXFirebirdDriver;DBXInformixDriver;DBXInterBaseDriver;DBXMSSQLDriver;DBXMySQLDriver;DBXOdbcDriver;DBXOracleDriver;DBXSqliteDriver;DBXSybaseASADriver;DBXSybaseASEDriver;dsnap;dsnapcon;dsnapxml;dxADOEMFRS28;dxADOServerModeRS28;dxBarDBNavRS28;dxBarExtDBItemsRS28;dxBarExtItemsRS28;dxBarRS28;dxChartControlRS28;dxCloudServiceLibraryRS28;dxComnRS28;dxCoreRS28;dxdborRS28;dxdbtrRS28;dxDBXServerModeRS28;dxDockingRS28;dxEMFRS28;dxFireDACEMFRS28;dxFireDACServerModeRS28;dxFlowChartAdvancedCustomizeFormRS28;dxFlowChartDesignerRS28;dxFlowChartLayoutsRS28;dxFlowChartRS28;dxGanttControlRS28;dxGaugeControlRS28;dxGDIPlusRS28;dxHttpIndyRequestRS28;dxMapControlRS28;dxmdsRS28;dxNavBarRS28;dxOrgChartAdvancedCustomizeFormRS28;dxorgcRS28;dxPDFViewerRS28;dxPSCoreRS28;dxPScxCommonRS28;dxPScxExtCommonRS28;dxPScxGridLnkRS28;dxPScxPCProdRS28;dxPScxPivotGridLnkRS28;dxPScxSchedulerLnkRS28;dxPScxTLLnkRS28;dxPScxVGridLnkRS28;dxPSDBTeeChartRS28;dxPSdxDBOCLnkRS28;dxPSdxDBTVLnkRS28;dxPSdxFCLnkRS28;dxPSdxGaugeControlLnkRS28;dxPSdxLCLnkRS28;dxPSdxMapControlLnkRS28;dxPSdxOCLnkRS28;dxPSdxPDFViewerLnkRS28;dxPSdxSpreadSheetLnkRS28;dxPSLnksRS28;dxPsPrVwAdvRS28;dxPSPrVwRibbonRS28;dxPSRichEditControlLnkRS28;dxPSTeeChartRS28;dxRibbonCustomizationFormRS28;dxRibbonRS28;dxRichEditControlCoreRS28;dxRichEditControlRS28;dxRichEditCoreRS28;dxRichEditDocumentModelRS28;dxServerModeRS28;dxSkinsCoreRS28;dxSpellCheckerRS28;dxSpreadSheetConditionalFormattingDialogsRS28;dxSpreadSheetCoreConditionalFormattingDialogsRS28;dxSpreadSheetCoreRS28;dxSpreadSheetReportDesignerRS28;dxSpreadSheetRS28;dxTabbedMDIRS28;dxTileControlRS28;dxtrmdRS28;dxWizardControlRS28;emsclient;emsclientfiredac;emsedge;emshosting;emsserverresource;FireDAC;FireDACADSDriver;FireDACASADriver;FireDACCommon;FireDACCommonDriver;FireDACCommonODBC;FireDACDb2Driver;FireDACDBXDriver;FireDACDSDriver;FireDACIBDriver;FireDACInfxDriver;FireDACMongoDBDriver;FireDACMSAccDriver;FireDACMSSQLDriver;FireDACMySQLDriver;FireDACODBCDriver;FireDACOracleDriver;FireDACPgDriver;FireDACSqliteDriver;FireDACTDataDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;FMXTee;FmxTeeUI;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;Tee;TeeDB;TeeUI;tethering;vcl;vclactnband;vcldb;vcldsnap;vcledge;vclFireDAC;vclie;vclimg;VCLRESTComponents;VclSmp;vcltouch;vclwinx;vclx;xmlrtl;$(PackageImports)</PackageImports>
<IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
<BCC_PCHName_Clang>Project2PCH1.h</BCC_PCHName_Clang>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
<DCC_Optimize>false</DCC_Optimize>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<Defines>_DEBUG;$(Defines)</Defines>
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
<BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
<DCC_Define>DEBUG</DCC_Define>
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
<BCC_StackFrames>true</BCC_StackFrames>
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
<TASM_Debugging>Full</TASM_Debugging>
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
<BCC_EnableCPPExceptions>true</BCC_EnableCPPExceptions>
<BCC_DisableFramePtrElimOpt>true</BCC_DisableFramePtrElimOpt>
<BCC_DisableSpellChecking>true</BCC_DisableSpellChecking>
<CLANG_UnwindTables>true</CLANG_UnwindTables>
<ILINK_LibraryPath>$(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
<ILINK_TranslatedLibraryPath>$(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath)</ILINK_TranslatedLibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
<BCC_UseClassicCompiler>false</BCC_UseClassicCompiler>
<ILINK_LibraryPath>$(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<LinkPackageStatics>rtl.lib;vcl.lib;dbrtl.lib;dsnap.lib;dbexpress.lib;DbxCommonDriver.lib;cxLibraryRS28.lib;dxGDIPlusRS28.lib;dxCoreRS28.lib;vclwinx.lib;vclimg.lib;bindengine.lib;vcldb.lib;vclie.lib;vcledge.lib;vclx.lib;DBXFirebirdDriver.lib;IndySystem.lib;IndyCore.lib;FireDAC.lib;FireDACCommonDriver.lib;FireDACCommon.lib;xmlrtl.lib;vclFireDAC.lib;FireDACCommonODBC.lib;FireDACIBDriver.lib;FireDACODBCDriver.lib</LinkPackageStatics>
<UsePackages>false</UsePackages>
<VerInfo_Locale>1033</VerInfo_Locale>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<Defines>NDEBUG;$(Defines)</Defines>
<TASM_Debugging>None</TASM_Debugging>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
<BCC_UseClassicCompiler>false</BCC_UseClassicCompiler>
</PropertyGroup>
<ItemGroup>
<CppCompile Include="Paketi\Helper\Enumeratori.cpp">
<DependentOn>Paketi\Helper\Enumeratori.h</DependentOn>
<BuildOrder>3</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Helper\TCompInfo.cpp">
<DependentOn>Paketi\Helper\TCompInfo.h</DependentOn>
<BuildOrder>4</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Helper\TFBBaza.cpp">
<DependentOn>Paketi\Helper\TFBBaza.h</DependentOn>
<BuildOrder>5</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Helper\THelper.cpp">
<DependentOn>Paketi\Helper\THelper.h</DependentOn>
<BuildOrder>6</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Helper\TRezultatOperacije.cpp">
<DependentOn>Paketi\Helper\TRezultatOperacije.h</DependentOn>
<BuildOrder>7</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\IbeWrapper\TDataClasses.cpp">
<DependentOn>Paketi\IbeWrapper\TDataClasses.h</DependentOn>
<BuildOrder>8</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\IbeWrapper\TDllWrap.cpp">
<DependentOn>Paketi\IbeWrapper\TDllWrap.h</DependentOn>
<BuildOrder>9</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\IbeWrapper\TIbeWrapper.cpp">
<DependentOn>Paketi\IbeWrapper\TIbeWrapper.h</DependentOn>
<BuildOrder>10</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Logger\TLogger.cpp">
<DependentOn>Paketi\Logger\TLogger.h</DependentOn>
<BuildOrder>11</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Logger\TLogWorker.cpp">
<DependentOn>Paketi\Logger\TLogWorker.h</DependentOn>
<BuildOrder>12</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Ping\TPinger.cpp">
<DependentOn>Paketi\Ping\TPinger.h</DependentOn>
<BuildOrder>13</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Ping\TPingLog.cpp">
<DependentOn>Paketi\Ping\TPingLog.h</DependentOn>
<BuildOrder>14</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Zec\DllWrapper.cpp">
<DependentOn>Paketi\Zec\DllWrapper.h</DependentOn>
<BuildOrder>15</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Zec\TipoviPoruka.cpp">
<DependentOn>Paketi\Zec\TipoviPoruka.h</DependentOn>
<BuildOrder>16</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Zec\TZec.cpp">
<DependentOn>Paketi\Zec\TZec.h</DependentOn>
<BuildOrder>17</BuildOrder>
</CppCompile>
<CppCompile Include="Paketi\Zec\UpdatePodesavanja.cpp">
<DependentOn>Paketi\Zec\UpdatePodesavanja.h</DependentOn>
<BuildOrder>18</BuildOrder>
</CppCompile>
<CppCompile Include="Project2.cpp">
<BuildOrder>0</BuildOrder>
</CppCompile>
<PCHCompile Include="Project2PCH1.h">
<BuildOrder>1</BuildOrder>
<PCH>true</PCH>
</PCHCompile>
<CppCompile Include="Unit4.cpp">
<Form>Form4</Form>
<FormType>dfm</FormType>
<DependentOn>Unit4.h</DependentOn>
<BuildOrder>2</BuildOrder>
</CppCompile>
<FormResources Include="Unit4.dfm"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>CPlusPlusBuilder.Personality.12</Borland.Personality>
<Borland.ProjectType>CppVCLApplication</Borland.ProjectType>
<BorlandProject>
<CPlusPlusBuilder.Personality>
<ProjectProperties>
<ProjectProperties Name="AutoShowDeps">False</ProjectProperties>
<ProjectProperties Name="ManagePaths">True</ProjectProperties>
<ProjectProperties Name="VerifyPackages">True</ProjectProperties>
<ProjectProperties Name="IndexFiles">False</ProjectProperties>
</ProjectProperties>
<Source>
<Source Name="MainSource">Project2.cpp</Source>
</Source>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k280.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcbofficexp280.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrx28.bpl">FastReport VCL Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfs28.bpl">FastScript 1.9 Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxIntIO28.bpl">FastReport VCL Internet transports</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxIntIOIndy28.bpl">FastReport VCL Internet transports</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxHTML28.bpl">FastReport VCL HTMLView Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxPDF28.bpl">FastReport VCL PDF Component</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxe28.bpl">FastReport VCL Exports</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxTee28.bpl">FastReport VCL Tee Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfsTee28.bpl">FastScript 1.9 Tee Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxDB28.bpl">FastReport VCL DB Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfsDB28.bpl">FastScript 1.9 DB Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxADO28.bpl">FastReport VCL ADO Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfsADO28.bpl">FastScript 1.9 ADO Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxDBX28.bpl">FastReport VCL DBX Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfrxIBX28.bpl">FastReport VCL IBX Components</Excluded_Packages>
<Excluded_Packages Name="C:\Program Files (x86)\FastReport VCL Standard\LibD28\dclfsIBX28.bpl">FastScript 1.9 IBX Components</Excluded_Packages>
</Excluded_Packages>
</CPlusPlusBuilder.Personality>
<Deployment Version="4">
<DeployFile Condition="'$(DynamicRTL)'=='true'" LocalName="$(BDS)\Redist\osx32\libcgcrtl.dylib" Class="DependencyModule">
<Platform Name="OSX32">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile Condition="'$(DynamicRTL)'=='true'" LocalName="$(BDS)\Redist\osx32\libcgstl.dylib" Class="DependencyModule">
<Platform Name="OSX32">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile Condition="'$(UsingDelphiRTL)'=='true'" LocalName="$(BDS)\bin64\borlndmm.dll" Class="DependencyModule">
<Platform Name="Win64">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin64\cc64280.dll" Class="DependencyModule">
<Platform Name="Win64">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'=='true'" LocalName="$(BDS)\bin64\cc64280mt.dll" Class="DependencyModule">
<Platform Name="Win64">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile Condition="'$(UsingDelphiRTL)'=='true'" LocalName="$(BDS)\bin\borlndmm.dll" Class="DependencyModule">
<Platform Name="Win32">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin\cc32280.dll" Class="DependencyModule">
<Platform Name="Win32">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'=='true'" LocalName="$(BDS)\bin\cc32280mt.dll" Class="DependencyModule">
<Platform Name="Win32">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin\cc32c280.dll" Class="DependencyModule">
<Platform Name="Win32">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'=='true'" LocalName="$(BDS)\bin\cc32c280mt.dll" Class="DependencyModule">
<Platform Name="Win32">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName=".\Win32\Debug\Project2.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>Project2.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName=".\Win32\Debug\Project2.tds" Configuration="Debug" Class="DebugSymbols">
<Platform Name="Win32">
<RemoteName>Project2.tds</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployClass Name="AdditionalDebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidClasses">
<Platform Name="Android">
<RemoteDir>classes</RemoteDir>
<Operation>64</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>classes</RemoteDir>
<Operation>64</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidFileProvider">
<Platform Name="Android">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidGDBServer">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiFile">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiv7aFile">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeMipsFile">
<Platform Name="Android">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashImageDef">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStyles">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStylesV21">
<Platform Name="Android">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Colors">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_DefaultAppIcon">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon144">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon192">
<Platform Name="Android">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon24">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage426">
<Platform Name="Android">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage470">
<Platform Name="Android">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage640">
<Platform Name="Android">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage960">
<Platform Name="Android">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Strings">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyFramework">
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyModule">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.dll;.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="DependencyPackage">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Name="File">
<Platform Name="Android">
<Operation>0</Operation>
</Platform>
<Platform Name="Android64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>0</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectAndroidManifest">
<Platform Name="Android">
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXDebug">
<Platform Name="OSX64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXEntitlements">
<Platform Name="OSX32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXInfoPList">
<Platform Name="OSX32">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXResource">
<Platform Name="OSX32">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="ProjectOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
</Platform>
<Platform Name="Linux64">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectUWPManifest">
<Platform Name="Win32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceDebug">
<Platform Name="iOSDevice32">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSEntitlements">
<Platform Name="iOSDevice32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSInfoPList">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSLaunchScreen">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
<Operation>64</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
<Operation>64</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSResource">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_CppLogo150">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_CppLogo44">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iOS_AppStore1024">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_AppIcon152">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_AppIcon167">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_LaunchDark2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Notification40">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Setting58">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_SpotLight80">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_AppIcon120">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_AppIcon180">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch3x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_LaunchDark2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_LaunchDark3x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Notification40">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Notification60">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Setting58">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Setting87">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Spotlight120">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Spotlight80">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="iOSSimARM64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="OSX64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
</Deployment>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Cpp.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Cpp.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
<Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
</Project>
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("Unit4.cpp", Form4);
//---------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
{
Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->CreateForm(__classid(TForm4), &Form4);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
#include <vcl.h>
#include <tchar.h>
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit4.h"
#include "Paketi\Helper\THelper.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cxContainer"
#pragma link "cxControls"
#pragma link "cxEdit"
#pragma link "cxGraphics"
#pragma link "cxLabel"
#pragma link "cxLookAndFeelPainters"
#pragma link "cxLookAndFeels"
#pragma link "cxButtons"
#pragma link "cxDBLookupComboBox"
#pragma link "cxDBLookupEdit"
#pragma link "cxDropDownEdit"
#pragma link "cxLookupEdit"
#pragma link "cxMaskEdit"
#pragma link "cxTextEdit"
#pragma resource "*.dfm"
TForm4 *Form4;
int magacin;
int mnozi_odnos_pjm;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormCreate(TObject *Sender)
{
// create
Position = poScreenCenter;
cdsPricer2->Close();
cdsPricer2->Open();
cdsMagacin->Close();
cdsMagacin->Open();
magacin = PodrazumevaniMagacin();
cdsMagacin->Locate("SIFRA_MAGACINA", magacin, TLocateOptions());
}
//---------------------------------------------------------------------------
void __fastcall TForm4::sveClick(TObject *Sender)
{
// izvezi
TcxButton *btn = dynamic_cast<TcxButton*>(Sender);
if(btn->Name == "sve"){
Export(cdsMagacin->FieldByName("SIFRA_MAGACINA")->AsInteger, 1);
}else{
Export(cdsMagacin->FieldByName("SIFRA_MAGACINA")->AsInteger, 0);
}
}
void __fastcall TForm4::Export(int mg, int sve){
TStringList* fajl = new TStringList();
WideString naredba = "001|Barcode | Code | Name | Local name | Sales price | List price | Unit Unit | Cenovnik | Weight | Weight unit | Price unit | Vazi_od | Vazi_do";
fajl->Append( naredba );
SaveDialog1->Title = "Izvoz podataka za Pricer";
SaveDialog1->DefaultExt = "csv";
SaveDialog1->Filter = "Text|*.csv|All files|*.*";
SaveDialog1->InitialDir = "C:\\Price\\upload" ;
SaveDialog1->FileName = "item_";
AnsiString cena, unit_price;
Currency cena_zs_stampu;
int mnozi_cenu = mnozi_odnos_pjm;
char lOldDecimalSeparator = FormatSettings.DecimalSeparator;
FormatSettings.DecimalSeparator = '.';
cdsPricer2->Active = false;
sdsPricer2->ParamByName("MAG")->AsInteger = mg;
sdsPricer2->ParamByName("datum")->AsDate = Date();
if(sve == 0){
sdsPricer2->ParamByName("datum_promene")->AsDate = VratiVremeZadnjegUpisa(mg);
}else{
sdsPricer2->ParamByName("datum_promene")->Clear();
}
cdsPricer2->Active = true;
if ( SaveDialog1->Execute( ) )
{
while (!cdsPricer2->Eof) {
try {
if (cdsPricer2->RecordCount > 0) {
naredba = "001|";
naredba = naredba + cdsPricer2->FieldByName("BARKOD")->AsString + "|";
naredba = naredba + cdsPricer2->FieldByName("KOD")->AsString + "|";
naredba = naredba + cdsPricer2->FieldByName("artikal")->AsString+ "|";
naredba = naredba + cdsPricer2->FieldByName("lokalni_naziv")->AsString+ "|";
// naredba = naredba + cdsPricer2->FieldByName("AKCIJA_OZNAKA")->AsString+ "|";
if (mnozi_cenu == 0 && cdsPricer2->FieldByName("ODNOSJMNALEPNICE")->AsCurrency > 0) {
cena_zs_stampu = cdsPricer2->FieldByName("cena")->AsCurrency / cdsPricer2->FieldByName("ODNOSJMNALEPNICE")->AsCurrency;
// cena = Strutils::AnsiReplaceStr(FormatCurr("0.00",cdsPricer2->FieldByName("cena")->AsCurrency), ".", "") + "|";
// cena = Strutils::AnsiReplaceStr(cena, ",", "") ;
cena = FormatCurr("0.00", cdsPricer2->FieldByName("cena")->AsCurrency) + "|";
// unit_price = Strutils::AnsiReplaceStr(FormatCurr("0.00",cena_zs_stampu), ".", "");
// unit_price = Strutils::AnsiReplaceStr(unit_price, ",", "")+ "|";
unit_price = FormatCurr("0.00", cena_zs_stampu);
unit_price = unit_price + "|";
}
else if (mnozi_cenu == 1 && cdsPricer2->FieldByName("ODNOSJMNALEPNICE")->AsCurrency > 0) {
cena_zs_stampu = cdsPricer2->FieldByName("cena")->AsCurrency * cdsPricer2->FieldByName("ODNOSJMNALEPNICE")->AsCurrency;
// cena = Strutils::AnsiReplaceStr(FormatCurr("0.00",cena_zs_stampu), ".", "") + "|";
// cena = Strutils::AnsiReplaceStr(cena, ",", "") ;
cena = FormatCurr("0.00", cena_zs_stampu) + "|";
// unit_price = Strutils::AnsiReplaceStr(FormatCurr("0.00",cdsPricer2->FieldByName("cena")->AsCurrency), ".", "");
// unit_price = Strutils::AnsiReplaceStr(unit_price, ",", "")+ "|";
unit_price = FormatCurr("0.00", cdsPricer2->FieldByName("cena")->AsCurrency);
unit_price = unit_price + "|";
}
else {
// cena = Strutils::AnsiReplaceStr(FormatCurr("0.00",cdsPricer2->FieldByName("cena")->AsCurrency), ".", "") + "|";
// cena = Strutils::AnsiReplaceStr(cena, ",", "") ;
cena = FormatCurr("0.00", cdsPricer2->FieldByName("cena")->AsCurrency) + "|"; // Formatira cenu na dve decimale i dodaje separator
unit_price = cena;
}
naredba = naredba + cena;
naredba = naredba + unit_price;
naredba = naredba + " |";
naredba = naredba + " |";
naredba = naredba + cdsPricer2->FieldByName("tip_cenovnika")->AsString+ "|";
naredba = naredba + cdsPricer2->FieldByName("IDPJM")->AsString+ "|";
naredba = naredba + cdsPricer2->FieldByName("IDJMNALEPNICE")->AsString+ "|";
naredba = naredba + cdsPricer2->FieldByName("ODNOSJMNALEPNICE")->AsString+ "|";
// naredba = naredba + cdsPricer2->FieldByName("JED_MERE")->AsString+ "|";
// naredba = naredba + cdsPricer2->FieldByName("kolicina")->AsString+ "|";
// naredba = naredba + cdsPricer2->FieldByName("kategorija")->AsString+ "|";
naredba = naredba + " |";
naredba = naredba + FormatDateTime("DD.MM.YYYY",cdsPricer2->FieldByName("vazi_od")->AsDateTime)+ "|";
if (!cdsPricer2->FieldByName("vazi_do")->IsNull) {
naredba = naredba + FormatDateTime("DD.MM.YYYY",cdsPricer2->FieldByName("vazi_do")->AsDateTime)+ "||";
}
else {
naredba = naredba + "||";
}
// naredba = naredba + FormatCurr("0.00", cdsPricer2->FieldByName("stara_cena")->AsCurrency) + "|||";
// UpisiUFile(SaveDialog1->FileName, naredba,2) ;
naredba = IzbaciNavodnika(naredba);
fajl->Append( naredba );
}
else {
// UpisiULogFile(LOG_FAJL, "TdmPricer::ExportPricer nama podataka:" + cdsStavke->FieldByName("artikal")->AsString , 2);
}
} catch (Exception &e) {
ShowMessage(e.Message);
}
cdsPricer2->Next();
naredba = "";
}
}
FormatSettings.DecimalSeparator = lOldDecimalSeparator;
fajl->SaveToFile(SaveDialog1->FileName, TEncoding::UTF8);
delete fajl;
if(sve == 0){
UpisiUPricerLog(mg);
}
ShowMessage("Izvoz zavrsen!!!");
}
String __fastcall TForm4::IzbaciNavodnika(String tekst){
for (int i = 1; i <= tekst.Length(); i++) {
if (tekst[i] == '"') {
tekst[i] = ' ';
}
}
return tekst;
}
TDateTime __fastcall TForm4::VratiVremeZadnjegUpisa(int magacin){
THelper* helper = new THelper();
TFDConnection* konekcija = new TFDConnection(nullptr);
TRezultatOperacije<TFDConnection*>* rezultat = helper->NapraviKonekciju(false); // ako je true onda je udaljeni
if(rezultat->OperacijaUspela()){
konekcija = rezultat->DohvatiRezultat();
} else{
AnsiString greska = rezultat->DohvatiGresku();
}
TFDQuery *query = new TFDQuery(nullptr);
query->Connection = konekcija;
query->SQL->Text = "select first 1 p.datum_promene from pricer_log p "
"where p.sifra_magacina = :magacin "
"order by 1 desc";
query->ParamByName("magacin")->AsInteger = magacin;
query->Open();
TDateTime vreme = query->FieldByName("datum_promene")->AsDateTime;
delete rezultat;
delete konekcija;
delete helper;
delete query;
return vreme;
}
void __fastcall TForm4::UpisiUPricerLog(int mg){
THelper* helper = new THelper();
TFDConnection* konekcija = new TFDConnection(nullptr);
TRezultatOperacije<TFDConnection*>* rezultat = helper->NapraviKonekciju(false); // ako je true onda je udaljeni
if(rezultat->OperacijaUspela()){
konekcija = rezultat->DohvatiRezultat();
} else{
AnsiString greska = rezultat->DohvatiGresku();
}
TFDQuery *query = new TFDQuery(nullptr);
query->Connection = konekcija;
query->SQL->Text =
"INSERT INTO PRICER_LOG (SIFRA_MAGACINA, DATUM_PROMENE) "
"VALUES (:SIFRA_MAGACINA, :DATUM_PROMENE)";
query->ParamByName("SIFRA_MAGACINA")->AsInteger = magacin;
query->ParamByName("DATUM_PROMENE")->AsDateTime = Now();
query->ExecSQL();
delete rezultat;
delete konekcija;
delete helper;
delete query;
}
int __fastcall TForm4::PodrazumevaniMagacin(){
THelper* helper = new THelper();
TFDConnection* konekcija = new TFDConnection(nullptr);
TRezultatOperacije<TFDConnection*>* rezultat = helper->NapraviKonekciju(false); // ako je true onda je udaljeni
if(rezultat->OperacijaUspela()){
konekcija = rezultat->DohvatiRezultat();
} else{
AnsiString greska = rezultat->DohvatiGresku();
}
TFDQuery *query = new TFDQuery(nullptr);
query->Connection = konekcija;
query->SQL->Text =
"SELECT M.sifra_magacina, F.MNOZI_ODNOS_PJM "
"FROM HP_FISKAL F "
"LEFT JOIN TBLKOMITENTI K ON F.SIFRA_DEFAULT_KUPCA = K.SIFRA_KOMITENTA "
"LEFT JOIN TBLMAGACIN M ON F.DEF_MP_MG = M.SIFRA_MAGACINA";
query->Open();
int sifra_magacina = query->FieldByName("sifra_magacina")->AsInteger;
mnozi_odnos_pjm = query->FieldByName("MNOZI_ODNOS_PJM")->AsInteger;
delete rezultat;
delete konekcija;
delete helper;
delete query;
return sifra_magacina;
}
//---------------------------------------------------------------------------
object Form4: TForm4
Left = 0
Top = 0
Caption = 'Izvoz u Excel'
ClientHeight = 175
ClientWidth = 561
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'Segoe UI'
Font.Style = []
OnCreate = FormCreate
TextHeight = 15
object Panel1: TPanel
Left = 0
Top = 0
Width = 561
Height = 41
Align = alTop
BevelOuter = bvNone
TabOrder = 0
ExplicitWidth = 557
object cxLabel1: TcxLabel
Left = 0
Top = 0
Align = alClient
Caption = 'Magacini:'
ParentFont = False
Style.Font.Charset = DEFAULT_CHARSET
Style.Font.Color = clWindowText
Style.Font.Height = 35
Style.Font.Name = 'Segoe UI'
Style.Font.Style = []
Style.IsFontAssigned = True
ExplicitWidth = 557
end
end
object cxLookupComboBox1: TcxLookupComboBox
Left = 0
Top = 41
Align = alClient
Properties.KeyFieldNames = 'SIFRA_MAGACINA'
Properties.ListColumns = <
item
FieldName = 'MAGACIN'
end>
Properties.ListOptions.SyncMode = True
Properties.ListSource = dsMagacin
TabOrder = 1
ExplicitWidth = 557
ExplicitHeight = 52
Width = 561
end
object Panel2: TPanel
AlignWithMargins = True
Left = 0
Top = 104
Width = 561
Height = 68
Margins.Left = 0
Margins.Top = 10
Margins.Right = 0
Align = alBottom
BevelOuter = bvNone
Caption = 'Panel2'
ShowCaption = False
TabOrder = 2
ExplicitTop = 103
ExplicitWidth = 557
object sve: TcxButton
Left = 0
Top = 0
Width = 272
Height = 68
Margins.Left = 0
Margins.Top = 10
Margins.Right = 0
Margins.Bottom = 0
Align = alLeft
Caption = 'Izvezi u Excel'
LookAndFeel.Kind = lfFlat
LookAndFeel.NativeStyle = True
OptionsImage.Glyph.SourceDPI = 96
OptionsImage.Glyph.SourceHeight = 32
OptionsImage.Glyph.SourceWidth = 32
OptionsImage.Glyph.Data = {
89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
6100000006624B474400FF00FF00FFA0BDA79300000183494441543811636018
68C088EC80D0D050E69BEAF755FE33FDD76364F8AFCFF09F411728AF77A9F99C
2290C68A1861A2BAB546A7801C6D209F0B8851909C91DC1E6401A0BA4F9B0337
0483C45840040803054D41340EEC822CFE1F89C384C46650125562305534010B
E9C9EA32288B2983D99B03D633D8485B31806810060B42091403BEFDFACA3031
AA8FC144C198A13FB297E1EBCF2F60659DA7BB196EBCBBC900A241182C082550
0C78F1F125C38A93AB18FA227B18961E5FC600E283D4D9485B3308730A035D61
0DC620311846310024F81F18F47FFEFE61E064E50471096214030CE4F419020C
FD18E2662730849B8731A889AB820D38F2F428C3DBEF6F194034088305A1048A
019FBE7F62485F98C5F0E4FD5386B405190CDF7F7F072B2B372D65D010526700
D1200C168412C0D883B0F46A8D90630722082581E900CA42505B023780F5B2C0
851819CE00BDAF03E47300310A626464588D2CF0FF3FC30F181F6C0A8C03A20D
1B0CA5FEFE633406B28D81061A039D657CB9F99C14903F481100B8526B445898
CF5F0000000049454E44AE426082}
TabOrder = 0
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = 30
Font.Name = 'Segoe UI'
Font.Style = []
ParentFont = False
OnClick = sveClick
end
object promene: TcxButton
Left = 272
Top = 0
Width = 289
Height = 68
Align = alClient
Caption = 'Izvezi zadnje promene'
OptionsImage.Glyph.SourceDPI = 96
OptionsImage.Glyph.SourceHeight = 32
OptionsImage.Glyph.SourceWidth = 32
OptionsImage.Glyph.Data = {
89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
6100000006624B474400FF00FF00FFA0BDA79300000183494441543811636018
68C088EC80D0D050E69BEAF755FE33FDD76364F8AFCFF09F411728AF77A9F99C
2290C68A1861A2BAB546A7801C6D209F0B8851909C91DC1E6401A0BA4F9B0337
0483C45840040803054D41340EEC822CFE1F89C384C46650125562305534010B
E9C9EA32288B2983D99B03D633D8485B31806810060B42091403BEFDFACA3031
AA8FC144C198A13FB297E1EBCF2F60659DA7BB196EBCBBC900A241182C082550
0C78F1F125C38A93AB18FA227B18961E5FC600E283D4D9485B3308730A035D61
0DC620311846310024F81F18F47FFEFE61E064E50471096214030CE4F419020C
FD18E2662730849B8731A889AB820D38F2F428C3DBEF6F194034088305A1048A
019FBE7F62485F98C5F0E4FD5386B405190CDF7F7F072B2B372D65D010526700
D1200C168412C0D883B0F46A8D90630722082581E900CA42505B023780F5B2C0
851819CE00BDAF03E47300310A626464588D2CF0FF3FC30F181F6C0A8C03A20D
1B0CA5FEFE633406B28D81061A039D657CB9F99C14903F481100B8526B445898
CF5F0000000049454E44AE426082}
TabOrder = 1
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = 30
Font.Name = 'Segoe UI'
Font.Style = []
ParentFont = False
OnClick = sveClick
ExplicitWidth = 285
end
end
object dsPricer2: TDataSource
DataSet = cdsPricer2
Left = 352
Top = 1
end
object cdsPricer2: TClientDataSet
Aggregates = <>
Params = <>
ProviderName = 'dspPricer2'
Left = 304
Top = 1
object cdsPricer2KOD: TStringField
FieldName = 'KOD'
Size = 255
end
object cdsPricer2BARKOD: TStringField
FieldName = 'BARKOD'
Size = 255
end
object cdsPricer2ARTIKAL: TStringField
FieldName = 'ARTIKAL'
Size = 255
end
object cdsPricer2IDJMNALEPNICE: TStringField
FieldName = 'IDJMNALEPNICE'
end
object cdsPricer2IDPJM: TStringField
FieldName = 'IDPJM'
end
object cdsPricer2LOKALNI_NAZIV: TStringField
FieldName = 'LOKALNI_NAZIV'
Size = 250
end
object cdsPricer2CENA: TFMTBCDField
FieldName = 'CENA'
Precision = 18
Size = 2
end
object cdsPricer2ODNOSJMNALEPNICE: TFloatField
FieldName = 'ODNOSJMNALEPNICE'
end
object cdsPricer2AKCIJA_OZNAKA: TIntegerField
FieldName = 'AKCIJA_OZNAKA'
Required = True
end
object cdsPricer2JED_MERE: TStringField
FieldName = 'JED_MERE'
Size = 10
end
object cdsPricer2KOLICINA: TFMTBCDField
FieldName = 'KOLICINA'
Precision = 18
Size = 3
end
object cdsPricer2KATEGORIJA: TStringField
FieldName = 'KATEGORIJA'
Size = 255
end
object cdsPricer2TIP_CENOVNIKA: TStringField
FieldName = 'TIP_CENOVNIKA'
Size = 250
end
object cdsPricer2VAZI_OD: TDateField
FieldName = 'VAZI_OD'
end
object cdsPricer2VAZI_DO: TDateField
FieldName = 'VAZI_DO'
end
object cdsPricer2STARA_CENA: TFMTBCDField
FieldName = 'STARA_CENA'
Precision = 18
Size = 2
end
end
object dspPricer2: TDataSetProvider
DataSet = sdsPricer2
Left = 264
Top = 1
end
object sdsPricer2: TSQLDataSet
CommandText =
'select C.KOD,'#13#10' CASE when C.BARKOD is not null then C.BARK' +
'OD else C.KOD end as BARKOD,'#13#10' C.ARTIKAL,'#13#10' (select ' +
't.naziv from tbljm t where t.id = C.IDJMNALEPNICE ) as IDJMNALEP' +
'NICE,'#13#10' (select t.naziv from tbljm t where t.id = C.IDPJM ' +
') as IDPJM,'#13#10' C.LOKALNI_NAZIV,'#13#10' C.CENA,'#13#10' ROU' +
'ND(C.ODNOSJMNALEPNICE, 2) as ODNOSJMNALEPNICE,'#13#10' CASE when' +
' C.AKCIJA_OZNAKA = '#39'1'#39' then 1 else 0 end as AKCIJA_OZNAKA,'#13#10' ' +
' C.JED_MERE,'#13#10' C.LAGER_KOL as KOLICINA,'#13#10' C.KATEGO' +
'RIJA,'#13#10' C.TIP_CENOVNIKA,'#13#10' C.VAZI_OD,'#13#10' C.VAZI' +
'_DO,'#13#10' C.STARA_CENA'#13#10'from PROC_MP_PRICER2(:MAG, :DATUM, :D' +
'ATUM_PROMENE) C'
MaxBlobSize = -1
Params = <
item
DataType = ftInteger
Name = 'MAG'
ParamType = ptInput
end
item
DataType = ftDate
Name = 'DATUM'
ParamType = ptInput
end
item
DataType = ftTimeStamp
Name = 'DATUM_PROMENE'
ParamType = ptInput
end>
SQLConnection = Konekcija
Left = 216
object sdsPricer2KOD: TStringField
FieldName = 'KOD'
Size = 255
end
object sdsPricer2BARKOD: TStringField
FieldName = 'BARKOD'
Size = 255
end
object sdsPricer2ARTIKAL: TStringField
FieldName = 'ARTIKAL'
Size = 255
end
object sdsPricer2IDJMNALEPNICE: TStringField
FieldName = 'IDJMNALEPNICE'
end
object sdsPricer2IDPJM: TStringField
FieldName = 'IDPJM'
end
object sdsPricer2LOKALNI_NAZIV: TStringField
FieldName = 'LOKALNI_NAZIV'
Size = 250
end
object sdsPricer2CENA: TFMTBCDField
FieldName = 'CENA'
Precision = 18
Size = 2
end
object sdsPricer2ODNOSJMNALEPNICE: TFloatField
FieldName = 'ODNOSJMNALEPNICE'
end
object sdsPricer2AKCIJA_OZNAKA: TIntegerField
FieldName = 'AKCIJA_OZNAKA'
Required = True
end
object sdsPricer2JED_MERE: TStringField
FieldName = 'JED_MERE'
Size = 10
end
object sdsPricer2KOLICINA: TFMTBCDField
FieldName = 'KOLICINA'
Precision = 18
Size = 3
end
object sdsPricer2KATEGORIJA: TStringField
FieldName = 'KATEGORIJA'
Size = 255
end
object sdsPricer2TIP_CENOVNIKA: TStringField
FieldName = 'TIP_CENOVNIKA'
Size = 250
end
object sdsPricer2VAZI_OD: TDateField
FieldName = 'VAZI_OD'
end
object sdsPricer2VAZI_DO: TDateField
FieldName = 'VAZI_DO'
end
object sdsPricer2STARA_CENA: TFMTBCDField
FieldName = 'STARA_CENA'
Precision = 18
Size = 2
end
end
object Konekcija: TSQLConnection
ConnectionName = 'baza2006'
DriverName = 'FIREBIRD'
LoadParamsOnConnect = True
LoginPrompt = False
Params.Strings = (
'='
'drivername=FIREBIRD'
'blobsize=-1'
'commitretain=False'
'#Database=127.0.0.1/3050:D:\C11\baza\SYSTEMLINE.FDB'
'Database=127.0.0.1/3051:D:\C11\baza\LUKI_KLIJENT.FDB'
'localecode=0000'
'Password=masterkey'
'rolename=RoleName'
'sqldialect=3'
'isolationlevel=ReadCommitted'
'user_name=sysdba'
'waitonlocks=True'
'trim char=False'
'ConnectionName=baza2006')
Connected = True
Left = 24
Top = 120
end
object SaveDialog1: TSaveDialog
Left = 112
Top = 88
end
object sqlMagacin: TSQLDataSet
SchemaName = 'sysdba'
CommandText =
'select M.SIFRA_MAGACINA,'#13#10' M.MAGACIN,'#13#10' M.SEDISTE,'#13#10 +
' M.SKRACENICA,'#13#10' M.MESTO,'#13#10' M.ADRESA,'#13#10' ' +
'M.CENA_MAGACIN,'#13#10' M.DEF_DOKUMENT,'#13#10' M.ROBNO_DALJINSK' +
'I,'#13#10' M.MAX_KOL,'#13#10' M.KES,'#13#10' M.CEK,'#13#10' M.KA' +
'RTICA,'#13#10' M.VIRMAN,'#13#10' M.KESIRICI,'#13#10' M.BENEFIT,'#13 +
#10' M.VAUCER,'#13#10' M.BEZGOTOVINSKO,'#13#10' M.SALJI_KESIR' +
'ICE,'#13#10' M.AKCIJSKI_RABAT,'#13#10' M.KARTICA_TERMINAL,'#13#10' ' +
' M.VAGA_PREFIX,'#13#10' M.VAGA_KOEF_TEZINA,'#13#10' M.IMA_VAGU' +
','#13#10' M.OBRISI_PREFIKS_VAGE,'#13#10' M.DEF_DOKUMENT_CC,'#13#10' ' +
' M.BROJ_DECIMALA_IZLAZ,'#13#10' M.API_ID_KESIRICI,'#13#10' M.' +
'KESIRICI_API,'#13#10' M.RACUN_IZ_VISE_MAGACINA,'#13#10' A.USER_R' +
'FZO_KNJIZICA,'#13#10' A.PASS_RFZO_KNJIZICA,'#13#10' A.HOST_REST,' +
#13#10' A.PORT_REST'#13#10#13#10'from TBLMAGACIN M'#13#10'left join TBLAPOTEKE_' +
'SETUP A on M.SIFRA_MAGACINA = A.SIFRA_MAGACINA'#13#10'where M.TIP = 20' +
' or M.TIP = 2 or M.TIP = 10'
MaxBlobSize = -1
Params = <>
SQLConnection = Konekcija
Left = 164
Top = 55
end
object dspMagacin: TDataSetProvider
DataSet = sqlMagacin
Left = 228
Top = 55
end
object cdsMagacin: TClientDataSet
Aggregates = <>
Params = <>
ProviderName = 'dspMagacin'
Left = 292
Top = 55
object cdsMagacinSIFRA_MAGACINA: TIntegerField
FieldName = 'SIFRA_MAGACINA'
Required = True
end
object cdsMagacinMAGACIN: TStringField
FieldName = 'MAGACIN'
Size = 50
end
object cdsMagacinSEDISTE: TIntegerField
FieldName = 'SEDISTE'
end
object cdsMagacinSKRACENICA: TStringField
FieldName = 'SKRACENICA'
Size = 5
end
object cdsMagacinMESTO: TStringField
FieldName = 'MESTO'
end
object cdsMagacinADRESA: TStringField
FieldName = 'ADRESA'
Size = 30
end
object cdsMagacinCENA_MAGACIN: TSmallintField
FieldName = 'CENA_MAGACIN'
end
object cdsMagacinDEF_DOKUMENT: TIntegerField
FieldName = 'DEF_DOKUMENT'
end
object cdsMagacinROBNO_DALJINSKI: TIntegerField
FieldName = 'ROBNO_DALJINSKI'
end
object cdsMagacinMAX_KOL: TFMTBCDField
FieldName = 'MAX_KOL'
Precision = 15
Size = 4
end
object cdsMagacinKES: TIntegerField
FieldName = 'KES'
end
object cdsMagacinCEK: TIntegerField
FieldName = 'CEK'
end
object cdsMagacinKARTICA: TIntegerField
FieldName = 'KARTICA'
end
object cdsMagacinVIRMAN: TIntegerField
FieldName = 'VIRMAN'
end
object cdsMagacinAKCIJSKI_RABAT: TFMTBCDField
FieldName = 'AKCIJSKI_RABAT'
Precision = 15
Size = 4
end
object cdsMagacinKARTICA_TERMINAL: TIntegerField
FieldName = 'KARTICA_TERMINAL'
end
object cdsMagacinUSER_RFZO_KNJIZICA: TStringField
FieldName = 'USER_RFZO_KNJIZICA'
Size = 50
end
object cdsMagacinPASS_RFZO_KNJIZICA: TStringField
FieldName = 'PASS_RFZO_KNJIZICA'
Size = 50
end
object cdsMagacinSALJI_KESIRICE: TSmallintField
FieldName = 'SALJI_KESIRICE'
end
object cdsMagacinKESIRICI: TIntegerField
FieldName = 'KESIRICI'
end
object cdsMagacinVAGA_PREFIX: TStringField
FieldName = 'VAGA_PREFIX'
end
object cdsMagacinVAGA_KOEF_TEZINA: TFMTBCDField
FieldName = 'VAGA_KOEF_TEZINA'
Precision = 18
Size = 4
end
object cdsMagacinIMA_VAGU: TIntegerField
FieldName = 'IMA_VAGU'
end
object cdsMagacinHOST_REST: TStringField
FieldName = 'HOST_REST'
Size = 255
end
object cdsMagacinPORT_REST: TIntegerField
FieldName = 'PORT_REST'
end
object cdsMagacinOBRISI_PREFIKS_VAGE: TSmallintField
FieldName = 'OBRISI_PREFIKS_VAGE'
end
object cdsMagacinDEF_DOKUMENT_CC: TIntegerField
FieldName = 'DEF_DOKUMENT_CC'
end
object cdsMagacinBENEFIT: TSmallintField
FieldName = 'BENEFIT'
end
object cdsMagacinBROJ_DECIMALA_IZLAZ: TSmallintField
FieldName = 'BROJ_DECIMALA_IZLAZ'
end
object cdsMagacinAPI_ID_KESIRICI: TSmallintField
FieldName = 'API_ID_KESIRICI'
end
object cdsMagacinKESIRICI_API: TStringField
FieldName = 'KESIRICI_API'
end
object cdsMagacinVAUCER: TSmallintField
FieldName = 'VAUCER'
end
object cdsMagacinRACUN_IZ_VISE_MAGACINA: TIntegerField
FieldName = 'RACUN_IZ_VISE_MAGACINA'
end
object cdsMagacinBEZGOTOVINSKO: TSmallintField
FieldName = 'BEZGOTOVINSKO'
end
end
object dsMagacin: TDataSource
DataSet = cdsMagacin
Left = 356
Top = 55
end
end
//---------------------------------------------------------------------------
#ifndef Unit4H
#define Unit4H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Data.DB.hpp>
#include <Data.FMTBcd.hpp>
#include <Data.SqlExpr.hpp>
#include <Datasnap.DBClient.hpp>
#include <Datasnap.Provider.hpp>
#include "cxContainer.hpp"
#include "cxControls.hpp"
#include "cxEdit.hpp"
#include "cxGraphics.hpp"
#include "cxLabel.hpp"
#include "cxLookAndFeelPainters.hpp"
#include "cxLookAndFeels.hpp"
#include <Vcl.ExtCtrls.hpp>
#include "cxButtons.hpp"
#include "cxDBLookupComboBox.hpp"
#include "cxDBLookupEdit.hpp"
#include "cxDropDownEdit.hpp"
#include "cxLookupEdit.hpp"
#include "cxMaskEdit.hpp"
#include "cxTextEdit.hpp"
#include <Vcl.Menus.hpp>
#include <Data.DBXFirebird.hpp>
#include <FireDAC.Comp.Client.hpp>
#include <FireDAC.Comp.UI.hpp>
#include <FireDAC.Phys.FB.hpp>
#include <FireDAC.Phys.FBDef.hpp>
#include <FireDAC.Phys.hpp>
#include <FireDAC.Phys.IBBase.hpp>
#include <FireDAC.Phys.Intf.hpp>
#include <FireDAC.Phys.ODBC.hpp>
#include <FireDAC.Phys.ODBCBase.hpp>
#include <FireDAC.Phys.ODBCDef.hpp>
#include <FireDAC.Stan.Async.hpp>
#include <FireDAC.Stan.Def.hpp>
#include <FireDAC.Stan.Error.hpp>
#include <FireDAC.Stan.Intf.hpp>
#include <FireDAC.Stan.Option.hpp>
#include <FireDAC.Stan.Pool.hpp>
#include <FireDAC.UI.Intf.hpp>
#include <FireDAC.VCLUI.Wait.hpp>
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
#include <Vcl.Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm4 : public TForm
{
__published: // IDE-managed Components
TDataSource *dsPricer2;
TClientDataSet *cdsPricer2;
TDataSetProvider *dspPricer2;
TSQLDataSet *sdsPricer2;
TcxLabel *cxLabel1;
TPanel *Panel1;
TcxButton *sve;
TSQLConnection *Konekcija;
TSaveDialog *SaveDialog1;
TSQLDataSet *sqlMagacin;
TDataSetProvider *dspMagacin;
TClientDataSet *cdsMagacin;
TIntegerField *cdsMagacinSIFRA_MAGACINA;
TStringField *cdsMagacinMAGACIN;
TIntegerField *cdsMagacinSEDISTE;
TStringField *cdsMagacinSKRACENICA;
TStringField *cdsMagacinMESTO;
TStringField *cdsMagacinADRESA;
TSmallintField *cdsMagacinCENA_MAGACIN;
TIntegerField *cdsMagacinDEF_DOKUMENT;
TIntegerField *cdsMagacinROBNO_DALJINSKI;
TFMTBCDField *cdsMagacinMAX_KOL;
TIntegerField *cdsMagacinKES;
TIntegerField *cdsMagacinCEK;
TIntegerField *cdsMagacinKARTICA;
TIntegerField *cdsMagacinVIRMAN;
TFMTBCDField *cdsMagacinAKCIJSKI_RABAT;
TIntegerField *cdsMagacinKARTICA_TERMINAL;
TStringField *cdsMagacinUSER_RFZO_KNJIZICA;
TStringField *cdsMagacinPASS_RFZO_KNJIZICA;
TSmallintField *cdsMagacinSALJI_KESIRICE;
TIntegerField *cdsMagacinKESIRICI;
TStringField *cdsMagacinVAGA_PREFIX;
TFMTBCDField *cdsMagacinVAGA_KOEF_TEZINA;
TIntegerField *cdsMagacinIMA_VAGU;
TStringField *cdsMagacinHOST_REST;
TIntegerField *cdsMagacinPORT_REST;
TSmallintField *cdsMagacinOBRISI_PREFIKS_VAGE;
TIntegerField *cdsMagacinDEF_DOKUMENT_CC;
TSmallintField *cdsMagacinBENEFIT;
TSmallintField *cdsMagacinBROJ_DECIMALA_IZLAZ;
TSmallintField *cdsMagacinAPI_ID_KESIRICI;
TStringField *cdsMagacinKESIRICI_API;
TSmallintField *cdsMagacinVAUCER;
TIntegerField *cdsMagacinRACUN_IZ_VISE_MAGACINA;
TSmallintField *cdsMagacinBEZGOTOVINSKO;
TDataSource *dsMagacin;
TcxLookupComboBox *cxLookupComboBox1;
TPanel *Panel2;
TcxButton *promene;
TStringField *sdsPricer2KOD;
TStringField *sdsPricer2BARKOD;
TStringField *sdsPricer2ARTIKAL;
TStringField *sdsPricer2IDJMNALEPNICE;
TStringField *sdsPricer2IDPJM;
TStringField *sdsPricer2LOKALNI_NAZIV;
TFMTBCDField *sdsPricer2CENA;
TFloatField *sdsPricer2ODNOSJMNALEPNICE;
TIntegerField *sdsPricer2AKCIJA_OZNAKA;
TStringField *sdsPricer2JED_MERE;
TFMTBCDField *sdsPricer2KOLICINA;
TStringField *sdsPricer2KATEGORIJA;
TStringField *sdsPricer2TIP_CENOVNIKA;
TDateField *sdsPricer2VAZI_OD;
TDateField *sdsPricer2VAZI_DO;
TFMTBCDField *sdsPricer2STARA_CENA;
TStringField *cdsPricer2KOD;
TStringField *cdsPricer2BARKOD;
TStringField *cdsPricer2ARTIKAL;
TStringField *cdsPricer2IDJMNALEPNICE;
TStringField *cdsPricer2IDPJM;
TStringField *cdsPricer2LOKALNI_NAZIV;
TFMTBCDField *cdsPricer2CENA;
TFloatField *cdsPricer2ODNOSJMNALEPNICE;
TIntegerField *cdsPricer2AKCIJA_OZNAKA;
TStringField *cdsPricer2JED_MERE;
TFMTBCDField *cdsPricer2KOLICINA;
TStringField *cdsPricer2KATEGORIJA;
TStringField *cdsPricer2TIP_CENOVNIKA;
TDateField *cdsPricer2VAZI_OD;
TDateField *cdsPricer2VAZI_DO;
TFMTBCDField *cdsPricer2STARA_CENA;
void __fastcall sveClick(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm4(TComponent* Owner);
int __fastcall PodrazumevaniMagacin();
void __fastcall Export(int mg, int sve);
void __fastcall UpisiUPricerLog(int mg);
TDateTime __fastcall VratiVremeZadnjegUpisa(int magacin);
String __fastcall IzbaciNavodnika(String tekst);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm4 *Form4;
//---------------------------------------------------------------------------
#endif
// ---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "c_poruka.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cxContainer"
#pragma link "cxControls"
#pragma link "cxEdit"
#pragma link "cxGraphics"
#pragma link "cxLabel"
#pragma link "cxLookAndFeelPainters"
#pragma link "cxLookAndFeels"
#pragma link "cxButtons"
#pragma link "dxSkinBlack"
#pragma link "dxSkinBlue"
#pragma link "dxSkinBlueprint"
#pragma link "dxSkinCaramel"
#pragma link "dxSkinCoffee"
#pragma link "dxSkinDarkRoom"
#pragma link "dxSkinDarkSide"
#pragma link "dxSkinDevExpressDarkStyle"
#pragma link "dxSkinDevExpressStyle"
#pragma link "dxSkinFoggy"
#pragma link "dxSkinGlassOceans"
#pragma link "dxSkinHighContrast"
#pragma link "dxSkiniMaginary"
#pragma link "dxSkinLilian"
#pragma link "dxSkinLiquidSky"
#pragma link "dxSkinLondonLiquidSky"
#pragma link "dxSkinMcSkin"
#pragma link "dxSkinMoneyTwins"
#pragma link "dxSkinOffice2007Black"
#pragma link "dxSkinOffice2007Blue"
#pragma link "dxSkinOffice2007Green"
#pragma link "dxSkinOffice2007Pink"
#pragma link "dxSkinOffice2007Silver"
#pragma link "dxSkinOffice2010Black"
#pragma link "dxSkinOffice2010Blue"
#pragma link "dxSkinOffice2010Silver"
#pragma link "dxSkinOffice2013White"
#pragma link "dxSkinPumpkin"
#pragma link "dxSkinsCore"
#pragma link "dxSkinsDefaultPainters"
#pragma link "dxSkinSeven"
#pragma link "dxSkinSevenClassic"
#pragma link "dxSkinSharp"
#pragma link "dxSkinSharpPlus"
#pragma link "dxSkinSilver"
#pragma link "dxSkinSpringTime"
#pragma link "dxSkinStardust"
#pragma link "dxSkinSummer2008"
#pragma link "dxSkinTheAsphaltWorld"
#pragma link "dxSkinValentine"
#pragma link "dxSkinVS2010"
#pragma link "dxSkinWhiteprint"
#pragma link "dxSkinXmas2008Blue"
#pragma link "dxSkinBasic"
#pragma link "dxSkinMetropolis"
#pragma link "dxSkinMetropolisDark"
#pragma link "dxSkinOffice2013DarkGray"
#pragma link "dxSkinOffice2013LightGray"
#pragma link "dxSkinOffice2016Colorful"
#pragma link "dxSkinOffice2016Dark"
#pragma link "dxSkinOffice2019Black"
#pragma link "dxSkinOffice2019Colorful"
#pragma link "dxSkinOffice2019DarkGray"
#pragma link "dxSkinOffice2019White"
#pragma link "dxSkinTheBezier"
#pragma link "dxSkinVisualStudio2013Blue"
#pragma link "dxSkinVisualStudio2013Dark"
#pragma link "dxSkinVisualStudio2013Light"
#pragma resource "*.dfm"
// ---------------------------------------------------------------------------
__fastcall Tfrm_poruka::Tfrm_poruka(AnsiString poruka, TColor boja, int vremePrikazivanja)
:TForm(Application)
{
_boja = boja;
_poruka = poruka;
_vreme = vremePrikazivanja;
}
// ---------------------------------------------------------------------------
void __fastcall Tfrm_poruka::FormClose(TObject* Sender, TCloseAction& Action)
{
Action = caFree;
}
// ---------------------------------------------------------------------------
void __fastcall Tfrm_poruka::Timer1Timer(TObject* Sender)
{
Close();
}
// ---------------------------------------------------------------------------
void __fastcall Tfrm_poruka::FormActivate(TObject* Sender)
{
Color = _boja;
lblPoruka->Caption = _poruka;
Timer1->Interval = _vreme;
Timer1->Enabled = true;
Vcl::Forms::TMonitor *monitor = Screen->MonitorFromWindow(reinterpret_cast<NativeUInt>(Application->Handle));
Left = monitor->Left + monitor->Width - 400;
Top = monitor->Top + monitor->Height - 300;
Application->ProcessMessages();
}
// ---------------------------------------------------------------------------
void __fastcall Tfrm_poruka::btnOKClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
object frm_poruka: Tfrm_poruka
Left = 200
Top = 200
ParentCustomHint = False
AlphaBlend = True
AlphaBlendValue = 200
BiDiMode = bdLeftToRight
BorderStyle = bsNone
Caption = 'Poruka'
ClientHeight = 208
ClientWidth = 400
Color = 8905208
TransparentColorValue = clBtnShadow
DragKind = dkDock
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
FormStyle = fsStayOnTop
ParentBiDiMode = False
Position = poScreenCenter
OnActivate = FormActivate
OnClose = FormClose
TextHeight = 13
object Panel1: TPanel
AlignWithMargins = True
Left = 5
Top = 5
Width = 390
Height = 198
Margins.Left = 5
Margins.Top = 5
Margins.Right = 5
Margins.Bottom = 5
Align = alClient
BevelOuter = bvNone
Caption = 'Panel1'
Color = 8976369
ParentBackground = False
TabOrder = 1
end
object lblPoruka: TcxLabel
AlignWithMargins = True
Left = 20
Top = 20
Margins.Left = 20
Margins.Top = 20
Margins.Right = 20
Margins.Bottom = 20
Align = alClient
AutoSize = False
Caption = 'Poruka - nebitna '
ParentColor = False
ParentFont = False
Style.Color = 8976369
Style.Font.Charset = DEFAULT_CHARSET
Style.Font.Color = clWindowText
Style.Font.Height = -24
Style.Font.Name = 'Tahoma'
Style.Font.Style = []
Style.IsFontAssigned = True
Properties.WordWrap = True
Height = 168
Width = 360
end
object btnOK: TButton
Left = 305
Top = 163
Width = 75
Height = 25
Caption = 'OK'
TabOrder = 2
OnClick = btnOkClick
end
object Timer1: TTimer
Enabled = False
Interval = 3000
OnTimer = Timer1Timer
Left = 40
Top = 56
end
end
// ---------------------------------------------------------------------------
#ifndef c_porukaH
#define c_porukaH
// ---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "cxContainer.hpp"
#include "cxControls.hpp"
#include "cxEdit.hpp"
#include "cxGraphics.hpp"
#include "cxLabel.hpp"
#include "cxLookAndFeelPainters.hpp"
#include "cxLookAndFeels.hpp"
#include <ExtCtrls.hpp>
#include "cxButtons.hpp"
#include <Menus.hpp>
#include "dxSkinBlack.hpp"
#include "dxSkinBlue.hpp"
#include "dxSkinBlueprint.hpp"
#include "dxSkinCaramel.hpp"
#include "dxSkinCoffee.hpp"
#include "dxSkinDarkRoom.hpp"
#include "dxSkinDarkSide.hpp"
#include "dxSkinDevExpressDarkStyle.hpp"
#include "dxSkinDevExpressStyle.hpp"
#include "dxSkinFoggy.hpp"
#include "dxSkinGlassOceans.hpp"
#include "dxSkinHighContrast.hpp"
#include "dxSkiniMaginary.hpp"
#include "dxSkinLilian.hpp"
#include "dxSkinLiquidSky.hpp"
#include "dxSkinLondonLiquidSky.hpp"
#include "dxSkinMcSkin.hpp"
#include "dxSkinMoneyTwins.hpp"
#include "dxSkinOffice2007Black.hpp"
#include "dxSkinOffice2007Blue.hpp"
#include "dxSkinOffice2007Green.hpp"
#include "dxSkinOffice2007Pink.hpp"
#include "dxSkinOffice2007Silver.hpp"
#include "dxSkinOffice2010Black.hpp"
#include "dxSkinOffice2010Blue.hpp"
#include "dxSkinOffice2010Silver.hpp"
#include "dxSkinOffice2013White.hpp"
#include "dxSkinPumpkin.hpp"
#include "dxSkinsCore.hpp"
#include "dxSkinsDefaultPainters.hpp"
#include "dxSkinSeven.hpp"
#include "dxSkinSevenClassic.hpp"
#include "dxSkinSharp.hpp"
#include "dxSkinSharpPlus.hpp"
#include "dxSkinSilver.hpp"
#include "dxSkinSpringTime.hpp"
#include "dxSkinStardust.hpp"
#include "dxSkinSummer2008.hpp"
#include "dxSkinTheAsphaltWorld.hpp"
#include "dxSkinValentine.hpp"
#include "dxSkinVS2010.hpp"
#include "dxSkinWhiteprint.hpp"
#include "dxSkinXmas2008Blue.hpp"
#include "dxSkinBasic.hpp"
#include "dxSkinMetropolis.hpp"
#include "dxSkinMetropolisDark.hpp"
#include "dxSkinOffice2013DarkGray.hpp"
#include "dxSkinOffice2013LightGray.hpp"
#include "dxSkinOffice2016Colorful.hpp"
#include "dxSkinOffice2016Dark.hpp"
#include "dxSkinOffice2019Black.hpp"
#include "dxSkinOffice2019Colorful.hpp"
#include "dxSkinOffice2019DarkGray.hpp"
#include "dxSkinOffice2019White.hpp"
#include "dxSkinTheBezier.hpp"
#include "dxSkinVisualStudio2013Blue.hpp"
#include "dxSkinVisualStudio2013Dark.hpp"
#include "dxSkinVisualStudio2013Light.hpp"
// ---------------------------------------------------------------------------
class Tfrm_poruka:public TForm
{
__published: // IDE-managed Components
TcxLabel* lblPoruka;
TTimer* Timer1;
TPanel* Panel1;
TButton *btnOK;
void __fastcall FormClose(TObject* Sender, TCloseAction& Action);
void __fastcall Timer1Timer(TObject* Sender);
void __fastcall FormActivate(TObject* Sender);
void __fastcall btnOKClick(TObject *Sender);
private: // User declarations
TColor _boja;
AnsiString _poruka;
int _vreme;
public: // User declarations
__fastcall Tfrm_poruka(AnsiString poruka, TColor boja, int vremePrikazivanja);
};
// ---------------------------------------------------------------------------
// extern PACKAGE Tfrm_poruka *frm_poruka;
// ---------------------------------------------------------------------------
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment