diff options
Diffstat (limited to 'testautomation/extensions/optional/includes/extensions.inc')
-rwxr-xr-x | testautomation/extensions/optional/includes/extensions.inc | 684 |
1 files changed, 684 insertions, 0 deletions
diff --git a/testautomation/extensions/optional/includes/extensions.inc b/testautomation/extensions/optional/includes/extensions.inc new file mode 100755 index 000000000000..db115274e19d --- /dev/null +++ b/testautomation/extensions/optional/includes/extensions.inc @@ -0,0 +1,684 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU Lesser General Public License version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : Function test of extension manager +'* +'\************************************************************************ + +testcase tExtensionsFunction + + ' written for CWS jsc7, in master since SRC680m176 + ' additions for CWS sb63 - Dependency checking with versioning - documents 24-30 + ' features: - http://specs.openoffice.org/appwide/packagemanager/simple_extension_license.odt + ' - http://specs.openoffice.org/appwide/packagemanager/extensiondependencies1.odt + '/// The test documents are available at http://qa.openoffice.org/source/browse/qa/qatesttool/framework/basic/input/extensions/ ///' + '/// Textdocuments used in this test and expected messages: ///' + '/// (1/31): simpleLicense\BadDesc.oxt ///' + '/// - BadDesc.oxt/description.xml contains data which cannot be parsed. ///' + '/// - will not install ///' + '/// (2/31): simpleLicense\BadNamespace.oxt ///' + '/// - BadNamespace.oxt/description.xml contains a root element with an unsupported namespace. ///' + '/// - will not install ///' + '/// (3/31): simpleLicense\BadRoot.oxt ///' + '/// - BadRoot.oxt/description.xml does not contain the root element <description>. ///' + '/// - will not install ///' + '/// (4/31): simpleLicense\IncompAttr1.oxt ///' + '/// - ExtensionSoftwareLicenseAgreement dialog exists ///' + '/// - installs and is enabled ///' + '/// (5/31): simpleLicense\IncompAttr2.oxt ///' + '/// - Cannot find a localized license text or a default license text. ///' + '/// - will not install ///' + '/// (6/31): simpleLicense\LongLic.oxt ///' + '/// - ExtensionSoftwareLicenseAgreement dialog exists ///' + '/// - It is a Long License ///' + '/// - installs and is enabled ///' + '/// (7/31): simpleLicense\MissingLic.oxt ///' + '/// - MissingLic.oxt\registration\license_en_US.txt does not exist. ///' + '/// - will not install ///' + '/// (8/31): simpleLicense\MissingLicRef.oxt ///' + '/// - Cannot find a localized license text or a default license text. ///' + '/// - will not install ///' + '/// (9/31): simpleLicense\NoDesc.oxt ///' + '/// - installs and is enabled ///' + '/// (10/31): simpleLicense\NoLangNoDefault.oxt ///' + '/// - Cannot find a localized license text or a default license text. ///' + '/// - will not install ///' + '/// (11/31): simpleLicense\OnlyDefault.oxt ///' + '/// - Cannot find a localized license text or a default license text. ///' + '/// - will not install ///' + '/// (12/31): simpleLicense\ShortLicense.oxt ///' + '/// - ExtensionSoftwareLicenseAgreement dialog exists ///' + '/// - installs and is enabled ///' + '/// (13/31): ///' + '/// - will not install ///' + '/// (14/31): simpleLicense\ShortLicenseShared.oxt ///' + '/// - ExtensionSoftwareLicenseAgreement dialog exists ///' + '/// - installs and is enabled ///' + '/// (15/31): dependencies\broken-dependency.oxt ///' + '/// - broken-dependency.oxt/description.xml contains data which cannot be parsed. ///' + '/// - will not install ///' + '/// (16/31): dependencies\double-dependencies.oxt ///' + '/// - UnsatisfiedDependencies dialog exists ///' + '/// (1/2): Dependency 1 ///' + '/// (2/2): Dependency 2 ///' + '/// - will not install ///' + '/// (17/31): dependencies\empty-dependencies.oxt ///' + '/// - installs and is enabled ///' + '/// (18/31): dependencies\funny-dependency.oxt ///' + '/// - UnsatisfiedDependencies dialog exists ///' + '/// (1/1): & < > ' " > ' tab . crlf ///' + '/// . em-dash�;. line-separator?. paragraph-separator?. xxxxxxxxxxx... ///' + '/// - will not install ///' + '/// (19/31): dependencies\license-dependency.oxt ///' + '/// - UnsatisfiedDependencies dialog exists ///' + '/// (1/1): Dependency ///' + '/// - will not install ///' + '/// (20/31): dependencies\many-dependencies.oxt ///' + '/// - UnsatisfiedDependencies dialog exists ///' + '/// (1/20): Dependency 1 ///' + '/// (2/20): Dependency 2 ///' + '/// (3/20): Dependency 3 ///' + '/// (4/20): Dependency 4 ///' + '/// (5/20): Dependency 5 ///' + '/// (6/20): Dependency 6 ///' + '/// (7/20): Dependency 7 ///' + '/// (8/20): Dependency 8 ///' + '/// (9/20): Dependency 9 ///' + '/// (10/20): Dependency 10 ///' + '/// (11/20): Dependency 11 ///' + '/// (12/20): Dependency 12 ///' + '/// (13/20): Dependency 13 ///' + '/// (14/20): Dependency 14 ///' + '/// (15/20): Dependency 15 ///' + '/// (16/20): Dependency 16 ///' + '/// (17/20): Dependency 17 ///' + '/// (18/20): Dependency 18 ///' + '/// (19/20): Dependency 19 ///' + '/// (20/20): Dependency 20 ///' + '/// - will not install ///' + '/// (21/31): dependencies\no-dependencies.oxt ///' + '/// - installs and is enabled ///' + '/// (22/31): dependencies\no-description.oxt ///' + '/// - installs and is enabled ///' + '/// (23/31): dependencies\unknown-dependency.oxt ///' + '/// - UnsatisfiedDependencies dialog exists ///' + '/// (1/1): Unknown ///' + '/// - will not install ///' + '/// (24/31): dependencies\version21.oxt ///' + '/// - installs and is enabled ///' + '/// (25/31): dependencies\version10000.oxt ///' + '/// - UnsatisfiedDependencies dialog exists ///' + '/// (1/1): Unknown ///' + '/// - will not install ///' + '/// (26/31): dependencies\version21ns.oxt ///' + '/// - installs and is enabled ///' + '/// (27/31): dependencies\version21other.oxt ///' + '/// - UnsatisfiedDependencies dialog exists ///' + '/// (1/1): Unknown ///' + '/// - will not install ///' + '/// (25/31): dependencies\version25.oxt ///' + '/// - installs and is enabled ///' + '/// (25/31): dependencies\version30.oxt ///' + '/// - installs and is enabled ///' + '/// (25/31): dependencies\version31.oxt ///' + '/// - UnsatisfiedDependencies dialog exists ///' + '/// (1/1): Unknown ///' + '/// - will not install ///' + '/// (27/31): dependencies\version21other.oxt ///' + '/// - UnsatisfiedDependencies dialog exists ///' + '/// (1/1): Unknown ///' + '/// (30/31): dependencies\versionempty.oxt ///' + '/// - installs and is enabled ///' + '/// (31/31): dependencies\versionnone.oxt ///' + '/// - installs and is enabled ///' + '/// (32/41): versions/plain.oxt + '/// - installs and is enabled ///' + '/// (33/41): versions/plain.oxt + '/// - You are about to install version 1.02.4.7.0 of the extension org.openoffice.legacy.plain.oxt. That version is already installed. + '/// - installs and is enabled ///' + '/// (34/41): versions/version_none/plain.oxt + '/// - You are about to install version 0 of the extension org.openoffice.legacy.plain.oxt. The newer version 1.02.4.7.0 is already installed. + '/// - installs and is enabled ///' + '/// (35/41): versions/version_1.2.3/plain.oxt + '/// - You are about to install version 1.2.3 of the extension org.openoffice.legacy.plain.oxt. The older version 0 is already installed. + '/// - installs and is enabled ///' + '/// (36/41): versions/version_1.2.3/plain.oxt + '/// - You are about to install version 1.2.3 of the extension org.openoffice.legacy.plain.oxt. That version is already installed. + '/// - installs and is enabled ///' + '/// (37/41): versions/version_0.0/plain.oxt + '/// - You are about to install version 0.0 of the extension org.openoffice.legacy.plain.oxt. The newer version 1.2.3 is already installed. + '/// - installs and is enabled ///' + '/// (38/41): versions/version_1.2.4.7/plain.oxt + '/// - You are about to install version 1.2.4.7 of the extension org.openoffice.legacy.plain.oxt. The older version 0.0 is already installed. + '/// - installs and is enabled ///' + '/// (39/41): versions/version_1.02.4.7.0/plain.oxt + '/// - You are about to install version 1.02.4.7.0 of the extension org.openoffice.legacy.plain.oxt. That version is already installed. + '/// - installs and is enabled ///' + '/// (40/41): versions/version_1.2.3/plain.oxt + '/// - You are about to install version 1.2.3 of the extension org.openoffice.legacy.plain.oxt. The newer version 1.02.4.7.0 is already installed. + '/// - installs and is enabled ///' + '/// (41/41): versions/version_1.2.15.3/plain.oxt + '/// - You are about to install version 1.2.15.3 of the extension org.openoffice.legacy.plain.oxt. The older version 1.2.3 is already installed. + + dim j,b,i,a,x,y as integer + dim sPath as string + dim aFiles(50) as string + dim aFeatures(50) as string + dim aFileList(50) as string + dim sTemp as string + dim sTemp2 as string + dim sTemp3 as string + dim sTemp4 as string + dim aTemp + dim aTemp2 + dim sFirstStatus as string + dim bFound as boolean + dim aRemovePackages(50) as string + dim bFoundNumber as boolean + dim sLastVersion as string + + sLastVersion = "" + ' want to start and work with just one document window + b = getDocumentCount + hFileCloseAll() + hNewDocument() + + ' load about twenty one extension files, to test the features + ' the list tells the filename and in encoded numbers the features + ' a line looks like: + ' simpleLicense\LongLic.oxt;0,2,1,0 + ' - the filename and the features are seperated by a semicolon + ' - the numbes for the features are seperated by colons + ' 1st number: Unsatisfied dependencies; if there are any, the number counts them; if there are none it is zero and the dialog won't come up + ' 2nd number: License; if there is one the value is 1; it it a long one, where the scroll button needs to be used it is 2; 3 if the license should not be accepted for testing purposes, if there is no license the value is zero + ' 3rd number: If the extension should successfully install the value is one, else zero. + ' 4th number: If an active is expected after selecting a file for installation the value is one, else zero. + ' 5th number: If active is expected the expected version information after selecting a file for installation the value is one, else zero and if an upgrade/downgrade is expected, the number is 2. + + ' Base path for test files + sPath = convertPath(gTestToolPath+"extensions/optional/input/") + ' read filelist and expected features + ListRead(aFileList(), sPath+"files.txt") + a = listCount(aFileList()) + printlog a + for i = 1 to a + aTemp = split (aFileList(i),";") + if uBound(aTemp()) >0 then + listAppend(aFiles(),aTemp(0)) + listAppend(aFeatures(),aTemp(1)) + endif + next i + + ' there are some dependencys to languages... + if iSprache = 49 then + sTemp = aFeatures(4) + aFeatures(4) = aFeatures(5) + aFeatures(5) = sTemp + else + if iSprache <> 01 then + aFeatures(4) = aFeatures(5) + aFeatures(6) = aFeatures(5) + aFeatures(12) = aFeatures(5) + aFeatures(13) = aFeatures(5) + aFeatures(14) = aFeatures(5) + endif + endif + ' cleanup before starting; check that no extension from the list is installed right now; if remove it. + '/// Before starting, look into extension manager, if already a file is installed, that will be used in this test ///' + '/// Remove it. ///' + a = listCount(aFiles()) + dim ii as integer + ToolsPackageManager + kontext "PackageManager" + If PackageManager.exists(10) then + BrowsePackages.typeKeys("<home>") + ii = 1 + while (ii < BrowsePackages.getItemCount+1 ) + kontext "PackageManager" + 'BrowsePackages.typeKeys("+") + 'BrowsePackages.typeKeys("<down>") + BrowsePackages.select ii + sTemp = BrowsePackages.getItemText (ii,1) + if right(sTemp,3) = "oxt" then + for x = 1 to a + sTemp3 = aFiles(x) + aTemp = split(sTemp3,"\") + if uBound(aTemp) < 1 then + aTemp = split(sTemp3,"/") + endif + sTemp3 = aTemp(uBound(aTemp)) + if sTemp = sTemp3 then + qaErrorLog "Package is already installed, trying to remove it: '" + sTemp + "'" + if remove.isEnabled then + remove.click + + kontext "Active" + if ( Active.exists( 2 ) ) then + Active.ok() + else + warnlog( "No confirmation dialog for Extension removal" ) + endif + + Kontext "AddingPackages" + y=0 + while AddingPackages.exists(1) AND (y<30) + printlog "RemovingPackages..." + sleep 1 + y=y+1 + wend + kontext "PackageManager" + BrowsePackages.typeKeys("<up>") + x = 100 + else + warnlog "Package is already installed and can't get removed: '" + sTemp + "'" + ii=ii+1 + x = 101 + endif + endif + next x + if x < 100 then + ii=ii+1 + endif + else + ii=ii+1 + endif + wend + kontext "PackageManager" + PackageManager.close + WaitSlot( 5000 ) + endif + + ' for every test file do... + a = listCount(aFiles()) + for i = 1 to a + printlog "********** Test file ("+i+"/"+a+"): "+aFiles(i) + aTemp = split (aFeatures(i),",") + '/// call Tools - Package/Extension manager ///' + ToolsPackageManager + kontext "PackageManager" + If PackageManager.exists(10) then + '/// going to top of package list and explode every line, until the button 'Add' is enabled ///' + '/// should be 'My Packages' ///' + 'BrowsePackages.typeKeys("<home>") + 'sTemp = BrowsePackages.getSelText + 'sTemp2 = "" + 'while (Not Add.isEnabled AND (sTemp <> sTemp2)) + ' BrowsePackages.typeKeys("+") + ' BrowsePackages.typeKeys("<down>") + ' sTemp2 = sTemp + ' sTemp = BrowsePackages.getSelText + 'wend + 'if sTemp = sTemp2 then + ' warnlog "Couldn't find a way to enable the Add button - aborting" + ' goto endsub + 'endif + 'printlog BrowsePackages.getSelText + '/// click button 'Add' ///' + try + Add.click + catch + warnlog "#i90870# extension manager deadlock/C++ runtimes" + exitrestarttheoffice + ToolsPackageManager + kontext "PackageManager" + Add.click + endcatch + '/// Add Package(s)... dialg comes up ///' + Kontext "OeffnenDlg" + if OeffnenDlg.exists(5) then + '/// put filename into field ///' + Dateiname.setText convertPath(sPath + aFiles(i)) + printlog DateiTyp.getSelText + '/// press button 'Open' ///' + Oeffnen.click + else + warnlog "Add Package(s)... dialog didn't came up" + endif + + 'Asking for whom to install; All: YES, Me: NO, nobody: Cancel + kontext + if active.exists(5) then + sTemp = active.getText + printlog "Messagebox: " + sTemp + ' We only want to handle the installation target here which only + ' pops up if we have the choice (rights to write to shared layer) + if active.getButtonCount = 3 then + try + active.yes + catch + warnlog( "Try...catch: Failed to click Yes-button" ) + endcatch + else + printlog "No installation target message (this is probably a root-installation)" + endif + endif + + '/// Progress dialog comes up ///' + Kontext "AddingPackages" + if AddingPackages.exists(1) then + printlog " - AddingPackages dialog exists" + 'DialogTest(AddingPackages) + endif + + '/// If any error happens, an active comes up, telling what is wrong ///' + ' error is just a dialog with one button + ' version infos have two buttons + Kontext + if active.exists(5) then + sTemp = active.getText + select case active.getbuttoncount + case 1: + y = instr(sTemp, " ") + if cBool(aTemp(3)) then + printlog sTemp + else + warnlog sTemp + endif + case 2: + x = 0 + if cBool(aTemp(4)) then + printlog "Version info message available." + else + warnlog "Version info message available, but not expected" + endif + printlog sTemp + bFoundNumber = false + aTemp2 = split(sTemp," ") + y = uBound(aTemp2) + while ((NOT bFoundNumber) AND (x < y)) + stemp2 = left(aTemp2(x),1) + if isNumeric(stemp2) then + bFoundNumber = TRUE + printlog "Try to install version: " + aTemp2(x) + endif + x=x+1 + wend + if NOT bFoundNumber then + warnlog "No version was mentioned in the version message!" + endif + bFoundNumber = false + while (NOT bFoundNumber AND x < y) + stemp2 = left(aTemp2(x),1) + if isNumeric(stemp2) then + bFoundNumber = TRUE + endif + x=x+1 + wend + if aTemp(4) = "2" AND bFoundNumber then + printlog "Old version is: " + aTemp2(x-1) + elseif bFoundNumber then + warnlog "No old version expected: " + aTemp2(x-1) + elseif aTemp(4) = "2" then + warnlog "Old version expected, but not mentioned." + endif + end select + active.ok + else + if cBool(aTemp(3)) then + if i = 3 then + qaErrorLog "#i73367# " + else + warnlog "errormessage expected, but none came up." + endif + endif + endif + + '/// If there are any unsatisfied dependencies, they are shown now ///' + Kontext "UnsatisfiedDependencies" + if UnsatisfiedDependencies.exists(10) then + if cBool(aTemp(0)) then + printlog " - UnsatisfiedDependencies dialog exists" + else + warnLog "UnsatisfiedDependencies are not expected but available" + endif + DialogTest(UnsatisfiedDependencies) + y = UnsatisfiedDependencyList.getItemCount + if cInt(aTemp(0)) <> y then + warnlog "Difference in dependencies; expected: " + aTemp(0) + "; found: " +y + endif + for x = 1 to y + printlog " ("+x+"/"+y+"): "+UnsatisfiedDependencyList.getItemText(x) + next x + '/// close dialog if available, extension will not be installed ///' + UnsatisfiedDependencies.close + else + if cBool(aTemp(0)) then + warnLog "UnsatisfiedDependencies expected but none shown." + endif + endif + + '/// If there is a license, it is shown now ///' + Kontext "ExtensionSoftwareLicenseAgreement" + if ExtensionSoftwareLicenseAgreement.exists(10) then + if cBool(aTemp(1)) then + printlog " - ExtensionSoftwareLicenseAgreement dialog exists" + else + warnlog "ExtensionSoftwareLicenseAgreement are not expected but shown" + endif + if NOT Accept.isEnabled then + if cInt(aTemp(1)) = 2 then + printlog " Long License" + else + errorlog "Long License" + endif + else + if NOT cInt(aTemp(1)) = 2 then + printlog "Long License" + else + errorlog "Long License" + endif + endif + '/// scroll down until accept button is enabled, click accept button ///' + LicenseText.typeKeys ("<mod1 a>",true) + if Accept.isEnabled then + '/// for testing purposes click cancel one time - the extension should not get installed ///' + if cInt(aTemp(1)) = 3 then + ExtensionSoftwareLicenseAgreement.CANCEL + else + Accept.click + endif + else + qaErrorLog "Accept not enabled.yet" + while NOT Accept.isEnabled + ScrollDown.click + printlog "Scrolling..." + sleep 1 + wend + '/// for testing purposes click cancel one time - the extension should not get installed ///' + if cInt(aTemp(1)) = 3 then + ExtensionSoftwareLicenseAgreement.CANCEL + else + Accept.click + endif + endif + else + if cBool(aTemp(1)) then + errorlog "ExtensionSoftwareLicenseAgreement dialog expected but not shown." + endif + endif + + '/// There may come up another active right now, which would be an error ///' + Kontext + if active.exists(5) then + sTemp = active.getText + if i = 7 then + qaerrorlog "#i67452# " + sTemp + else + if i = 13 then + qaerrorlog "#i73307#" + stemp + else + warnlog sTemp + endif + endif + active.ok + endif + + '/// the progress dialog is now available again ///' + Kontext "AddingPackages" + x=0 + while AddingPackages.exists(1) AND (x<30) + printlog "AddingPackages..." + sleep 1 + x=x+1 + wend + + '/// There may come up another active right now, which would be an error ///' + Kontext + if active.exists(5) then + sTemp = active.getText + warnlog sTemp + active.ok + endif + + ' find out, if the extension got installed + kontext "PackageManager" + BrowsePackages.typeKeys("<home>") + BrowsePackages.typeKeys("+") + y = BrowsePackages.getItemCount + sTemp = aFiles(i) + aTemp2 = split(sTemp,"\") + if uBound(aTemp2) < 1 then + aTemp2 = split(sTemp,"/") + endif + sTemp = aTemp2(uBound(aTemp2)) + printlog stemp + bFound = FALSE + for x = 1 to y + sTemp2 = BrowsePackages.getItemText(x,1) + printlog "("+x+"/"+y+"): "+sTemp2 + ' Mechanism to detect a status change; report it only one time + sTemp3 = BrowsePackages.getItemText(x,3) ' enabled? + sTemp4 = BrowsePackages.getItemText(x,2) ' version + if sTemp3 <> "" AND sFirstStatus = "" then + sFirstStatus = sTemp3 + else + if (sFirstStatus <> sTemp3) AND (sTemp3 <> "") AND (sFirstStatus <> "alreadyshown") then + qaErrorlog "#i67450# " + sFirstStatus + " <> " + sTemp3 + sFirstStatus= "alreadyshown" + endif + endif + if sTemp3 <> "" then + printlog " +++ " + sTemp3 + endif + if sTemp4 <> "" then + sLastVersion = sTemp4 + printlog " Version:" + sTemp4 + endif + if sTemp = sTemp2 then + listAppend(aRemovePackages(), sTemp) + if cBool(aTemp(2)) then + printlog "-------------------------------- Extension got installed" + bFound = TRUE + else + if i = 3 then + qaerrorLog "#i73367# " + else + warnLog "-------------------------------- Extension got installed, but shouldn't do that" + endif + endif + endif + next x + if NOT cBool(aTemp(2)) and bFound then + warnlog "not found" + endif + '/// Close extension manager ///' + PackageManager.OK + 'OK / Close + else + warnlog "Couldn't call Tools -> Package manager - aborting test at " + i + goto endsub + endif + next i + + '/// after installing all extensions, remove them ///' + ' uninstall all components, that were installed + a = listCount(aRemovePackages()) + ToolsPackageManager + + kontext "PackageManager" + If PackageManager.exists(10) then + + BrowsePackages.typeKeys("<home>") + waitslot() + + ii = 1 + while (ii < BrowsePackages.getItemCount +1) + + wait( 2000 ) ' Required, Extension Manager needs time to populate + kontext "PackageManager" + 'BrowsePackages.typeKeys("+") + 'BrowsePackages.typeKeys("<down>") + sTemp2 = sTemp + BrowsePackages.select ii + waitslot() + + sTemp = BrowsePackages.getItemText (ii,1) + if right(sTemp,3) = "oxt" then + for x = 1 to a + if sTemp = aRemovePackages(x) then + printlog "Package is installed, trying to remove it: '" + sTemp + "'" + if remove.isEnabled then + remove.click + + kontext "Active" + if ( Active.exists( 2 ) ) then + Active.ok() + else + warnlog( "No confirmation for extension removal" ) + endif + + Kontext "AddingPackages" + y=0 + while AddingPackages.exists(1) AND (y<30) + printlog "RemovingPackages..." + sleep 1 + y=y+1 + wend + kontext "PackageManager" + BrowsePackages.typeKeys("<up>") + x = 100 + else + warnlog "Package can't get removed: '" + sTemp + "'" + ii=ii+1 + endif + endif + next x + endif + ii = ii+1 + wend + kontext "PackageManager" + hCloseDialog( PackageManager, "close" ) + else + qaErrorLog "disabling installed extensions failed;" + endif + WaitSlot() + hFileCloseAll() +endcase + + |