From cc1a3d434e0dcdeab16378a5304c46179cab1d97 Mon Sep 17 00:00:00 2001 From: CJY Date: Tue, 3 Feb 2026 18:00:31 +0900 Subject: [PATCH] =?UTF-8?q?=20-=20Pay=20Service=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Document/DLL/libPayService.dll | Bin 0 -> 16896 bytes INT89DB_26.suo | Bin 243712 -> 251904 bytes INT89DB_26/DataStore.cs | 465 ++++++++- INT89DB_26/DialogForms/DialogFormMessage.cs | 279 +++++- INT89DB_26/Forms/FormCommunication.cs | 78 +- INT89DB_26/Forms/FormFactoryReset.cs | 4 +- INT89DB_26/Forms/FormInformation.cs | 4 +- INT89DB_26/Forms/FormMain.cs | 538 ++++++++++- INT89DB_26/Forms/FormMainDisplay.cs | 28 +- INT89DB_26/Forms/FormMenu.Designer.cs | 12 + INT89DB_26/Forms/FormMenu.cs | 50 +- INT89DB_26/Forms/FormMenu.resx | 3 + .../Forms/FormOptionSetting.Designer.cs | 21 +- INT89DB_26/Forms/FormOptionSetting.cs | 19 +- INT89DB_26/Forms/FormOptionSetting.resx | 883 +++++++++--------- .../Forms/FormProgramUpdate.Designer.cs | 320 +++++-- INT89DB_26/Forms/FormProgramUpdate.cs | 527 +++++++++-- INT89DB_26/Forms/FormProgramUpdate.resx | 242 +++++ INT89DB_26/Forms/FormSystemSetting.cs | 12 + INT89DB_26/Forms/FormUserSetting.cs | 6 +- INT89DB_26/INT89DB_26.csproj | 11 + .../Part11_Encryption/Encryption.Define.cs | 34 + .../Part11_Encryption/Encryption.Structure.cs | 25 + INT89DB_26/Part11_Encryption/Encryption.cs | 62 ++ INT89DB_26/Part11_UserManager/UserItem.cs | 439 +++++++++ .../Part11_UserManager/UserManager.Define.cs | 185 ++++ .../UserManager.Structure.cs | 379 ++++++++ INT89DB_26/Part11_UserManager/UserManager.cs | 415 ++++++++ INT89DB_26/Version.txt | 6 + ..._26_ImageDll.csproj.GenerateResource.Cache | Bin 12756 -> 12756 bytes 30 files changed, 4308 insertions(+), 739 deletions(-) create mode 100644 Document/DLL/libPayService.dll create mode 100644 INT89DB_26/Part11_Encryption/Encryption.Define.cs create mode 100644 INT89DB_26/Part11_Encryption/Encryption.Structure.cs create mode 100644 INT89DB_26/Part11_Encryption/Encryption.cs create mode 100644 INT89DB_26/Part11_UserManager/UserItem.cs create mode 100644 INT89DB_26/Part11_UserManager/UserManager.Define.cs create mode 100644 INT89DB_26/Part11_UserManager/UserManager.Structure.cs create mode 100644 INT89DB_26/Part11_UserManager/UserManager.cs diff --git a/Document/DLL/libPayService.dll b/Document/DLL/libPayService.dll new file mode 100644 index 0000000000000000000000000000000000000000..2f197d85b76d0243a96f130e3ec72964af50dfb5 GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/INT89DB_26.suo b/INT89DB_26.suo index f534f9a5c290d156a48e8477f754d28e38dc8562..8fac3c9a5b7caff45fd9c03705d3c806efbd8591 100644 GIT binary patch delta 12942 zcmc&)30zgx)<0|Sd+{=epooBo7ces=MKmHLx!`On;FK9DnA*#cjLaD{vocL&8%s?M z$;_dMq`dE$CEDaOU!wKO%nWTFR2(X+r+oi?&b=VL*Z00&@Av!oxxDA>v&Xg9@Ly~1 z!rH*Xie?oRf@Y`}#GTY%wUpbbz1l0c2NrF9tLU>;$4MH7;aX5R$2O20K6p+5smvQX zC|9seU9wlv`pUof^rN7=Yg*j;(EOJDO3qxjdi3bvchosYe5K2=SUTE~VfcDlRbKSB z5xFXV3h*b{-7t9XOzK8PWsksqvY9XlRSjVn%|RJzWpIm#WhiJ4`rG#I&CgyrQ>SZ0 z;k}bl`D$>oXcDXEhkjfv(<)sdNrJjp&JKOl<~z_BZzLPp#uScTM=e!I>jd9%zb=Z4 z9&g-jBe2gMEpO)m}=aMR@UE0W4zka`a#i=R8g1CK5;0WBr4}b&LN*3cpmdk z<=xN~iZ#;pI?OnqlMDcZsze_$@`LydjC)&Yxn+ zG98?EKlSCDXQ>0-&KsYnvFv9Ur-oI&;+p za;n;030&A556)ROes7CNQia*hN@w;_LEF^qG1n^R*jP#a=IremcEcz$OH0Sbs@H5? z1F}()=UJ*cJn2StI%m16*lJT%(*~)6ck_AdG?Arpo)6|`Q$=XmIH7_cnV_m(Yt1eP z#j0hMBe;{DdZ@aGf>ilK{*|r?Cmm|+d+oXUUJaMYJ0HBZO!|bmdFae<4*kBdRiL#woiDCWH4hmAUjcKD~mpMfgqnrha_NiEWp4!{Gb#Xk{R#@OrPhQC7=|0p(6}Vfe0ZYr(h)1`pu@%iK zo0W_wRkf-+7nO<_yMPq#=Z!rm?V1E5-nhZ&Y9t!%AV+r_5M+^#ax4ki!M;6-gi|sG|1it zW%INO^(uZWlDexlkF~XZhfS??J+_H#ALysAR)h)Vx;?^_6Z%v$;1Dm^En?^eiy5w0 z!JX2rDChy{GWi{&S=JMZW#il-bVya*8mfZxx~tMB{Z#zb!z747~xg4O9x+2)a^NSN9ZtpY}X&#_uzrt)ShWvhDbN7W5pb z+*4M8-xokTK$V~uK`()He{RpOe%ACd-ruwvWT@KJVN-R<>nM5Ss#^Q;{8!KW+xR`` zd431Khd>uVXlDMsi|6-1e+TKl^q>Cy5bwu8AAyd8J_emodsnwznHQ;QR@<&SgMzal zUHKe-&wHM|o&13JA3>L_Mm8FvXzlGmJ5e+S6amsz)s(eij(vDp08-1=x*WQ6uzq=O zZI1c!ynab}qRRFc{gCxmY~_dRuC?=(86re0U6vYinO7F;DBdfg<4oOuX6m}bwU*{j#YcU3*|@e6>Zgt7l&#Cq*8Z>diwDx z&V;3S{S;xrhA~sEoRX=^54YyPED@>VOR~%tZJ&5^KQTfTy;D^3qJ(zuud!D;58W$a ze)g(8@3v8c_qI}4qc&k!^wut_SxK~BW98*{rA-wsit)<3W)q$>H5dFXLv{3&-Pfy> zebwMEKH)`k=^)Hh4E5sN61qWc_+<_+ew@~Fbtak0O1rts^K>T{cBeo(#w+~jaXQb@ zv*~RvY9%|!U2tN1`pMLsW2$v*6~lfU|8LM!#%o7zKo*kAue%Z)bkFz;~@Tah`0{k%1^y= zCA{pCP~*OcR|Dtnt=86WjVfA}$T^iF%3g*MW^&q_V4B|OH`K|wZMi6& zb}Gt?Ha%LwyLXr>bK=F>#ammm(?&aChgH|RlHEaesL(EjGyV_097?&WYS?0ma)3#$~9{pL?TY@U(lS~>TGc;iAANnXMPVdFkk2csMMZiDoNeLi9dHQWuWSq5=dG zY0geuI6!k}D4mMt7bl~K>N(xnnT3WIA45a1GKGg`&|>9!dliLS+gS4#VQwRJwQz~K zttZ!V42`#;=WzJP}Ma?U*P z5C~s0E?K?P$=ZWBz09XLr=3WlB1^_{-o(&;bF`BH$hD*}*uCdrh%j)!g9{&~bS@kr z^XOZCrN3N3A6deLp-o}p+Q%?sL>324NtHq1RB8>qfO+cJfnCd}C%4O@Y_1+7BJGDE zYUep^B7Mx6Z&4`rz^nx{+*9w%`=+otiyMTk%GwD`u0I#ff{I9PRt%lN?w5E26CW;R zfzOX)Chuj7Nu1YFMl`WF{R>ZBLl06OuY7_gbNo^Ap?A1odqY%{z@>v_5-e1)B?DMk zU%Jr^2iiw-z>Iu+z)z9FIVEJHGLGH`{mXlToHWkDy_u2j$PM(FofDd(@Dq;q$HrEy z0}CKvV=Q2MiI+b?k7|J*!qszOO|-I_qE5GRR=DPr2EnEnr|PXaWNCh~HW%HvVi)C@ z9OIPD&@#`wOl_xSmT^FYHj3ld(-IVD6FQ)=ka`{PU>MeEpu0?W+~AlSmwPRH01RcR zwq4dLVzm;R#w(1gw!xBDjgqVEUt&`ibM%K|s_N`)&b6z-AX%b-nts%TZnvya%DuC9PuBFZ9ZYaM|a(6LLccz>2*umn`w>zz_MQ^Zz~QY za^5$nW7=g%ag@0}T5jr*wqIOxfs%LrKs5nW%qN9#lj1c}bh)M+(s>`K2s9Hk3$zS0 z8#D*B0JPkFT8b9w>ikRLe73J}1LJw1qXyp^tZV3KCKHO@L0maN%+fB_UEW^|wX1XA zgsYnEfo=dbKcp}gchMM?zt0fI5SjN;@lS^%&X}%|xvHAnN`3TDdsQo7a z0CNn<1}xV34DGf}SpAAvg zaJB5IW;)6OZUyR}QlFryNBwKR8&wa*RZf)-2S=DO)RPy?;8AUPrKxIqp|u-PQV&81 z(QRkGD6|)(141SsJCbeYMH*n`@3o1)2`!BspFR>74c;MVXlT5rvy=`{ASg(kQ)zD3 z98u-3W81iwN&+nsl?sgB0hVgi+_@18EqG5qbGeNTvQ~1Ub0Mo>-wCsd-;MQ&?sf`&o zsN#dk?&J-ksicu5Ps7jG=Pcv+u{AQFwKp@F2S}|ml{4T&rUGE+8ROlqGEs$?Fm8#N zAq;IS>s;}W2;{;5IlSpXOl68EtnBBmds>j-MF+(YEo<^97E-sHp5UDI!p8CIfNxCq zsS`z72ID`Z(vmSilhr9vfSqQlGIIrBk2bmRg@ z=9{Vj1Y}}UpOV*v)9u_RI*?6bvHDcNo&TCxW>X2bhj8Ja5nOKCEjE`V%6amn=Fnxa zkd9d6nuyDEV7;}yT+b2hDU)u{c@gc*q7>Y|9D+uvCuuuOtBK0Yz^y+-{2b@K2&b@x z_Z|>0>p|i)j!)WIEkbM{Lq;{`nL1QS=%5uv%`Fk?d+M zZPKNiucv}0{n7^w7^JKBllLL=3*f?2XtLl-G(mskIsOv5Kk$>chxiN%({?SwD%(Gk z(*Fw>R8PXgfdRMvF(LkE1=OAQ@~lw%u^@BJ{pw53iAa-S3;n>be>_244GKQ`Cjay5F!y{#cEfdG_naQ}GktjZ&#C9`@Cw>6%_?=e>Y z=kc|9cbF^JyOj2ncz}1;dL_$|C})`88cmrCPl|v>Vr{00BD_V>o4*ncoiPQ}jSdyD z4xLl$;L&dTTSzx<;h!qywTKp?Kc->+2T)Q0V~Iaim(f<J6R`XhX*kpZh*PRpO!{^t~z(2q{EAo7G;p!Xw(5;38$ZgeU^bKCwncCQ0C`#u& zFHuYW;votw*-T+-NBb}pe-PpH{UWMKU7Z2I@_SEsZupN*c+};LSa$v_w%ESMv`iy< z@n@0JBvL2)HLU;_*Me4p)`N5z4-)cEHuLGvLgv^GqMRe83@fO{(_5gwg8mLV0(uwp z9_Se8eb5J>qo9vK_k%tL9S5BRodA6TssYUfodSId`V90r=nK%7pszq*gT4Xjd3gR- zP9D6|CimNI2*}LE@I_xaCwR}L9_2A8(SK-Q2+qpDai{5PTOMVRu5v%_#F;Uaq`Dtm z%?ZyVG zi}-ENrQx!jLr>~FhSOa2UkYhhst2zZ)dWja+oLeVTkCuDb=<7v73gkS5r+96!G~jw zK6JO5Ux((cJk5QMqSj-C!|#DMJ-Dh$NNU{>?GE=dssyU)Px{Z`Cy$BP7BKWiI4A-X z3BtJ^@41VjaWX)GYF}L3zdo$XRb`jbRl9Cs-2Y)X@WQn;-uJ?rC5659B6(q;d`4Y7 z7{^BfM6w$Gw@6M-gp;W5A)0e~rAV=F`{B^xfxOTuTLHPX9f6?PaWIIhoU&QMKKnBQ z`hyALO#Zt}lWAY2tdG-k*MIui0^HWSu~ggLRNfaOoSYLaojhZw928vk@#1?scxvcA z1mE+uh%Nb6!-g1HBURx&VJi8E=fF5;T7(+4aZvpc6`v@RLwMXyIhun$5jGPIz#ZPp ziw=l%Gcx9yzlxp>K@^Y}_x&qkH8Yj056nkdp_)#wX*^D(!N+<=VstptQabemFyl!x zm97%~?IoCH9`9``Z_^%IC(rAwE`V2(Ok77je+98~*1`S*C>_KIer79(z*CU1f?aRe zuR(u5tF+iVN`@ez5|tpw+12?ok#q;I>@M%zoFoMYCCf0L*i)u(V2lXhykzO1Rs3Y4 zjOGo=(#N+HU2FuE@z@yAn&WShI0xXdePs_GnJU}y`P<q8lfwU4_0A1v|`$a4Ma}U|h$A&Gj6JL2<#JHU)(&?v)KTqPa3nGjwVkp2= z9xbF?jS-%y>MN-sD6soC-~LGqN8{8O&{FTcyQ;r*Nj|>=VQp!M2(wSZa6en=B^;lG znT2!J#g`ba3{ZB@%jPE1r|XX^9C6T#X&_zeC{zaD*`dQI~ z4332IEF5imYc$B4jiWj@wDgoe+ZoN{;=mwF3(ixZ=xvnDle1`(nw@F_u5-Au zaqJ_n);ey-HtCR%C+Yol_{s5CgZTkne&;sv-VU;bS4#^xtdk7j?1-xv)7s=084yqzaamVLS7 zFmT~go-F4p3*`|`93~HN#W?A3JF?|ElHK&IaX*nu@02~c?-;pdXOZkrHf_?aWXDQ) z7n>6n-*Q;Ra=5Ln_bp$^4DIFYZQ-k~xPMY|zp&?Oufh{I$=li+MoZ&=#aWGRFPfRa z=DyP!U19XqR{`>kB;zIxrx&towM;|yQ=>B#Z405^$R32^DjO)>`1xuxN`rhA&!cmmN6nCYj>=ag)fzCk*?O(#a$g(g@VFB-uNbp|CWl&UDb1t zf$t+-Tzahx=yvs<{5#9)IWTqCZIKI!$JzANFHh`F3%JWVF}B`-h5F;J-HG-G92nou zKVA{nL|ezNoskUx=kv&4ZcLspdE<16D^kmC)^TpCHUJ6y^Can%+P8ZR$h^kN(e*c# z1G_yQ$@eMdk;GNC)Jne=CE4<*duN{flO0)?UcM9scE*CVZrERgK3Mq{E`3qr)^2E5 z`!1A~n>iSEz9eIP0SOHw+S?)qU%#@xmg1}G^+v)(6dl3p_1}N%G{#D^JkT*G1>nkz zSv#3~%0b~cfVS=t{edjbZ)Ly?W6x(>LTvETZ9J&Hps^qPcY^b4RDXDVw|qd?deGhi z&pHx^@ET4~45%IG8ql?%6i`o)_YB6#{!8Q&T)hGaV$M*x*1hb0SuE-$(pUGRBl;*l zypUR@{ZajT(|hN*t2X)oo&V;}an@DBhRa!3-AIN={`$`GU?T%6p>H2IBrJXy==fS- z{$2$~XwoIzyl(AZf883g`ofS@-to1FrwRN*ADO|02ZYQ1ROcP;J~~8P!R1bb;?iY-9QT58<}Qo#2FT!D%!2tluw=j>d(UeZv5|v;%d+fjV*JVy+DF&k459 zNleV9G0~uB3DMkK8R$Q~ZuFY#rynPc#!PEh|H(Qj`TOK_eNy7aNl70<&eyCpwH`s5 pO+psR?q-ROK^ER7A9R;z$%n~Zy-2?9uX;ODihW)6|5Uuq@jnD_)g%A_ delta 9596 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 Months; + #endregion + + #region Constructor + public DataBackupYear(string year) + { + this.Initialize(); + + this.Year = year; + } + #endregion + + #region Property + public string Year + { + get { return this.m_Year; } + private set { this.m_Year = value; } + } + #endregion + + #region Method + private void Initialize() + { + this.Year = ""; + this.Months = new List(); + } + #endregion + } + #endregion + #region DataBackupMonth + public class DataBackupMonth + { + #region Field + private string m_Month; + + public List Days; + #endregion + + #region Constructor + public DataBackupMonth(string month) + { + this.Initialize(); + + this.Month = month; + } + #endregion + + #region Property + public string Month + { + get { return this.m_Month; } + private set { this.m_Month = value; } + } + #endregion + + #region Method + private void Initialize() + { + this.Month = ""; + this.Days = new List(); + } + #endregion + } + #endregion + + #region FileHeaderItem + public class FileHeaderItem + { + #region Field + private int m_EquipmentColumns; + private int m_EquipmentType; + + private string m_LoginId; + private string m_SerialNumber; + + private DateTime m_TimeStamp; + #endregion + + #region Constructor + public FileHeaderItem() + { + } + #endregion + + #region Property + public int EquipmentColumns + { + get { return this.m_EquipmentColumns; } + set { this.m_EquipmentColumns = value; } + } + public int EquipmentType + { + get { return this.m_EquipmentType; } + set { this.m_EquipmentType = value; } + } + + public string LoginId + { + get { return this.m_LoginId; } + set { this.m_LoginId = value; } + } + public string SerialNumber + { + get { return this.m_SerialNumber; } + set { this.m_SerialNumber = value; } + } + + public DateTime TimeStamp + { + get { return this.m_TimeStamp; } + set { this.m_TimeStamp = value; } + } + #endregion + + #region Method + #endregion + } + #endregion } diff --git a/INT89DB_26/DialogForms/DialogFormMessage.cs b/INT89DB_26/DialogForms/DialogFormMessage.cs index 8421377..6605fb7 100644 --- a/INT89DB_26/DialogForms/DialogFormMessage.cs +++ b/INT89DB_26/DialogForms/DialogFormMessage.cs @@ -1888,6 +1888,281 @@ namespace INT89DB_26.DialogForms break; } } + public DialogFormMessage(int errCode, DataStore.E_LanguageID language, DataStore.E_FormStore screen) + { + InitializeComponent(); + + this.labelErrorCode.Text = ""; + this.labelMessage1.Text = ""; + this.labelMessage2.Text = ""; + + int screenNum = (int)screen; + + switch (screen) + { + case DataStore.E_FormStore.FormProgramUpdate: + if (language == DataStore.E_LanguageID.Korean) + { + this.buttonOK.Text = "OK"; + + #region 한글 + switch (errCode) + { + case 1: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_01"; + this.labelMessage1.Text = "파일명이 올바르지 않습니다"; + this.labelMessage2.Text = ""; + break; + case 2: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_02"; + this.labelMessage1.Text = "시리얼 번호가 올바르지 않습니다"; + this.labelMessage2.Text = ""; + break; + case 3: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_03"; + this.labelMessage1.Text = "파일을 찾을 수 없습니다"; + this.labelMessage2.Text = ""; + break; + case 4: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_04"; + this.labelMessage1.Text = "파일 상태에 문제가 있습니다"; + this.labelMessage2.Text = ""; + break; + case 5: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_05"; + this.labelMessage1.Text = "파일의 시리얼 번호가 현재 장비와 일치하지 않습니다"; + this.labelMessage2.Text = ""; + break; + case 6: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_06"; + this.labelMessage1.Text = "UID가 일치하지 않습니다"; + this.labelMessage2.Text = ""; + break; + case 7: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_07"; + this.labelMessage1.Text = "키 타입이 올바르지 않습니다"; + this.labelMessage2.Text = ""; + break; + default: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_99"; + this.labelMessage1.Text = "제조사에 문의하세요"; + this.labelMessage2.Text = ""; + break; + } + #endregion + } + else if (language == DataStore.E_LanguageID.English) + { + this.buttonOK.Text = "OK"; + + #region 영문 + switch (errCode) + { + case 1: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_01"; + this.labelMessage1.Text = "The file name is incorrect"; + this.labelMessage2.Text = ""; + break; + case 2: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_02"; + this.labelMessage1.Text = "Serial number is incorrect"; + this.labelMessage2.Text = ""; + break; + case 3: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_03"; + this.labelMessage1.Text = "file not found"; + this.labelMessage2.Text = ""; + break; + case 4: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_04"; + this.labelMessage1.Text = "There is a problem with the file status"; + this.labelMessage2.Text = ""; + break; + case 5: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_05"; + this.labelMessage1.Text = "The serial number in the file"; + this.labelMessage2.Text = "does not match your current device"; + break; + case 6: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_06"; + this.labelMessage1.Text = "UID does not match"; + this.labelMessage2.Text = ""; + break; + case 7: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_07"; + this.labelMessage1.Text = "Key type is incorrect"; + this.labelMessage2.Text = ""; + break; + default: + this.labelErrorCode.Text = "Error" + screenNum.ToString() + "_99"; + this.labelMessage1.Text = "Please contact a manufacturer"; + break; + } + #endregion + } + else if (language == DataStore.E_LanguageID.Chinese) + { + this.buttonOK.Text = "确认"; + + #region 중문 + switch (errCode) + { + case 1: + this.labelErrorCode.Text = "错误" + screenNum.ToString() + "_01"; + this.labelMessage1.Text = "文件名不正确"; + this.labelMessage2.Text = ""; + break; + case 2: + this.labelErrorCode.Text = "错误" + screenNum.ToString() + "_02"; + this.labelMessage1.Text = "序列号不正确"; + this.labelMessage2.Text = ""; + break; + case 3: + this.labelErrorCode.Text = "错误" + screenNum.ToString() + "_03"; + this.labelMessage1.Text = "文件未找到"; + this.labelMessage2.Text = ""; + break; + case 4: + this.labelErrorCode.Text = "错误" + screenNum.ToString() + "_04"; + this.labelMessage1.Text = "文件状态有问题"; + this.labelMessage2.Text = ""; + break; + case 5: + this.labelErrorCode.Text = "错误" + screenNum.ToString() + "_05"; + this.labelMessage1.Text = "文件中的序列号与您当前的设备不匹配"; + this.labelMessage2.Text = ""; + break; + case 6: + this.labelErrorCode.Text = "错误" + screenNum.ToString() + "_06"; + this.labelMessage1.Text = "UID 不匹配"; + this.labelMessage2.Text = ""; + break; + case 7: + this.labelErrorCode.Text = "错误" + screenNum.ToString() + "_07"; + this.labelMessage1.Text = "密钥类型不正确"; + this.labelMessage2.Text = ""; + break; + default: + this.labelErrorCode.Text = "错误" + screenNum.ToString() + "_99"; + this.labelMessage1.Text = "请联系厂商"; + this.labelMessage2.Text = ""; + break; + } + #endregion + } + else if (language == DataStore.E_LanguageID.Czech) + { + + } + else if (language == DataStore.E_LanguageID.Russian) + { + this.buttonOK.Text = "OK"; + + #region 러시아어 + switch (errCode) + { + case 1: + this.labelErrorCode.Text = "Ошибка" + screenNum.ToString() + "_01"; + this.labelMessage1.Text = "Имя файла неверно"; + this.labelMessage2.Text = ""; + break; + case 2: + this.labelErrorCode.Text = "Ошибка" + screenNum.ToString() + "_02"; + this.labelMessage1.Text = "Серийный номер неверен"; + this.labelMessage2.Text = ""; + break; + case 3: + this.labelErrorCode.Text = "Ошибка" + screenNum.ToString() + "_03"; + this.labelMessage1.Text = "файл не найден"; + this.labelMessage2.Text = ""; + break; + case 4: + this.labelErrorCode.Text = "Ошибка" + screenNum.ToString() + "_04"; + this.labelMessage1.Text = "Возникла проблема со статусом файла"; + this.labelMessage2.Text = ""; + break; + case 5: + this.labelErrorCode.Text = "Ошибка" + screenNum.ToString() + "_05"; + this.labelMessage1.Text = "Серийный номер в файле не"; + this.labelMessage2.Text = "соответствует вашему текущему устройству"; + break; + case 6: + this.labelErrorCode.Text = "Ошибка" + screenNum.ToString() + "_06"; + this.labelMessage1.Text = "UID не соответствует"; + this.labelMessage2.Text = ""; + break; + case 7: + this.labelErrorCode.Text = "Ошибка" + screenNum.ToString() + "_07"; + this.labelMessage1.Text = "Тип ключа неверен"; + this.labelMessage2.Text = ""; + break; + default: + this.labelErrorCode.Text = "Ошибка" + screenNum.ToString() + "_99"; + this.labelMessage1.Text = "Свяжитесь с производителем"; + this.labelMessage2.Text = ""; + break; + } + #endregion + } + else if (language == DataStore.E_LanguageID.German) + { + this.buttonOK.Text = "Bestätigen"; + + #region 독일어 + switch (errCode) + { + case 1: + this.labelErrorCode.Text = "Fehler" + screenNum.ToString() + "_01"; + this.labelMessage1.Text = "Der Dateiname ist falsch"; + this.labelMessage2.Text = ""; + break; + case 2: + this.labelErrorCode.Text = "Fehler" + screenNum.ToString() + "_02"; + this.labelMessage1.Text = "Die Seriennummer ist falsch"; + this.labelMessage2.Text = ""; + break; + case 3: + this.labelErrorCode.Text = "Fehler" + screenNum.ToString() + "_03"; + this.labelMessage1.Text = "Datei nicht gefunden"; + this.labelMessage2.Text = ""; + break; + case 4: + this.labelErrorCode.Text = "Fehler" + screenNum.ToString() + "_04"; + this.labelMessage1.Text = "Es liegt ein Problem mit dem Dateistatus vor"; + this.labelMessage2.Text = ""; + break; + case 5: + this.labelErrorCode.Text = "Fehler" + screenNum.ToString() + "_05"; + this.labelMessage1.Text = "Die Seriennummer in der Datei stimmt"; + this.labelMessage2.Text = "nicht mit Ihrem aktuellen Gerät überein"; + break; + case 6: + this.labelErrorCode.Text = "Fehler" + screenNum.ToString() + "_06"; + this.labelMessage1.Text = "UID stimmt nicht überein"; + this.labelMessage2.Text = ""; + break; + case 7: + this.labelErrorCode.Text = "Fehler" + screenNum.ToString() + "_07"; + this.labelMessage1.Text = "Der Schlüsseltyp ist falsch"; + this.labelMessage2.Text = ""; + break; + default: + this.labelErrorCode.Text = "Fehler" + screenNum.ToString() + "_99"; + this.labelMessage1.Text = "Hersteller kontaktieren"; + this.labelMessage2.Text = ""; + break; + } + #endregion + } + else + { + + } + break; + default: + break; + } + } public DialogFormMessage(DataStore.MessageBoxIcon icon, string code, string message1, string message2, int autoClose_sec) { InitializeComponent(); @@ -1938,7 +2213,7 @@ namespace INT89DB_26.DialogForms #endregion #region Method - private void InitializeContnrol() + private void InitializeControl() { int x = 0, y = 0; @@ -1956,7 +2231,7 @@ namespace INT89DB_26.DialogForms { base.OnLoad(e); - this.InitializeContnrol(); + this.InitializeControl(); } #endregion diff --git a/INT89DB_26/Forms/FormCommunication.cs b/INT89DB_26/Forms/FormCommunication.cs index 3ed63cf..550c70e 100644 --- a/INT89DB_26/Forms/FormCommunication.cs +++ b/INT89DB_26/Forms/FormCommunication.cs @@ -104,7 +104,7 @@ namespace INT89DB_26.Forms { this.comboBoxTCPOperationMode.Items.Clear(); this.comboBoxTCPOperationMode.SelectedIndexChanged -= new EventHandler(this.comboBoxOperationMode_SelectedIndexChanged); - this.comboBoxTCPOperationMode.Items.Add("-"); + this.comboBoxTCPOperationMode.Items.Add("None"); this.comboBoxTCPOperationMode.Items.Add("Server"); this.comboBoxTCPOperationMode.Items.Add("Client"); this.comboBoxTCPOperationMode.SelectedIndex = 0; @@ -112,10 +112,11 @@ namespace INT89DB_26.Forms this.comboBoxTCPMode.Items.Clear(); this.comboBoxTCPMode.SelectedIndexChanged -= new EventHandler(this.comboBoxMode_SelectedIndexChanged); - this.comboBoxTCPMode.Items.Add("-"); + this.comboBoxTCPMode.Items.Add("None"); this.comboBoxTCPMode.Items.Add("STD1"); // index : 1 this.comboBoxTCPMode.Items.Add("STD2"); // index : 2 - this.comboBoxTCPMode.Items.Add("Modbus"); // index : 99 + if (this.ParentForm.SystemConfig.IsModbus == true) + this.comboBoxTCPMode.Items.Add("Modbus"); this.comboBoxTCPMode.SelectedIndex = 0; this.comboBoxTCPMode.SelectedIndexChanged += new EventHandler(this.comboBoxMode_SelectedIndexChanged); @@ -130,7 +131,7 @@ namespace INT89DB_26.Forms this.comboBoxSerial3Mode.Items.Clear(); this.comboBoxSerial3Mode.SelectedIndexChanged -= new EventHandler(this.comboBoxSerial3Mode_SelectedIndexChanged); - this.comboBoxSerial3Mode.Items.Add("-"); + this.comboBoxSerial3Mode.Items.Add("None"); this.comboBoxSerial3Mode.Items.Add("STD1"); // index : 1 this.comboBoxSerial3Mode.Items.Add("STD2"); // index : 2 if (this.ParentForm.SystemConfig.IsFeedbackBoard == true) @@ -183,7 +184,33 @@ namespace INT89DB_26.Forms //this.UpdateDisplayCom3(); //#endregion } - + + public void RefreshComboBoxSerial3FeedbackBoard(bool bValue) + { + this.comboBoxSerial3Mode.SelectedIndexChanged -= new EventHandler(this.comboBoxSerial3Mode_SelectedIndexChanged); + if (bValue == true) + { + this.comboBoxSerial3Mode.Items.Add("FB_Board"); // index : 98 + + this.comboBoxSerial3Mode.SelectedItem = "FB_Board"; + + if (this.ParentForm.SystemConfig.IsFeedback == true) + { + this.comboBoxSerial3BaudRate.Enabled = false; + this.comboBoxSerial3Mode.Enabled = false; + } + } + else + { + this.comboBoxSerial3Mode.Items.Remove("FB_Board"); // index : 98 + + this.comboBoxSerial3Mode.SelectedIndex = 0; + this.comboBoxSerial3BaudRate.Enabled = true; + this.comboBoxSerial3Mode.Enabled = true; + } + this.comboBoxSerial3Mode.SelectedIndexChanged += new EventHandler(this.comboBoxSerial3Mode_SelectedIndexChanged); + } + private void EthernetStart() { this.buttonEthernetStart.Enabled = true; @@ -238,16 +265,19 @@ namespace INT89DB_26.Forms this.comboBoxSerial3Mode.SelectedIndexChanged -= new EventHandler(this.comboBoxSerial3Mode_SelectedIndexChanged); switch (this.ParentForm.SystemConfig.Serial3Mode) { - case (int)DataStore.CommunicationMode.f1_STD1: + case (int)DataStore.E_CommMode.f1_STD1: this.comboBoxSerial3Mode.SelectedItem = "STD1"; break; - case (int)DataStore.CommunicationMode.f2_STD2: + case (int)DataStore.E_CommMode.f2_STD2: this.comboBoxSerial3Mode.SelectedItem = "STD2"; break; - case (int)DataStore.CommunicationMode.f98_FB_Board: + case (int)DataStore.E_CommMode.f98_FB_Board: this.comboBoxSerial3Mode.SelectedItem = "FB_Board"; - this.comboBoxSerial3BaudRate.Enabled = false; - this.comboBoxSerial3Mode.Enabled = false; + if (this.ParentForm.SystemConfig.IsFeedback == true) + { + this.comboBoxSerial3BaudRate.Enabled = false; + this.comboBoxSerial3Mode.Enabled = false; + } break; default: break; @@ -272,7 +302,7 @@ namespace INT89DB_26.Forms this.comboBoxTCPOperationMode.SelectedIndexChanged -= new EventHandler(this.comboBoxOperationMode_SelectedIndexChanged); // 통신모드 - if (this.ParentForm.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f99_Modbus) + if (this.ParentForm.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f99_Modbus) this.comboBoxTCPMode.SelectedItem = "Modbus"; else this.comboBoxTCPMode.SelectedIndex = this.ParentForm.SystemConfig.EthernetMode; @@ -354,12 +384,12 @@ namespace INT89DB_26.Forms } private void UpdateProtocolDescriptionEthernet() { - if (this.comboBoxTCPMode.SelectedIndex == (int)DataStore.CommunicationMode.f1_STD1) + if (this.comboBoxTCPMode.SelectedIndex == (int)DataStore.E_CommMode.f1_STD1) { this.labelProtocolDescriptionEthernet_1.Text = "STX[1],ID[5],NO[4],LANE[2],GRD[1],"; this.labelProtocolDescriptionEthernet_2.Text = "WEIGHT[6],ETX[1]"; } - else if (this.comboBoxTCPMode.SelectedIndex == (int)DataStore.CommunicationMode.f2_STD2) + else if (this.comboBoxTCPMode.SelectedIndex == (int)DataStore.E_CommMode.f2_STD2) { this.labelProtocolDescriptionEthernet_1.Text = "STX[1],ID[5],NO[4],LANE[2],SIGN[1],"; @@ -521,9 +551,9 @@ namespace INT89DB_26.Forms { string data = ""; - if (this.ParentForm.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f1_STD1) + if (this.ParentForm.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f1_STD1) data = this.ParentForm.Protocol_STD1(this.ParentForm.SystemConfig, this.ParentForm.CollectionWeightData[0], 1); - else if (this.ParentForm.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f2_STD2) + else if (this.ParentForm.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f2_STD2) data = this.ParentForm.Protocol_STD2(this.ParentForm.SystemConfig, this.ParentForm.CollectionWeightData[0], 1); switch (this.ParentForm.SystemConfig.EthernetOperationMode) @@ -617,13 +647,13 @@ namespace INT89DB_26.Forms this.ParentForm.SystemConfig.EthernetMode = 0; break; case "STD1": - this.ParentForm.SystemConfig.EthernetMode = (int)DataStore.CommunicationMode.f1_STD1; + this.ParentForm.SystemConfig.EthernetMode = (int)DataStore.E_CommMode.f1_STD1; break; case "STD2": - this.ParentForm.SystemConfig.EthernetMode = (int)DataStore.CommunicationMode.f2_STD2; + this.ParentForm.SystemConfig.EthernetMode = (int)DataStore.E_CommMode.f2_STD2; break; case "Modbus": - this.ParentForm.SystemConfig.EthernetMode = (int)DataStore.CommunicationMode.f99_Modbus; + this.ParentForm.SystemConfig.EthernetMode = (int)DataStore.E_CommMode.f99_Modbus; break; default: break; @@ -1074,13 +1104,13 @@ namespace INT89DB_26.Forms this.ParentForm.SystemConfig.Serial3Mode = 0; break; case "STD1": - this.ParentForm.SystemConfig.Serial3Mode = (int)DataStore.CommunicationMode.f1_STD1; + this.ParentForm.SystemConfig.Serial3Mode = (int)DataStore.E_CommMode.f1_STD1; break; case "STD2": - this.ParentForm.SystemConfig.Serial3Mode = (int)DataStore.CommunicationMode.f2_STD2; + this.ParentForm.SystemConfig.Serial3Mode = (int)DataStore.E_CommMode.f2_STD2; break; case "FB_Board": - this.ParentForm.SystemConfig.Serial3Mode = (int)DataStore.CommunicationMode.f98_FB_Board; + this.ParentForm.SystemConfig.Serial3Mode = (int)DataStore.E_CommMode.f98_FB_Board; break; default: break; @@ -1104,11 +1134,11 @@ namespace INT89DB_26.Forms } private void buttonSerialSend_Click(object sender, EventArgs e) { - if (this.ParentForm.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f1_STD1) + if (this.ParentForm.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f1_STD1) this.ParentForm.SerialPort3_Write(this.ParentForm.Protocol_STD1_NotStxEtx(this.ParentForm.SystemConfig, this.ParentForm.CollectionWeightData[0], 1)); - else if (this.ParentForm.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f2_STD2) + else if (this.ParentForm.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f2_STD2) this.ParentForm.SerialPort3_Write(this.ParentForm.Protocol_STD2_NotStxEtx(this.ParentForm.SystemConfig, this.ParentForm.CollectionWeightData[0], 1)); - else if (this.ParentForm.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f98_FB_Board) + else if (this.ParentForm.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f98_FB_Board) this.ParentForm.SerialPort3_FbBoardTestSend(1); } diff --git a/INT89DB_26/Forms/FormFactoryReset.cs b/INT89DB_26/Forms/FormFactoryReset.cs index d225650..fa3b827 100644 --- a/INT89DB_26/Forms/FormFactoryReset.cs +++ b/INT89DB_26/Forms/FormFactoryReset.cs @@ -114,8 +114,8 @@ namespace INT89DB_26.Forms structItem.IsDataBackup = this.ParentForm.SystemConfig.IsDataBackup; structItem.DummyBool5 = false; - structItem.DummyBool6 = false; - structItem.DummyBool7 = false; + structItem.IsPart11 = false; + structItem.IsModbus = false; structItem.IsFeedbackBoard = false; structItem.IsFeedback = false; structItem.IsLogin = this.ParentForm.SystemConfig.IsLogin; diff --git a/INT89DB_26/Forms/FormInformation.cs b/INT89DB_26/Forms/FormInformation.cs index 929fc36..806df0c 100644 --- a/INT89DB_26/Forms/FormInformation.cs +++ b/INT89DB_26/Forms/FormInformation.cs @@ -107,7 +107,7 @@ namespace INT89DB_26.Forms } private void DefaultSetting() { - this.labelDisplayVer.Text = "8.6.0"; + this.labelDisplayVer.Text = "8.7.0"; this.labelSerialNo.Text = this.ParentForm.SystemConfig.SerialNumber; this.CollectionControlVerLabel = new Collection(); @@ -296,7 +296,7 @@ namespace INT89DB_26.Forms #region Event Handler private void labelSerialNo_Click(object sender, EventArgs e) { - if (this.ParentForm.SystemConfig.CurrentUser.Group == DataStore.UserGroup.Level4Developer) + if (this.ParentForm.SystemConfig.CurrentUser.Group == DataStore.UserGroup.Developer) { this.textBoxSerialNo.Visible = true; this.textBoxSerialNo.BringToFront(); diff --git a/INT89DB_26/Forms/FormMain.cs b/INT89DB_26/Forms/FormMain.cs index 35959ef..bf4d6db 100644 --- a/INT89DB_26/Forms/FormMain.cs +++ b/INT89DB_26/Forms/FormMain.cs @@ -43,7 +43,16 @@ namespace INT89DB_26.Forms private string m_PathSystemFileFolder1; private string m_PathSystemFileFolder2; private string m_PathDataBackupFolder; + private string m_PathDataStatisticsFolder; private string m_PathProgramSaveFolder; + private string m_PathDataFolder; + private string m_PathDataHistoryFolder; + private string m_PathDataInspectionFolder; + private string m_PathDataOthersFolder; + private string m_PathEncryptionFolder; + private string m_PathHeaderFolder; + private string m_PathDataLogFolder; + private static string m_PathBinFolder; // 로그온 색상 public Color ColorLogOff; @@ -171,6 +180,51 @@ namespace INT89DB_26.Forms get { return this.m_PathProgramSaveFolder; } set { this.m_PathProgramSaveFolder = value; } } + public string PathDataStatisticsFolder + { + get { return this.m_PathDataStatisticsFolder; } + private set { this.m_PathDataStatisticsFolder = value; } + } + public string PathDataFolder + { + get { return this.m_PathDataFolder; } + private set { this.m_PathDataFolder = value; } + } + public string PathDataHistoryFolder + { + get { return this.m_PathDataHistoryFolder; } + private set { this.m_PathDataHistoryFolder = value; } + } + public string PathDataInspectionFolder + { + get { return this.m_PathDataInspectionFolder; } + private set { this.m_PathDataInspectionFolder = value; } + } + public string PathDataOthersFolder + { + get { return this.m_PathDataOthersFolder; } + private set { this.m_PathDataOthersFolder = value; } + } + public string PathEncryptionFolder + { + get { return this.m_PathEncryptionFolder; } + set { this.m_PathEncryptionFolder = value; } + } + public string PathHeaderFolder + { + get { return this.m_PathHeaderFolder; } + private set { this.m_PathHeaderFolder = value; } + } + public string PathDataLogFolder + { + get { return this.m_PathDataLogFolder; } + set { this.m_PathDataLogFolder = value; } + } + public static string PathBinFolder + { + get { return m_PathBinFolder; } + private set { m_PathBinFolder = value; } + } public DataStore.EquipmentStatus EquipmentStatus { @@ -293,6 +347,16 @@ namespace INT89DB_26.Forms this.PathSystemFileFolder2 = this.PathLaunchFolder + "SystemFile2\\"; this.PathDataBackupFolder = this.PathLaunchFolder + "DataBackup\\"; this.PathProgramSaveFolder = this.PathLaunchFolder + "Program\\"; + this.PathDataStatisticsFolder = this.PathLaunchFolder + "DataStatistics\\"; + this.PathDataFolder = this.PathLaunchFolder + "Data\\"; + this.PathDataHistoryFolder = this.PathDataFolder + "History\\"; + this.PathDataInspectionFolder = this.PathDataFolder + "Inspection\\"; + this.PathDataOthersFolder = this.PathDataFolder + "Others\\"; + this.PathEncryptionFolder = this.PathLaunchFolder + "Encryption\\"; + this.PathHeaderFolder = this.PathLaunchFolder + "Header\\"; + this.PathDataLogFolder = this.PathLaunchFolder + "Log\\"; + PathBinFolder = this.PathLaunchFolder + "Bin\\"; + this.EquipmentStatus = DataStore.EquipmentStatus.Stop; this.BufferSmartUart = 1000000; // 1MB this.ColorLogOff = Color.Red; @@ -1125,19 +1189,19 @@ namespace INT89DB_26.Forms #endregion // CH3 - if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.SerialPort3_Write(this.Protocol_STD1_NotStxEtx(this.SystemConfig, this.CollectionWeightData[0], 1)); - else if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.SerialPort3_Write(this.Protocol_STD2_NotStxEtx(this.SystemConfig, this.CollectionWeightData[0], 1)); // Ethernet if (this.SystemConfig.IsEthernetEnable == true) { - if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.EthernetWrite(this.Protocol_STD1(this.SystemConfig, this.CollectionWeightData[0], 1)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.EthernetWrite(this.Protocol_STD2(this.SystemConfig, this.CollectionWeightData[0], 1)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f99_Modbus) // Modbus + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f99_Modbus) // Modbus { this.Update30000ModbusData(0); if (this.SystemConfig.EthernetOperationMode == 2) // Client @@ -1185,19 +1249,19 @@ namespace INT89DB_26.Forms #endregion // CH3 - if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.SerialPort3_Write(this.Protocol_STD1_NotStxEtx(this.SystemConfig, this.CollectionWeightData[1], 2)); - else if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.SerialPort3_Write(this.Protocol_STD2_NotStxEtx(this.SystemConfig, this.CollectionWeightData[1], 2)); // Ethernet if (this.SystemConfig.IsEthernetEnable == true) { - if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.EthernetWrite(this.Protocol_STD1(this.SystemConfig, this.CollectionWeightData[1], 2)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.EthernetWrite(this.Protocol_STD2(this.SystemConfig, this.CollectionWeightData[1], 2)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f99_Modbus) // Modbus + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f99_Modbus) // Modbus { this.Update30000ModbusData(1); if (this.SystemConfig.EthernetOperationMode == 2) // Client @@ -1245,19 +1309,19 @@ namespace INT89DB_26.Forms #endregion // CH3 - if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.SerialPort3_Write(this.Protocol_STD1_NotStxEtx(this.SystemConfig, this.CollectionWeightData[2], 3)); - else if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.SerialPort3_Write(this.Protocol_STD2_NotStxEtx(this.SystemConfig, this.CollectionWeightData[2], 3)); // Ethernet if (this.SystemConfig.IsEthernetEnable == true) { - if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.EthernetWrite(this.Protocol_STD1(this.SystemConfig, this.CollectionWeightData[2], 3)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.EthernetWrite(this.Protocol_STD2(this.SystemConfig, this.CollectionWeightData[2], 3)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f99_Modbus) // Modbus + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f99_Modbus) // Modbus { this.Update30000ModbusData(2); if (this.SystemConfig.EthernetOperationMode == 2) // Client @@ -1305,19 +1369,19 @@ namespace INT89DB_26.Forms #endregion // CH3 - if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.SerialPort3_Write(this.Protocol_STD1_NotStxEtx(this.SystemConfig, this.CollectionWeightData[3], 4)); - else if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.SerialPort3_Write(this.Protocol_STD2_NotStxEtx(this.SystemConfig, this.CollectionWeightData[3], 4)); // Ethernet if (this.SystemConfig.IsEthernetEnable == true) { - if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.EthernetWrite(this.Protocol_STD1(this.SystemConfig, this.CollectionWeightData[3], 4)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.EthernetWrite(this.Protocol_STD2(this.SystemConfig, this.CollectionWeightData[3], 4)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f99_Modbus) // Modbus + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f99_Modbus) // Modbus { this.Update30000ModbusData(3); if (this.SystemConfig.EthernetOperationMode == 2) // Client @@ -1365,19 +1429,19 @@ namespace INT89DB_26.Forms #endregion // CH3 - if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.SerialPort3_Write(this.Protocol_STD1_NotStxEtx(this.SystemConfig, this.CollectionWeightData[4], 5)); - else if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.SerialPort3_Write(this.Protocol_STD2_NotStxEtx(this.SystemConfig, this.CollectionWeightData[4], 5)); // Ethernet if (this.SystemConfig.IsEthernetEnable == true) { - if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.EthernetWrite(this.Protocol_STD1(this.SystemConfig, this.CollectionWeightData[4], 5)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.EthernetWrite(this.Protocol_STD2(this.SystemConfig, this.CollectionWeightData[4], 5)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f99_Modbus) // Modbus + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f99_Modbus) // Modbus { this.Update30000ModbusData(4); if (this.SystemConfig.EthernetOperationMode == 2) // Client @@ -1425,19 +1489,19 @@ namespace INT89DB_26.Forms #endregion // CH3 - if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.SerialPort3_Write(this.Protocol_STD1_NotStxEtx(this.SystemConfig, this.CollectionWeightData[4], 5)); - else if (this.SystemConfig.Serial3Mode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.SerialPort3_Write(this.Protocol_STD2_NotStxEtx(this.SystemConfig, this.CollectionWeightData[4], 5)); // Ethernet if (this.SystemConfig.IsEthernetEnable == true) { - if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f1_STD1) // OPT1 + if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f1_STD1) // OPT1 this.EthernetWrite(this.Protocol_STD1(this.SystemConfig, this.CollectionWeightData[4], 5)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f2_STD2) // OPT2 + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f2_STD2) // OPT2 this.EthernetWrite(this.Protocol_STD2(this.SystemConfig, this.CollectionWeightData[4], 5)); - else if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f99_Modbus) // Modbus + else if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f99_Modbus) // Modbus { this.Update30000ModbusData(5); if (this.SystemConfig.EthernetOperationMode == 2) // Client @@ -1492,7 +1556,7 @@ namespace INT89DB_26.Forms } #endregion - if (this.SystemConfig.EthernetMode == (int)DataStore.CommunicationMode.f99_Modbus) // Modbus + if (this.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f99_Modbus) // Modbus { for (int i = 0; i < this.SystemConfig.EquipmentColumns; i++) this.Update30000ModbusData(i); @@ -4381,7 +4445,7 @@ namespace INT89DB_26.Forms return ret; } - private void SerialPort3_FbBoardBooting() + public void SerialPort3_FbBoardBooting() { string value = ""; @@ -4788,6 +4852,9 @@ namespace INT89DB_26.Forms } private void Update30000UpdateData(int index) { + if (this.SystemConfig.IsModbus == false) + return; + if (this.CollectionWeightData[index].UpdateCount > 65535) this.CollectionWeightData[index].UpdateCount = 0; else @@ -4797,6 +4864,9 @@ namespace INT89DB_26.Forms } public void Update30000ModbusData() { + if (this.SystemConfig.IsModbus == false) + return; + for (int i = 0; i < this.SystemConfig.EquipmentColumns; i++) this.Update30000UpdateData(i); @@ -4815,10 +4885,15 @@ namespace INT89DB_26.Forms } public void Update30000ModbusData(int index) { + if (this.SystemConfig.IsModbus == false) + return; + + double weightData = Helper.StringToWeight(this.CollectionWeightData[index].WeightString, this.SystemConfig.DecimalPlaces); + this.Update30000UpdateData(index); this.Current30000ModbusData.ModbusLaneData[index].Grade = this.Grade(this.CollectionWeightData[index].JudgmentStatus); - this.Current30000ModbusData.ModbusLaneData[index].WeightDouble = this.CollectionWeightData[index].Weight; + this.Current30000ModbusData.ModbusLaneData[index].WeightDouble = weightData; this.Current30000ModbusData.ModbusLaneData[index].UnderCount = (UInt32)this.CollectionWeightData[index].UnderCount; this.Current30000ModbusData.ModbusLaneData[index].PassCount = (UInt32)this.CollectionWeightData[index].PassCount; this.Current30000ModbusData.ModbusLaneData[index].OverCount = (UInt32)this.CollectionWeightData[index].OverCount; @@ -5267,8 +5342,8 @@ namespace INT89DB_26.Forms #region StructItem1 structItem1.IsDataBackup = this.SystemConfig.IsDataBackup; structItem1.DummyBool5 = false; - structItem1.DummyBool6 = false; - structItem1.DummyBool7 = false; + structItem1.IsPart11 = this.SystemConfig.IsPart11; + structItem1.IsModbus = this.SystemConfig.IsModbus; structItem1.IsFeedbackBoard = this.SystemConfig.IsFeedbackBoard; structItem1.IsFeedback = this.SystemConfig.IsFeedback; structItem1.IsLogin = this.SystemConfig.IsLogin; @@ -5332,7 +5407,7 @@ namespace INT89DB_26.Forms structItem2.FeedbackCorrectionRate = this.SystemConfig.FeedbackCorrectionRate; structItem2.FeedbackPulseWidth = this.SystemConfig.FeedbackPulseWidth; - structItem2.DummyInt3 = 0; + structItem2.StoragePeriod = this.SystemConfig.StoragePeriod; structItem2.DummyInt4 = 0; structItem2.DummyInt5 = 0; structItem2.DummyInt6 = 0; @@ -5390,8 +5465,8 @@ namespace INT89DB_26.Forms #region StructItem1 structItem1.IsDataBackup = item.IsDataBackup; structItem1.DummyBool5 = false; - structItem1.DummyBool6 = false; - structItem1.DummyBool7 = false; + structItem1.IsPart11 = item.IsPart11; + structItem1.IsModbus = item.IsModbus; structItem1.IsFeedbackBoard = item.IsFeedbackBoard; structItem1.IsFeedback = item.IsFeedback; structItem1.IsLogin = item.IsLogin; @@ -5455,7 +5530,7 @@ namespace INT89DB_26.Forms structItem2.FeedbackCorrectionRate = item.FeedbackCorrectionRate; structItem2.FeedbackPulseWidth = item.FeedbackPulseWidth; - structItem2.DummyInt3 = 0; + structItem2.StoragePeriod = item.StoragePeriod; structItem2.DummyInt4 = 0; structItem2.DummyInt5 = 0; structItem2.DummyInt6 = 0; @@ -5517,6 +5592,8 @@ namespace INT89DB_26.Forms structItem1 = (StructSystemConfigurationItem1)this.smartFileIO.ReadStructure(0, typeof(StructSystemConfigurationItem1)); #region StructItem1 + this.SystemConfig.IsPart11 = structItem1.IsPart11; + this.SystemConfig.IsModbus = structItem1.IsModbus; this.SystemConfig.IsFeedback = structItem1.IsFeedback; this.SystemConfig.IsDataBackup = structItem1.IsDataBackup; this.SystemConfig.IsWeightViewForward = structItem1.IsWeightViewForward; @@ -5577,6 +5654,7 @@ namespace INT89DB_26.Forms #region StructItem2 this.SystemConfig.FeedbackCorrectionRate = structItem2.FeedbackCorrectionRate; this.SystemConfig.FeedbackPulseWidth = structItem2.FeedbackPulseWidth; + this.SystemConfig.StoragePeriod = structItem2.StoragePeriod; #endregion } catch @@ -6262,13 +6340,13 @@ namespace INT89DB_26.Forms feedbackWeight = averageWeight - passRange; this.CollectionFeedbackStatus[lane - 1].FeedbackWeight = feedbackWeight; - this.CollectionFeedbackStatus[lane - 1].ClearData(); - this.CollectionFeedbackStatus[lane - 1].IsFbCalComplete = true; if (this.CollectionFeedbackStatus[lane - 1].UpdateFeedbackData > 65535) this.CollectionFeedbackStatus[lane - 1].UpdateFeedbackData = 0; else this.CollectionFeedbackStatus[lane - 1].UpdateFeedbackData++; + this.CollectionFeedbackStatus[lane - 1].ClearData(); + this.CollectionFeedbackStatus[lane - 1].IsFbCalComplete = true; if (this.SystemConfig.IsFeedbackBoard == true) this.SerialPort3_Write(this.Protocol_STD3_NotStxEtx(this.SystemConfig, this.CollectionFeedbackStatus[lane - 1], lane)); @@ -6311,7 +6389,7 @@ namespace INT89DB_26.Forms structItem.ID = "L1"; structItem.Password = "1111"; - structItem.Group = DataStore.UserGroup.Level1Operator; + structItem.Group = DataStore.UserGroup.Level1; structItem.Dummy1 = ""; structItem.Dummy2 = ""; @@ -6428,7 +6506,7 @@ namespace INT89DB_26.Forms structItem.ID = "L2"; structItem.Password = "2222"; - structItem.Group = DataStore.UserGroup.Level2Engineer; + structItem.Group = DataStore.UserGroup.Level2; structItem.Dummy1 = ""; structItem.Dummy2 = ""; @@ -6545,7 +6623,7 @@ namespace INT89DB_26.Forms structItem.ID = "L3"; structItem.Password = "3333"; - structItem.Group = DataStore.UserGroup.Level3Manager; + structItem.Group = DataStore.UserGroup.Level3; structItem.Dummy1 = ""; structItem.Dummy2 = ""; @@ -6842,6 +6920,376 @@ namespace INT89DB_26.Forms } #endregion + #region Backup + public List GetSeletedNodeList(TreeView tree) + { + int yearCNT, monthCNT, dayCNT; + List listSelectedFile = new List(); + + yearCNT = tree.Nodes.Count; + if (yearCNT != 0) + { + for (int i = 0; i < yearCNT; i++) + { + monthCNT = tree.Nodes[i].Nodes.Count; + if (monthCNT != 0) + { + for (int j = 0; j < monthCNT; j++) + { + dayCNT = tree.Nodes[i].Nodes[j].Nodes.Count; + if (dayCNT != 0) + { + for (int k = 0; k < dayCNT; k++) + { + //if (tree.Nodes[i].Nodes[j].Nodes[k].Checked == true) + //{ + //listSelectedFile.Add(tree.Nodes[i].Nodes[j].Nodes[k].Text); + listSelectedFile.Add(string.Format("{0}\\{1}\\{2}", tree.Nodes[i].Text, tree.Nodes[i].Nodes[j].Text, tree.Nodes[i].Nodes[j].Nodes[k].Text)); + //} + } + } + } + } + } + } + + return listSelectedFile; + } + + private void DeleteLogFile(string path, DataStore.E_DataType type) + { + string dataFolderPath = ""; + + switch (type) + { + case DataStore.E_DataType.None: + break; + case DataStore.E_DataType.History: + dataFolderPath = this.PathDataHistoryFolder; + break; + case DataStore.E_DataType.Inspection: + dataFolderPath = this.PathDataInspectionFolder; + break; + case DataStore.E_DataType.Others: + dataFolderPath = this.PathDataOthersFolder; + break; + default: + break; + } + + foreach (string Folder in Directory.GetDirectories(path)) + { + this.DeleteLogFile(Folder, type); //재귀함수 호출 + if (Directory.GetDirectories(Folder).Count() == 0 && Directory.GetFiles(Folder).Count() == 0 && Folder != dataFolderPath) + Directory.Delete(Folder, true); + } + + foreach (string file in Directory.GetFiles(path)) + { + FileInfo fi = new FileInfo(file); + if (DateTime.ParseExact(fi.Name.Substring(1, 8), "yyyyMMdd", null) < DateTime.Now.AddMonths(-1 * this.SystemConfig.StoragePeriod)) + fi.Delete(); + } + } + #endregion + #region Tracking Inspection data + private void GetTrackingInspectionFolderPath(ref string folder, ref string fileName) + { + DateTime time = DateTime.Now; + + if (this.SystemConfig.IsPart11 == false) + { + folder = this.PathDataBackupFolder; + fileName = string.Format("{0:yyyyMMdd}-{1}.csv", time, this.SystemConfig.ProductNumber); + } + else + { + folder = string.Format("{0}{1}\\{2}\\", this.PathDataInspectionFolder, time.Year, time.Month); + fileName = string.Format("I{0:yyyyMMdd}-{1}.csv", time, this.SystemConfig.ProductNumber); + } + } + private void TrackingInspectionData(Collection items) + { + bool fileCheck = false, directoryCheck = false; + string fullFilePath = "", folderPath = "", fileName = ""; + StreamWriter sw; + + if (this.SystemConfig.IsDataBackup == true) + { + this.GetTrackingInspectionFolderPath(ref folderPath, ref fileName); + fullFilePath = string.Format("{0}{1}", folderPath, fileName); + + DirectoryInfo di = new DirectoryInfo(folderPath); + directoryCheck = di.Exists; + // 폴더 체크 + if (directoryCheck == false) + di.Create(); + + FileInfo fileInfo = new FileInfo(fullFilePath); + fileCheck = fileInfo.Exists; + + sw = new StreamWriter(fullFilePath, true, Encoding.UTF8); + + if (fileCheck == false) + { + this.RemoveInspectionDataFile(); + + sw.Write("Date"); + sw.Write(","); + sw.Write("Time"); + sw.Write(","); + sw.Write("P_No"); + sw.Write(","); + sw.Write("Name"); + sw.Write(","); + sw.Write("Lot"); + sw.Write(","); + sw.Write("UnderRange"); + sw.Write(","); + sw.Write("PassRange"); + sw.Write(","); + sw.Write("OverRange"); + sw.Write(","); + sw.Write("TareRange"); + + for (int i = 0; i < this.SystemConfig.EquipmentColumns; i++) + { + sw.Write(","); + sw.Write(string.Format("#{0}_Weight", i + 1)); + sw.Write(","); + sw.Write(string.Format("#{0}_Grade", i + 1)); + } + + sw.WriteLine(); + } + + sw.Write(string.Format("{0:yyyy-MM-dd}", DateTime.Now)); + sw.Write(","); + sw.Write(string.Format("{0:HH:mm:ss}", DateTime.Now)); + sw.Write(","); + sw.Write(this.CurrentProductItem.Number); + sw.Write(","); + sw.Write(this.CurrentProductItem.Name); + sw.Write(","); + sw.Write(this.CurrentProductItem.LotNo); + sw.Write(","); + sw.Write(Helper.StringToDecimalPlaces(this.CurrentProductItem.UnderRange, this.SystemConfig.DecimalPlaces)); + sw.Write(","); + sw.Write(Helper.StringToDecimalPlaces(this.CurrentProductItem.PassRange, this.SystemConfig.DecimalPlaces)); + sw.Write(","); + sw.Write(Helper.StringToDecimalPlaces(this.CurrentProductItem.OverRange, this.SystemConfig.DecimalPlaces)); + sw.Write(","); + sw.Write(Helper.StringToDecimalPlaces(this.CurrentProductItem.TareRange, this.SystemConfig.DecimalPlaces)); + + for (int i = 0; i < this.SystemConfig.EquipmentColumns; i++) + { + sw.Write(","); + sw.Write(Helper.DoubleToString(items[i].Weight, this.SystemConfig.DecimalPlaces)); + sw.Write(","); + sw.Write(items[i].JudgmentStatus); + } + sw.WriteLine(); + sw.Close(); + } + } + private void RemoveInspectionDataFile() + { + bool directoryCheck = false; + + try + { + if (this.SystemConfig.IsPart11 == true) + this.DeleteLogFile(this.PathDataInspectionFolder, DataStore.E_DataType.Inspection); + else + { + string dday = string.Format("{0:yyyyMMdd}", DateTime.Now.AddDays(-180)) + ".csv"; + + DirectoryInfo dir = new DirectoryInfo(this.PathDataInspectionFolder); + + directoryCheck = dir.Exists; + // 폴더 체크 + if (directoryCheck == false) + dir.Create(); + + FileInfo[] files = dir.GetFiles(); + foreach (FileInfo subfile in files) + { + if (subfile.Name.StartsWith("20")) // 날짜 비교하여 180일 지난화일은 삭제함 + { + if (subfile.Name.CompareTo(dday) < 0) + { + subfile.Delete(); + } + } + } + } + } + catch + { + + } + } + #endregion + #region Tracking History data + public void SetTrackingHistoryData(DataStore.E_TrackingOperation type, string detail) + { + if (this.SystemConfig.IsPart11 == false) + return; + + HistoryData data = new HistoryData(); + + data.Type = "Operation"; + data.Time = DateTime.Now; + data.LoginID = this.SystemConfig.CurrentUser.ID; + data.Event = type.ToString(); + data.Detail = detail; + data.BeforeData = ""; + data.AfterData = ""; + + this.TrackingHistoryData(data); + } + public void SetTrackingHistoryData(DataStore.E_TrackingOperation eventType, string detail, string loginID) + { + if (this.SystemConfig.IsPart11 == false) + return; + + HistoryData data = new HistoryData(); + + data.Type = "Operation"; + data.Time = DateTime.Now; + data.LoginID = loginID; + data.Event = eventType.ToString(); + data.Detail = detail; + data.BeforeData = ""; + data.AfterData = ""; + + this.TrackingHistoryData(data); + } + public void SetTrackingHistoryData(DataStore.TrackingAlarm type, string detail) + { + HistoryData data = new HistoryData(); + + data.Type = "Alarm"; + data.Time = DateTime.Now; + data.LoginID = this.SystemConfig.CurrentUser.ID; + data.Event = type.ToString(); + data.Detail = detail; + data.BeforeData = ""; + data.AfterData = ""; + + this.TrackingHistoryData(data); + } + public void SetTrackingHistoryData(DataStore.TrackingParameter type, string detail, string before, string after) + { + if (before == after) + return; + + HistoryData data = new HistoryData(); + + data.Type = "Parameter"; + data.Time = DateTime.Now; + data.LoginID = this.SystemConfig.CurrentUser.ID; + data.Event = type.ToString(); + data.Detail = detail; + data.BeforeData = before; + data.AfterData = after; + + this.TrackingHistoryData(data); + } + + private void TrackingHistoryData(HistoryData data) + { + bool fileCheck = false, directoryCheck = false; + string fullFilePath = "", folderPath = "", fileName = ""; + StreamWriter sw; + DateTime time = DateTime.Now; + + if (this.SystemConfig.IsPart11 == true) + { + folderPath = string.Format("{0}{1}\\{2}\\", this.PathDataHistoryFolder, time.Year, time.Month); + fileName = string.Format("H{0:yyyyMMdd}.csv", time); + + fullFilePath = string.Format("{0}{1}", folderPath, fileName); + + DirectoryInfo di = new DirectoryInfo(folderPath); + directoryCheck = di.Exists; + // 폴더 체크 + if (directoryCheck == false) + di.Create(); + + FileInfo fileInfo = new FileInfo(fullFilePath); + fileCheck = fileInfo.Exists; + + sw = new StreamWriter(fullFilePath, true, Encoding.UTF8); + + if (fileCheck == false) + { + this.RemoveHistoryDataFile(); + + sw.Write("Date"); + sw.Write(","); + sw.Write("Time"); + sw.Write(","); + sw.Write("LoginID"); + sw.Write(","); + sw.Write("Event"); + sw.Write(","); + sw.Write("Detail"); + sw.Write(","); + sw.Write("Before"); + sw.Write(","); + sw.Write("After"); + sw.Write(","); + sw.Write("Type"); + + sw.WriteLine(); + } + + sw.Write(string.Format("{0:yyyy-MM-dd}", DateTime.Now)); + sw.Write(","); + sw.Write(string.Format("{0:HH:mm:ss}", DateTime.Now)); + sw.Write(","); + sw.Write(data.LoginID); + sw.Write(","); + sw.Write(data.Event.ToString()); + sw.Write(","); + sw.Write(data.Detail); + sw.Write(","); + sw.Write(data.BeforeData); + sw.Write(","); + sw.Write(data.AfterData); + sw.Write(","); + sw.Write(data.Type); + sw.WriteLine(); + + sw.Close(); + } + } + private void RemoveHistoryDataFile() + { + try + { + this.DeleteLogFile(this.PathDataHistoryFolder, DataStore.E_DataType.History); + } + catch + { + + } + } + #endregion + #region Tracking Others data + private void RemoveOthersDataFile() + { + try + { + this.DeleteLogFile(this.PathDataOthersFolder, DataStore.E_DataType.Others); + } + catch + { + + } + } + #endregion #endregion #region Override Member @@ -6955,7 +7403,7 @@ namespace INT89DB_26.Forms switch (this.SystemConfig.EthernetMode) { - case (int)DataStore.CommunicationMode.f99_Modbus: + case (int)DataStore.E_CommMode.f99_Modbus: #region Modbus TCP if (this.smartTCPMultiServer.ClientInfoList != null) { diff --git a/INT89DB_26/Forms/FormMainDisplay.cs b/INT89DB_26/Forms/FormMainDisplay.cs index 67ba8df..98840c2 100644 --- a/INT89DB_26/Forms/FormMainDisplay.cs +++ b/INT89DB_26/Forms/FormMainDisplay.cs @@ -320,7 +320,7 @@ namespace INT89DB_26.Forms this.labelUserID.Visible = false; this.labelUserLevel.Visible = false; - this.ParentForm.SystemConfig.CurrentUser.Group = DataStore.UserGroup.Level3Manager; + this.ParentForm.SystemConfig.CurrentUser.Group = DataStore.UserGroup.Level3; } // Ethernet @@ -366,7 +366,7 @@ namespace INT89DB_26.Forms switch (user.Group) { - case DataStore.UserGroup.Level1Operator: + case DataStore.UserGroup.Level1: id = user.ID; if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) group = "级别1"; @@ -391,7 +391,7 @@ namespace INT89DB_26.Forms colorButtonText = this.ColorButtonAccessFalse; break; - case DataStore.UserGroup.Level2Engineer: + case DataStore.UserGroup.Level2: id = user.ID; if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) group = "级别2"; @@ -416,7 +416,7 @@ namespace INT89DB_26.Forms colorButtonText = this.ColorButtonAccessTrue; break; - case DataStore.UserGroup.Level3Manager: + case DataStore.UserGroup.Level3: id = user.ID; if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) group = "级别3"; @@ -441,7 +441,7 @@ namespace INT89DB_26.Forms colorButtonText = this.ColorButtonAccessTrue; break; - case DataStore.UserGroup.Level4Developer: + case DataStore.UserGroup.Developer: id = user.ID; if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) group = "级别4"; @@ -466,7 +466,7 @@ namespace INT89DB_26.Forms colorButtonText = this.ColorButtonAccessTrue; break; - case DataStore.UserGroup.LogOff: + case DataStore.UserGroup.LogOut: id = ""; if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) group = "关闭"; @@ -1273,6 +1273,18 @@ namespace INT89DB_26.Forms } else { + if (this.ParentForm.SystemConfig.IsFeedback == true) + { + if (myKeyPad.doubleValue < Helper.StringToWeight(this.ParentForm.CurrentFeedbackItem.LowLimit, this.ParentForm.SystemConfig.DecimalPlaces) + || (myKeyPad.doubleValue > Helper.StringToWeight(this.ParentForm.CurrentFeedbackItem.HighLimit, this.ParentForm.SystemConfig.DecimalPlaces))) + { + // 입력범위를 확인하세요 + DialogFormMessage myMsg = new DialogFormMessage(1, this.ParentForm.SystemConfig.Language, ""); + myMsg.ShowDialog(); + return; + } + } + this.UpdatePassRangeChange(myKeyPad.StringValue); this.ParentForm.Update30000ModbusData(); @@ -1349,7 +1361,7 @@ namespace INT89DB_26.Forms } private void buttonUser_Click(object sender, EventArgs e) { - if (this.ParentForm.SystemConfig.CurrentUser.Group == DataStore.UserGroup.LogOff) + if (this.ParentForm.SystemConfig.CurrentUser.Group == DataStore.UserGroup.LogOut) { DialogFormLogOn logOn = new DialogFormLogOn(this.ParentForm); if (logOn.ShowDialog() == DialogResult.OK) @@ -1367,7 +1379,7 @@ namespace INT89DB_26.Forms DialogFormYesNo msg = new DialogFormYesNo(this.ParentForm.SystemConfig.Language, 12); if (msg.ShowDialog() == DialogResult.Yes) { - this.ParentForm.SystemConfig.CurrentUser.Group = DataStore.UserGroup.LogOff; + this.ParentForm.SystemConfig.CurrentUser.Group = DataStore.UserGroup.LogOut; this.buttonUser.ButtonUp(); this.DisplayRefresh(); diff --git a/INT89DB_26/Forms/FormMenu.Designer.cs b/INT89DB_26/Forms/FormMenu.Designer.cs index 279e0dc..fb6e32c 100644 --- a/INT89DB_26/Forms/FormMenu.Designer.cs +++ b/INT89DB_26/Forms/FormMenu.Designer.cs @@ -28,6 +28,7 @@ /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMenu)); this.smartForm1 = new SmartX.SmartForm(); this.buttonBack = new SmartX.SmartButton(); @@ -50,6 +51,7 @@ this.buttonFunction = new SmartX.SmartButton(); this.buttonCommunication = new SmartX.SmartButton(); this.buttonOptionSetting = new SmartX.SmartButton(); + this.smartTimerScanUSB = new SmartX.SmartTimer(this.components); ((System.ComponentModel.ISupportInitialize)(this.smartForm1)).BeginInit(); this.SuspendLayout(); // @@ -634,6 +636,15 @@ this.buttonOptionSetting.Visible = false; this.buttonOptionSetting.Click += new System.EventHandler(this.buttonMenu_Click); // + // smartTimerScanUSB + // + this.smartTimerScanUSB.EndTime = ((long)(100000000000)); + this.smartTimerScanUSB.Interval = 100; + this.smartTimerScanUSB.IntervalSeries = null; + this.smartTimerScanUSB.NowMillisecond = ((long)(0)); + this.smartTimerScanUSB.StartTime = ((long)(0)); + this.smartTimerScanUSB.Tick += new System.EventHandler(this.smartTimerScanUSB_Tick); + // // FormMenu // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); @@ -691,5 +702,6 @@ private SmartX.SmartButton buttonFunction; private SmartX.SmartButton buttonCommunication; private SmartX.SmartButton buttonOptionSetting; + private SmartX.SmartTimer smartTimerScanUSB; } } \ No newline at end of file diff --git a/INT89DB_26/Forms/FormMenu.cs b/INT89DB_26/Forms/FormMenu.cs index 087c21a..b31ab89 100644 --- a/INT89DB_26/Forms/FormMenu.cs +++ b/INT89DB_26/Forms/FormMenu.cs @@ -6,6 +6,7 @@ using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; +using System.IO; using INT89DB_26.DialogForms; using INT89DB_26_ImageDll; @@ -16,6 +17,8 @@ namespace INT89DB_26.Forms { #region Field private FormMain m_ParentForm; + + public bool IsConnectedUSB; #endregion #region Costructor @@ -155,6 +158,8 @@ namespace INT89DB_26.Forms } private void DefaultSetting() { + this.IsConnectedUSB = false; + if (this.ParentForm.SystemConfig.IsLogin == false) { this.labelUserID.Visible = false; @@ -171,7 +176,7 @@ namespace INT89DB_26.Forms switch (user.Group) { - case DataStore.UserGroup.Level1Operator: + case DataStore.UserGroup.Level1: id = user.ID; if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) group = "级别1"; @@ -197,7 +202,7 @@ namespace INT89DB_26.Forms this.buttonOptionSetting.Visible = false; break; - case DataStore.UserGroup.Level2Engineer: + case DataStore.UserGroup.Level2: id = user.ID; if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) group = "级别2"; @@ -222,7 +227,7 @@ namespace INT89DB_26.Forms this.buttonEquipmentTest.Visible = false; this.buttonOptionSetting.Visible = false; break; - case DataStore.UserGroup.Level3Manager: + case DataStore.UserGroup.Level3: id = user.ID; if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) group = "级别3"; @@ -247,7 +252,7 @@ namespace INT89DB_26.Forms this.buttonEquipmentTest.Visible = false; this.buttonOptionSetting.Visible = false; break; - case DataStore.UserGroup.Level4Developer: + case DataStore.UserGroup.Developer: id = user.ID; if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) group = "级别4"; @@ -272,7 +277,7 @@ namespace INT89DB_26.Forms this.buttonEquipmentTest.Visible = true; this.buttonOptionSetting.Visible = true; break; - case DataStore.UserGroup.LogOff: + case DataStore.UserGroup.LogOut: break; default: break; @@ -291,13 +296,15 @@ namespace INT89DB_26.Forms this.UpdateDisplayUser(this.ParentForm.SystemConfig.CurrentUser); else { - this.ParentForm.SystemConfig.CurrentUser.Group = DataStore.UserGroup.Level3Manager; + this.ParentForm.SystemConfig.CurrentUser.Group = DataStore.UserGroup.Level3; this.buttonEquipmentTest.Visible = false; this.buttonOptionSetting.Visible = false; } this.ParentForm.TransferData(CommunicationCommand.ModeMenu, CommunicationID.MainBoard); this.ParentForm.SystemConfig.CurrentForm = DataStore.E_FormStore.FormMenu; + + this.smartTimerScanUSB.Start(); } #endregion @@ -377,10 +384,8 @@ namespace INT89DB_26.Forms else if (button == this.buttonUpdate) { #region 업데이트 - DialogFormYesNo myDlg = new DialogFormYesNo(this.ParentForm.SystemConfig.Language, 3); - DialogResult dr = myDlg.ShowDialog(); - if (dr == DialogResult.Yes) - this.ParentForm.ChildFormProgramUpdate.DisplayRefresh(); + ((FormMain)(Owner)).smartForm.Show((int)DataStore.E_FormStore.FormProgramUpdate); + this.ParentForm.ChildFormProgramUpdate.DisplayRefresh(); #endregion } else if (button == this.buttonEquipmentSetting) @@ -439,7 +444,7 @@ namespace INT89DB_26.Forms if (pass.ShowDialog() == DialogResult.OK) { - this.ParentForm.SystemConfig.CurrentUser.Group = DataStore.UserGroup.Level4Developer; + this.ParentForm.SystemConfig.CurrentUser.Group = DataStore.UserGroup.Developer; if (this.buttonEquipmentTest.Visible != true) this.buttonEquipmentTest.Visible = true; @@ -448,6 +453,29 @@ namespace INT89DB_26.Forms } } } + + private void smartTimerScanUSB_Tick(object sender, EventArgs e) + { + bool isBeforeConnectedUSB = this.IsConnectedUSB; + DirectoryInfo info = new DirectoryInfo("하드 디스크\\"); + + if (info.Exists == true) + this.IsConnectedUSB = true; + else + this.IsConnectedUSB = false; + + if (isBeforeConnectedUSB != this.IsConnectedUSB) + { + if (this.ParentForm.ChildFormProgramUpdate != null) + this.ParentForm.ChildFormProgramUpdate.EnableBackupButton(this.IsConnectedUSB); + + //if (this.ParentForm.ChildFormDataBackup != null) + // this.ParentForm.ChildFormDataBackup.EnableBackupButton(this.IsConnectedUSB); + + //if (this.ParentForm.ChildFormDataBackup_Part11 != null) + // this.ParentForm.ChildFormDataBackup_Part11.EnableBackupButton(this.IsConnectedUSB); + } + } #endregion } } \ No newline at end of file diff --git a/INT89DB_26/Forms/FormMenu.resx b/INT89DB_26/Forms/FormMenu.resx index fd83170..88a1d23 100644 --- a/INT89DB_26/Forms/FormMenu.resx +++ b/INT89DB_26/Forms/FormMenu.resx @@ -7867,6 +7867,9 @@ EAAAAABJRU5ErkJggg== + + 17, 17 + WEBPAD diff --git a/INT89DB_26/Forms/FormOptionSetting.Designer.cs b/INT89DB_26/Forms/FormOptionSetting.Designer.cs index 9b364e0..65c5362 100644 --- a/INT89DB_26/Forms/FormOptionSetting.Designer.cs +++ b/INT89DB_26/Forms/FormOptionSetting.Designer.cs @@ -128,7 +128,7 @@ this.labelTitle.BackPictureBox2 = null; this.labelTitle.BorderColor = System.Drawing.Color.Black; this.labelTitle.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.labelTitle.Font = new System.Drawing.Font("New Gulim", 23F, System.Drawing.FontStyle.Bold); + this.labelTitle.Font = new System.Drawing.Font("새굴림", 23F, System.Drawing.FontStyle.Bold); this.labelTitle.ForeColor = System.Drawing.Color.White; this.labelTitle.InitVisible = true; this.labelTitle.LineSpacing = 0F; @@ -155,16 +155,17 @@ this.labelTitleFeedback.BackPictureBox2 = null; this.labelTitleFeedback.BorderColor = System.Drawing.Color.Black; this.labelTitleFeedback.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.labelTitleFeedback.Font = new System.Drawing.Font("New Gulim", 13F, System.Drawing.FontStyle.Bold); + this.labelTitleFeedback.Font = new System.Drawing.Font("새굴림", 13F, System.Drawing.FontStyle.Bold); this.labelTitleFeedback.InitVisible = true; this.labelTitleFeedback.LineSpacing = 0F; - this.labelTitleFeedback.Location = new System.Drawing.Point(248, 219); + this.labelTitleFeedback.Location = new System.Drawing.Point(260, 195); this.labelTitleFeedback.Name = "labelTitleFeedback"; this.labelTitleFeedback.Size = new System.Drawing.Size(160, 30); this.labelTitleFeedback.TabIndex = 169; this.labelTitleFeedback.Text = "Feedback"; this.labelTitleFeedback.TextHAlign = SmartX.SmartLabel.TextHorAlign.Middle; this.labelTitleFeedback.TextVAlign = SmartX.SmartLabel.TextVerAlign.Middle; + this.labelTitleFeedback.Visible = false; this.labelTitleFeedback.Wordwrap = false; // // buttonFeedback @@ -179,7 +180,7 @@ this.buttonFeedback.DownImage = ((System.Drawing.Image)(resources.GetObject("buttonFeedback.DownImage"))); this.buttonFeedback.GroupID = 0; this.buttonFeedback.InitVisible = true; - this.buttonFeedback.Location = new System.Drawing.Point(414, 219); + this.buttonFeedback.Location = new System.Drawing.Point(426, 195); this.buttonFeedback.Mode = SmartX.SmartButton.BUTTONMODE.PUSH; this.buttonFeedback.Name = "buttonFeedback"; this.buttonFeedback.NestedClickEventPrevent = false; @@ -196,6 +197,7 @@ this.buttonFeedback.TextLocation = new System.Drawing.Point(0, 0); this.buttonFeedback.TextVAlign = SmartX.SmartButton.TextVerAlign.Middle; this.buttonFeedback.UpImage = ((System.Drawing.Image)(resources.GetObject("buttonFeedback.UpImage"))); + this.buttonFeedback.Visible = false; this.buttonFeedback.Click += new System.EventHandler(this.buttonFeedback_Click); // // buttonFeedbackBoard @@ -210,7 +212,7 @@ this.buttonFeedbackBoard.DownImage = ((System.Drawing.Image)(resources.GetObject("buttonFeedbackBoard.DownImage"))); this.buttonFeedbackBoard.GroupID = 0; this.buttonFeedbackBoard.InitVisible = true; - this.buttonFeedbackBoard.Location = new System.Drawing.Point(414, 255); + this.buttonFeedbackBoard.Location = new System.Drawing.Point(426, 231); this.buttonFeedbackBoard.Mode = SmartX.SmartButton.BUTTONMODE.PUSH; this.buttonFeedbackBoard.Name = "buttonFeedbackBoard"; this.buttonFeedbackBoard.NestedClickEventPrevent = false; @@ -236,10 +238,10 @@ this.labelTitleFeedbackBoard.BackPictureBox2 = null; this.labelTitleFeedbackBoard.BorderColor = System.Drawing.Color.Black; this.labelTitleFeedbackBoard.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.labelTitleFeedbackBoard.Font = new System.Drawing.Font("New Gulim", 13F, System.Drawing.FontStyle.Bold); + this.labelTitleFeedbackBoard.Font = new System.Drawing.Font("새굴림", 13F, System.Drawing.FontStyle.Bold); this.labelTitleFeedbackBoard.InitVisible = true; this.labelTitleFeedbackBoard.LineSpacing = 0F; - this.labelTitleFeedbackBoard.Location = new System.Drawing.Point(248, 255); + this.labelTitleFeedbackBoard.Location = new System.Drawing.Point(260, 231); this.labelTitleFeedbackBoard.Name = "labelTitleFeedbackBoard"; this.labelTitleFeedbackBoard.Size = new System.Drawing.Size(160, 30); this.labelTitleFeedbackBoard.TabIndex = 173; @@ -256,7 +258,7 @@ this.labelBuadrateWarning2.BackPictureBox2 = null; this.labelBuadrateWarning2.BorderColor = System.Drawing.Color.Black; this.labelBuadrateWarning2.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.labelBuadrateWarning2.Font = new System.Drawing.Font("New Gulim", 11F, System.Drawing.FontStyle.Bold); + this.labelBuadrateWarning2.Font = new System.Drawing.Font("새굴림", 11F, System.Drawing.FontStyle.Bold); this.labelBuadrateWarning2.ForeColor = System.Drawing.Color.Red; this.labelBuadrateWarning2.InitVisible = true; this.labelBuadrateWarning2.LineSpacing = 0F; @@ -277,7 +279,7 @@ this.labelBuadrateWarning.BackPictureBox2 = null; this.labelBuadrateWarning.BorderColor = System.Drawing.Color.Black; this.labelBuadrateWarning.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.labelBuadrateWarning.Font = new System.Drawing.Font("New Gulim", 11F, System.Drawing.FontStyle.Bold); + this.labelBuadrateWarning.Font = new System.Drawing.Font("새굴림", 11F, System.Drawing.FontStyle.Bold); this.labelBuadrateWarning.ForeColor = System.Drawing.Color.Red; this.labelBuadrateWarning.InitVisible = true; this.labelBuadrateWarning.LineSpacing = 0F; @@ -288,6 +290,7 @@ this.labelBuadrateWarning.Text = "※ 설정 변경 후, 전원을 껐다 켜야 합니다"; this.labelBuadrateWarning.TextHAlign = SmartX.SmartLabel.TextHorAlign.Middle; this.labelBuadrateWarning.TextVAlign = SmartX.SmartLabel.TextVerAlign.Middle; + this.labelBuadrateWarning.Visible = false; this.labelBuadrateWarning.Wordwrap = false; // // FormOptionSetting diff --git a/INT89DB_26/Forms/FormOptionSetting.cs b/INT89DB_26/Forms/FormOptionSetting.cs index 3015b97..b474d06 100644 --- a/INT89DB_26/Forms/FormOptionSetting.cs +++ b/INT89DB_26/Forms/FormOptionSetting.cs @@ -133,10 +133,10 @@ namespace INT89DB_26.Forms private void buttonSave_Click(object sender, EventArgs e) { // 피드백시스템 사용 유무 - if (this.buttonFeedback.ButtonStatus == SmartButton.BUTSTATUS.DOWN) - this.ParentForm.SystemConfig.IsFeedback = true; - else - this.ParentForm.SystemConfig.IsFeedback = false; + //if (this.buttonFeedback.ButtonStatus == SmartButton.BUTSTATUS.DOWN) + // this.ParentForm.SystemConfig.IsFeedback = true; + //else + // this.ParentForm.SystemConfig.IsFeedback = false; // 피드백 보드 사용 유무 if (this.buttonFeedbackBoard.ButtonStatus == SmartButton.BUTSTATUS.DOWN) @@ -145,6 +145,9 @@ namespace INT89DB_26.Forms this.ParentForm.SystemConfig.Serial3BaudRate = 38400; this.ParentForm.SystemConfig.Serial3Mode = 98; + + this.ParentForm.SerialPort3_Open(); + this.ParentForm.SerialPort3_FbBoardBooting(); } else { @@ -156,10 +159,12 @@ namespace INT89DB_26.Forms this.ParentForm.SaveSystemConfigurationFile(this.ParentForm.SystemConfig); - this.buttonSave.Visible = false; - this.buttonBack.Visible = false; + this.ParentForm.ChildFormMainDisplay.UpdateDisplayFeedbackVisible(); + this.ParentForm.ChildFormCommunication.RefreshComboBoxSerial3FeedbackBoard(this.ParentForm.SystemConfig.IsFeedbackBoard); - this.Enabled = false; + this.buttonSave.Visible = false; + + //this.Enabled = false; } private void buttonBack_Click(object sender, EventArgs e) { diff --git a/INT89DB_26/Forms/FormOptionSetting.resx b/INT89DB_26/Forms/FormOptionSetting.resx index 346054f..6a93ebc 100644 --- a/INT89DB_26/Forms/FormOptionSetting.resx +++ b/INT89DB_26/Forms/FormOptionSetting.resx @@ -165,53 +165,52 @@ XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOwwAADsMBx2+oZAAACrZJREFUeF7t1jERgAAQ - wLC3w4gENIMjsAAzAhjpmLtMVdBZtwUAgNB8EwAAfxgsAICYwQIAiBksAICYwQIAiBksAICYwQIAiBks - AICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIA - iBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICY - wQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBks - AICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAICYwQIA - iBksAICYwQIAiBksAICYwQIAiBksAICYwQIAiBksAIDY3OcOAEBonusAACBksAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAA - YgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBm - sAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYLACBmsAAAYgYL - ACBmsAAAYgYLACBmsAAAYnOfOwAAoVm3BQCAkMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZ - LACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMEC - AIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACA - mMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZ - LACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMEC - AIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACAmMECAIgZLACA - mMECAIgZLACAmMECAIgZLACAmMECAIgZLACA2AuqGSgslGsrFQAAAABJRU5ErkJggg== + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOwwAADsMBx2+oZAAACmpJREFUeF7t1jERgEAQ + ALGz8yUSXjM4AgtQY2LLzERE5tgLAICQYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhg + AQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABi + ggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIA + iAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQL + ACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABAT + LACAmGABAMQECwAgJlgAADHBAgCIzXufAACE5nsuAABCggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJ + FgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAg + JlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywA + gJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEyw + AABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAx + wQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEA + xAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIF + ABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJ + FgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAg + JlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywA + gJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEyw + AABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAx + wQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEA + xAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIF + ABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJ + FgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAg + JlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywA + gJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEyw + AABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAx + wQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEA + xAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIF + ABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJ + FgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAg + JlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywA + gJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEyw + AABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAx + wQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEA + xAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIF + ABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJ + FgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAg + JlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywA + gJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEyw + AABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAx + wQIAiAkWAEBs3vsEACA0x14AAIQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAm + WAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACA + mGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAA + AGKCBQAQEywAgJhgAQDEBAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHB + AgCICRYAQEywAABiggUAEBMsAICYYAEAxAQLACAmWAAAMcECAIgJFgBATLAAAGKCBQAQEywAgJhgAQDE + BAsAICZYAAAxwQIAiAkWAEBMsAAAYoIFABATLACAmGABAMQECwAgJlgAADHBAgCICRYAQEywAABiggUA + EBMsAICYYAEApPb6AaoZKCzs3dg8AAAAAElFTkSuQmCC @@ -261,127 +260,118 @@ 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 + RK5CYII= @@ -431,56 +421,50 @@ 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 - AAAASUVORK5CYII= + 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 @@ -530,122 +514,113 @@ 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 + Kml+s4BQAAAAAElFTkSuQmCC @@ -695,47 +670,43 @@ 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 - RU5ErkJggg== + 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 + rkJggg== @@ -785,25 +756,23 @@ RudN65tdA8sHzg46DF645Xrr8m2v29fvrLwzMBQydHc4cnjkLvvu5L2key/vZ9yff7DpIfph4SOpR+WP lR7X/aj3Y+uI5ciZUdfRvidBTx6Mscae/5T+04fx/Kfkp+UTqhONk2aTp6fcp24+W/1s/Hnq8/npgp+l f65+ofviu18cf+mbWTUz/pL/cuHX4lfyr468Xva6e9Z/9vGb5Dfzc4Vv5d8efcd41/s+7P3EfOYH7IeK - j3ofuz55f3q4kLyw8Bv3hPP74uYdwgAAAAlwSFlzAAAOxAAADsQBlSsOGwAABB5JREFUWEftl/FLU2sY - x/t3BiIcBmMwBtt02L2MxZjevLtlXtTM4toYycgWS41xx5h1vWY2Sm8sNIdekeEuYgy5MuxGNu4sp8yV - LqnErLGyHabj6YcHTmfnddvxnI36oYfvTy/P+76f8z7nfZ7nPUKpJd+OjpBDX1HfPI3d2bnwOJRMJaE8 - Fl9f802N/nBcQ27NpZn652/u7PJYMpU0NuoK0didnegai6/2eXp73PZyaHJ6PJvdB4Dl1acybWVemqVo - BFE4TiVXx5Xz+NntF8+wx3NoaDoNAO4BJzm/5PrwMQUAfZ5e9mAODfI6rnWRk0uu11uvAGBoxMMePARN - tVE54R+Lr68lU8lwZLHjynnSh79E0dS3GPBs2TbhHyM9eUo4jbSqAif7pkarjUpKLWm/eGZr+w0A2BxW - cic+EkKjMSi6XDavbxgAFh6H2M6nLY2Yysg7fKDOWVvE0iQ2N5i4kGdGxq6wdblsomhmggFmLVe/g+0s - rarY/bT7Zati9u79TrO5QRQNqr7FAACJzQ2lTsYMugecADATDHCceUo4DaWWzIWCALD56uXvf1y1OayT - 0+MAQNNpU2st6cxHomjkR6lHTx5+OXeADx9TnLx+KImiQZkvnR0a8Uz4x1z9DpVeTjqo9PJf2385bWnE - RFBAJaApIJm20usbxkoHANns/uT0OPs/46i8NMH5WQDY/bQbnJ+dCQawWVuKRvK1A2WkaTY3AMDW9hud - SYsjGoMiFl8tkKyF0PS47curT4vq7c42ANidnezV2i40YY+HPv8uzNXUqUTRvHu/g4N87GTbT+zVqo1K - jgO7cxJCY7n824R/rKhWYlEyxHg2ic0N9Bka8WgMClE0PHXq3M8YlLqmYziiM2nj62sAYO22kP7lpaHU - Et/UKF7scGTx0ZOHWMLmQkFpVQXpXHYaaVVFn6eXqeo0nfb6huVHKdITVQIa/I0CD/y37t448HlGqSWm - 1lpTa22+NMNIFI1KL8f3DWM0nc6XS/hIFE04sggA/z8LW7stzeaG297BzF4mm91ntyyHkkAaY6Ouy2UD - gBeJ5+zz73HbASAcWcTQFBWnygqhCf03z4Tm+qCL7SzTVjI1ko/RdLrtQpMoGswZaCI7UU7pEEKj+FFq - aq119TswKOzkYb50FgBWYlEyKAdKf6KGvZcQGpRMW/ki8RwAAg/89S0GjUFh7bZgz5Av1RaVcBpKLdGf - qMFCzbbb3kHSk6fwcchZIYcG97s/eY+cTKklSp3s1t0bS9HISiwanJ8VfLfZ5Z3z5Tk0+BLI7GU6r3aQ - S5RKKr0cr2pmL8N0Z6gcGp1Je9jnoxi7OfwnBzSHhlJL6pqOYQdZVsvsZfrvXCfLO5cGb1CzucE94CS7 - KvH66/4da7clX8U9gOYr6jtNfn0GXOuEYHQDgxcAAAAASUVORK5CYII= + j3ofuz55f3q4kLyw8Bv3hPP74uYdwgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAA7dJREFUWEftl+tLVUEU + xft3hAhEEEEEtaIHYojZ+4lZmWQiiWSGWSKJWPY2ySyMMqlEJCMKkUSsqCR7mJQ9TCwxSyorLLEfbhvm + jN7X3HuoD27WB10zc2edmT1r9swKjwv7fzCjxjOmUVNQktd+v234y/C4O9Hz5mVdw8VFy+ONeYGppuH6 + 1clBLgdfm7whwZjdoYZVka4verqPVB7cX1bgBuqvXR4b+80sz7qfRM6fowtwqHnc1SlSjE4hR87eHRNf + PZ65a6vOO9T8/PmDHmUnSnTSJXz99oW52AGddKiZkDtefKhQJ13C+4F+5jpzoVInA1AzLznmSuMlTgQJ + 2NH5gNU2OgSEoNSsSEuStdUDcUY3/2GvJmLubBmMT7BCMGTfwOAHmPziXL2n/7BRE58UXViaX1NXDY8l + Kh5szt4AycYZB9gTMnLT9OE2anr73gpJTF2zqXvnPfgwNdZGzY3mJiGJ0mPFigds38j3kck2P+LT56FN + WevUcPu8IYXhWaeYhEhFYkuQyFVMQLBXA1rammnq63934HARmYu78y9uuWrLUqOnnwhKTdTC8HsP70gH + CZLG8PWAEJQaQdbubYzHZsih2MQooxVAbsxczXETI/CCEKjxAi5ajEBuOoJbmt3U88yAu2qaW28yllPG + H6S2FGsUBZ7KARfVcHQZiDsnrJovDLZJZQLpyaxt1OCh1EQ+8XFokIEUa2ogSN+ZCskiSZ/b7S0LUmJV + q40aLEtIf2Jt+jI1EJDIkw1/Q6+cbNRk79nOCfKJ5y+6jIFA1gbPlD5MzPapVhfzZn3GSgayKSmpS4Qh + gbhQIXP3ZatuOlxUAyg2GMvBphDDJ+UKw8G5zoyeAnfVMCtFrrrVMR7sBwc3uimEQI2kUdOtxlPnjk/7 + PAPcXMDnqyMoNVi+vG9U8PXWhR8ISg3ZQNOjpx1kJV53uqZi9NcoWaKXLAHBUg3vU2o2+Ne9r/T1xxgh + USlb4xPGLWujpu1uq5BEeUWp4gHK1B3pT9AZB1LDbdSIZ0gEWYkS+tVhoyZ6cQSLjA54NkU3D2odSFxY + 3w4vSFyzQI0F9lnMppA0NHG2qZExeHJZagZPVusT9moAXyYXtR6cLKOb/5DHofELDjUyX239eZ1UoJDD + 9HAddoeSyvpsA3W9G1/uUCMvAYwkryhH50MLjrocVSZS1ZnAoYa2QJ+PwcTJ6qP67MChBlASSAXparAq + x6rKp17vphrACSInqNOkSgotztZWcQw93bjTqPmHmFHjCXFhfwBc64RgRhAB0gAAAABJRU5ErkJggg== @@ -853,21 +822,20 @@ XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvQAADr0BR/uQrQAAAx5JREFUaEPt2d9LmlEY - B/D9AyYkhlGUiRGKovDSqGUDGyNaTIhYUGSMZRdeJHQzk2CMNqOikF66qhnW8iLo1YlllIPIdvMOy20N - i8RR7ZCudw3OReCFcPbjjHeSBfNi+S49fG885yCHz/sceeS9sc694X/jdzNu36nPd+rzfPUsnCw4vziz - kLjTHrOPH41bohZ9WN8cbL5x/qQcGGuba/PxeRfj8jCexZPF2fjs9PH01WfqeMr22WaJWjrDnbVbtZpX - Gi5irW6uToLJmdjMXHzOHrNPgImRo5Grz/Dh8MCnga7dLs22RuFWVJPVXMRa2VwZPBgcPRodOxobOhzq - j/abIqarT2+kV7+rrw/VK71KqU2q6ldxEWs5sGyKmPoifaaIqWevp/Vja9OHpqtP4/vGmq0ahUchtUlL - +0rlBjkXsZYCS4Y9Q/detz6sb9lpqQ/VE0EiC3lLqNZUVS+qyp+Uix6Jqjqq8liXJ4+VQfJYGeQaY+l2 - dBRD0ZCmIU0xlHHfyC6RgCQBqQ1pUzeTgEzdc0GuK5b1wIoQgklIMRTFUCABEELWAyteRb+GI+Zg9xv3 - jQghEpDpX/Un1xJLG9LCJAQJwNaONqQNn4URQrodHYvFfsxpLBKQqXWEgzkohsJYNKRBAtCQTl3NRSwa - 0gih9HmQACABWCx8Vc1Rcx7rAix2HmMRQSJ8FsZ8eaxL51ks1ih3sfzf/Aih1M4A59w1xJMUQ8EkxFcy - F7H+8gcez+t2dDAJcdHlIhbbOrCdQXrrwGJhXJiEOYpFBAlz1AyTEJcMDWlskdqUpmJpQ1rcteYoFr5f - jpgDYzliDrbKcCmlX9Lc/bvzT5LHyiB5rAySx8og/wWWN+BtD7fj9xR123XqdbVyWZmFeJUyp0wyLCkx - lQjbhJWtlVzE8mx4Gt41EMGfD1bmlElt0ornFVnIs4qyx2WihyLBfQH/Nl9yV8JFLPeGWx1QyxfkUpsU - H1fYJsxCHggFzQJ+HZ9H8HgET3KHk1iudZfspUw8KC42FBfeKyy4WYCPm91wFIt6TYmfios6ivi3fj9V - LuQH1nf5VNJV3VWF0AAAAABJRU5ErkJggg== + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvQAADr0BR/uQrQAAAwNJREFUaEPtmd9LU2EY + x/sHdOCYTBTdDpOxsbHBMDRnoBJikiBSoDiJnBdeKOwmFSHCUqYoQ/FKU9TcheC2DvMHukCc3Rj+qJQp + yULX0OUq8CLoIljfeuNwUEcMYue0cw4fDs95znvxvp/3ec/7wrm2yr/L98rniXoWvywC+jM9ezbr/OTk + gIhz/HR8MDTYGey0BCxVm1V8lLWyvjITmXFH3XSUnjubm4pMjZ2MJZ/Rk1HHRwdMNQQairaKzC/MfJS1 + vL48Eh6ZOJ2YjkxjbofCQ32hvuRjP7Z3fehq3G80b5t1Hl3BcAEfZS2tL3UfdfeH+gdCA73HvR3BjrbD + tuTTethq2beU7JTovXqVQ2XoMPBR1oJ/AX21Hdpwbz5ort2rrXxXmXwq3lYUbhXqaB1M5dhytFYtH2XN + ++etB9amgyZ8Vmt2azC3pk0TB7w2GVYM6mfqvEd58gdydb1alBUfUVYCiLISIIVlVe9Wu6KujfMNgKDl + fQvzajg8DEp3SpkMGiPDbnMFqSqr56gnFoud/ziHJhD+HsYjkuQtYlyTp5NMe2hCBr6YzBWkpCyUDDRB + EFM7CALfAtCBCsLjb1e/LvIIhCsLY8bImToiEB2oMsQIsDZhE3f2WyHKggKM/EISwA5AQGSRpdoebEdG + lBU3T2QhwNok+kRZcfOMLMaRcGX5vvowcvbJgHBhGZIkvmLYDciSFKIsjBkj/+sHnuSxIUIWKTohymKO + DszJ4PLRgZEF4AjtBSoLYI/D+EnJAOKCfShly4JKmBWuLIAiwhmdyELAVBmAlMuLFEnc2cmLpLCsf48o + KwFEWQkgykqA/0KW1++tC9SR/xTF28XGVaN+Qc8BXr3GqaHsVHZbtuyeLL82n4+y6DW67E0Z5hYTi+6q + HCrlUyUHPFHmPsyV35dL70glNyXULYqPsjxrHqPfqJ3VQhPpLiaWA+7KpFVSSbEkzZQGqHJeynKvujXP + NYpuRZY1K+N2Rvr1dNJdbuGpLNdLl+KxIrM+U3Ljz6zyAaqc+gn5VNJVTZ7e1wAAAABJRU5ErkJggg== @@ -917,23 +885,23 @@ XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvQAADr0BR/uQrQAAA5NJREFUaEPtmd1LMlkc - x+dP2qUXS7LG9yjCybKBLCUIgm56gSbLUie2EaOrTGccpaAGs2ZqitBuoiGppcg2WjAqk8rtZf+MBQ+P - z9PxufFi19nBz+WXM4cvn+H85sAgHx8ffxf5/Px8e3v7q0q8vLzkcrlsNpvJZNLptCRLkEKh8FHk/f29 - UCi8VIPn5+enpydg6vT0NB6PwzXlAZLP519fX4GmfD7/WCXu7u6ur6/T6TTHcUtLS3BNeYDc398/Pj7m - crmHh4dsNvtnNbi9vQWnL5FIUBQ1OTkJ15QHSKnxzc3N5eXl79Xg/PwcnD6KokZHR51OJ1xTHiB/FMlk - MhcXF9WarCcnJ6IorqysEARht9v7+vrgFfKgJqsCarIqoCarAiqT5fF4MAzr7u7u6upyuVypVArkPM8T - BDE9Pe36hsfjEQSBJMkf89nZ2Z9eC5QmK5lMGgwGrVYbCAQ4jpufn29tbbVarcBXOBxubGycmJj47RuB - QCAej9tsNqvVSpIkCP1+P03T8NbKk0UQhNFo3NnZKSXBYFCv109NTUmSRNN0R0fHwcHBl2ckyW63Ly8v - Q2E5SpPV3NzsdruhcGBgAMdxURRpmtbr9dvb29ACHMfn5uagsBxFyQqHw2q1OhaLQTlFURiGhcPhSCRS - X18fjUahBT09PYODg1BYjqJk0TTd1tbGMAyUMwyj1WpXV1dZllWpVDqdrqGh4dciKIoCWSiKtrS0gLCp - qWlxcRHaRGmyGIbRaDTlsxlIDIVCLMsaDIbNzU2e53eK8DwPjuHCwoIgCCAUBGF/fx/aRGmyNjY2VCpV - +agmSdJkMq2vr0ejUbPZvLe3By3Acdzv90NhOYqSJUmSRqMZGhqCQqvVOjw8nEqlWJatDfjv+Hw+g8Hg - 8/lKidfrRVEUTH2GYWqyvjA+Pm6z2bAinZ2dZrM5GAweHx9LksSyrMPh2N3dhR5xOp0/vbJDKFCWJEkc - x0Wj0VAoFIvFRFEs5aIoxmKxo6OjL6uLd46trS0oLEeZsv4larIqoCarAmqyKuB/I+vq6gr8p0in04eH - h9vVIJFIsCzr9XpHRkYwDLNYLHBNeYCcnZ2BzxnLshRFzVUDt9s9NjbW39/f3t6uVqt1Oh1cUx4gyWRy - bW2NoihQF1yj/mMsFovJZFKpVL8U0Wq1cE15gEQikZmZGYfDYTQa6+rqQN3qIl9ZLpert7e39FblgGxl - /QMHPJEbQSo3sQAAAABJRU5ErkJggg== + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvQAADr0BR/uQrQAAA4JJREFUaEPtmVtLYlEU + x89HmqGLFXY1S4ywtAt0kyAQesmCytJu0oWkp25mRUFFaRc1xHqJDkUNRTpRUNRYlI3ZfIz5496ncWiE + OQ+jZw7n96B77b2Vtf9nr7XXViYajf6I8fb2FolEvqeI5+fnUCh0c3MTCASOj49ZQcK8vLxAL/D6+oo2 + nE4+T09PDw8PRKmjo6P19XXqncBgHh8fw+EwkQntbyni9vY2GAxiT62trdlsNuqdwGDu7u7gK0Lg/v4e + z/Y6FVxdXZHoczqdo6OjHR0d1DuBwVB/r68vLy/Pz8+/pILT01MSfVCqtbVVr9dT7wQG8zUGHuzZ2Vmq + Muvh4aHH45mcnOzq6qqvr6+pqaEDAkMSiweSWDyQxOIBP7H6+/srKioqKyvLy8tNJtPe3h7p39rawjq7 + u7vRScDM7e3toaGh+P7e3t4/lgViE8vv9xcXFxcWFo6Pj6MU6uvry8vL02q1RK/Z2dnMzMz29vZhDkzD + 6VZdXY05kIx0jo2N2e128oXxiE0sLEOpVG5ublKbZaemphQKRWdnJ9qQQK1W7+7ukqF3sPKJiQlqJEZs + YmVnZ5vNZmpwNDQ01NbWYp0QC8K5XC46wIFRi8VCjcSISixEWU5OzuLiIrU5UEMihWHU4XCkp6cvLCzQ + AQ6dTtfY2EiNxIhKLGyc/Pz8ubk5anOgB1lsenp6fn5eJpMVFRVlZGR8jlFQUIAJEAsNuVxOOrOyskZG + Rshn4xGVWBAlNzf3Y24mIs7MzEAspP/V1VUci8hrAA1MQBharVYci6QTDa/XSz4bj6jEWllZwcb5mKpx + zJWUlCwvLyMAS0tL3W43HeCAWDgBqZEYsSV47Kzm5mZqcKAsaGlpQfWAnSUl+F8MDg4i0PBKbZYdGBhA + PiJZH3EqifUbRqMRRSaOP1BWVoa4Q6l1cHCAIeyspqamnZ0dMvMdvV7/N7/kiVAsgNod6QkZHRsKy6O9 + LIs2evb396nNgapiY2ODGokRp1j/CEksHkhi8UASiwf/jVgXFxfkfwoo5fP5cPwnH6fTifMUtYjBYMBR + q9FoqHcCgzk5OcEbHizcxcUYZVHyMZvNbW1tdXV1KpUKN3bcMYlzQoPx+/1LS0uQibhLyqgkg62EaxNu + VJ9i4HJOvRMYjMPh6OnpQUmpVCrT0tKIu6lFuGKZTKaqqqr3pyoEBCoWy/4EBzyRG765DXAAAAAASUVO + RK5CYII= @@ -983,21 +951,20 @@ XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvQAADr0BR/uQrQAAAx5JREFUaEPt2d9LmlEY - B/D9AyYkhlGUiRGKovDSqGUDGyNaTIhYUGSMZRdeJHQzk2CMNqOikF66qhnW8iLo1YlllIPIdvMOy20N - i8RR7ZCudw3OReCFcPbjjHeSBfNi+S49fG885yCHz/sceeS9sc694X/jdzNu36nPd+rzfPUsnCw4vziz - kLjTHrOPH41bohZ9WN8cbL5x/qQcGGuba/PxeRfj8jCexZPF2fjs9PH01WfqeMr22WaJWjrDnbVbtZpX - Gi5irW6uToLJmdjMXHzOHrNPgImRo5Grz/Dh8MCnga7dLs22RuFWVJPVXMRa2VwZPBgcPRodOxobOhzq - j/abIqarT2+kV7+rrw/VK71KqU2q6ldxEWs5sGyKmPoifaaIqWevp/Vja9OHpqtP4/vGmq0ahUchtUlL - +0rlBjkXsZYCS4Y9Q/detz6sb9lpqQ/VE0EiC3lLqNZUVS+qyp+Uix6Jqjqq8liXJ4+VQfJYGeQaY+l2 - dBRD0ZCmIU0xlHHfyC6RgCQBqQ1pUzeTgEzdc0GuK5b1wIoQgklIMRTFUCABEELWAyteRb+GI+Zg9xv3 - jQghEpDpX/Un1xJLG9LCJAQJwNaONqQNn4URQrodHYvFfsxpLBKQqXWEgzkohsJYNKRBAtCQTl3NRSwa - 0gih9HmQACABWCx8Vc1Rcx7rAix2HmMRQSJ8FsZ8eaxL51ks1ih3sfzf/Aih1M4A59w1xJMUQ8EkxFcy - F7H+8gcez+t2dDAJcdHlIhbbOrCdQXrrwGJhXJiEOYpFBAlz1AyTEJcMDWlskdqUpmJpQ1rcteYoFr5f - jpgDYzliDrbKcCmlX9Lc/bvzT5LHyiB5rAySx8og/wWWN+BtD7fj9xR123XqdbVyWZmFeJUyp0wyLCkx - lQjbhJWtlVzE8mx4Gt41EMGfD1bmlElt0ornFVnIs4qyx2WihyLBfQH/Nl9yV8JFLPeGWx1QyxfkUpsU - H1fYJsxCHggFzQJ+HZ9H8HgET3KHk1iudZfspUw8KC42FBfeKyy4WYCPm91wFIt6TYmfios6ivi3fj9V - LuQH1nf5VNJV3VWF0AAAAABJRU5ErkJggg== + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvQAADr0BR/uQrQAAAwNJREFUaEPtmd9LU2EY + x/sHdOCYTBTdDpOxsbHBMDRnoBJikiBSoDiJnBdeKOwmFSHCUqYoQ/FKU9TcheC2DvMHukCc3Rj+qJQp + yULX0OUq8CLoIljfeuNwUEcMYue0cw4fDs95znvxvp/3ec/7wrm2yr/L98rniXoWvywC+jM9ezbr/OTk + gIhz/HR8MDTYGey0BCxVm1V8lLWyvjITmXFH3XSUnjubm4pMjZ2MJZ/Rk1HHRwdMNQQairaKzC/MfJS1 + vL48Eh6ZOJ2YjkxjbofCQ32hvuRjP7Z3fehq3G80b5t1Hl3BcAEfZS2tL3UfdfeH+gdCA73HvR3BjrbD + tuTTethq2beU7JTovXqVQ2XoMPBR1oJ/AX21Hdpwbz5ort2rrXxXmXwq3lYUbhXqaB1M5dhytFYtH2XN + ++etB9amgyZ8Vmt2azC3pk0TB7w2GVYM6mfqvEd58gdydb1alBUfUVYCiLISIIVlVe9Wu6KujfMNgKDl + fQvzajg8DEp3SpkMGiPDbnMFqSqr56gnFoud/ziHJhD+HsYjkuQtYlyTp5NMe2hCBr6YzBWkpCyUDDRB + EFM7CALfAtCBCsLjb1e/LvIIhCsLY8bImToiEB2oMsQIsDZhE3f2WyHKggKM/EISwA5AQGSRpdoebEdG + lBU3T2QhwNok+kRZcfOMLMaRcGX5vvowcvbJgHBhGZIkvmLYDciSFKIsjBkj/+sHnuSxIUIWKTohymKO + DszJ4PLRgZEF4AjtBSoLYI/D+EnJAOKCfShly4JKmBWuLIAiwhmdyELAVBmAlMuLFEnc2cmLpLCsf48o + KwFEWQkgykqA/0KW1++tC9SR/xTF28XGVaN+Qc8BXr3GqaHsVHZbtuyeLL82n4+y6DW67E0Z5hYTi+6q + HCrlUyUHPFHmPsyV35dL70glNyXULYqPsjxrHqPfqJ3VQhPpLiaWA+7KpFVSSbEkzZQGqHJeynKvujXP + NYpuRZY1K+N2Rvr1dNJdbuGpLNdLl+KxIrM+U3Ljz6zyAaqc+gn5VNJVTZ7e1wAAAABJRU5ErkJggg== @@ -1047,23 +1014,23 @@ XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvQAADr0BR/uQrQAAA5NJREFUaEPtmd1LMlkc - x+dP2qUXS7LG9yjCybKBLCUIgm56gSbLUie2EaOrTGccpaAGs2ZqitBuoiGppcg2WjAqk8rtZf+MBQ+P - z9PxufFi19nBz+WXM4cvn+H85sAgHx8ffxf5/Px8e3v7q0q8vLzkcrlsNpvJZNLptCRLkEKh8FHk/f29 - UCi8VIPn5+enpydg6vT0NB6PwzXlAZLP519fX4GmfD7/WCXu7u6ur6/T6TTHcUtLS3BNeYDc398/Pj7m - crmHh4dsNvtnNbi9vQWnL5FIUBQ1OTkJ15QHSKnxzc3N5eXl79Xg/PwcnD6KokZHR51OJ1xTHiB/FMlk - MhcXF9WarCcnJ6IorqysEARht9v7+vrgFfKgJqsCarIqoCarAiqT5fF4MAzr7u7u6upyuVypVArkPM8T - BDE9Pe36hsfjEQSBJMkf89nZ2Z9eC5QmK5lMGgwGrVYbCAQ4jpufn29tbbVarcBXOBxubGycmJj47RuB - QCAej9tsNqvVSpIkCP1+P03T8NbKk0UQhNFo3NnZKSXBYFCv109NTUmSRNN0R0fHwcHBl2ckyW63Ly8v - Q2E5SpPV3NzsdruhcGBgAMdxURRpmtbr9dvb29ACHMfn5uagsBxFyQqHw2q1OhaLQTlFURiGhcPhSCRS - X18fjUahBT09PYODg1BYjqJk0TTd1tbGMAyUMwyj1WpXV1dZllWpVDqdrqGh4dciKIoCWSiKtrS0gLCp - qWlxcRHaRGmyGIbRaDTlsxlIDIVCLMsaDIbNzU2e53eK8DwPjuHCwoIgCCAUBGF/fx/aRGmyNjY2VCpV - +agmSdJkMq2vr0ejUbPZvLe3By3Acdzv90NhOYqSJUmSRqMZGhqCQqvVOjw8nEqlWJatDfjv+Hw+g8Hg - 8/lKidfrRVEUTH2GYWqyvjA+Pm6z2bAinZ2dZrM5GAweHx9LksSyrMPh2N3dhR5xOp0/vbJDKFCWJEkc - x0Wj0VAoFIvFRFEs5aIoxmKxo6OjL6uLd46trS0oLEeZsv4larIqoCarAmqyKuB/I+vq6gr8p0in04eH - h9vVIJFIsCzr9XpHRkYwDLNYLHBNeYCcnZ2BzxnLshRFzVUDt9s9NjbW39/f3t6uVqt1Oh1cUx4gyWRy - bW2NoihQF1yj/mMsFovJZFKpVL8U0Wq1cE15gEQikZmZGYfDYTQa6+rqQN3qIl9ZLpert7e39FblgGxl - /QMHPJEbQSo3sQAAAABJRU5ErkJggg== + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvQAADr0BR/uQrQAAA4JJREFUaEPtmVtLYlEU + x89HmqGLFXY1S4ywtAt0kyAQesmCytJu0oWkp25mRUFFaRc1xHqJDkUNRTpRUNRYlI3ZfIz5496ncWiE + OQ+jZw7n96B77b2Vtf9nr7XXViYajf6I8fb2FolEvqeI5+fnUCh0c3MTCASOj49ZQcK8vLxAL/D6+oo2 + nE4+T09PDw8PRKmjo6P19XXqncBgHh8fw+EwkQntbyni9vY2GAxiT62trdlsNuqdwGDu7u7gK0Lg/v4e + z/Y6FVxdXZHoczqdo6OjHR0d1DuBwVB/r68vLy/Pz8+/pILT01MSfVCqtbVVr9dT7wQG8zUGHuzZ2Vmq + Muvh4aHH45mcnOzq6qqvr6+pqaEDAkMSiweSWDyQxOIBP7H6+/srKioqKyvLy8tNJtPe3h7p39rawjq7 + u7vRScDM7e3toaGh+P7e3t4/lgViE8vv9xcXFxcWFo6Pj6MU6uvry8vL02q1RK/Z2dnMzMz29vZhDkzD + 6VZdXY05kIx0jo2N2e128oXxiE0sLEOpVG5ublKbZaemphQKRWdnJ9qQQK1W7+7ukqF3sPKJiQlqJEZs + YmVnZ5vNZmpwNDQ01NbWYp0QC8K5XC46wIFRi8VCjcSISixEWU5OzuLiIrU5UEMihWHU4XCkp6cvLCzQ + AQ6dTtfY2EiNxIhKLGyc/Pz8ubk5anOgB1lsenp6fn5eJpMVFRVlZGR8jlFQUIAJEAsNuVxOOrOyskZG + Rshn4xGVWBAlNzf3Y24mIs7MzEAspP/V1VUci8hrAA1MQBharVYci6QTDa/XSz4bj6jEWllZwcb5mKpx + zJWUlCwvLyMAS0tL3W43HeCAWDgBqZEYsSV47Kzm5mZqcKAsaGlpQfWAnSUl+F8MDg4i0PBKbZYdGBhA + PiJZH3EqifUbRqMRRSaOP1BWVoa4Q6l1cHCAIeyspqamnZ0dMvMdvV7/N7/kiVAsgNod6QkZHRsKy6O9 + LIs2evb396nNgapiY2ODGokRp1j/CEksHkhi8UASiwf/jVgXFxfkfwoo5fP5cPwnH6fTifMUtYjBYMBR + q9FoqHcCgzk5OcEbHizcxcUYZVHyMZvNbW1tdXV1KpUKN3bcMYlzQoPx+/1LS0uQibhLyqgkg62EaxNu + VJ9i4HJOvRMYjMPh6OnpQUmpVCrT0tKIu6lFuGKZTKaqqqr3pyoEBCoWy/4EBzyRG765DXAAAAAASUVO + RK5CYII= diff --git a/INT89DB_26/Forms/FormProgramUpdate.Designer.cs b/INT89DB_26/Forms/FormProgramUpdate.Designer.cs index 8d54301..25459ad 100644 --- a/INT89DB_26/Forms/FormProgramUpdate.Designer.cs +++ b/INT89DB_26/Forms/FormProgramUpdate.Designer.cs @@ -30,13 +30,17 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormProgramUpdate)); this.smartForm1 = new SmartX.SmartForm(); - this.labelUpdateWait2 = new SmartX.SmartLabel(); - this.labelUpdateRestart = new SmartX.SmartLabel(); - this.labelUpdateWait = new SmartX.SmartLabel(); - this.progressBarUpdateBar = new SmartX.SmartProgressBar(); + this.labelMessage2 = new SmartX.SmartLabel(); + this.labelMessage1 = new SmartX.SmartLabel(); + this.progressBarUpdate = new SmartX.SmartProgressBar(); this.timerUpdate = new System.Windows.Forms.Timer(); this.labelTitle = new SmartX.SmartLabel(); this.pictureBoxFormIcon = new System.Windows.Forms.PictureBox(); + this.buttonBack = new SmartX.SmartButton(); + this.buttonLCD = new SmartX.SmartButton(); + this.buttonServiceUpdate = new SmartX.SmartButton(); + this.labelUpdateContents = new SmartX.SmartLabel(); + this.labelTitleUpdate = new SmartX.SmartLabel(); ((System.ComponentModel.ISupportInitialize)(this.smartForm1)).BeginInit(); this.SuspendLayout(); // @@ -55,93 +59,71 @@ this.smartForm1.SpecialFunctionClickPointSize = 100; this.smartForm1.SuspendLayoutInterval = 0; // - // labelUpdateWait2 + // labelMessage2 // - this.labelUpdateWait2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(246)))), ((int)(((byte)(228)))), ((int)(((byte)(180))))); - this.labelUpdateWait2.BackPictureBox = this.smartForm1; - this.labelUpdateWait2.BackPictureBox1 = null; - this.labelUpdateWait2.BackPictureBox2 = null; - this.labelUpdateWait2.BorderColor = System.Drawing.Color.Black; - this.labelUpdateWait2.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.labelUpdateWait2.Font = new System.Drawing.Font("New Gulim", 18F, System.Drawing.FontStyle.Bold); - this.labelUpdateWait2.ForeColor = System.Drawing.Color.Black; - this.labelUpdateWait2.InitVisible = true; - this.labelUpdateWait2.LineSpacing = 0F; - this.labelUpdateWait2.Location = new System.Drawing.Point(108, 242); - this.labelUpdateWait2.Name = "labelUpdateWait2"; - this.labelUpdateWait2.Size = new System.Drawing.Size(600, 31); - this.labelUpdateWait2.TabIndex = 158; - this.labelUpdateWait2.Text = "USB를 본체에서 분리하지 마십시오"; - this.labelUpdateWait2.TextHAlign = SmartX.SmartLabel.TextHorAlign.Middle; - this.labelUpdateWait2.TextVAlign = SmartX.SmartLabel.TextVerAlign.Middle; - this.labelUpdateWait2.Visible = false; - this.labelUpdateWait2.Wordwrap = false; + this.labelMessage2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(246)))), ((int)(((byte)(228)))), ((int)(((byte)(180))))); + this.labelMessage2.BackPictureBox = this.smartForm1; + this.labelMessage2.BackPictureBox1 = null; + this.labelMessage2.BackPictureBox2 = null; + this.labelMessage2.BorderColor = System.Drawing.Color.Black; + this.labelMessage2.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.labelMessage2.Font = new System.Drawing.Font("새굴림", 18F, System.Drawing.FontStyle.Bold); + this.labelMessage2.ForeColor = System.Drawing.Color.Black; + this.labelMessage2.InitVisible = true; + this.labelMessage2.LineSpacing = 0F; + this.labelMessage2.Location = new System.Drawing.Point(107, 221); + this.labelMessage2.Name = "labelMessage2"; + this.labelMessage2.Size = new System.Drawing.Size(600, 31); + this.labelMessage2.TabIndex = 158; + this.labelMessage2.Text = "USB를 본체에서 분리하지 마십시오"; + this.labelMessage2.TextHAlign = SmartX.SmartLabel.TextHorAlign.Middle; + this.labelMessage2.TextVAlign = SmartX.SmartLabel.TextVerAlign.Middle; + this.labelMessage2.Visible = false; + this.labelMessage2.Wordwrap = false; // - // labelUpdateRestart + // labelMessage1 // - this.labelUpdateRestart.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(192)))), ((int)(((byte)(255))))); - this.labelUpdateRestart.BackPictureBox = null; - this.labelUpdateRestart.BackPictureBox1 = null; - this.labelUpdateRestart.BackPictureBox2 = null; - this.labelUpdateRestart.BorderColor = System.Drawing.Color.Black; - this.labelUpdateRestart.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.labelUpdateRestart.Font = new System.Drawing.Font("New Gulim", 18F, System.Drawing.FontStyle.Bold); - this.labelUpdateRestart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.labelUpdateRestart.InitVisible = true; - this.labelUpdateRestart.LineSpacing = 0F; - this.labelUpdateRestart.Location = new System.Drawing.Point(56, 279); - this.labelUpdateRestart.Name = "labelUpdateRestart"; - this.labelUpdateRestart.Size = new System.Drawing.Size(700, 32); - this.labelUpdateRestart.TabIndex = 159; - this.labelUpdateRestart.Text = "전원을 끄고 다시 켜주세요"; - this.labelUpdateRestart.TextHAlign = SmartX.SmartLabel.TextHorAlign.Middle; - this.labelUpdateRestart.TextVAlign = SmartX.SmartLabel.TextVerAlign.Middle; - this.labelUpdateRestart.Visible = false; - this.labelUpdateRestart.Wordwrap = false; + this.labelMessage1.BackColor = System.Drawing.Color.DarkGray; + this.labelMessage1.BackPictureBox = this.smartForm1; + this.labelMessage1.BackPictureBox1 = null; + this.labelMessage1.BackPictureBox2 = null; + this.labelMessage1.BorderColor = System.Drawing.Color.Black; + this.labelMessage1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.labelMessage1.Font = new System.Drawing.Font("새굴림", 18F, System.Drawing.FontStyle.Bold); + this.labelMessage1.InitVisible = true; + this.labelMessage1.LineSpacing = 0F; + this.labelMessage1.Location = new System.Drawing.Point(107, 184); + this.labelMessage1.Name = "labelMessage1"; + this.labelMessage1.Size = new System.Drawing.Size(600, 31); + this.labelMessage1.TabIndex = 157; + this.labelMessage1.Text = "업데이트 중..."; + this.labelMessage1.TextHAlign = SmartX.SmartLabel.TextHorAlign.Middle; + this.labelMessage1.TextVAlign = SmartX.SmartLabel.TextVerAlign.Middle; + this.labelMessage1.Wordwrap = false; // - // labelUpdateWait + // progressBarUpdate // - this.labelUpdateWait.BackColor = System.Drawing.Color.DarkGray; - this.labelUpdateWait.BackPictureBox = this.smartForm1; - this.labelUpdateWait.BackPictureBox1 = null; - this.labelUpdateWait.BackPictureBox2 = null; - this.labelUpdateWait.BorderColor = System.Drawing.Color.Black; - this.labelUpdateWait.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.labelUpdateWait.Font = new System.Drawing.Font("New Gulim", 18F, System.Drawing.FontStyle.Bold); - this.labelUpdateWait.InitVisible = true; - this.labelUpdateWait.LineSpacing = 0F; - this.labelUpdateWait.Location = new System.Drawing.Point(108, 205); - this.labelUpdateWait.Name = "labelUpdateWait"; - this.labelUpdateWait.Size = new System.Drawing.Size(600, 31); - this.labelUpdateWait.TabIndex = 157; - this.labelUpdateWait.Text = "업데이트 중..."; - this.labelUpdateWait.TextHAlign = SmartX.SmartLabel.TextHorAlign.Middle; - this.labelUpdateWait.TextVAlign = SmartX.SmartLabel.TextVerAlign.Middle; - this.labelUpdateWait.Wordwrap = false; - // - // progressBarUpdateBar - // - this.progressBarUpdateBar.AutoColorSet = true; - this.progressBarUpdateBar.BackColor = System.Drawing.Color.Silver; - this.progressBarUpdateBar.BarBackColor1 = System.Drawing.Color.White; - this.progressBarUpdateBar.BarBackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); - this.progressBarUpdateBar.BarColor1 = System.Drawing.Color.Cyan; - this.progressBarUpdateBar.BarColor2 = System.Drawing.Color.Teal; - this.progressBarUpdateBar.BarStyle = SmartX.SmartProgressBar.BARTYPE.Normal; - this.progressBarUpdateBar.Direction = SmartX.SmartProgressBar.DIR.Horizontal; - this.progressBarUpdateBar.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular); - this.progressBarUpdateBar.InitVisible = true; - this.progressBarUpdateBar.Location = new System.Drawing.Point(114, 351); - this.progressBarUpdateBar.Maximum = 100; - this.progressBarUpdateBar.Minimum = 0; - this.progressBarUpdateBar.Name = "progressBarUpdateBar"; - this.progressBarUpdateBar.OutlineColor = System.Drawing.Color.Black; - this.progressBarUpdateBar.PercentageText = true; - this.progressBarUpdateBar.RoundedCorners = true; - this.progressBarUpdateBar.Size = new System.Drawing.Size(585, 53); - this.progressBarUpdateBar.TabIndex = 156; - this.progressBarUpdateBar.TextAutoRotation = true; - this.progressBarUpdateBar.Value = 10; + this.progressBarUpdate.AutoColorSet = true; + this.progressBarUpdate.BackColor = System.Drawing.Color.Silver; + this.progressBarUpdate.BarBackColor1 = System.Drawing.Color.White; + this.progressBarUpdate.BarBackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.progressBarUpdate.BarColor1 = System.Drawing.Color.Cyan; + this.progressBarUpdate.BarColor2 = System.Drawing.Color.Teal; + this.progressBarUpdate.BarStyle = SmartX.SmartProgressBar.BARTYPE.Normal; + this.progressBarUpdate.Direction = SmartX.SmartProgressBar.DIR.Horizontal; + this.progressBarUpdate.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular); + this.progressBarUpdate.InitVisible = true; + this.progressBarUpdate.Location = new System.Drawing.Point(112, 296); + this.progressBarUpdate.Maximum = 100; + this.progressBarUpdate.Minimum = 0; + this.progressBarUpdate.Name = "progressBarUpdate"; + this.progressBarUpdate.OutlineColor = System.Drawing.Color.Black; + this.progressBarUpdate.PercentageText = true; + this.progressBarUpdate.RoundedCorners = true; + this.progressBarUpdate.Size = new System.Drawing.Size(585, 53); + this.progressBarUpdate.TabIndex = 156; + this.progressBarUpdate.TextAutoRotation = true; + this.progressBarUpdate.Value = 10; // // timerUpdate // @@ -154,7 +136,7 @@ this.labelTitle.BackPictureBox2 = null; this.labelTitle.BorderColor = System.Drawing.Color.Black; this.labelTitle.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.labelTitle.Font = new System.Drawing.Font("New Gulim", 23F, System.Drawing.FontStyle.Bold); + this.labelTitle.Font = new System.Drawing.Font("새굴림", 23F, System.Drawing.FontStyle.Bold); this.labelTitle.ForeColor = System.Drawing.Color.White; this.labelTitle.InitVisible = true; this.labelTitle.LineSpacing = 0F; @@ -174,18 +156,162 @@ this.pictureBoxFormIcon.Name = "pictureBoxFormIcon"; this.pictureBoxFormIcon.Size = new System.Drawing.Size(47, 45); // + // buttonBack + // + this.buttonBack.BackPictureBox = null; + this.buttonBack.BackPictureBox1 = null; + this.buttonBack.BackPictureBox2 = null; + this.buttonBack.ButtonColor = System.Drawing.Color.Gray; + this.buttonBack.ButtonImageAutoSize = true; + this.buttonBack.ColorKeySamplePosition = new System.Drawing.Point(0, 0); + this.buttonBack.DisableImage = null; + this.buttonBack.DownImage = ((System.Drawing.Image)(resources.GetObject("buttonBack.DownImage"))); + this.buttonBack.GroupID = 0; + this.buttonBack.InitVisible = true; + this.buttonBack.Location = new System.Drawing.Point(720, 525); + this.buttonBack.Mode = SmartX.SmartButton.BUTTONMODE.NORMAL; + this.buttonBack.Name = "buttonBack"; + this.buttonBack.NestedClickEventPrevent = false; + this.buttonBack.OutlinePixel = 1; + this.buttonBack.RepeatInterval = 200; + this.buttonBack.RepeatIntervalAccelerate = null; + this.buttonBack.SafeInterval = 200; + this.buttonBack.Size = new System.Drawing.Size(70, 70); + this.buttonBack.SpecialFunction = SmartX.SmartButton.SPECIALFUNC.NONE; + this.buttonBack.TabIndex = 238; + this.buttonBack.TextColor = System.Drawing.Color.Black; + this.buttonBack.TextDownColor = System.Drawing.Color.White; + this.buttonBack.TextHAlign = SmartX.SmartButton.TextHorAlign.Middle; + this.buttonBack.TextLocation = new System.Drawing.Point(0, 0); + this.buttonBack.TextVAlign = SmartX.SmartButton.TextVerAlign.Middle; + this.buttonBack.UpImage = ((System.Drawing.Image)(resources.GetObject("buttonBack.UpImage"))); + this.buttonBack.Click += new System.EventHandler(this.buttonBack_Click); + // + // buttonLCD + // + this.buttonLCD.BackPictureBox = null; + this.buttonLCD.BackPictureBox1 = null; + this.buttonLCD.BackPictureBox2 = null; + this.buttonLCD.ButtonColor = System.Drawing.Color.Silver; + this.buttonLCD.ButtonImageAutoSize = true; + this.buttonLCD.ColorKeySamplePosition = new System.Drawing.Point(0, 0); + this.buttonLCD.DisableImage = null; + this.buttonLCD.DownImage = null; + this.buttonLCD.Font = new System.Drawing.Font("새굴림", 13F, System.Drawing.FontStyle.Bold); + this.buttonLCD.GroupID = 0; + this.buttonLCD.InitVisible = true; + this.buttonLCD.Location = new System.Drawing.Point(205, 371); + this.buttonLCD.Mode = SmartX.SmartButton.BUTTONMODE.NORMAL; + this.buttonLCD.Name = "buttonLCD"; + this.buttonLCD.NestedClickEventPrevent = false; + this.buttonLCD.OutlinePixel = 1; + this.buttonLCD.RepeatInterval = 200; + this.buttonLCD.RepeatIntervalAccelerate = null; + this.buttonLCD.SafeInterval = 200; + this.buttonLCD.Size = new System.Drawing.Size(180, 50); + this.buttonLCD.SpecialFunction = SmartX.SmartButton.SPECIALFUNC.NONE; + this.buttonLCD.TabIndex = 239; + this.buttonLCD.Text = "LCD Update"; + this.buttonLCD.TextColor = System.Drawing.Color.Black; + this.buttonLCD.TextDownColor = System.Drawing.Color.White; + this.buttonLCD.TextHAlign = SmartX.SmartButton.TextHorAlign.Middle; + this.buttonLCD.TextLocation = new System.Drawing.Point(0, 0); + this.buttonLCD.TextVAlign = SmartX.SmartButton.TextVerAlign.Middle; + this.buttonLCD.UpImage = null; + this.buttonLCD.Click += new System.EventHandler(this.buttonLCD_Click); + // + // buttonServiceUpdate + // + this.buttonServiceUpdate.BackPictureBox = null; + this.buttonServiceUpdate.BackPictureBox1 = null; + this.buttonServiceUpdate.BackPictureBox2 = null; + this.buttonServiceUpdate.ButtonColor = System.Drawing.Color.Silver; + this.buttonServiceUpdate.ButtonImageAutoSize = true; + this.buttonServiceUpdate.ColorKeySamplePosition = new System.Drawing.Point(0, 0); + this.buttonServiceUpdate.DisableImage = null; + this.buttonServiceUpdate.DownImage = null; + this.buttonServiceUpdate.Font = new System.Drawing.Font("새굴림", 13F, System.Drawing.FontStyle.Bold); + this.buttonServiceUpdate.GroupID = 0; + this.buttonServiceUpdate.InitVisible = true; + this.buttonServiceUpdate.Location = new System.Drawing.Point(409, 371); + this.buttonServiceUpdate.Mode = SmartX.SmartButton.BUTTONMODE.NORMAL; + this.buttonServiceUpdate.Name = "buttonServiceUpdate"; + this.buttonServiceUpdate.NestedClickEventPrevent = false; + this.buttonServiceUpdate.OutlinePixel = 1; + this.buttonServiceUpdate.RepeatInterval = 200; + this.buttonServiceUpdate.RepeatIntervalAccelerate = null; + this.buttonServiceUpdate.SafeInterval = 200; + this.buttonServiceUpdate.Size = new System.Drawing.Size(180, 50); + this.buttonServiceUpdate.SpecialFunction = SmartX.SmartButton.SPECIALFUNC.NONE; + this.buttonServiceUpdate.TabIndex = 240; + this.buttonServiceUpdate.Text = "Service Update"; + this.buttonServiceUpdate.TextColor = System.Drawing.Color.Black; + this.buttonServiceUpdate.TextDownColor = System.Drawing.Color.White; + this.buttonServiceUpdate.TextHAlign = SmartX.SmartButton.TextHorAlign.Middle; + this.buttonServiceUpdate.TextLocation = new System.Drawing.Point(0, 0); + this.buttonServiceUpdate.TextVAlign = SmartX.SmartButton.TextVerAlign.Middle; + this.buttonServiceUpdate.UpImage = null; + this.buttonServiceUpdate.Click += new System.EventHandler(this.buttonServiceUpdate_Click); + // + // labelUpdateContents + // + this.labelUpdateContents.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(30)))), ((int)(((byte)(30))))); + this.labelUpdateContents.BackPictureBox = this.smartForm1; + this.labelUpdateContents.BackPictureBox1 = null; + this.labelUpdateContents.BackPictureBox2 = null; + this.labelUpdateContents.BorderColor = System.Drawing.Color.Black; + this.labelUpdateContents.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.labelUpdateContents.Font = new System.Drawing.Font("새굴림", 12F, System.Drawing.FontStyle.Bold); + this.labelUpdateContents.ForeColor = System.Drawing.Color.Black; + this.labelUpdateContents.InitVisible = true; + this.labelUpdateContents.LineSpacing = 0F; + this.labelUpdateContents.Location = new System.Drawing.Point(337, 258); + this.labelUpdateContents.Name = "labelUpdateContents"; + this.labelUpdateContents.Size = new System.Drawing.Size(360, 30); + this.labelUpdateContents.TabIndex = 251; + this.labelUpdateContents.TextHAlign = SmartX.SmartLabel.TextHorAlign.Middle; + this.labelUpdateContents.TextVAlign = SmartX.SmartLabel.TextVerAlign.Middle; + this.labelUpdateContents.Visible = false; + this.labelUpdateContents.Wordwrap = false; + // + // labelTitleUpdate + // + this.labelTitleUpdate.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(30)))), ((int)(((byte)(30))))); + this.labelTitleUpdate.BackPictureBox = this.smartForm1; + this.labelTitleUpdate.BackPictureBox1 = null; + this.labelTitleUpdate.BackPictureBox2 = null; + this.labelTitleUpdate.BorderColor = System.Drawing.Color.Black; + this.labelTitleUpdate.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.labelTitleUpdate.Font = new System.Drawing.Font("새굴림", 12F, System.Drawing.FontStyle.Bold); + this.labelTitleUpdate.ForeColor = System.Drawing.Color.Black; + this.labelTitleUpdate.InitVisible = true; + this.labelTitleUpdate.LineSpacing = 0F; + this.labelTitleUpdate.Location = new System.Drawing.Point(161, 258); + this.labelTitleUpdate.Name = "labelTitleUpdate"; + this.labelTitleUpdate.Size = new System.Drawing.Size(153, 30); + this.labelTitleUpdate.TabIndex = 250; + this.labelTitleUpdate.Text = "Update : "; + this.labelTitleUpdate.TextHAlign = SmartX.SmartLabel.TextHorAlign.Middle; + this.labelTitleUpdate.TextVAlign = SmartX.SmartLabel.TextVerAlign.Middle; + this.labelTitleUpdate.Visible = false; + this.labelTitleUpdate.Wordwrap = false; + // // FormProgramUpdate // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.AutoScroll = true; this.ClientSize = new System.Drawing.Size(800, 600); + this.Controls.Add(this.labelUpdateContents); + this.Controls.Add(this.labelTitleUpdate); + this.Controls.Add(this.buttonServiceUpdate); + this.Controls.Add(this.buttonLCD); + this.Controls.Add(this.buttonBack); this.Controls.Add(this.labelTitle); this.Controls.Add(this.pictureBoxFormIcon); - this.Controls.Add(this.labelUpdateWait2); - this.Controls.Add(this.labelUpdateRestart); - this.Controls.Add(this.labelUpdateWait); - this.Controls.Add(this.progressBarUpdateBar); + this.Controls.Add(this.labelMessage2); + this.Controls.Add(this.labelMessage1); + this.Controls.Add(this.progressBarUpdate); this.Controls.Add(this.smartForm1); this.Name = "FormProgramUpdate"; this.Text = "FormProgramUpdate"; @@ -197,12 +323,16 @@ #endregion private SmartX.SmartForm smartForm1; - public SmartX.SmartLabel labelUpdateWait2; - public SmartX.SmartLabel labelUpdateRestart; - public SmartX.SmartLabel labelUpdateWait; - public SmartX.SmartProgressBar progressBarUpdateBar; + public SmartX.SmartLabel labelMessage2; + public SmartX.SmartLabel labelMessage1; + public SmartX.SmartProgressBar progressBarUpdate; private System.Windows.Forms.Timer timerUpdate; private SmartX.SmartLabel labelTitle; private System.Windows.Forms.PictureBox pictureBoxFormIcon; + private SmartX.SmartButton buttonBack; + private SmartX.SmartButton buttonLCD; + private SmartX.SmartButton buttonServiceUpdate; + public SmartX.SmartLabel labelUpdateContents; + public SmartX.SmartLabel labelTitleUpdate; } } \ No newline at end of file diff --git a/INT89DB_26/Forms/FormProgramUpdate.cs b/INT89DB_26/Forms/FormProgramUpdate.cs index 95882cd..c434a4e 100644 --- a/INT89DB_26/Forms/FormProgramUpdate.cs +++ b/INT89DB_26/Forms/FormProgramUpdate.cs @@ -10,6 +10,8 @@ using System.IO; using INT89DB_26.DialogForms; using INT89DB_26_ImageDll; +using INT89DB_26.Part11_UserManager; +using libPayService; namespace INT89DB_26.Forms { @@ -17,6 +19,9 @@ namespace INT89DB_26.Forms { #region Field private FormMain m_ParentForm; + private DataStore.E_Step3 UpdateStep; + + private bool IsUpdate = false; private int Check; @@ -24,6 +29,7 @@ namespace INT89DB_26.Forms private string UpdateFilePath = ""; private string OldFilePath = ""; private string RemoveFolderPath = ""; + private string KeyFolderPath = ""; private List DllName = new List(); private List LongOldDllFileLastWriteTime = new List(); @@ -36,6 +42,9 @@ namespace INT89DB_26.Forms InitializeComponent(); this.ParentForm = parent; + + this.InitializeDesign(); + this.DefaultSetting(); } #endregion @@ -60,17 +69,15 @@ namespace INT89DB_26.Forms { this.labelTitle.Text = "Update"; - this.labelUpdateWait.Text = "Wait a minute..."; - this.labelUpdateWait2.Text = "Do not disconnect the USB from the body"; - this.labelUpdateRestart.Text = "Turn OFF the power and then turn ON the power"; + this.labelMessage1.Text = "Wait a minute..."; + this.labelMessage2.Text = "Do not disconnect the USB from the body"; } else if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Chinese) { this.labelTitle.Text = "更新"; - this.labelUpdateWait.Text = "请稍等..."; - this.labelUpdateWait2.Text = "请勿断开USB"; - this.labelUpdateRestart.Text = "关掉电源,然后在打开电源"; + this.labelMessage1.Text = "请稍等..."; + this.labelMessage2.Text = "请勿断开USB"; } else if (this.ParentForm.SystemConfig.Language == DataStore.E_LanguageID.Czech) { @@ -81,16 +88,13 @@ namespace INT89DB_26.Forms } } - - public void DisplayRefresh() + private void DefaultSetting() { - this.CheckError(); + PayService.ServiceDataEvent += PayService_ServiceDataEvent; + this.DecideUpdatePath(); } - - public void CheckError() + private void DecideUpdatePath() { - FileInfo[] newFiles; - if (Directory.Exists("Hard Disk\\") == true) this.USBPath = "Hard Disk\\"; else if (Directory.Exists("하드 디스크\\") == true) @@ -99,61 +103,191 @@ namespace INT89DB_26.Forms this.USBPath = "하드 디스크\\"; this.UpdateFilePath = this.USBPath + "UpdateFiles\\"; + this.KeyFolderPath = this.USBPath + "KEY\\"; + this.OldFilePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\"; + if (this.OldFilePath.StartsWith("\\F") == true) + this.RemoveFolderPath = "Flash Disk\\RemoveFile\\"; + else + this.RemoveFolderPath = "SD Card\\RemoveFile\\"; + } + + private void InitialStatus() + { + this.UpdateStep = DataStore.E_Step3.Step1; + this.UpdateLabelStatus(this.UpdateStep, this.ParentForm.SystemConfig.Language); + this.buttonLCD.Enabled = true; + this.buttonServiceUpdate.Enabled = true; + this.labelMessage2.ForeColor = Color.Black; + this.labelMessage2.Visible = true; + this.buttonBack.Enabled = true; + } + private void FinishStatusNeededReBoot() + { + this.ParentForm.Enabled = false; + this.UpdateStep = DataStore.E_Step3.Step3; + this.UpdateLabelStatus(this.UpdateStep, this.ParentForm.SystemConfig.Language); + } + + public void EnableBackupButton(bool enable) + { + this.buttonLCD.Enabled = enable; + this.buttonServiceUpdate.Enabled = enable; + + if (enable == true) + { + this.buttonLCD.TextColor = Color.Black; + this.buttonServiceUpdate.TextColor = Color.Black; + } + else + { + this.buttonLCD.TextColor = Color.DimGray; + this.buttonServiceUpdate.TextColor = Color.DimGray; + } + this.Refresh(); + } + + private void ProgramUpdateCheck(DialogResult result) + { + PayService service = new PayService(); + DataStore.E_UpdateCheck check = DataStore.E_UpdateCheck.Fail; + + if (result == DialogResult.Yes) + { + check = this.CheckError(); + + if (check == DataStore.E_UpdateCheck.Success) + { + this.buttonLCD.TextColor = Color.DimGray; + this.buttonLCD.Enabled = false; + this.buttonServiceUpdate.TextColor = Color.DimGray; + this.buttonServiceUpdate.Enabled = false; + this.UpdateStep = DataStore.E_Step3.Step2; + this.UpdateLabelStatus(this.UpdateStep, this.ParentForm.SystemConfig.Language); + + if (this.IsUpdate == true) + this.ProgramUpdate(); + else + { + FileInfo[] newFiles; + DirectoryInfo directoryFolder = new DirectoryInfo(this.KeyFolderPath); + if (directoryFolder.Exists == false) + directoryFolder.Create(); + + newFiles = directoryFolder.GetFiles(); + + //Console.Write("{0}, {1} \n", this.KeyFolderPath + newFiles[0].ToString(), newFiles.Length); + + ErrorLog_e ret = service.PayServiceOpen(this.KeyFolderPath + newFiles[0].ToString(), this.ParentForm.SystemConfig.SerialNumber); + if (ret != ErrorLog_e.NONE) + { + DialogFormMessage message = new DialogFormMessage((int)ret, this.ParentForm.SystemConfig.Language, + this.ParentForm.SystemConfig.CurrentForm); + message.ShowDialog(); + + this.InitialStatus(); + } + } + } + else if (check == DataStore.E_UpdateCheck.NotUsbMomery) + { + DialogFormMessage message = new DialogFormMessage(5, this.ParentForm.SystemConfig.Language); + message.ShowDialog(); + this.IsUpdate = false; + } + else if (check == DataStore.E_UpdateCheck.NotUpdateFolder) + { + DialogFormMessage message = new DialogFormMessage(9, this.ParentForm.SystemConfig.Language); + message.ShowDialog(); + this.IsUpdate = false; + } + else if (check == DataStore.E_UpdateCheck.NotFile) + { + DialogFormMessage message = new DialogFormMessage(7, this.ParentForm.SystemConfig.Language); + message.ShowDialog(); + this.IsUpdate = false; + } + else if (check == DataStore.E_UpdateCheck.TooManyFiles) + { + DialogFormMessage message = new DialogFormMessage(8, this.ParentForm.SystemConfig.Language); + message.ShowDialog(); + this.IsUpdate = false; + } + } + } + public DataStore.E_UpdateCheck CheckError() + { + DataStore.E_UpdateCheck ret = DataStore.E_UpdateCheck.Fail; + FileInfo[] newFiles; DirectoryInfo info = new DirectoryInfo(this.USBPath); - DirectoryInfo directoryFolderUpdateFiles = new DirectoryInfo(this.UpdateFilePath); + DirectoryInfo dirFolderSource; + + if (this.IsUpdate == true) + dirFolderSource = new DirectoryInfo(this.UpdateFilePath); + else + dirFolderSource = new DirectoryInfo(this.KeyFolderPath); // USB 장착 유무 확인 if (info.Exists == true) { // USB에 UpdateFiles 유무 확인 - if (directoryFolderUpdateFiles.Exists == true) + if (dirFolderSource.Exists == true) { - newFiles = directoryFolderUpdateFiles.GetFiles(); + newFiles = dirFolderSource.GetFiles(); if (newFiles.Length == 0) { - // USB에 업데이트 파일이 없습니다 - DialogFormMessage message = new DialogFormMessage(7, this.ParentForm.SystemConfig.Language, ""); - message.ShowDialog(); - return; + ret = DataStore.E_UpdateCheck.NotFile; } else { - ((FormMain)(Owner)).smartForm.Show((int)DataStore.E_FormStore.FormProgramUpdate); + if (this.IsUpdate == false) + { + if (newFiles.Length == 1) + ret = DataStore.E_UpdateCheck.Success; + else + ret = DataStore.E_UpdateCheck.TooManyFiles; + } + else + ret = DataStore.E_UpdateCheck.Success; } } else { - // USB에 업데이트 폴더가 없습니다 - DialogFormMessage message = new DialogFormMessage(9, this.ParentForm.SystemConfig.Language, ""); - message.ShowDialog(); - return; + ret = DataStore.E_UpdateCheck.NotUpdateFolder; } } else { - // USB메모리가 장착되지 않았습니다 - DialogFormMessage message = new DialogFormMessage(5, this.ParentForm.SystemConfig.Language, ""); - message.ShowDialog(); - return; + ret = DataStore.E_UpdateCheck.NotUsbMomery; } - } + return ret; + } + private void ProgramUpdate() { + this.buttonBack.Enabled = false; + FileInfo[] newFiles; DirectoryInfo directoryFolderUpdateFiles = new DirectoryInfo(this.UpdateFilePath); + if (directoryFolderUpdateFiles.Exists == false) + directoryFolderUpdateFiles.Create(); + newFiles = directoryFolderUpdateFiles.GetFiles(); - this.progressBarUpdateBar.Value += 20; + this.progressBarUpdate.Value += 20; this.TreatmentRemoveOldFile(); + + this.progressBarUpdate.Value += 20; + this.TreatmentCopyNewFile(newFiles); - this.progressBarUpdateBar.Value += 100; + this.progressBarUpdate.Value += 100; + this.ParentForm.SetTrackingHistoryData(DataStore.E_TrackingOperation.Update, "LCD"); + this.FinishStatusNeededReBoot(); } - private void TreatmentRemoveOldFile() { bool removeFolderCheck = false; @@ -168,45 +302,287 @@ namespace INT89DB_26.Forms directoryFolderRemove.Create(); foreach (FileInfo subFile in oldFiles) - subFile.MoveTo(RemoveFolderPath + DateTime.Now.ToString("yyyyMMddHHmmss") + subFile.Name.ToString()); + subFile.MoveTo(this.RemoveFolderPath + DateTime.Now.ToString("yyyyMMddHHmmss") + subFile.Name.ToString()); - this.progressBarUpdateBar.Value += 20; + this.progressBarUpdate.Value += 20; } - private void TreatmentCopyNewFile(FileInfo[] newFile) { // 새 파일 복사 foreach (FileInfo subFile in newFile) subFile.CopyTo(this.OldFilePath + subFile.Name.ToString()); - this.progressBarUpdateBar.Value += 20; + this.progressBarUpdate.Value += 20; } - #endregion - #region Override Member - protected override void OnLoad(EventArgs e) + private void UpdateLabelStatus(DataStore.E_Step3 step, DataStore.E_LanguageID language) { - base.OnLoad(e); + switch (step) + { + case DataStore.E_Step3.Step1: + #region Step1 + switch (language) + { + case DataStore.E_LanguageID.Korean: + this.labelMessage1.Text = "USB를 본체에 삽입 하십시오"; + this.labelMessage2.Text = "업데이트 할 항목을 선택해 주십시오"; + break; + case DataStore.E_LanguageID.English: + this.labelMessage1.Text = "Please insert usb into the device"; + this.labelMessage2.Text = "Please select an item to update"; + break; + case DataStore.E_LanguageID.Chinese: + this.labelMessage1.Text = "请将usb插入设备中。"; + this.labelMessage2.Text = "请选择一个项目来更新"; + break; + case DataStore.E_LanguageID.German: + this.labelMessage1.Font = new Font("새굴림", 18, FontStyle.Bold); + this.labelMessage1.Text = "USB nicht vom Gerät trennen"; + this.labelMessage2.Font = new Font("새굴림", 18, FontStyle.Bold); + this.labelMessage2.Text = "Drücken Sie nach dem USB-Anschluss die untere Taste"; + break; + default: + break; + } + #endregion + break; + case DataStore.E_Step3.Step2: + #region Step2 + switch (language) + { + case DataStore.E_LanguageID.Korean: + this.labelMessage1.Text = "업데이트 중..."; + this.labelMessage2.Text = "USB를 본체에서 분리하지 마십시오"; + break; + case DataStore.E_LanguageID.English: + this.labelMessage1.Text = "Updating..."; + this.labelMessage2.Text = "Do not remove the USB from the device"; + break; + case DataStore.E_LanguageID.Chinese: + this.labelMessage1.Text = "更新中..."; + this.labelMessage2.Text = "请勿断开USB"; + break; + case DataStore.E_LanguageID.German: + this.labelMessage1.Font = new Font("새굴림", 18, FontStyle.Bold); + this.labelMessage1.Text = "Aktualisierung…."; + this.labelMessage2.Font = new Font("새굴림", 18, FontStyle.Bold); + this.labelMessage2.Text = "USB nicht vom Gerät trennen"; + break; + default: + break; + } + #endregion + break; + case DataStore.E_Step3.Step3: + #region Step3 + this.labelMessage2.ForeColor = Color.Red; + switch (language) + { + case DataStore.E_LanguageID.Korean: + this.labelMessage1.Text = "프로그램 업데이트 완료"; + this.labelMessage2.Text = "전원을 끄고 다시 켜주세요"; + break; + case DataStore.E_LanguageID.English: + this.labelMessage1.Text = "Program update complete"; + this.labelMessage2.Text = "Reset the system"; + break; + case DataStore.E_LanguageID.Chinese: + this.labelMessage1.Text = "系统更新完成"; + this.labelMessage2.Text = "关掉电源,然后在打开电源"; + break; + case DataStore.E_LanguageID.German: + this.labelMessage1.Font = new Font("새굴림", 18, FontStyle.Bold); + this.labelMessage1.Text = "Programmaktualisierung abgeschlossen"; + this.labelMessage2.Font = new Font("새굴림", 18, FontStyle.Bold); + this.labelMessage2.Text = "Mit dem Hauptschalter aus- und einschalten"; + break; + default: + break; + } + #endregion + break; + default: + break; + } - this.InitializeDesign(); + this.Refresh(); + } + private void PayService_ServiceDataEvent(SERVICE_ITEMS_e item, SERVICE_MODE_e value) + { + //Console.Write("{0} = {1} \n", item.ToString(), value.ToString()); + this.progressBarUpdate.Value = 50; - DirectoryInfo directoryFolderUpdateFiles = new DirectoryInfo(this.UpdateFilePath); - if (directoryFolderUpdateFiles.Exists == false) - directoryFolderUpdateFiles.Create(); + switch (item) + { + case SERVICE_ITEMS_e.MODBUS: + #region Modbus + switch (value) + { + case SERVICE_MODE_e.DISABLE: + if (this.ParentForm.SystemConfig.IsModbus == true) + { + this.ParentForm.SystemConfig.IsModbus = false; - this.Check = 0; + if (this.ParentForm.SystemConfig.Serial3Mode == (int)DataStore.E_CommMode.f99_Modbus) + this.ParentForm.SystemConfig.Serial3Mode = 0; + if (this.ParentForm.SystemConfig.EthernetMode == (int)DataStore.E_CommMode.f99_Modbus) + this.ParentForm.SystemConfig.EthernetMode = 0; - this.UpdateFilePath = this.USBPath + "UpdateFiles\\"; - this.OldFilePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\"; - if (this.OldFilePath.StartsWith("\\F") == true) - this.RemoveFolderPath = "Flash Disk\\RemoveFile\\"; + this.ParentForm.SaveSystemConfigurationFile(this.ParentForm.SystemConfig); + + //this.ParentForm.CenterConfiSerial.ChangeCommunicationMode(); + //this.ParentForm.CenterConfiEthernet.ChangeCommunicationMode(); + + this.labelUpdateContents.Text += "Modbus OFF"; + this.ParentForm.SetTrackingHistoryData(DataStore.E_TrackingOperation.FunctionUpdate, "Modbus_OFF"); + } + break; + case SERVICE_MODE_e.ENABLE: + if (this.ParentForm.SystemConfig.IsModbus == false) + { + this.ParentForm.SystemConfig.IsModbus = true; + this.ParentForm.SaveSystemConfigurationFile(this.ParentForm.SystemConfig); + + //this.ParentForm.CenterConfiSerial.ChangeCommunicationMode(); + //this.ParentForm.CenterConfiEthernet.ChangeCommunicationMode(); + + this.labelUpdateContents.Text += "Modbus ON"; + this.ParentForm.SetTrackingHistoryData(DataStore.E_TrackingOperation.FunctionUpdate, "Modbus_ON"); + } + break; + default: + break; + } + #endregion + break; + case SERVICE_ITEMS_e.PART11: + // Part11 추가 시 활성화 + #region Part11 + //switch (value) + //{ + // case SERVICE_MODE_e.DISABLE: + // if (this.ParentForm.SystemConfig.IsPart11 == true) + // { + // this.ParentForm.SystemConfig.IsPart11 = false; + // this.ParentForm.SystemConfig.IsLogin = false; + // //this.ParentForm.SystemConfig.IsDataStatistics = false; + // this.ParentForm.SystemConfig.IsDataBackup = false; + + // if (this.ParentForm.SystemConfig.StoragePeriod > 12) + // this.ParentForm.SystemConfig.StoragePeriod = 12; + + // // Delete user list + // try + // { + // UserManager.UserManager_UserAllDel(); + // } + // catch + // { + + // } + + // this.ParentForm.SaveSystemConfigurationFile(this.ParentForm.SystemConfig); + + // if (this.labelUpdateContents.Text.Length != 0) + // this.labelUpdateContents.Text += ", "; + // this.labelUpdateContents.Text += "Part11 OFF"; + // this.ParentForm.SetTrackingHistoryData(DataStore.E_TrackingOperation.FunctionUpdate, "Part11_OFF"); + // } + // break; + // case SERVICE_MODE_e.ENABLE: + // if (this.ParentForm.SystemConfig.IsPart11 == false) + // { + // this.ParentForm.SystemConfig.IsLogin = true; + // this.ParentForm.SystemConfig.IsPart11 = true; + // //this.ParentForm.SystemConfig.IsDataStatistics = true; + // this.ParentForm.SystemConfig.IsDataBackup = true; + + // if (this.ParentForm.SystemConfig.StoragePeriod <= 12) + // this.ParentForm.SystemConfig.StoragePeriod = 24; + + // this.ParentForm.SaveSystemConfigurationFile(this.ParentForm.SystemConfig); + + // if (this.labelUpdateContents.Text.Length != 0) + // this.labelUpdateContents.Text += ", "; + // this.labelUpdateContents.Text += "Part11 ON"; + // this.ParentForm.SetTrackingHistoryData(DataStore.E_TrackingOperation.FunctionUpdate, "Part11_ON"); + // } + // break; + // default: + // break; + //} + this.buttonBack.Enabled = false; + #endregion + break; + case SERVICE_ITEMS_e.FEEDBACK: + #region Feedback + switch (value) + { + case SERVICE_MODE_e.DISABLE: + if (this.ParentForm.SystemConfig.IsFeedback == true) + { + this.ParentForm.SystemConfig.IsFeedback = false; + this.ParentForm.SaveSystemConfigurationFile(this.ParentForm.SystemConfig); + + if (this.labelUpdateContents.Text.Length != 0) + this.labelUpdateContents.Text += ", "; + this.labelUpdateContents.Text += "Feedback OFF"; + this.ParentForm.SetTrackingHistoryData(DataStore.E_TrackingOperation.FunctionUpdate, "Feedback_OFF"); + } + break; + case SERVICE_MODE_e.ENABLE: + if (this.ParentForm.SystemConfig.IsFeedback == false) + { + this.ParentForm.SystemConfig.IsFeedback = true; + this.ParentForm.SaveSystemConfigurationFile(this.ParentForm.SystemConfig); + + if (this.labelUpdateContents.Text.Length != 0) + this.labelUpdateContents.Text += ", "; + this.labelUpdateContents.Text += "Feedback ON"; + this.ParentForm.SetTrackingHistoryData(DataStore.E_TrackingOperation.FunctionUpdate, "Feedback_ON"); + } + break; + default: + break; + } + + this.FinishStatusNeededReBoot(); + this.progressBarUpdate.Value += 100; + this.buttonBack.Enabled = false; + #endregion + break; + default: + break; + } + + this.labelTitleUpdate.Visible = true; + this.labelUpdateContents.Visible = true; + } + + public void DisplayRefresh() + { + this.ParentForm.SystemConfig.CurrentForm = DataStore.E_FormStore.FormProgramUpdate; + + this.InitialStatus(); + this.progressBarUpdate.Value = 0; + + // USB 체크 + DirectoryInfo info = new DirectoryInfo("하드 디스크\\"); + if (info.Exists == true) + { + this.buttonLCD.TextColor = Color.Black; + this.buttonLCD.Enabled = true; + this.buttonServiceUpdate.TextColor = Color.Black; + this.buttonServiceUpdate.Enabled = true; + } else - this.RemoveFolderPath = "SD Card\\RemoveFile\\"; - - this.timerUpdate.Interval = 1000; - this.timerUpdate.Tick += new EventHandler(timerUpdate_Tick); - this.timerUpdate.Enabled = true; + { + this.buttonLCD.TextColor = Color.DimGray; + this.buttonLCD.Enabled = false; + this.buttonServiceUpdate.TextColor = Color.DimGray; + this.buttonServiceUpdate.Enabled = false; + } } #endregion @@ -216,16 +592,47 @@ namespace INT89DB_26.Forms this.Check += 1; if (this.Check == 3) { - this.ParentForm.ChildFormProgramUpdate.ProgramUpdate(); + this.ProgramUpdate(); } - if (this.progressBarUpdateBar.Value == 100) + if (this.progressBarUpdate.Value == 100) { - this.labelUpdateWait.Visible = false; - this.labelUpdateWait2.Visible = false; - this.labelUpdateRestart.Visible = true; + this.labelMessage1.Visible = false; + this.labelMessage2.Visible = false; } } + + private void buttonLCD_Click(object sender, EventArgs e) + { + DialogFormYesNo myDlg = new DialogFormYesNo(this.ParentForm.SystemConfig.Language, 3); + DialogResult dr = myDlg.ShowDialog(); + if (dr == DialogResult.Yes) + this.IsUpdate = true; + + myDlg.Close(); + + this.Refresh(); + + this.labelMessage2.Visible = true; + this.ProgramUpdateCheck(dr); + } + private void buttonServiceUpdate_Click(object sender, EventArgs e) + { + DialogFormYesNo myDlg = new DialogFormYesNo(this.ParentForm.SystemConfig.Language, 3); + DialogResult dr = myDlg.ShowDialog(); + myDlg.Close(); + + PayService service = new PayService(); + + this.labelMessage2.Visible = true; + this.ProgramUpdateCheck(dr); + } + + private void buttonBack_Click(object sender, EventArgs e) + { + this.ParentForm.ChildFormMenu.DisplayRefresh(); + ((FormMain)(Owner)).smartForm.Show((int)DataStore.E_FormStore.FormMenu); + } #endregion } } \ No newline at end of file diff --git a/INT89DB_26/Forms/FormProgramUpdate.resx b/INT89DB_26/Forms/FormProgramUpdate.resx index 1dc2889..f58c622 100644 --- a/INT89DB_26/Forms/FormProgramUpdate.resx +++ b/INT89DB_26/Forms/FormProgramUpdate.resx @@ -276,6 +276,248 @@ IuLOxLfp6rmLy7jLf6z7kyHYGcBcqMv4XCYbfJHs6u7U/VqFvL4y3DMmikyHedxkAyamxklo6euX1zMv dfB29g1NgQcjinlpk+fJoi8S3Q3PpvFKg5hd2hAoxe90dfSFujWB7x6jrOZY2/wvXBs7clP+AE97kRBm /EAaAAAAAElFTkSuQmCC + + + + + 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 + Kml+s4BQAAAAAElFTkSuQmCC + + + + + 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 + rkJggg== diff --git a/INT89DB_26/Forms/FormSystemSetting.cs b/INT89DB_26/Forms/FormSystemSetting.cs index fdda2bd..35bc802 100644 --- a/INT89DB_26/Forms/FormSystemSetting.cs +++ b/INT89DB_26/Forms/FormSystemSetting.cs @@ -869,6 +869,18 @@ namespace INT89DB_26.Forms } else { + if (this.ParentForm.SystemConfig.IsFeedback == true) + { + if (myKeyPad.doubleValue < Helper.StringToWeight(this.ParentForm.CurrentFeedbackItem.LowLimit, this.ParentForm.SystemConfig.DecimalPlaces) + || (myKeyPad.doubleValue > Helper.StringToWeight(this.ParentForm.CurrentFeedbackItem.HighLimit, this.ParentForm.SystemConfig.DecimalPlaces))) + { + // 입력범위를 확인하세요 + DialogFormMessage myMsg = new DialogFormMessage(1, this.ParentForm.SystemConfig.Language, ""); + myMsg.ShowDialog(); + return; + } + } + this.buttonPass.Text = myKeyPad.StringValue; this.SelectedProductItem.PassRange = myKeyPad.StringValue.Replace(".", ""); diff --git a/INT89DB_26/Forms/FormUserSetting.cs b/INT89DB_26/Forms/FormUserSetting.cs index fcfddf4..1d0cd85 100644 --- a/INT89DB_26/Forms/FormUserSetting.cs +++ b/INT89DB_26/Forms/FormUserSetting.cs @@ -277,7 +277,7 @@ namespace INT89DB_26.Forms { this.ParentForm.CurrentCollectionUser.Level1Users[this.listBoxLevel1.SelectItemIndex].ID = this.textBoxID.Text; this.ParentForm.CurrentCollectionUser.Level1Users[this.listBoxLevel1.SelectItemIndex].Password = this.textBoxPassword.Text; - this.ParentForm.CurrentCollectionUser.Level1Users[this.listBoxLevel1.SelectItemIndex].Group = DataStore.UserGroup.Level1Operator; + this.ParentForm.CurrentCollectionUser.Level1Users[this.listBoxLevel1.SelectItemIndex].Group = DataStore.UserGroup.Level1; this.ParentForm.SaveUserLevel1File(this.ParentForm.CurrentCollectionUser.Level1Users); this.listBoxLevel1.Items[this.listBoxLevel1.SelectItemIndex] = this.textBoxID.Text; @@ -286,7 +286,7 @@ namespace INT89DB_26.Forms { this.ParentForm.CurrentCollectionUser.Level2Users[this.listBoxLevel2.SelectItemIndex].ID = this.textBoxID.Text; this.ParentForm.CurrentCollectionUser.Level2Users[this.listBoxLevel2.SelectItemIndex].Password = this.textBoxPassword.Text; - this.ParentForm.CurrentCollectionUser.Level2Users[this.listBoxLevel2.SelectItemIndex].Group = DataStore.UserGroup.Level2Engineer; + this.ParentForm.CurrentCollectionUser.Level2Users[this.listBoxLevel2.SelectItemIndex].Group = DataStore.UserGroup.Level2; this.ParentForm.SaveUserLevel2File(this.ParentForm.CurrentCollectionUser.Level2Users); this.listBoxLevel2.Items[this.listBoxLevel2.SelectItemIndex] = this.textBoxID.Text; @@ -295,7 +295,7 @@ namespace INT89DB_26.Forms { this.ParentForm.CurrentCollectionUser.Level3Users[this.listBoxLevel3.SelectItemIndex].ID = this.textBoxID.Text; this.ParentForm.CurrentCollectionUser.Level3Users[this.listBoxLevel3.SelectItemIndex].Password = this.textBoxPassword.Text; - this.ParentForm.CurrentCollectionUser.Level3Users[this.listBoxLevel3.SelectItemIndex].Group = DataStore.UserGroup.Level3Manager; + this.ParentForm.CurrentCollectionUser.Level3Users[this.listBoxLevel3.SelectItemIndex].Group = DataStore.UserGroup.Level3; this.ParentForm.SaveUserLevel3File(this.ParentForm.CurrentCollectionUser.Level3Users); this.listBoxLevel3.Items[this.listBoxLevel3.SelectItemIndex] = this.textBoxID.Text; diff --git a/INT89DB_26/INT89DB_26.csproj b/INT89DB_26/INT89DB_26.csproj index 847f189..5489baf 100644 --- a/INT89DB_26/INT89DB_26.csproj +++ b/INT89DB_26/INT89DB_26.csproj @@ -53,6 +53,10 @@ False ..\INT89DB_26_ImageDll\bin\Release\INT89DB_26_ImageDll.dll + + False + ..\Document\DLL\libPayService.dll + @@ -284,6 +288,13 @@ + + + + + + + diff --git a/INT89DB_26/Part11_Encryption/Encryption.Define.cs b/INT89DB_26/Part11_Encryption/Encryption.Define.cs new file mode 100644 index 0000000..be4de48 --- /dev/null +++ b/INT89DB_26/Part11_Encryption/Encryption.Define.cs @@ -0,0 +1,34 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace INT89DB_26.Part11_Encryption +{ + public partial class Encryption + { + private const string PathDll = "SD Card\\Run\\DllAes128.dll"; + + private delegate void fnAesVersionCB(StringBuilder version); + private static fnAesVersionCB fnAesVersionCallBack; + + public delegate void fnAesEncryptionCB(ref auth_encryption_status_t encryption_status); + public static fnAesEncryptionCB fnAesEncryptionCallBack; + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_AES_Register_VersionCB(fnAesVersionCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + public static extern void DLL_AES_Register_EncryptionCB(fnAesEncryptionCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_SAES_Getversion(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + public static extern void DLL_AES_Activation(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + public static extern int DLL_AES_Encryption(IntPtr inFileName, IntPtr outFileName, bool encrypt, bool compress); + } +} diff --git a/INT89DB_26/Part11_Encryption/Encryption.Structure.cs b/INT89DB_26/Part11_Encryption/Encryption.Structure.cs new file mode 100644 index 0000000..ed836c0 --- /dev/null +++ b/INT89DB_26/Part11_Encryption/Encryption.Structure.cs @@ -0,0 +1,25 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace INT89DB_26.Part11_Encryption +{ + public partial class Encryption + { + public const int MAX_FILE_NAME_LENGTH = 256; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct auth_encryption_status_t + { + public int status; + public int error_type; + public int error_index; + public int percentage; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILE_NAME_LENGTH)] + public string inFileName; + } + } +} diff --git a/INT89DB_26/Part11_Encryption/Encryption.cs b/INT89DB_26/Part11_Encryption/Encryption.cs new file mode 100644 index 0000000..d2d50c1 --- /dev/null +++ b/INT89DB_26/Part11_Encryption/Encryption.cs @@ -0,0 +1,62 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace INT89DB_26.Part11_Encryption +{ + public partial class Encryption + { + public delegate void ObjectEventHandler(object data); + public static event ObjectEventHandler DllAesEncryption_Event; + public static event ObjectEventHandler DllAesEncryption_GetVersionDataEvent; + + public static void InitializeEncryption() + { + // register callback + fnAesVersionCallBack = AesEncryption_VersionCallback; + DLL_AES_Register_VersionCB(fnAesVersionCallBack); + + fnAesEncryptionCallBack = cbAesEncryption; + DLL_AES_Register_EncryptionCB(fnAesEncryptionCallBack); + + // call the function + DLL_AES_Activation(); + } + + #region Aes_Fuction + public static void AesEncryption(string inFileName, string outFileName, bool encrypt, bool compress) + { + IntPtr pInFileName = Marshal.StringToBSTR(inFileName); + IntPtr pOutFileName = Marshal.StringToBSTR(outFileName); + + DLL_AES_Encryption(pInFileName, pOutFileName, encrypt, compress); + } + public static void AesEncryption_GetVersion() + { + DLL_SAES_Getversion(); + } + #endregion + + #region Aes_Callback + public static void cbAesEncryption(ref auth_encryption_status_t encryption_status) + { + if (DllAesEncryption_Event != null) + DllAesEncryption_Event(encryption_status); + } + private static void AesEncryption_VersionCallback(StringBuilder version) + { + try + { + if (DllAesEncryption_GetVersionDataEvent != null) + DllAesEncryption_GetVersionDataEvent(version); + } + catch + { + + } + } + #endregion + } +} diff --git a/INT89DB_26/Part11_UserManager/UserItem.cs b/INT89DB_26/Part11_UserManager/UserItem.cs new file mode 100644 index 0000000..114c3b2 --- /dev/null +++ b/INT89DB_26/Part11_UserManager/UserItem.cs @@ -0,0 +1,439 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace INT89DB_26.Part11_UserManager +{ + #region UserItem + public class UserItem + { + #region Field + private string m_ID; + private string m_Password; + private string m_ResetPW; + + private int m_ExpireId; + private int m_ExpirePassword; + + private bool m_IsLockAccount; + private bool m_IsLockPassword; + + private DateTime m_DatePasswordRegister; + private DateTime m_DateIdLogin; + private DateTime m_DateIdExpire; + private DateTime m_DatePasswordExpire; + + private DataStore.UserGroup m_Group; + + private bool m_IsAdmin; + + private int m_ActiveLevel; + + private int m_IsFirstPassword; + #endregion + + #region Constructor + public UserItem() + { + this.Initialize(); + } + #endregion + + #region Property + public string ID + { + get { return this.m_ID; } + set { this.m_ID = value; } + } + public string Password + { + get { return this.m_Password; } + set { this.m_Password = value; } + } + public string ResetPW + { + get { return this.m_ResetPW; } + private set { this.m_ResetPW = value; } + } + + public int ExpireId + { + get { return this.m_ExpireId; } + set { this.m_ExpireId = value; } + } + public int ExpirePassword + { + get { return this.m_ExpirePassword; } + set { this.m_ExpirePassword = value; } + } + + public bool IsLockAccount + { + get { return this.m_IsLockAccount; } + set { this.m_IsLockAccount = value; } + } + public bool IsLockPassword + { + get { return this.m_IsLockPassword; } + set { this.m_IsLockPassword = value; } + } + + public DateTime DatePasswordRegister + { + get { return this.m_DatePasswordRegister; } + set { this.m_DatePasswordRegister = value; } + } + public DateTime DateIdLogin + { + get { return this.m_DateIdLogin; } + set { this.m_DateIdLogin = value; } + } + public DateTime DateIdExpire + { + get { return this.m_DateIdExpire; } + set { this.m_DateIdExpire = value; } + } + public DateTime DatePasswordExpire + { + get { return this.m_DatePasswordExpire; } + set { this.m_DatePasswordExpire = value; } + } + + public DataStore.UserGroup Group + { + get { return this.m_Group; } + set { this.m_Group = value; } + } + + public bool IsAdmin + { + get { return this.m_IsAdmin; } + set { this.m_IsAdmin = value; } + } + + public int ActiveLevel + { + get { return this.m_ActiveLevel; } + set { this.m_ActiveLevel = value; } + } + + public int IsFirstPassword + { + get { return this.m_IsFirstPassword; } + set { this.m_IsFirstPassword = value; } + } + #endregion + + #region Method + private void Initialize() + { + this.ID = "-"; + this.Password = "-"; + this.ResetPW = "Password12!"; + + this.ExpireId = 0; + this.ExpirePassword = 0; + + this.DatePasswordRegister = DateTime.Now; + this.DateIdLogin = DateTime.Now; + this.DateIdExpire = DateTime.Now; + this.DatePasswordExpire = DateTime.Now; + + this.Group = DataStore.UserGroup.None; + + this.IsAdmin = false; + + this.ActiveLevel = 1; + + this.IsFirstPassword = 1; //[1] 최초 비밀번호(비밀번호 변경창 띄우기), [0] 비밀번호 변경완료됨 + } + + public int GetPasswordExpiryDday() + { + int ret = 0; + DateTime timeNow = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); + TimeSpan dayDiff; + + if (this.Group == DataStore.UserGroup.Admin || this.Group == DataStore.UserGroup.Developer) + ret = 9999; + else + { + dayDiff = timeNow.Date - this.DatePasswordExpire.Date; + ret = dayDiff.Days; + } + + return ret; + } + #endregion + } + #endregion + + #region UserGroup + public class UserGroup + { + #region Field + private UserGroupItem m_Level1; + private UserGroupItem m_Level2; + private UserGroupItem m_Level3; + private UserGroupItem m_NotLogin; + #endregion + + #region Constructor + public UserGroup() + { + this.Initialize(); + } + #endregion + + #region Property + public UserGroupItem Level1 + { + get { return this.m_Level1; } + set { this.m_Level1 = value; } + } + public UserGroupItem Level2 + { + get { return this.m_Level2; } + set { this.m_Level2 = value; } + } + public UserGroupItem Level3 + { + get { return this.m_Level3; } + set { this.m_Level3 = value; } + } + + public UserGroupItem NotLogin + { + get { return this.m_NotLogin; } + set { this.m_NotLogin = value; } + } + #endregion + + #region Method + private void Initialize() + { + this.Level1 = new UserGroupItem(); + this.Level2 = new UserGroupItem(); + this.Level3 = new UserGroupItem(); + this.NotLogin = new UserGroupItem(); + } + #endregion + } + #endregion + #region UserGroupItem + public class UserGroupItem + { + #region Field + private bool m_IsMainDisplayProductNo; + private bool m_IsMainDisplayWeightSetting; + private bool m_IsMainDisplayClear; + private bool m_IsMainDisplaySubMenu; + + private bool m_IsMenuInformation; + private bool m_IsMenuConfiguration; + private bool m_IsMenuCommunication; + private bool m_IsMenuCalibration; + private bool m_IsMenuSystem; + private bool m_IsMenuMotor; + private bool m_IsMenuIOTest; + private bool m_IsMenuEquipment; + private bool m_IsMenuUpdate; + private bool m_IsMenuInitialization; + private bool m_IsMenuTime; + private bool m_IsMenuDataBackup; + private bool m_IsMenuStatistics; + private bool m_IsMenuViewer; + private bool m_IsMenuUser; + private bool m_IsMenuUserGroupEditor; + #endregion + + #region Constructor + public UserGroupItem() + { + this.Initialize(); + } + #endregion + + #region Property + public bool IsMainDisplayProductNo + { + get { return this.m_IsMainDisplayProductNo; } + set { this.m_IsMainDisplayProductNo = value; } + } + public bool IsMainDisplayWeightSetting + { + get { return this.m_IsMainDisplayWeightSetting; } + set { this.m_IsMainDisplayWeightSetting = value; } + } + public bool IsMainDisplayClear + { + get { return this.m_IsMainDisplayClear; } + set { this.m_IsMainDisplayClear = value; } + } + public bool IsMainDisplaySubMenu + { + get { return this.m_IsMainDisplaySubMenu; } + set { this.m_IsMainDisplaySubMenu = value; } + } + + public bool IsMenuTime + { + get { return this.m_IsMenuTime; } + set { this.m_IsMenuTime = value; } + } + public bool IsMenuInformation + { + get { return this.m_IsMenuInformation; } + set { this.m_IsMenuInformation = value; } + } + public bool IsMenuDataBackup + { + get { return this.m_IsMenuDataBackup; } + set { this.m_IsMenuDataBackup = value; } + } + public bool IsMenuCalibration + { + get { return this.m_IsMenuCalibration; } + set { this.m_IsMenuCalibration = value; } + } + public bool IsMenuCommunication + { + get { return this.m_IsMenuCommunication; } + set { this.m_IsMenuCommunication = value; } + } + public bool IsMenuConfiguration + { + get { return this.m_IsMenuConfiguration; } + set { this.m_IsMenuConfiguration = value; } + } + public bool IsMenuSystem + { + get { return this.m_IsMenuSystem; } + set { this.m_IsMenuSystem = value; } + } + public bool IsMenuMotor + { + get { return this.m_IsMenuMotor; } + set { this.m_IsMenuMotor = value; } + } + public bool IsMenuUpdate + { + get { return this.m_IsMenuUpdate; } + set { this.m_IsMenuUpdate = value; } + } + public bool IsMenuInitialization + { + get { return this.m_IsMenuInitialization; } + set { this.m_IsMenuInitialization = value; } + } + public bool IsMenuEquipment + { + get { return this.m_IsMenuEquipment; } + set { this.m_IsMenuEquipment = value; } + } + public bool IsMenuIOTest + { + get { return this.m_IsMenuIOTest; } + set { this.m_IsMenuIOTest = value; } + } + public bool IsMenuStatistics + { + get { return this.m_IsMenuStatistics; } + set { this.m_IsMenuStatistics = value; } + } + public bool IsMenuUser + { + get { return this.m_IsMenuUser; } + set { this.m_IsMenuUser = value; } + } + public bool IsMenuViewer + { + get { return this.m_IsMenuViewer; } + set { this.m_IsMenuViewer = value; } + } + public bool IsMenuUserGroupEditor + { + get { return this.m_IsMenuUserGroupEditor; } + set { this.m_IsMenuUserGroupEditor = value; } + } + #endregion + + #region Method + private void Initialize() + { + this.IsMainDisplayProductNo = false; + this.IsMainDisplayWeightSetting = false; + this.IsMainDisplayClear = false; + this.IsMainDisplaySubMenu = false; + + this.IsMenuTime = false; + this.IsMenuInformation = true; + this.IsMenuDataBackup = false; + this.IsMenuCalibration = false; + this.IsMenuCommunication = false; + this.IsMenuConfiguration = false; + this.IsMenuSystem = false; + this.IsMenuMotor = false; + this.IsMenuUpdate = false; + this.IsMenuInitialization = false; + this.IsMenuEquipment = false; + this.IsMenuIOTest = false; + this.IsMenuStatistics = false; + this.IsMenuUser = true; + this.IsMenuUserGroupEditor = false; + this.IsMenuViewer = false; + } + #endregion + } + #endregion + #region StructUserGroupItem + [StructLayout(LayoutKind.Sequential)] + public struct StructUserGroupItem + { + public bool IsMainDisplayProductNo; + public bool IsMainDisplayWeightSetting; + public bool IsMainDisplayClear; + public bool IsMainDispalySubMenu; + + public bool IsMenuTimeSetting; + public bool IsMenuInformation; + public bool IsMenuDataBackup; + public bool IsMenuCalibration; + public bool IsMenuCommunication; + public bool IsMenuConfiguration; + public bool IsMenuSystemSetting; + public bool IsMenuMotorSetting; + public bool IsMenuUpdate; + public bool IsMenuFactoryReset; + public bool IsMenuEquipmentSetting; + public bool IsMenuIOTest; + public bool IsMenuDataStatistics; + public bool IsMenuUserSetting; + public bool IsMenuUserGroupSetting; + public bool IsMenuDataViewer; + + public bool Dummy1; + public bool Dummy2; + public bool Dummy3; + public bool Dummy4; + public bool Dummy5; + public bool Dummy6; + public bool Dummy7; + public bool Dummy8; + public bool Dummy9; + public bool Dummy10; + public bool Dummy11; + public bool Dummy12; + public bool Dummy13; + public bool Dummy14; + public bool Dummy15; + public bool Dummy16; + public bool Dummy17; + public bool Dummy18; + public bool Dummy19; + public bool Dummy20; + } + #endregion +} diff --git a/INT89DB_26/Part11_UserManager/UserManager.Define.cs b/INT89DB_26/Part11_UserManager/UserManager.Define.cs new file mode 100644 index 0000000..07b0091 --- /dev/null +++ b/INT89DB_26/Part11_UserManager/UserManager.Define.cs @@ -0,0 +1,185 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace INT89DB_26.Part11_UserManager +{ + public partial class UserManager + { + private const string PathDll = "SD Card\\Run\\DllUserMgr.dll"; + + private delegate void fnUserMgrVersionCB(StringBuilder version); + private static fnUserMgrVersionCB fnUserMgrVersionCallBack; + + private delegate void fnUserMgrDebugCB(int level, StringBuilder pMessage); + private static fnUserMgrDebugCB fnUserMgrDebugCallBack; + + private delegate void fnUserMgrNewUserCB(IntPtr pBuffer); + private static fnUserMgrNewUserCB fnUserMgrNewUserCallBack; + + private delegate void fnUserMgrAddUserCB(ref UserMgr_user_add_t user_add); + private static fnUserMgrAddUserCB fnUserMgrAddUserCallBack; + + private delegate void fnUserMgrModifyUserCB(ref UserMgr_user_modify_t user_mod); + private static fnUserMgrModifyUserCB fnUserMgrModifyUserCallBack; + + private delegate void fnUserMgrModifyInfoCB(ref UserMgr_user_info_t user_info); + private static fnUserMgrModifyInfoCB fnUserMgrModifyInfoCallBack; + + private delegate void fnUserMgrDelUserCB(ref UserMgr_user_del_t user_del); + private static fnUserMgrDelUserCB fnUserMgrDelUserCallBack; + + private delegate void fnUserMgrUserLockCB(ref UserMgr_user_lock_t user_lock); + private static fnUserMgrUserLockCB fnUserMgrUserLockCallBack; + + private delegate void fnUserMgrDefaultSettingCB(int status); + private static fnUserMgrDefaultSettingCB fnUserMgrDefaultSettingCallBack; + + private delegate void fnUserMgrLoginCB(int status, IntPtr pBuffer); + private static fnUserMgrLoginCB fnUserMgrLoginCallBack; + + private delegate void fnUserMgrLogoutCB(int status); + private static fnUserMgrLogoutCB fnUserMgrLogoutCallBack; + + private delegate void fnUserMgrLoginTimeoutCB(ref UserMgr_login_timeout_t timeout); + private static fnUserMgrLoginTimeoutCB fnUserMgrLoginTimeoutCallBack; + + private delegate void fnUserMgrGetListCB(ref UserMgr_user_list_t user_list); + private static fnUserMgrGetListCB fnUserMgrGetListCallBack; + + private delegate void fnUserMgrGetListNameCB(ref UserMgr_user_list_name_t user_name); + private static fnUserMgrGetListNameCB fnUsermgrGetListNameCallBack; + + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_VersionCB(fnUserMgrVersionCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_DebugCB(fnUserMgrDebugCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_NewStatusCB(fnUserMgrNewUserCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_AddStatusCB(fnUserMgrAddUserCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_ModifyUserCB(fnUserMgrModifyUserCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_ModifyStatusCB(fnUserMgrModifyInfoCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_DelStatusCB(fnUserMgrDelUserCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_UserLockCB(fnUserMgrUserLockCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_DefaultSettingCB(fnUserMgrDefaultSettingCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_LoginStausCB(fnUserMgrLoginCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_LogoutStausCB(fnUserMgrLogoutCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_LoginTimeoutCB(fnUserMgrLoginTimeoutCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_GetListCB(fnUserMgrGetListCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Register_GetListNameCB(fnUserMgrGetListNameCB func); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_HelloWorld(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Getversion(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Activation(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern void DLL_UserMgr_Deactivation(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserNew(IntPtr user_id, IntPtr user_pw, int fadmin, int expire_pw, int expire_account, int active_level, IntPtr menuId); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserAdd(IntPtr user_id, IntPtr user_pw, int fadmin, int expire_pw, int expire_account, int active_level, DateTime_t dateRegister, DateTime_t dateLogin); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserAddHistoryPW(IntPtr user_id, IntPtr user_pw); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserResetHistoryPW(IntPtr user_id); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserModify(IntPtr user_id, IntPtr user_pw, int fadmin, int expire_pw, int expire_account, int active_level, IntPtr menuId); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserModifyPW(IntPtr user_id, IntPtr user_pw); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserModifyPWDirect(IntPtr user_id, IntPtr user_pw); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserModifyID(IntPtr user_org_id, IntPtr user_new_id); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserResetPWDirect(IntPtr user_id, IntPtr user_pw); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserModifyOthers(IntPtr user_id, int fadmin, int expire_pw, int expire_account, int active_level); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserDel(IntPtr user_id); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserAllDel_Default(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserLoginFailLockSet(IntPtr user_id); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserLockRelease(IntPtr user_id, bool lock_account, bool lock_password); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserLockGet(IntPtr user_id); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserLoginCB(IntPtr user_id, IntPtr user_pw); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserLoginDirect(IntPtr user_id, IntPtr user_pw, ref UserMgr_user_info_t user_info); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_UserLogout(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_AutoLogoutTimeoutReset(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_AutoLogoutTimeoutPause(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_AutoLogoutSetTimeout(int timeout_min, int warning_timeout_sec); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_GetUserList(int index); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_GetUserListID(IntPtr user_id); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_GetUserListName(); + + [DllImport(PathDll, CallingConvention = CallingConvention.Winapi)] + private static extern int DLL_UserMgr_SetFolder(IntPtr folder); + } +} diff --git a/INT89DB_26/Part11_UserManager/UserManager.Structure.cs b/INT89DB_26/Part11_UserManager/UserManager.Structure.cs new file mode 100644 index 0000000..0d5acb2 --- /dev/null +++ b/INT89DB_26/Part11_UserManager/UserManager.Structure.cs @@ -0,0 +1,379 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace INT89DB_26.Part11_UserManager +{ + public partial class UserManager + { + #region Field + // fnUserMgrDebugCB + public const int USERMGR_DBG_NORMAL = 0x0001; + public const int USERMGR_DBG_THREAD = 0x0002; + public const int USERMGR_DBG_LIST = 0x0004; + + // fnUserMgrLoginCB + public const int USERMGR_LOGIN_STATUS_OK = 0x00; + public const int USERMGR_LOGIN_STATUS_ID_FAIL = 0x01; + public const int USERMGR_LOGIN_STATUS_PW_FAIL = 0x02; + + // fnUserMgrLogoutCB + public const int USERMGR_LOGOUT_STATUS_OK = 0x00; + public const int USERMGR_LOGOUT_STATUS_FAIL = 0x01; + + // fnUserMgrDelUserCB + //public const int USERMGR_DEL_STATUS_OK = 0x00; + //public const int USERMGR_DEL_STATUS_NOK = 0x01; + + // lock_status + public const int USERMGR_LOCK_STATUS_NONE = 0x00; + public const int USERMGR_LOCK_STATUS_EXPIRE = 0x01; + + public const int USERMGR_ID_MIN_LENGTH = 6; + public const int UERRMGR_ID_MAX_LENGTH = 20; + + public const int USERMGR_PW_MIN_LENGTH = 6; + public const int USERMGR_PW_MAX_LENGTH = 20; + + public const int MAX_USER_ID_LENGTH = 32; + public const int MAX_USER_PW_LEGNTH = 32; + public const int MAX_USER_HISTORY_PW_COUNT = 3; + + public const int INVALID_VALUE = -1; + public const int USERMGR_USER_ADMINISTRATOR = 1; + public const int USERMGR_USER_NORMAL = 0; + + public const int EXPIRE_PERIOD_PASSWORD_NOT_SUPPORT = 0; + public const int MAX_EXPIRE_PERIOD_PASSWORD = 90; + public const int DEFAULT_PASSWORD_EXPIRE_PERIOD = 90; // Days password change + + public const int EXPIRE_PERIOD_ACCOUNT_NOT_SUPPORT = 0; + public const int MAX_EXPIRE_PERIOD_ACCOUNT = 180; + public const int DEFAULT_ACCOUNT_LOCK_PERIOD = 180; // Days login + + public const int MAX_LOGIN_AUTO_TIMEOUT = 90; + public const int DEFAULT_LOGIN_WARNING_TIMEOUT_SEC = 60; // 60 sec during login, auto logout warning time + public const int DEFAULT_LOGIN_AUTO_TIMEOUT_MIN = 30; // 30 min during login, auto logout timeout + + public const int USER_MENU_ID_MAX = 30; // MenuID_t buffer Size + + public const int MAX_ACTIVE_LEVEL = 10; // menu active level + public const int INVALID_ACTIVE_LEVEL = 0; + #endregion + + #region Enum E_user_mgr_status + public enum E_user_mgr_status + { + USER_MGR_STATUS_OK = 0x00, + + // error status + USER_MGR_STATUS_ID_NOT_FOUND, // 1 - not found the user id + USER_MGR_STATUS_ID_DUPLICATE, // 2 - duplicate on id + USER_MGR_STATUS_ID_LENGTH_UNDER, // 3 - under the minimum length of id + USER_MGR_STATUS_ID_LENGTH_OVER, // 4 - over the maximum length of id + USER_MGR_STATUS_ID_CONT_LETTER, // 5 - continue characters or duplicate characters of id + USER_MGR_STATUS_ID_INVALID_CHAR, // 6 - include the invalid character on id + USER_MGR_STATUS_ID_ACCOUNT_LOCK, // 7 - Account Lock + + USER_MGR_STATUS_PW_DUPLICATE_HISTORY, // 8 - duplicate on password history + USER_MGR_STATUS_PW_LENGTH_UNDER, // 9 - under the minimum length of password + USER_MGR_STATUS_PW_LENGTH_OVER, // 10 - over the maximum length of password + USER_MGR_STATUS_PW_CONT_LETTER, // 11 - continue characters or duplicate characters of password + USER_MGR_STATUS_PW_INVALID_CHAR, // 12 - include the invalid character on password + USER_MGR_STATUS_PW_EACH_MIN_CHAR, // 13 - not include minimum characters on password + USER_MGR_STATUS_PW_NOT_SAME, // 14 - password error + USER_MGR_STATUS_PW_PASSWORD_LOCK, // 15 - Password Lock + + USER_MGR_STATUS_OTHER_OVER_PASSWORD_PERIOD, // 16 - over maximum password expire period (days) + USER_MGR_STATUS_OTHER_OVER_ACCOUNT_PERIOD, // 17 - over maximum account expire period (days) + USER_MGR_STATUS_OTHER_OVER_LOGIN_TIMEOUT, // 18 - over maximum auto logout time (minute) + + USER_MGR_STATUS_MAX, + }; + #endregion + + #region Enum E_user_mgr_menu_id + public enum E_user_mgr_menu_id + { + USER_MENU_ID_RESERVE_0 = 0x00, + USER_MENU_ID_RESERVE_1, + USER_MENU_ID_RESERVE_2, + USER_MENU_ID_RESERVE_3, + USER_MENU_ID_RESERVE_4, + + USER_MENU_ID_RESERVE_5, + USER_MENU_ID_RESERVE_6, + USER_MENU_ID_RESERVE_7, + USER_MENU_ID_RESERVE_8, + USER_MENU_ID_RESERVE_9, + + USER_MENU_ID_RESERVE_10, + USER_MENU_ID_RESERVE_11, + USER_MENU_ID_RESERVE_12, + USER_MENU_ID_RESERVE_13, + USER_MENU_ID_RESERVE_14, + + USER_MENU_ID_RESERVE_15, + USER_MENU_ID_RESERVE_16, + USER_MENU_ID_RESERVE_17, + USER_MENU_ID_RESERVE_18, + USER_MENU_ID_RESERVE_19, + + USER_MENU_ID_RESERVE_20, + USER_MENU_ID_RESERVE_21, + USER_MENU_ID_RESERVE_22, + USER_MENU_ID_RESERVE_23, + USER_MENU_ID_RESERVE_24, + + USER_MENU_ID_RESERVE_25, + USER_MENU_ID_RESERVE_26, + USER_MENU_ID_RESERVE_27, + USER_MENU_ID_RESERVE_28, + USER_MENU_ID_RESERVE_29, + USER_MENU_ID_MAX, + }; + #endregion + + #region Struct MenuID_t + [StructLayout(LayoutKind.Sequential)] + public struct MenuID_t + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)E_user_mgr_menu_id.USER_MENU_ID_MAX)] + public bool[] fMenu; + } + #endregion + + #region Struct DateTime_t + [StructLayout(LayoutKind.Sequential)] + public struct DateTime_t + { + [MarshalAs(UnmanagedType.U2)] + public UInt16 year; + [MarshalAs(UnmanagedType.U1)] + public byte month; + [MarshalAs(UnmanagedType.U1)] + public byte day; + + [MarshalAs(UnmanagedType.U1)] + public byte hour; + [MarshalAs(UnmanagedType.U1)] + public byte minute; + [MarshalAs(UnmanagedType.U1)] + public byte second; + [MarshalAs(UnmanagedType.U1)] + public byte reserved; + + public static int Size + { + get { return (int)(sizeof(UInt16) + 6); } + } + + public void SetDate(UInt16 year, byte month, byte day) + { + this.year = year; + this.month = month; + this.day = day; + } + + public void SetTime(byte hour, byte minute, byte second) + { + this.hour = hour; + this.minute = minute; + this.second = second; + } + + public string GetDateTime() + { + string dateTime; + + dateTime = string.Format("{0:D4}{1:D2}{2:D2}{3:D2}{4:D2}{5:D2}", year, month, day, hour, minute, second); + + return dateTime; + } + } + #endregion + + #region Struct UserMgr_user_info_t + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct UserMgr_user_info_t + { + [MarshalAs(UnmanagedType.I4)] + public Int32 status; // user_new_add_status_e + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)] + public string user_id; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_PW_LEGNTH)] + public string user_pw; + + [MarshalAs(UnmanagedType.I4)] + public Int32 fadmin; + + [MarshalAs(UnmanagedType.I4)] + public Int32 password_expire_period; // password lock date + + [MarshalAs(UnmanagedType.I4)] + public Int32 id_expire_period; // id lock date + + [MarshalAs(UnmanagedType.I4)] + public Int32 id_flock_status; // user ID (account) lock status + + [MarshalAs(UnmanagedType.I4)] + public Int32 password_flock_status; // password lock status (need to change password) + + [MarshalAs(UnmanagedType.Struct)] + public DateTime_t password_register_date; // date/time when the user password was registered or changed + + [MarshalAs(UnmanagedType.Struct)] + public DateTime_t id_login_date; // date/time when the user was login + + [MarshalAs(UnmanagedType.Struct)] + public DateTime_t password_expire_date; // Password Expiration Date + + [MarshalAs(UnmanagedType.Struct)] + public DateTime_t id_expire_date; // Account Expiration Date + + [MarshalAs(UnmanagedType.Struct)] + public MenuID_t menuID; // flag of Menu IDs + + [MarshalAs(UnmanagedType.I4)] + public Int32 active_level; // menu active level : max : MAX_ACTIVE_LEVEL + + [MarshalAs(UnmanagedType.I4)] + public Int32 fFirstPW; // [1] First (request to modify), [0] Next (not request) + + [MarshalAs(UnmanagedType.I4)] + public Int32 login_fail_count; // [1] First (request to modify), [0] Next (not request) + } + #endregion + + #region Struct UserMgr_user_modify_t + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct UserMgr_user_modify_t + { + public int status; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)] + public string user_id; + } + #endregion + + #region Struct UserMgr_user_del_t + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct UserMgr_user_del_t + { + public int status; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)] + public string user_id; + } + #endregion + + #region Struct UserMgr_login_timeout_t + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct UserMgr_login_timeout_t + { + public int remainder_time; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)] + public string user_id; + } + #endregion + + #region Struct UserMgr_user_add_t + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct UserMgr_user_add_t + { + public int status; + public int flock_status_account; + public int flock_status_password; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)] + public string user_id; + } + #endregion + + #region Struct UserMgr_user_lock_t + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct UserMgr_user_lock_t + { + public int flock_status_account; + public int flock_status_password; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)] + public string user_id; + } + #endregion + + #region Struct UserMgr_user_list_t + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct UserMgr_user_list_t + { + [MarshalAs(UnmanagedType.I4)] + public int status; // user_new_add_status_e + + [MarshalAs(UnmanagedType.I4)] + public int total_count; + + [MarshalAs(UnmanagedType.I4)] + public int index; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)] + public string user_id; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_PW_LEGNTH)] + public string user_pw; + + [MarshalAs(UnmanagedType.I4)] + public Int32 fadmin; + + [MarshalAs(UnmanagedType.I4)] + public Int32 password_expire_period; // password lock + + [MarshalAs(UnmanagedType.I4)] + public Int32 id_expire_period; // account lock + + [MarshalAs(UnmanagedType.I4)] + public Int32 id_flock_status; // user ID (account) lock + + [MarshalAs(UnmanagedType.I4)] + public Int32 flock_status_password; // password lock (need to change password) + + [MarshalAs(UnmanagedType.Struct)] + public DateTime_t password_register_date; // date/time when the user password was registered or changed + + [MarshalAs(UnmanagedType.Struct)] + public DateTime_t id_login_date; // date/time when the user was login + + [MarshalAs(UnmanagedType.Struct)] + public DateTime_t password_expire_date; // Password Expiration Date + + [MarshalAs(UnmanagedType.Struct)] + public DateTime_t id_expire_date; // Account Expiration Date + + [MarshalAs(UnmanagedType.I4)] + public Int32 active_level; // menu active level : max : MAX_ACTIVE_LEVEL + + [MarshalAs(UnmanagedType.Struct)] + public MenuID_t menuID; // flag of Menu IDs + + [MarshalAs(UnmanagedType.I4)] + public Int32 fFirstPW; // flag first password + } + #endregion + + #region Struct UserMgr_user_list_name_t + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct UserMgr_user_list_name_t + { + public int total_count; + public int index; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_USER_ID_LENGTH)] + public string user_id; + } + #endregion + } +} diff --git a/INT89DB_26/Part11_UserManager/UserManager.cs b/INT89DB_26/Part11_UserManager/UserManager.cs new file mode 100644 index 0000000..d138932 --- /dev/null +++ b/INT89DB_26/Part11_UserManager/UserManager.cs @@ -0,0 +1,415 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace INT89DB_26.Part11_UserManager +{ + public partial class UserManager + { + public delegate void ObjectEventHandler(object data); + public static event ObjectEventHandler UserListNewDataEvent; + public static event ObjectEventHandler UserListAddDataEvent; + public static event ObjectEventHandler UserListModifyUserDataEvent; + public static event ObjectEventHandler UserListModifyInfoDataEvent; + public static event ObjectEventHandler UserListDeleteDataEvent; + public static event ObjectEventHandler UserListLockDataEvent; + public static event ObjectEventHandler UserListDefautSettingDataEvent; + public static event ObjectEventHandler UserListLoginTimeoutDataEvent; + public static event ObjectEventHandler UserListGetListDataEvent; + public static event ObjectEventHandler UserListGetListNameDataEvent; + public static event ObjectEventHandler UserListGetVersionDataEvent; + + public delegate void IntObjectEventHandler(int status, object data); + public static event IntObjectEventHandler UserListLoginDataEvent; + + public delegate void IntEventHandler(int status); + public static event IntEventHandler UserListLogoutDataEvent; + + public static void IntializeUserManager(string folder) + { + // regisetr callback + fnUserMgrVersionCallBack = UserManager_VersionCallback; + DLL_UserMgr_Register_VersionCB(fnUserMgrVersionCallBack); + + fnUserMgrDebugCallBack = UserManager_DebugCallback; + DLL_UserMgr_Register_DebugCB(fnUserMgrDebugCallBack); + + fnUserMgrNewUserCallBack = UserManager_NewUserCallBack; + DLL_UserMgr_Register_NewStatusCB(fnUserMgrNewUserCallBack); + + fnUserMgrAddUserCallBack = UserManager_AddUserCallBack; + DLL_UserMgr_Register_AddStatusCB(fnUserMgrAddUserCallBack); + + fnUserMgrModifyUserCallBack = UserManager_ModifyUserCallBack; + DLL_UserMgr_Register_ModifyUserCB(fnUserMgrModifyUserCallBack); + + fnUserMgrModifyInfoCallBack = UserManager_ModifyInfoCallBack; + DLL_UserMgr_Register_ModifyStatusCB(fnUserMgrModifyInfoCallBack); + + fnUserMgrDelUserCallBack = UserManager_DelUserCallBack; + DLL_UserMgr_Register_DelStatusCB(fnUserMgrDelUserCallBack); + + fnUserMgrUserLockCallBack = UserManager_LockCallBack; + DLL_UserMgr_Register_UserLockCB(fnUserMgrUserLockCallBack); + + fnUserMgrDefaultSettingCallBack = UserManager_DefaultSettingCallBack; + DLL_UserMgr_Register_DefaultSettingCB(fnUserMgrDefaultSettingCallBack); + + fnUserMgrLoginCallBack = UserManager_LoginCallBack; + DLL_UserMgr_Register_LoginStausCB(fnUserMgrLoginCallBack); + + fnUserMgrLogoutCallBack = UserManager_LogoutCallBack; + DLL_UserMgr_Register_LogoutStausCB(fnUserMgrLogoutCallBack); + + fnUserMgrLoginTimeoutCallBack = UserManager_LoginTimeoutCallBack; + DLL_UserMgr_Register_LoginTimeoutCB(fnUserMgrLoginTimeoutCallBack); + + fnUserMgrGetListCallBack = UserManager_GetListCallBack; + DLL_UserMgr_Register_GetListCB(fnUserMgrGetListCallBack); + + fnUsermgrGetListNameCallBack = UserManager_GetListNameCallBack; + DLL_UserMgr_Register_GetListNameCB(fnUsermgrGetListNameCallBack); + + DLL_UserMgr_Activation(); + + IntPtr pFolder = Marshal.StringToBSTR(folder); + DLL_UserMgr_SetFolder(pFolder); + } + + #region UM_FUNCTION + public static void UserManager_GetUserList(String data) + { + if (String.IsNullOrEmpty(data) == true) + DLL_UserMgr_GetUserListID(IntPtr.Zero); + else + { + IntPtr pID = Marshal.StringToBSTR(data); + DLL_UserMgr_GetUserListID(pID); + } + } + public static void UserManager_UserAdd(String sID, String sPW, int fAdmin, int expire_period_pw, int expire_period_account, int active_level, DateTime_t password_date, DateTime_t account_date) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pPW = Marshal.StringToBSTR(sPW.ToString()); + + DLL_UserMgr_UserAdd(pID, pPW, fAdmin, expire_period_pw, expire_period_account, active_level, password_date, account_date); + } + public static void UserManager_UserNew(String sID, String sPW, int fAdmin, int expire_period_pw, int expire_period_account, int active_level, MenuID_t menuId) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pPW = Marshal.StringToBSTR(sPW.ToString()); + + IntPtr pMenuId = Marshal.AllocHGlobal(Marshal.SizeOf(menuId)); + Marshal.StructureToPtr(menuId, pMenuId, false); + + DLL_UserMgr_UserNew(pID, pPW, fAdmin, expire_period_pw, expire_period_account, active_level, pMenuId); + } + public static void UserManager_UserAddHistoryPW(String sID, String sHistoryPW) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pPW = Marshal.StringToBSTR(sHistoryPW.ToString()); + + DLL_UserMgr_UserAddHistoryPW(pID, pPW); + } + public static void UserManager_UserResetHistoryPW(String sID) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + + DLL_UserMgr_UserResetHistoryPW(pID); + } + public static void UserManager_UserModify(String sID, String sPW, int fAdmin, int expire_period_pw, int expire_period_account, int active_level, MenuID_t menuId) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pPW = Marshal.StringToBSTR(sPW.ToString()); + + IntPtr pMenuId = Marshal.AllocHGlobal(Marshal.SizeOf(menuId)); + Marshal.StructureToPtr(menuId, pMenuId, false); + + DLL_UserMgr_UserModify(pID, pPW, fAdmin, expire_period_pw, expire_period_account, active_level, pMenuId); + } + public static void UserManager_UserModifyPW(String sID, String sNewPW) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pPW = Marshal.StringToBSTR(sNewPW.ToString()); + + DLL_UserMgr_UserModifyPW(pID, pPW); + } + public static int UserManager_UserModifyPWDirect(String sID, String sNewPW) + { + int ret = 0; + + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pPW = Marshal.StringToBSTR(sNewPW.ToString()); + + ret = DLL_UserMgr_UserModifyPWDirect(pID, pPW); + + return ret; + } + public static int UserManager_UserResetPWDirect(String sID, String sNewPW) + { + int ret = 0; + + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pPW = Marshal.StringToBSTR(sNewPW.ToString()); + + ret = DLL_UserMgr_UserResetPWDirect(pID, pPW); + + return ret; + } + + public static void UserManager_UserModifyID(String sID, String sNewID) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pNewID = Marshal.StringToBSTR(sNewID.ToString()); + + DLL_UserMgr_UserModifyID(pID, pNewID); + } + public static void UserManager_UserModifyOthers(String sID, int fadmin, int period_expire_pw, int period_expire_account, int active_level) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + + DLL_UserMgr_UserModifyOthers(pID, fadmin, period_expire_pw, period_expire_account, active_level); + } + public static void UserManager_UserDel(String sID) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + + DLL_UserMgr_UserDel(pID); + } + public static void UserManager_UserAllDel() + { + DLL_UserMgr_UserAllDel_Default(); + } + public static void UserManager_UserLockRelease(String sID, bool lock_account, bool lock_password) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + + DLL_UserMgr_UserLockRelease(pID, lock_account, lock_password); + } + public static void UserManager_UserLockGet(String sID) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + + DLL_UserMgr_UserLockGet(pID); + } + public static void UserManager_UserLoginFailLockSet(String sID) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + + DLL_UserMgr_UserLoginFailLockSet(pID); + } + public static void UserManager_UserLoginCB(String sID, String sPW) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pPW = Marshal.StringToBSTR(sPW.ToString()); + + DLL_UserMgr_UserLoginCB(pID, pPW); + } + public static void UserManager_UserLoginDirect(string sID, string sPW, ref UserMgr_user_info_t user_info) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + IntPtr pPW = Marshal.StringToBSTR(sPW.ToString()); + + DLL_UserMgr_UserLoginDirect(pID, pPW, ref user_info); + } + public static void UserManager_UserLogout() + { + DLL_UserMgr_UserLogout(); + } + public static void UserManager_AutoLogoutTimeoutReset() + { + DLL_UserMgr_AutoLogoutTimeoutReset(); + } + public static void UserManager_AutoLogoutTimeoutPause() + { + DLL_UserMgr_AutoLogoutTimeoutPause(); + } + public static void UserManager_AutoLogoutSetTimeout(int timeout_min, int warning_timeout_sec) + { + DLL_UserMgr_AutoLogoutSetTimeout(timeout_min, warning_timeout_sec); + } + public static void UserManager_GetUserList(int index) + { + DLL_UserMgr_GetUserList(index); + } + public static void UserManager_GetUserListID(String sID) + { + IntPtr pID = Marshal.StringToBSTR(sID.ToString()); + + DLL_UserMgr_GetUserListID(pID); + } + public static void UserManager_GetUserListName() + { + DLL_UserMgr_GetUserListName(); + } + public static void UserManager_GetVersion() + { + DLL_UserMgr_Getversion(); + } + #endregion + + #region UM_CALLBACK + private static void UserManager_GetListNameCallBack(ref UserMgr_user_list_name_t user_name) + { + try + { + if (UserListGetListNameDataEvent != null) + UserListGetListNameDataEvent(user_name); + } + catch + { + } + } + private static void UserManager_GetListCallBack(ref UserMgr_user_list_t user_list) + { + try + { + if (UserListGetListDataEvent != null) + UserListGetListDataEvent(user_list); + } + catch + { + } + } + private static void UserManager_LoginTimeoutCallBack(ref UserMgr_login_timeout_t timeout) + { + try + { + if (UserListLoginTimeoutDataEvent != null) + UserListLoginTimeoutDataEvent(timeout); + } + catch + { + } + } + private static void UserManager_LogoutCallBack(int status) + { + try + { + if (UserListLogoutDataEvent != null) + UserListLogoutDataEvent(status); + + } + catch + { + } + } + private static void UserManager_LoginCallBack(int status, IntPtr pBuffer) + { + try + { + if (UserListLoginDataEvent != null) + UserListLoginDataEvent(status, pBuffer); + } + catch + { + } + } + private static void UserManager_LockCallBack(ref UserMgr_user_lock_t user_lock) + { + try + { + if (UserListLockDataEvent != null) + UserListLockDataEvent(user_lock); + } + catch + { + } + } + private static void UserManager_DefaultSettingCallBack(int status) + { + try + { + if (UserListDefautSettingDataEvent != null) + UserListDefautSettingDataEvent(status); + } + catch + { + } + } + private static void UserManager_DelUserCallBack(ref UserMgr_user_del_t user_del) + { + try + { + if (UserListDeleteDataEvent != null) + UserListDeleteDataEvent(user_del); + } + catch + { + } + } + private static void UserManager_ModifyUserCallBack(ref UserMgr_user_modify_t user_mod) + { + try + { + if (UserListModifyUserDataEvent != null) + UserListModifyUserDataEvent(user_mod); + } + catch + { + } + } + private static void UserManager_ModifyInfoCallBack(ref UserMgr_user_info_t user_info) + { + try + { + if (UserListModifyInfoDataEvent != null) + UserListModifyInfoDataEvent(user_info); + } + catch + { + } + } + private static void UserManager_AddUserCallBack(ref UserMgr_user_add_t user_add) + { + try + { + if (UserListAddDataEvent != null) + UserListAddDataEvent(user_add); + } + catch + { + } + } + private static void UserManager_NewUserCallBack(IntPtr pBuffer) + { + try + { + if (pBuffer != IntPtr.Zero) + { + UserMgr_user_info_t user_info = (UserMgr_user_info_t)Marshal.PtrToStructure(pBuffer, typeof(UserMgr_user_info_t)); + + if (UserListNewDataEvent != null) + UserListNewDataEvent(user_info); + } + } + catch + { + } + } + private static void UserManager_DebugCallback(int type, StringBuilder pMessage) + { + try + { + } + catch + { + } + } + private static void UserManager_VersionCallback(StringBuilder version) + { + try + { + if (UserListGetVersionDataEvent != null) + UserListGetVersionDataEvent(version); + } + catch + { + + } + } + #endregion + } +} diff --git a/INT89DB_26/Version.txt b/INT89DB_26/Version.txt index 3b622ad..098490d 100644 --- a/INT89DB_26/Version.txt +++ b/INT89DB_26/Version.txt @@ -13,6 +13,12 @@ Ƽ 2~6 跮 */ +@ Ver 8.7.0 by CJY + - 2026.02.03 + - Ver 8.6.0 Modify + - Framework : SmartX Framework V3.1.1(update: 2019.03.21) + - Pay Service ߰ + @ Ver 8.6.0 by LSJ - 2026.01.13 - Ver 8.5.0 Modify diff --git a/INT89DB_26_ImageDll/obj/Release/INT89DB_26_ImageDll.csproj.GenerateResource.Cache b/INT89DB_26_ImageDll/obj/Release/INT89DB_26_ImageDll.csproj.GenerateResource.Cache index 18daa67b89f02d3db811c1f5bfb08e80b6a1b702..3899c24b299a47d8ee71bcad9d0d0e4186869b85 100644 GIT binary patch delta 25 hcmcbTd?k5@wI|qa{>yY-4*-EJ3M2pk delta 25 hcmcbTd?k5yY-4*-4#3FZI*