From bf83b3cc2602a40d00c58b62a283d8c2174a6c6f Mon Sep 17 00:00:00 2001 From: Lyubomir Marinov Date: Thu, 9 Apr 2009 15:04:50 +0000 Subject: [PATCH] Makes the updatecheck plugin wait for SIP Communicator to exit before launching the auto-update installer. --- resources/install/windows/up2date.c | 109 +++++++++++++++++- resources/install/windows/up2date.exe | Bin 6656 -> 7168 bytes .../updatechecker/UpdateCheckActivator.java | 1 + 3 files changed, 105 insertions(+), 5 deletions(-) diff --git a/resources/install/windows/up2date.c b/resources/install/windows/up2date.c index 65dd9644b..53e3f319c 100644 --- a/resources/install/windows/up2date.c +++ b/resources/install/windows/up2date.c @@ -6,6 +6,7 @@ */ #include #include /* ShellExecute */ +#include /* CreateToolhelp32Snapshot */ #include #include @@ -26,9 +27,13 @@ DWORD up2date_createProcess(LPCTSTR); DWORD up2date_displayError(DWORD error); LPTSTR up2date_getAllowElevation(LPTSTR, BOOL *); +LPTSTR up2date_getBoolArg(LPCTSTR, LPTSTR, BOOL *); DWORD up2date_getExePath(LPTSTR, DWORD); +DWORD up2date_getParentProcessId(DWORD *); +LPTSTR up2date_getWaitParent(LPTSTR, BOOL *); LPTSTR up2date_skipWhitespace(LPTSTR); LPTSTR up2date_str2tstr(LPCSTR); +DWORD up2date_waitParent(); int WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdLine, int cmdShow) { @@ -36,13 +41,22 @@ WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdLine, int cmdShow) commandLine = up2date_str2tstr(cmdLine); if (commandLine) { + BOOL waitParent; + LPTSTR noWaitParentCommandLine; BOOL allowElevation; LPTSTR noAllowElevationCommandLine; DWORD error; + waitParent = FALSE; + noWaitParentCommandLine + = up2date_getWaitParent(commandLine, &waitParent); + if (waitParent) + up2date_waitParent(); + allowElevation = FALSE; noAllowElevationCommandLine - = up2date_getAllowElevation(commandLine, &allowElevation); + = up2date_getAllowElevation( + noWaitParentCommandLine, &allowElevation); error = up2date_createProcess(noAllowElevationCommandLine); if ((ERROR_ELEVATION_REQUIRED == error) && allowElevation) { @@ -132,10 +146,19 @@ up2date_displayError(DWORD error) { LPTSTR up2date_getAllowElevation(LPTSTR commandLine, BOOL *allowElevation) { - LPCTSTR argName = TEXT("--allow-elevation"); - size_t argNameLength = _tcslen(argName); + return + up2date_getBoolArg( + TEXT("--allow-elevation"), + commandLine, + allowElevation); +} + +LPTSTR +up2date_getBoolArg(LPCTSTR argName, LPTSTR commandLine, BOOL *boolValue) { + size_t argNameLength; BOOL argValue; + argNameLength = _tcslen(argName); commandLine = up2date_skipWhitespace(commandLine); if (0 == _tcsncicmp(commandLine, argName, argNameLength)) { argValue = TRUE; @@ -143,8 +166,8 @@ up2date_getAllowElevation(LPTSTR commandLine, BOOL *allowElevation) { = up2date_skipWhitespace(commandLine + argNameLength); } else argValue = FALSE; - if (allowElevation) - *allowElevation = argValue; + if (boolValue) + *boolValue = argValue; return commandLine; } @@ -156,6 +179,53 @@ up2date_getExePath(LPTSTR exePath, DWORD exePathSize) { : GetLastError(); } +DWORD +up2date_getParentProcessId(DWORD *ppid) { + HANDLE snapshot; + DWORD error; + + snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (snapshot == INVALID_HANDLE_VALUE) + error = GetLastError(); + else { + PROCESSENTRY32 entry; + + entry.dwSize = sizeof(PROCESSENTRY32); + if (Process32First(snapshot, &entry)) { + DWORD pid; + + error = 0; + pid = GetCurrentProcessId(); + if (ppid) + *ppid = 0; + + do { + if (entry.th32ProcessID == pid) { + if (ppid) + *ppid = entry.th32ParentProcessID; + break; + } + if (!Process32Next(snapshot, &entry)) { + error = GetLastError(); + break; + } + } while (1); + } else + error = GetLastError(); + CloseHandle(snapshot); + } + return error; +} + +LPTSTR +up2date_getWaitParent(LPTSTR commandLine, BOOL *waitParent) { + return + up2date_getBoolArg( + TEXT("--wait-parent"), + commandLine, + waitParent); +} + LPTSTR up2date_skipWhitespace(LPTSTR str) { TCHAR ch; @@ -193,3 +263,32 @@ up2date_str2tstr(LPCSTR str) { return tstr; } + +DWORD +up2date_waitParent() { + DWORD error; + DWORD ppid; + + error = up2date_getParentProcessId(&ppid); + if (!error) { + HANDLE parentProcess; + + parentProcess = OpenProcess(SYNCHRONIZE, FALSE, ppid); + if (parentProcess) { + DWORD event; + + error = 0; + + do { + event = WaitForSingleObject(parentProcess, INFINITE); + if (WAIT_FAILED == event) { + error = GetLastError(); + break; + } + } while (WAIT_TIMEOUT == event); + CloseHandle(parentProcess); + } else + error = GetLastError(); + } + return error; +} diff --git a/resources/install/windows/up2date.exe b/resources/install/windows/up2date.exe index fa2c4afab1a4583b6d86c97a49f058f6b7b59a46..d66c8474f2bb1fb4502f9530980411ad8f2bb6da 100644 GIT binary patch delta 2754 zcmb_edu&rx7(c!1*j-n)IyPR`F=0cVa~%(dKvEb(QPg5#-GglmR_N-oE!`~=qjXRT zTuYO}^??BlsENdABpD$_!Bk3^)hWcNSs=k_0MBg2Mkh`(x&F@W8BG5)p6u7(Ip6Dk z-*>*=u4{f*d3f*SW#W}pgs*;*la{3u%1Jf^6ZgNdP_#msDUFnPnwz912z5XyAOLyF72Wb|F&$eQFa{XkT_P9+VON&& zuzsUZn5Dd~FPWY+5E8hVvumrWs??9eKr41V`l2j&SR(R@B0cRjD8K4U%!iq__^$Q? z_B_pCr$JegJ}u`x82A%<`nyO7O=c=>=@#Dt$d1jhT1g-xHNUAZw31-{zBM?0l@mAy zfB&t1X^LjRA{}F@ptV%i7t!A`3Agp%ibym5ZDV6L7hn?~8y>xAx8}#5B%5eXHgfS_ zP15Tb$Vtvr=8l=XDj(gDqqG5rvbl(U3=W+_E?O}>1rrOuUJJ!?8nB}7@H+XLKOv$y zta3Gfml7T`#kUJ;dhj;Xp_9{Dly$+ehar=%)vMo!r0MJ&9yzm2wJ3QmQVPFPJi&j? zh~~5)vMUEN8=VGWZ4G3(OeUgvu3;$Di~e(_V@4DP)dGLQ=qiRZjs7eumW**izo@Lt zSXgwF6|6-pX5K5chzf*S#Iek6SUH+eE*ut>OBn^ThtU}MJR&3L_wcaW+^WM(+-Y

Ky10J#>a095xz(iI!0rJ;SV{!AcPs7(qR(i6pd@EIx7(#?lJ-IjZREnujkC@lyJc z=Axx_99z^Y_l2B;bq$TNC>-e_P5%#BuwD#Yma>9@e#8u}6J^12Ieum{OTNnPPnbiM zgEl%3w>;7egPaUGhw2(opiT7-x`~T@4}Elo7P}h3mWGj;TeZ{sAgZll)fOxjFdNd3 zNX<^Od1@nZHiu~%b3PyMXG#9S#_)XnHSD#KFsfesiEct)hNc$X&|4z0Xl&q19JNHz zWuHGW5vACvfqC~dz=u{~_*m9PhuubR;VYlI&3i48;1i}mOiB-~Gsyxg=T3)0`t3;3 zMn%n4`zFIFeqnSXt__$Sx*IKtMeoRSkfG~&rfAa?N>ZHi_!&HtkMBFCyaR}vAu@n=ib%+MBwM3A5YLe*ZN^NF=*bAu~ZLC(hGAB-5!mM$@ zL+mzizj%h)sdpV^Ik5LzZH@9_W|^-~Pe@H8rsEKu%iMe7FNNu})b5p3i?tyw#~=n@ zFgfUh!*}m`eNSbQ4IN^KDwDPRYtS6HYF3^x zK2%67R=mvOd8v0~aE(5w^M4}hb`oMGJN_h=?z6@XI^SNr;=*CI_<7Fna_-{%66bB4 z-{O3N^FhwXIUnWR%h|6in#&H2xgCelJAGM98<=OIqgMx^fg+&#JjdB)}Y))G>@?1Kqh!O7^{&}}|773Skp2J+0;Z=4DF8}=>G72qde5V#GDED>oI03)kp z)c*fT-1na||4)feCl#&joz6#_+L~LPq>5C`^f;R&r_Iy8$=TWIAf$m*Xp*(k93-p!w%Z`M8Hlq$R)kF!nUPOF-g@A7w877I^xINP|4JSOnnyt0)o zo=(X@R^OF8iGMI1L}?tqD1TO(qp3w&+3vBov~6j1KDE*9+$43sI)0K)2~RM0pO_%& F{sv{l@OA(I delta 2078 zcmcIlZERCj7(Vy*Ztc1|TebqFt1w`j6Xw#Afzu4UDkC7obQH$M92D71EekPlONa?} z*frr=n{*svNEBtL3BS;!hM?g`P04UXh#@g9Xu>d?Ib(}7xIp>P>vP&WSWNVvCw=;y z^M1eYJ-6*^>T66MaebW{*+7gnN^GW5L2M#21oH+?trEqX1J{;`^%8wi+*jV9_8e59 z@s#4r4#@O9VfkXdo3#|;NjL24-lgs$WQ@x_^o+28-V(e|)Jr(}fMURrY7niWI9)=Y zmtGf>CG=ydp*B!LNbHWS|A4OR><(O{~jIz2*whXQu1StE%mf zBGz#4b@_;Kojcq+kuV|cM@c@m zKJS;mhbU?CCmOIW+IRxKok*|n_KWbO5+{EDQ`h~h8Pq3hPsg`NqPP10$5;wQLAZxiqPp%WCAcwwR3ik7c7_L>vPP(jg zMdTc|J28XshwL)HY!@ewC0VAh`yg?E6sB=_s!qfOJ7nL+K0$?i0{kg7Uu??cAD;T@BC4yy z_<$}W^`oi8enUEm2Sfuc9kVs1}hsc1+^t@~Zfv0oi4{Y2tH9 zw4COJjhm<@|131po-+T-&Ps(ubGrI;EUjhK3hhqf{8QXbcbwp=jo~|Zg|hQ8ve129 z@96BxVCt*gP?1Ti5_iYkmGnW`vsGiruZ>SS3NL58Rf-GIZ!N;Rgec_jy)jQ}^AiCf z;={X@OzJgj4OR_aZ}4jdD+c!(e9+*4!EYHHH29dojRso`b{kw(;7Eas|`M4aDSe0MTRG?-_`ZPbs3)6ox@Me zZkDVHvSY0Si(QeApg9Aa2d)64Ko%(8Oo$7p2i5?u00H1_U}hc1{xon77y?FsUxAyz zG(b>|49o)-0?U9#U=3ib2w9KAj>iJBch>&@FK*?3R`+kk(HrwCsNK1OwmbW%bwN|A QeSuR*z3);5>JxwY8*RD9xBvhE diff --git a/src/net/java/sip/communicator/plugin/updatechecker/UpdateCheckActivator.java b/src/net/java/sip/communicator/plugin/updatechecker/UpdateCheckActivator.java index 07772109b..ebe640eba 100644 --- a/src/net/java/sip/communicator/plugin/updatechecker/UpdateCheckActivator.java +++ b/src/net/java/sip/communicator/plugin/updatechecker/UpdateCheckActivator.java @@ -547,6 +547,7 @@ public void run() new String[] { workingDir + File.separator + "up2date.exe", + "--wait-parent", "--allow-elevation", temp.getCanonicalPath(), workingDir