PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/home/htlwork.com/www/dev/magento/wp/wp-content/plugins/backwpup/inc/
Upload File :
Current File : /home/htlwork.com/www/dev/magento/wp/wp-content/plugins/backwpup/inc/class-create-archive.php
<?php
/**
 * Create Archive
 */

/**
 * Class for creating File Archives
 */
class BackWPup_Create_Archive {

	/**
	 * Achieve file with full path
	 *
	 * @var string
	 */
	private $file = '';

	/**
	 * Compression method
	 *
	 * @var string Method off compression Methods are ZipArchive, PclZip, Tar, TarGz, gz
	 */
	private $method = '';

	/**
	 * File Handel
	 *
	 * Open handel for files.
	 */
	private $filehandler = null;

	/**
	 * Handler Type
	 *
	 * @var string Can be 'bz', 'gz' or empty string.
	 */
	private $handlertype = '';

	/**
	 * ZipArchive
	 *
	 * @var ZipArchive
	 */
	private $ziparchive = null;

	/**
	 * PclZip
	 *
	 * @var PclZip
	 */
	private $pclzip = null;

	/**
	 * PclZip File List
	 *
	 * @var array()
	 */
	private $pclzip_file_list = array();

	/**
	 * File Count
	 *
	 * File cont off added files to handel somethings that depends on it
	 *
	 * @var int number of files added
	 */
	private $file_count = 0;

	/**
	 * BackWPup_Create_Archive constructor
	 *
	 * @param string $file File with full path of the archive.
	 *
	 * @throws BackWPup_Create_Archive_Exception If the file is empty or not a valid string.
	 */
	public function __construct( $file ) {

		if ( ! is_string( $file ) || empty( $file ) ) {
			throw new BackWPup_Create_Archive_Exception(
				__( 'The file name of an archive cannot be empty.', 'backwpup' )
			);
		}

		// Check folder can used.
		if ( ! is_dir( dirname( $file ) ) || ! is_writable( dirname( $file ) ) ) {
			throw new BackWPup_Create_Archive_Exception(
				sprintf(
				/* translators: $1 is the file path */
					esc_html_x( 'Folder %s for archive not found', '%s = Folder name', 'backwpup' ),
					dirname( $file )
				)
			);
		}

		$this->file = trim( $file );

		// TAR.GZ
		if (
			(! $this->filehandler && '.tar.gz' === strtolower( substr( $this->file, - 7 ) ))
		    || ( ! $this->filehandler && '.tar.bz2' === strtolower( substr( $this->file, - 8 ) ) )
		) {
			if ( ! function_exists( 'gzencode' ) ) {
				throw new BackWPup_Create_Archive_Exception(
					__( 'Functions for gz compression not available', 'backwpup' )
				);
			}

			$this->method      = 'TarGz';
			$this->handlertype = 'gz';
			$this->filehandler = $this->fopen( $this->file, 'ab' );
		}

		// .TAR
		if ( ! $this->filehandler && '.tar' === strtolower( substr( $this->file, - 4 ) ) ) {
			$this->method      = 'Tar';
			$this->filehandler = $this->fopen( $this->file, 'ab' ); // phpcs:ignore
		}

		// .ZIP
		if ( ! $this->filehandler && '.zip' === strtolower( substr( $this->file, - 4 ) ) ) {
			$this->method = 'ZipArchive';

			// Switch to PclZip if ZipArchive isn't supported.
			if ( ! class_exists( 'ZipArchive' ) ) {
				$this->method = 'PclZip';
			}

			// GzEncode supported?
			if ( 'PclZip' === $this->method && ! function_exists( 'gzencode' ) ) {
				throw new BackWPup_Create_Archive_Exception(
					esc_html__( 'Functions for gz compression not available', 'backwpup' )
				);
			}

			if ( 'ZipArchive' === $this->method ) {
				$this->ziparchive = new ZipArchive();
				$ziparchive_open  = $this->ziparchive->open( $this->file, ZipArchive::CREATE );

				if ( $ziparchive_open !== true ) {
					$this->ziparchive_status();

					throw new BackWPup_Create_Archive_Exception(
						sprintf(
						/* translators: $1 is a directory name */
							esc_html_x( 'Cannot create zip archive: %d', 'ZipArchive open() result', 'backwpup' ),
							$ziparchive_open
						)
					);
				}
			}

			if ( 'PclZip' === $this->method ) {
				$this->method = 'PclZip';

				if ( ! defined( 'PCLZIP_TEMPORARY_DIR' ) ) {
					define( 'PCLZIP_TEMPORARY_DIR', BackWPup::get_plugin_data( 'TEMP' ) );
				}

				require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';

				$this->pclzip = new PclZip( $this->file );
			}

			// Must be set to true to prevent issues. Monkey patch.
			$this->filehandler = true;
		}

		// .GZ
		if (
		    ( ! $this->filehandler && '.gz' === strtolower( substr( $this->file, - 3 ) ) )
		    || ( ! $this->filehandler && '.bz2' === strtolower( substr( $this->file, - 4 ) ) )
		) {
			if ( ! function_exists( 'gzencode' ) ) {
				throw new BackWPup_Create_Archive_Exception(
					__( 'Functions for gz compression not available', 'backwpup' )
				);
			}

			$this->method      = 'gz';
			$this->handlertype = 'gz';
			$this->filehandler = $this->fopen( $this->file, 'w' );
		}

		if ( '' === $this->method ) {
			throw new BackWPup_Create_Archive_Exception(
				sprintf(
				/* translators: the $1 is the type of the archive file */
					esc_html_x( 'Method to archive file %s not detected', '%s = file name', 'backwpup' ),
					basename( $this->file )
				)
			);
		}

		if ( null === $this->filehandler ) {
			throw new BackWPup_Create_Archive_Exception( __( 'Cannot open archive file', 'backwpup' ) );
		}
	}

	/**
	 * Destruct
	 *
	 * Closes open archive on shutdown.
	 */
	public function __destruct() {

		// Close PclZip.
		if ( is_object( $this->pclzip ) ) {
			if ( count( $this->pclzip_file_list ) > 0 ) {
				if ( 0 == $this->pclzip->add( $this->pclzip_file_list ) ) {
					trigger_error(
						sprintf(
						/* translatores: $1 is the error string */
							esc_html__( 'PclZip archive add error: %s', 'backwpup' ),
							$this->pclzip->errorInfo( true )
						),
						E_USER_ERROR
					);
				}
			}
			unset( $this->pclzip );
		}

		// Close ZipArchive.
		if ( null !== $this->ziparchive ) {
			if ( ! $this->ziparchive->close() ) {
				$this->ziparchive_status();

				sleep( 1 );
			}
			$this->ziparchive = null;
		}

		// Close file if open.
		if ( is_resource( $this->filehandler ) ) {
			$this->fclose();
		}
	}

	/**
	 * Close
	 *
	 * Closing the archive
	 *
	 * @return void
	 */
	public function close() {

		if ( $this->ziparchive instanceof \ZipArchive ) {
			$this->ziparchive->close();
			$this->ziparchive = null;
		}

		if ( ! is_resource( $this->filehandler ) ) {
			return;
		}

		// Write tar file end.
		if ( in_array( $this->method, array( 'Tar', 'TarGz' ), true ) ) {
			$this->fwrite( pack( 'a1024', '' ) );
		}

		$this->fclose();
	}

	/**
	 * Get Method
	 *
	 * Get method that the archive uses
	 *
	 * @return string The compression method
	 */
	public function get_method() {

		return $this->method;
	}

	/**
	 * Adds a file to Archive
	 *
	 * @param string $file_name       The file name path.
	 * @param string $name_in_archive The name of the file to use within the archive.
	 *
	 * @return bool True on success, false on error.
	 */
	public function add_file( $file_name, $name_in_archive = '' ) {

		$file_name = trim( $file_name );

		if ( ! is_string( $file_name ) || empty( $file_name ) ) {
			trigger_error(
				esc_html__( 'File name cannot be empty.', 'backwpup' ),
				E_USER_WARNING
			);

			return false;
		}

		clearstatcache( true, $file_name );

		if ( ! is_readable( $file_name ) ) {
			trigger_error(
				sprintf(
				/* translators: The $1 is the name of the file to add to the archive. */
					esc_html_x( 'File %s does not exist or is not readable', 'File to add to archive', 'backwpup' ),
					$file_name
				),
				E_USER_WARNING
			);

			return true;
		}

		if ( empty( $name_in_archive ) ) {
			$name_in_archive = $file_name;
		}

		switch ( $this->method ) {
			case 'gz':
				if ( ! is_resource( $this->filehandler ) ) {
					return false;
				}

				if ( $this->file_count > 0 ) {
					trigger_error(
						esc_html__( 'This archive method can only add one file', 'backwpup' ),
						E_USER_WARNING
					);

					return false;
				}

				$fd = $this->fopen( $file_name, 'rb' );
				if ( ! $fd ) {
					return false;
				}

				while ( ! feof( $fd ) ) {
					$this->fwrite( fread( $fd, 8192 ) );  // phpcs:ignore
				}
				fclose( $fd ); // phpcs:ignore

				$this->file_count ++;
				break;

			case 'Tar':
			case 'TarGz':
				// Convert chars for archives file names
				if ( function_exists( 'iconv' ) && stripos( PHP_OS, 'win' ) === 0 ) {
					$test = @iconv( 'ISO-8859-1', 'UTF-8', $name_in_archive );
					if ( $test ) {
						$name_in_archive = $test;
					}
				}

				return $this->tar_file( $file_name, $name_in_archive );
				break;

			case 'ZipArchive':
				// Convert chars for archives file names.
				if ( function_exists( 'iconv' ) && stripos( PHP_OS, 'win' ) === 0 ) {
					$test = @iconv( 'UTF-8', 'CP437', $name_in_archive );
					if ( $test ) {
						$name_in_archive = $test;
					}
				}

				$file_size = filesize( $file_name );
				if ( false === $file_size ) {
					return false;
				}

				$zip_file_stat = $this->ziparchive->statName( $name_in_archive );
				// If the file is allready in the archive doing anything else.
				if ( isset( $zip_file_stat['size'] ) && $zip_file_stat['size'] === $file_size ) {
					return true;
				}

				// The file is in the archive but the size is different than the one we
				// want to store. So delete the old and store the new one.
				if ( $zip_file_stat ) {
					$this->ziparchive->deleteName( $name_in_archive );
					// Reopen on deletion.
					$this->file_count = 21;
				}

				// Close and reopen, all added files are open on fs.
				// 35 works with PHP 5.2.4 on win.
				if ( $this->file_count > 20 ) {
					if ( ! $this->ziparchive->close() ) {
						$this->ziparchive_status();
						trigger_error(
							esc_html__( 'ZIP archive cannot be closed correctly', 'backwpup' ),
							E_USER_ERROR
						);

						sleep( 1 );
					}

					$this->ziparchive = null;

					if ( ! $this->check_archive_filesize() ) {
						return false;
					}

					$this->ziparchive = new ZipArchive();
					$ziparchive_open  = $this->ziparchive->open( $this->file, ZipArchive::CREATE );

					if ( $ziparchive_open !== true ) {
						$this->ziparchive_status();

						return false;
					}

					$this->file_count = 0;
				}

				if ( $file_size < ( 1024 * 1024 * 2 ) ) {
					if ( ! $this->ziparchive->addFromString( $name_in_archive, file_get_contents( $file_name ) ) ) {
						$this->ziparchive_status();
						trigger_error(
							sprintf(
							/* translators: the $1 is the name of the archive. */
								esc_html__( 'Cannot add "%s" to zip archive!', 'backwpup' ),
								$name_in_archive
							),
							E_USER_ERROR
						);

						return false;
					} else {
						$file_factor      = round( $file_size / ( 1024 * 1024 ), 4 ) * 2;
						$this->file_count = $this->file_count + $file_factor;
					}
				} else {
					if ( ! $this->ziparchive->addFile( $file_name, $name_in_archive ) ) {
						$this->ziparchive_status();
						trigger_error(
							sprintf(
							/* translators: the $1 is the name of the archive. */
								esc_html__( 'Cannot add "%s" to zip archive!', 'backwpup' ),
								$name_in_archive
							),
							E_USER_ERROR
						);

						return false;
					} else {
						$this->file_count ++;
					}
				}
				break;

			case 'PclZip':
				$this->pclzip_file_list[] = array(
					PCLZIP_ATT_FILE_NAME          => $file_name,
					PCLZIP_ATT_FILE_NEW_FULL_NAME => $name_in_archive,
				);

				if ( count( $this->pclzip_file_list ) >= 100 ) {
					if ( 0 == $this->pclzip->add( $this->pclzip_file_list ) ) {
						trigger_error(
							sprintf(
							/* translators: The $1 is the tecnical error string from pclzip. */
								esc_html__( 'PclZip archive add error: %s', 'backwpup' ),
								$this->pclzip->errorInfo( true )
							),
							E_USER_ERROR
						);

						return false;
					}
					$this->pclzip_file_list = array();
				}
				break;
		}

		return true;
	}

	/**
	 * Add a empty Folder to archive
	 *
	 * @param string $folder_name     Name of folder to add to archive.
	 * @param string $name_in_archive The name of archive to use within the archive.
	 *
	 * @return bool
	 */
	public function add_empty_folder( $folder_name, $name_in_archive ) {

		$folder_name = trim( $folder_name );

		if ( empty( $folder_name ) ) {
			trigger_error(
				esc_html__( 'Folder name cannot be empty', 'backwpup' ),
				E_USER_WARNING
			);

			return false;
		}

		if ( ! is_dir( $folder_name ) || ! is_readable( $folder_name ) ) {
			trigger_error(
				sprintf(
				/* translators: $1 is the folder name */
					esc_html_x(
						'Folder %s does not exist or is not readable',
						'Folder path to add to archive',
						'backwpup'
					),
					$folder_name
				),
				E_USER_WARNING
			);

			return false;
		}

		if ( empty( $name_in_archive ) ) {
			return false;
		}

		// Remove reserved chars.
		$name_in_archive = remove_invalid_characters_from_directory_name( $name_in_archive );

		switch ( $this->method ) {
			case 'gz':
				trigger_error(
					esc_html__( 'This archive method can only add one file', 'backwpup' ),
					E_USER_ERROR
				);

				return false;
				break;

			case 'Tar':
			case 'TarGz':
				$this->tar_empty_folder( $folder_name, $name_in_archive );

				return false;
				break;

			case 'ZipArchive':
				if ( ! $this->ziparchive->addEmptyDir( $name_in_archive ) ) {
					trigger_error(
						sprintf(
						/* translators: $1 is the name of the archive. */
							esc_html__( 'Cannot add "%s" to zip archive!', 'backwpup' ),
							$name_in_archive
						),
						E_USER_WARNING
					);

					return false;
				}
				break;

			case 'PclZip':
				return true;
				break;
		}

		return true;
	}

	/**
	 * Output status of ZipArchive
	 *
	 * @return bool
	 */
	private function ziparchive_status() {

		if ( $this->ziparchive->status === 0 ) {
			return true;
		}

		trigger_error(
			sprintf(
			/* translators. $1 is the status returned by a call to a ZipArchive method. */
				esc_html_x( 'ZipArchive returns status: %s', 'Text of ZipArchive status Message', 'backwpup' ),
				$this->ziparchive->getStatusString()
			),
			E_USER_ERROR
		);

		return false;
	}

	/**
	 * Tar a file to archive
	 *
	 * @param string $file_name       The file to store in the archive.
	 * @param string $name_in_archive The file name to use within the archive.
	 *
	 * @return bool True on success, false on failure
	 */
	private function tar_file( $file_name, $name_in_archive ) {

		if ( ! is_resource( $this->filehandler ) ) {
			return false;
		}

		if ( ! $this->check_archive_filesize( $file_name ) ) {
			return false;
		}

		$chunk_size      = 1024 * 1024 * 4;
		$filename        = $name_in_archive;
		$filename_prefix = '';

		// Split filename larger than 100 chars
		if ( 100 < strlen( $name_in_archive ) ) {
			$filename_offset = strlen( $name_in_archive ) - 100;
			$split_pos       = strpos( $name_in_archive, '/', $filename_offset );

			if ( $split_pos === false ) {
				$split_pos = strrpos( $name_in_archive, '/' );
			}

			$filename        = substr( $name_in_archive, $split_pos + 1 );
			$filename_prefix = substr( $name_in_archive, 0, $split_pos );

			if ( strlen( $filename ) > 100 ) {
				$filename = substr( $filename, - 100 );
				trigger_error(
					sprintf(
					/* translators: $1 is the file name. */
						esc_html__( 'File name "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ),
						$name_in_archive,
						$this->method
					),
					E_USER_WARNING
				);
			}

			if ( 155 < strlen( $filename_prefix ) ) {
				trigger_error(
					sprintf(
					/* translators: $1 is the file name to use in the archive. */
						esc_html__( 'File path "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ),
						$name_in_archive,
						$this->method
					),
					E_USER_WARNING
				);
			}
		}

		// Get file stat.
		$file_stat = stat( $file_name );
		if ( ! $file_stat ) {
			return true;
		}

		// Sanitize values.
		$file_stat['size'] = abs( (int) $file_stat['size'] );

		// Retrieve owner and group for the file.
		list( $owner, $group ) = $this->posix_getpwuid( $file_stat['uid'], $file_stat['gid'] );

		// Generate the TAR header for this file
		$chunk = $this->make_tar_headers(
			$filename,
			$file_stat['mode'],
			$file_stat['uid'],
			$file_stat['gid'],
			$file_stat['size'],
			$file_stat['mtime'],
			0,
			$owner,
			$group,
			$filename_prefix
		);

		$fd = false;
		if ( $file_stat['size'] > 0 ) {
			$fd = fopen( $file_name, 'rb' );

			if ( ! is_resource( $fd ) ) {
				trigger_error(
					sprintf(
						esc_html__( 'Cannot open source file %s for archiving. Writing an empty file.', 'backwpup' ),
						$file_name
					),
					E_USER_WARNING
				);
			}
		}

		if ( $fd ) {
			// Read/write files in 512 bit Blocks.
			while ( ( $content = fread( $fd, 512 ) ) != '' ) { // phpcs:ignore
				$chunk .= pack( 'a512', $content );

				if ( strlen( $chunk ) >= $chunk_size ) {
					$this->fwrite( $chunk );

					$chunk = '';
				}
			}
			fclose( $fd ); // phpcs:ignore
		}

		if ( ! empty( $chunk ) ) {
			$this->fwrite( $chunk );
		}

		return true;
	}

	/**
	 * Tar an empty Folder to archive
	 *
	 * @return bool True on success, false on failure.
	 */
	private function tar_empty_folder( $folder_name, $name_in_archive ) {

		if ( ! is_resource( $this->filehandler ) ) {
			return false;
		}

		$name_in_archive = trailingslashit( $name_in_archive );

		$tar_filename        = $name_in_archive;
		$tar_filename_prefix = '';

		// Split filename larger than 100 chars.
		if ( 100 < strlen( $name_in_archive ) ) {
			$filename_offset = strlen( $name_in_archive ) - 100;
			$split_pos       = strpos( $name_in_archive, '/', $filename_offset );

			if ( $split_pos === false ) {
				$split_pos = strrpos( untrailingslashit( $name_in_archive ), '/' );
			}

			$tar_filename        = substr( $name_in_archive, $split_pos + 1 );
			$tar_filename_prefix = substr( $name_in_archive, 0, $split_pos );

			if ( strlen( $tar_filename ) > 100 ) {
				$tar_filename = substr( $tar_filename, - 100 );
				trigger_error(
					sprintf(
					/* translators: $1 is the name of the folder. $2 is the archive name.*/
						esc_html__(
							'Folder name "%1$s" is too long to be saved correctly in %2$s archive!',
							'backwpup'
						),
						$name_in_archive,
						$this->method
					),
					E_USER_WARNING
				);
			}

			if ( strlen( $tar_filename_prefix ) > 155 ) {
				trigger_error(
					sprintf(
					/* translators: $1 is the name of the folder. $2 is the archive name.*/
						esc_html__(
							'Folder path "%1$s" is too long to be saved correctly in %2$s archive!',
							'backwpup'
						),
						$name_in_archive,
						$this->method
					),
					E_USER_WARNING
				);
			}
		}

		$file_stat = @stat( $folder_name );
		// Retrieve owner and group for the file.
		list( $owner, $group ) = $this->posix_getpwuid( $file_stat['uid'], $file_stat['gid'] );

		// Generate the TAR header for this file
		$header = $this->make_tar_headers(
			$tar_filename,
			$file_stat['mode'],
			$file_stat['uid'],
			$file_stat['gid'],
			$file_stat['size'],
			$file_stat['mtime'],
			5,
			$owner,
			$group,
			$tar_filename_prefix
		);

		$this->fwrite( $header );

		return true;
	}

	/**
	 * Check Archive File size
	 *
	 * @param string $file_to_add THe file to check
	 *
	 * @return bool True if the file size is less than PHP_INT_MAX false otherwise.
	 */
	public function check_archive_filesize( $file_to_add = '' ) {

		$file_to_add_size = 0;

		if ( ! empty( $file_to_add ) ) {
			$file_to_add_size = filesize( $file_to_add );

			if ( $file_to_add_size === false ) {
				$file_to_add_size = 0;
			}
		}

		if ( is_resource( $this->filehandler ) ) {
			$stats        = fstat( $this->filehandler );
			$archive_size = $stats['size'];
		} else {
			$archive_size = filesize( $this->file );
			if ( $archive_size === false ) {
				$archive_size = PHP_INT_MAX;
			}
		}

		$archive_size = $archive_size + $file_to_add_size;
		if ( $archive_size >= PHP_INT_MAX ) {
			trigger_error(
				sprintf(
					esc_html__(
						'If %s will be added to your backup archive, the archive will be too large for operations with this PHP Version. You might want to consider splitting the backup job in multiple jobs with less files each.',
						'backwpup'
					),
					$file_to_add
				),
				E_USER_ERROR
			);

			return false;
		}

		return true;
	}

	/**
	 * Make Tar Headers
	 *
	 * @param string  $name     The name of the file or directory. Known as Item.
	 * @param string  $mode     The permissions for the item.
	 * @param integer $uid      The owner ID.
	 * @param integer $gid      The group ID.
	 * @param integer $size     The size of the item.
	 * @param integer $mtime    The time of the last modification.
	 * @param integer $typeflag The type of the item. 0 for File and 5 for Directory.
	 * @param string  $owner    The owner Name.
	 * @param string  $group    The group Name.
	 * @param string  $prefix   The item prefix.
	 *
	 * @return mixed|string
	 */
	private function make_tar_headers( $name, $mode, $uid, $gid, $size, $mtime, $typeflag, $owner, $group, $prefix ) {

		// Generate the TAR header for this file
		$chunk = pack(
			"a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155a12",
			$name, //name of file  100
			sprintf( "%07o", $mode ), //file mode  8
			sprintf( "%07o", $uid ), //owner user ID  8
			sprintf( "%07o", $gid ), //owner group ID  8
			sprintf( "%011o", $size ), //length of file in bytes  12
			sprintf( "%011o", $mtime ), //modify time of file  12
			"        ", //checksum for header  8
			$typeflag, //type of file  0 or null = File, 5=Dir
			"", //name of linked file  100
			"ustar", //USTAR indicator  6
			"00", //USTAR version  2
			$owner, //owner user name 32
			$group, //owner group name 32
			"", //device major number 8
			"", //device minor number 8
			$prefix, //prefix for file name 155
			""
		); //fill block 12

		// Computes the unsigned Checksum of a file's header
		$checksum = 0;
		for ( $i = 0; $i < 512; $i ++ ) {
			$checksum += ord( substr( $chunk, $i, 1 ) );
		}

		$checksum = pack( "a8", sprintf( "%07o", $checksum ) );
		$chunk    = substr_replace( $chunk, $checksum, 148, 8 );

		return $chunk;
	}

	/**
	 * Posix Get PW ID
	 *
	 * @param integer $uid The user ID.
	 * @param integer $gid The group ID.
	 *
	 * @return array The owner and group in posix format
	 */
	private function posix_getpwuid( $uid, $gid ) {

		// Set file user/group name if linux.
		$owner = esc_html__( 'Unknown', 'backwpup' );
		$group = esc_html__( 'Unknown', 'backwpup' );

		if ( function_exists( 'posix_getpwuid' ) ) {
			$info  = posix_getpwuid( $uid );
			$owner = $info['name'];
			$info  = posix_getgrgid( $gid );
			$group = $info['name'];
		}

		return array(
			$owner,
			$group,
		);
	}

	/**
	 * Fopen
	 *
	 * @param string $filename The file to open in mode.
	 * @param string $mode     The mode to open the file.
	 *
	 * @return bool|resource The resources or false if file cannot be opened.
	 */
	private function fopen( $filename, $mode ) {

		$fd = fopen( $filename, $mode );

		if ( ! $fd ) {
			trigger_error(
				sprintf(
				/* translators: $1 is the filename to add into the archive. */
					esc_html__( 'Cannot open source file %s.', 'backwpup' ),
					$filename
				),
				E_USER_WARNING
			);
		}

		return $fd;
	}

	/**
	 * Write Content in File
	 *
	 * @param string $content The content to write into the file.
	 *
	 * @return int The number of bit wrote into the file.
	 */
	private function fwrite( $content ) {

		switch ( $this->handlertype ) {
			case 'bz':
				$content = bzcompress( $content );
				break;
			case 'gz':
				$content = gzencode( $content );
				break;
			default:
				break;
		}

		return (int) fwrite( $this->filehandler, $content );
	}

	/**
	 * Close file handler
	 *
	 * @return void
	 */
	private function fclose() {

		fclose( $this->filehandler );
	}
}