merge the formfield patch from ooo-build
[ooovba.git] / testautomation / global / tools / includes / optional / t_extension_manager_tools.inc
blob2dfc30ad52a8752ebd884157b63c5495bba21e95
1 'encoding UTF-8  Do not remove or change this line!
2 '**************************************************************************
3 '* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 '* 
5 '* Copyright 2008 by Sun Microsystems, Inc.
6 '*
7 '* OpenOffice.org - a multi-platform office productivity suite
8 '*
9 '* $RCSfile: t_extension_manager_tools.inc,v $
11 '* $Revision: 1.1 $
13 '* last change: $Author: jsk $ $Date: 2008-06-20 07:57:57 $
15 '* This file is part of OpenOffice.org.
17 '* OpenOffice.org is free software: you can redistribute it and/or modify
18 '* it under the terms of the GNU Lesser General Public License version 3
19 '* only, as published by the Free Software Foundation.
21 '* OpenOffice.org is distributed in the hope that it will be useful,
22 '* but WITHOUT ANY WARRANTY; without even the implied warranty of
23 '* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 '* GNU Lesser General Public License version 3 for more details
25 '* (a copy is included in the LICENSE file that accompanied this code).
27 '* You should have received a copy of the GNU Lesser General Public License
28 '* version 3 along with OpenOffice.org.  If not, see
29 '* <http://www.openoffice.org/license.html>
30 '* for a copy of the LGPLv3 License.
32 '/******************************************************************************
34 '*  owner : joerg.skottke@sun.com
36 '*  short description : Tools to ease working with the extension manager
38 '\******************************************************************************
40 function hExtensionAddGUI( _path as string, _flags as string ) as integer
42     '///<h3>Install an extension using the OpenOffice.org Extension Manager UI</h3>
43     '///<p>This function is intended for use with the new Extension Manager UI
44     '///+ and replaces an older function with the same name. Please note that 
45     '///+ the interface has changed significantly. <br>This has become necessary
46     '///+ because the Extension Manager can turn up with a really huge number
47     '///+ of different dialogs, warnings, errormessages etc. <br>
48     '///+ As this function is designed to handle the most common installation 
49     '///+ scenarios it needs quite a number of differnt options.<br>
50     '///+ Please have a look at the usage sample:<br><br></p>
51     '///+ <p align="center"><i>hExtensionAddGUI( sMyExtension, 
52     '///+ &quot;InstallForAll,BrokenDeps,DenyUpdate&quot; )</i<p><br>
54     
55     '///<u>Input:</u><br>
56     '///<ol>
57     '///+<li>Path to extension (String)</li>
58     '///<ul>
59     '///+<li>The path has to be fully qualified</li>
60     '///+<li>The path may be platform specific</li>
61     '///</ul>
62     
63     '///+<li>Flags (String), defaults underlined</li>
64     '///<ul>
65     '///+<li>The string is non optional but may be empty. Allowed flags are:</li>
66     '///<ul>
67     '///+<li>InstallForAll | <u>InstallForUser</u><br>Used when running office with administrator rights</li>
68     '///+<li>AllowUpdate | DenyUpdate | <u>NoUpdate</u><br>Reinstall already installed extension/update</li>
69     '///+<li>AcceptLicense | DenyLicense | <u>NoLicense</u><br>How to handle possible license dialog</li>
70     '///+<li>BrokenDeps<br>Close exactly one broken dependencies warning</li> 
71     '///+<li>UseSlot<br>Use the File Open slot to load the extension (faster)</li>   
72     '///</ul>
73     '///+<li>It is recommended to use the comma as delimiter between flags</li>
74     '///</ul>
75     '///</ol>
77     '///<u>Return Value:</u><br>
78     '///<ol>
79     '///+<li>Installation status (Integer)</li>
80     '///<ul>
81     '///+<li>&gt; 0 = Installation completed with no errors, number of installed extensions</li>
82     '///+<li>-1 = The requested extension does not exist</li>
83     '///+<li>-2 = The Add-button could not be accessed</li>
84     '///+<li>-3 = The Extension Manager did not open</li>
85     '///+<li>-4 = Unknown messagebox before the file Open dialog exists</li>
86     '///+<li>-5 = Broken dependency warning displayed</li>
87     '///+<li>-6 = The File Open dialog did not pop up</li>
88     '///</ul>
89     '///</ol>
91     dim flags as string   : flags  = lcase( _flags )
92     dim path as string    : path   = convertpath( _path )
93     dim bLogs as boolean  : bLogs  = FALSE
95     const CFN = "hExtensionAddGUI()::"
97     '///<u>Description</u>
98     '///<ul>
100     ' set defaults if string is empty    
101     if ( flags = "" ) then flags = "installforuser,noupdate,nolicense"
102     if ( instr( flags , "verbose" ) <> 0 ) then bLogs = TRUE 
103     
104     if ( bLogs ) then printlog( CFN & "Flags: " & flags )
105     
106     '///+<li>Verify that the requested extension exists (filesystem level)</li>
107     if ( not FileExists( path ) ) then
108         printlog( CFN & "Requested extension does not exist" )
109         hExtensionAddGUI() = -1
110         exit function
111     endif
112     
113     
114     if ( bLogs ) then 
115         printlog( "" )
116         printlog( "********** Installing extension begin **********" )
117     endif
118     
119     '///+<li>Open the Extension Manager - optionally using the slot (CWS oxtsysint01)</li>
120     if ( instr( flags , "useslot" ) <> 0 ) then
121         hFileOpen( path )
122     else
123         ToolsPackageManager
124         kontext "PackageManager"
125         
126         if ( PackageManager.exists( 2 ) ) then
127     
128             '///+<li>Verify that the &quot;Add..&quot; button is available</li>
129             if ( add.exists() and add.isEnabled() ) then
130             
131                 '///+<li>Click the &quot;Add...&quot; button</li>
132                 add.click()
133             else
134                 printlog( CFN & "Add button is missing or disabled" )
135                 hExtensionAddGUI() = -2
136                 exit function
137             endif
138             
139             '///+<li>Test for the dreaded &quot;The office workdirectory does not exist&quot; warning, close it</li>
140             kontext "Active"
141             if ( Active.exists( 1 ) ) then 
142                 if ( Active.getButtonCount() = 1 ) then
143                     if ( bLogs ) then printlog( Active.getText() )
144                     active.ok()
145                 else
146                     printlog( CFN & "Unexpected/unknown messagebox" )
147                     printlog( Active.getText() ) 
148                     hExtensionAddGUI() = -4
149                     exit function
150                 endif
151             endif
152             
153             '///+<li>Enter the extension name into the file picker, open the file</lI>
154             kontext "OeffnenDlg"
155             if ( OeffnenDlg.exists( 2 ) ) then
156                 DateiName.setText( path )
157                 Oeffnen.click()
158             else
159                 printlog( CFN & "The File Open dialog did not open" )
160                 hExtensionAddGUI() = -6
161                 exit function
162             endif
163             
164         else
165             printlog( CFN & "Extension Manager is not open" )
166             hExtensionAddGUI() = -3
167             exit function
168         endif
169     endif
170     
171     '///+<li>Test for the installation target dialog that comes up as soon as the
172     '///+ user has administrator rights or works on a userspace installation. 
173     '///+ Handle the dialog as specified by the function flags</li>
174     if ( instr( flags, "installfor" ) <> 0 ) then
175         kontext "Active"
176         if ( Active.exists( 1 ) ) then 
177             if ( Active.getButtonCount() = 3 ) then
178             
179                 if ( bLogs ) then 
180                     printlog( CFN & "Installation target dialog found" )
181                     printlog( Active.getText() )
182                 endif
183                 
184                 if ( instr( flags , "installforall" ) <> 0 ) then
185                     printlog( CFN & "Installing for all users" )
186                     Active.no()
187                 else
188                     printlog( CFN & "Installing for user only" )
189                     Active.yes()
190                 endif
191             else
192                 if ( bLogs ) then 
193                     printlog( CFN & "Unexpected/unknown dialog" )
194                     printlog( Active.getText() )
195                 endif
196             endif
197         else
198             if ( bLogs ) then printlog( CFN & "Skipping handling of installation target" )
199         endif
200     else
201         if ( bLogs ) then printlog( CFN & "Not handling userspace installations" )
202     endif
204     '///+<li>Test for the broken dependencies exception, close it with ok.</li>
205     if ( instr( flags , "brokendeps" ) <> 0 ) then
206         if ( bLogs ) then printlog( CFN & "Testing for dependencies messagebox" )
207         kontext "UnsatisfiedDependencies"
208         if ( UnsatisfiedDependencies.exists( 1 ) ) then
209             printlog( CFN & "Closing Unsatisfied Dependencies dialog." )
210             UnsatisfiedDependencies.ok()
211             hExtensionAddGUI() = -5
212         else
213             printlog( CFN & "No unsatisfied dependencies dialog" )
214         endif
215     else
216         if ( bLogs ) then printlog( CFN & "Skipping handling of broken dependencies dialog" )
217     endif
218     
219     '///+<li>Test for the extension update dialog which pops up if an extension
220     '///+ is already installed. Handle as specified by flags</li>
221     if ( instr( flags, "update" ) ) then
222         if ( bLogs ) then printlog( CFN & "Testing for version message/update" )
223         kontext "Active"
224         if ( Active.exists( 1 ) ) then
225         
226             if ( bLogs ) then 
227                 printlog( CFN & "Found update dialog" )
228                 printlog( Active.getText() )
229             endif
230             
231             if ( Active.getButtonCount() = 2 ) then
232                 if ( instr( flags, "denyupdate" ) <> 0 ) then
233                     printlog( CFN & "Denying update" )
234                     Active.cancel()                    
235                 else
236                     printlog( CFN & "Allowing update" )
237                     Active.ok()
238                 endif
239             else
240                 printlog( CFN & "Unexpected/unknown dialog displayed" )
241                 printlog( Active.getText() )
242             endif
243         else
244             if ( instr( flags , "noupdate" ) <> 0 ) then
245                 printlog( CFN & "No update dialog present. Good" )
246             else
247                 printlog( CFN & "Update messagebox is missing" )
248             endif
249         endif
250     else
251         if ( bLogs ) then printlog( CFN & "Skipping handling of update dialog" )
252     endif
253     
254     '///+<li>Test for the Software License Agreement dialog. Handle as specified by
255     '///+ flags</li>
256     if ( instr( flags, "license" ) <> 0 ) then
257         if ( bLogs ) then printlog( CFN & "Testing software license dialog" )
258         kontext "ExtensionSoftwareLicenseAgreement"
259         if ( ExtensionSoftwareLicenseAgreement.exists( 5 ) ) then
260             if ( bLogs ) then printlog( CFN & "Software license dialog found" )
261             if ( instr( flags , "denylicense" ) <> 0 ) then
262                 printlog( CFN & "Cancelling software license dialog" )
263                 ExtensionSoftwareLicenseAgreement.cancel()
264             else
265                 printlog( CFN & "Accepting software license" )
266                 do while ( not accept.isEnabled() ) 
267                     ScrollDown.click()
268                     WaitSlot()
269                 loop
270                 accept.click()
271             endif
272         else
273             if ( instr( flags , "nolicense" ) <> 0 ) then
274                 printlog( CFN & "No license dialog displayed. Good." )
275             else
276                 warnlog( CFN & "Expected license dialog is missing" )
277             endif
278         endif
279     else
280         if ( bLogs ) then printlog( CFN & "Skipping handling of license dialog" )
281     endif
282     
283     '///+<li>Retrieve the number of installed extensions</li>
284     kontext "PackageManager"
285     wait( 500 )
286     hExtensionAddGUI() = BrowsePackages.getItemCount()
287     
288     '///+<li>Close the Extension Manager</li>
289     PackageManager.close()
290     
291     if ( bLogs ) then 
292         printlog( "**********  Installing extension end  **********" )
293         printlog( "" )
294     endif
295     '///</ul>    
296     
297 end function
298     
300 '*******************************************************************************
302 function hExtensionRemoveGUI( cExtensionName as string ) as integer
305     '///<h3>Remove an extension via Extension Manager </h3>
307     '///<u>Input value(s):</u><br>
308     '///<ol>
309     '///+<li>UI Name of the extension (string)</li>
310     '///</ol>
313     '///<u>Return Value:</u><br>
315     '///<ol>
316     '///+<li>Errorcode (integer)</li>
317     '///<ul>
318     '///+<li>0 = No errors, extension was removed</li>
319     '///+<li>1 = Failure to open Extension Manager (fatal)</li>
320     '///+<li>2 = Cannot delete found extension, remove-button is disabled (fatal)</li>
321     '///+<li>3 = The extension was not found (non-fatal)</li>
322     '///</ul>
323     '///</ol>
324     
325     const CFN = "hExtensionRemoveGUI(): "
326     
327     printlog( "Removing extension by name: " & cExtensionName )
329     ToolsPackageManager
330     kontext "PackageManager"
331     if ( PackageManager.exists( 2 ) ) then
332         try
333             BrowsePackages.select( cExtensionName )
334             if ( Remove.exists() ) then
335                 if ( Remove.isEnabled() ) then
336                     Remove.click()
337                     
338                     kontext "Active"
339                     if ( Active.exists( 3 ) ) then
340                         printlog( Active.getText() )
341                         Active.OK()
342                         WaitSlot()
343                     else
344                         warnlog( CFN & "Expected confirmation dialog is missing" )
345                     endif
346                     hExtensionRemoveGUI() = 0
347                 else
348                     hExtensionRemoveGUI() = 2
349                 endif
350             else
351                 hExtensionRemoveGUI() = 4
352             endif
353         catch
354             hExtensionRemoveGUI() = 3
355         endcatch
356         
357         kontext "PackageManager"
358         PackageManager.close()
359     else
360         hExtensionRemoveGUI() = 1
361     endif
363 end function
365 '*******************************************************************************
367 function sExtensionCLI(sCommand as string, sExtensionName as string, optional sExtensionPath as string) as string
368     '/// Add/remove an extension with the command line tool 'unopkg'///'
369     '/// INPUT: sCommand: string of command from "add remove list reinstall" ///'
370    '/// INPUT: sExtensionName: name of the extension ///'
371    '/// INPUT: optional sExtensionPath: path to the extension ///'
372    '/// RETURN: currently nothing ///'
373     dim sLokalExtensionPath as string
374     dim sCommands as string
375     dim sUnoPkg as string
376     dim i, a, b as integer
377     dim args as string
378     Dim sFile as string
379     Dim sEnv as string
380     Dim sContent(5) as string
381     Dim sPlatformProgramPath as string
382     
383     if isMissing(sExtensionPath) then
384         sLokalExtensionPath = ""
385     else
386         sLokalExtensionPath = sExtensionPath
387     endif
388     
389     sCommands = "add remove list reinstall"
390     
391     a = len(sAppExe)
392     if a > 12 then
393         b = inStr(a-12, sAppExe, "soffice")
394         sUnoPkg = left(sAppExe, b-1) + "unopkg" + mid(sAppExe, b+len("soffice"))
395         'printlog sUnoPkg
396         'sUnoPkg = convertToUrl(sUnoPkg)
397     else
398         qaErrorLog ("Need to think about another solution..." + sAppExe)
399     endif
400     args = sCommand+" "+sLokalExtensionPath + sExtensionName
401     printlog "Executing: "+sUnopkg+" "+args
402     if gPlatGroup <> "unx" then
403         shell(sUnoPkg,2,args)
404     else
405         sFile = ConvertPath (gOfficePath + "user/work/uno.sh")
406         if gPlatform = lcase("osx") then
407             sPlatformProgramPath = "MacOS"
408         else
409             sPlatformProgramPath = "program"
410         end if
411         sEnv = convertToURL(convertPath(gNetzOfficePath + sPlatformProgramPath + "/fundamentalrc")
412         listAppend(sContent(), "export URE_BOOTSTRAP=" + sEnv) 
413         listAppend(sContent(), sUnoPkg + " " + args)
414         listWrite(sContent(), sFile)
415         shell("bash",1,sFile)
416     endif
417 end function
419 '*******************************************************************************
421 function hExtensionGetItemList( cItemList() as string ) as integer
423     '///<h3>Get the list of all items in the extensions list</h3>
424     '///<i>The array contains the list of all items in the extension manager GUI,
425     '///+ including all components of the extensions. Consider this when defining
426     '///+ the size of the array to be passed to this function as problems here are
427     '///+ hard to debug.<br>
428     '///+ Starting point is any document, the function will return to the 
429     '///+ calling document on completion</i><br><br>
430     
431     '///<u>Input:</u>
432     '///<ol>
433     '///+<li>Array for the list items (string)</li>
434     '///</ol>
435     
436     
437     '///<u>Return Value:</u><br>
438     '///<ol>
439     '///+<li>Number of items (integer)</li>
440     '///<ul>
441     '///+<li>0 on any error</li>
442     '///+<li>2 if no extensions exist (My Macros/OpenOffice.org macros nodes present</li>
443     '///+<li>&gt; 2 if any changes to the default exist</li>
444     '///</ul>
445     '///</ol>
446     
447     dim iItemCount as integer
448     dim iCurrentExtension as integer
449     
450     printlog( "Retrieving extension list" )
452     ToolsPackageManager
453     kontext "PackageManager"
454     if ( PackageManager.exists( 2 ) ) then
456         iItemCount = BrowsePackages.getItemCount()
458         for iCurrentExtension = 1 to iItemCount
459             cItemList( iCurrentExtension ) = BrowsePackages.getItemText( iCurrentExtension , 1 )
460             printlog( " * " & cItemList( iCurrentExtension )
461         next iCurrentExtension
463         hExtensionGetItemList() = iItemCount
464         cItemList( 0 ) = iItemCount
465         PackageManager.close()
467     else
468     
469         hExtensionGetItemList() = 0
470         
471     endif    
473 end function
475 '*******************************************************************************
477 function hSelectExtensionID( iPos as integer ) as string
479     '///<h3>Select an item by index in the list of available extensions</h3>
480     '///<i>This function needs the Extension Manager to be open. It will only
481     '///+ select extensions but not their components.</i><br><br>
482         
483     '///<u>Input:</u>
484     '///<ol>
485     '///+<li>Absolute position of the extension to be selected (Integer)</li>
486     '///</ol>
487     
488     '///<u>Return Value:</u><br>
489     '///<ol>
490     '///+<li>Name of the selected extension (String)</li>
491     '///+<li>Empty string on index out of range or Extension Manager not open</li>
492     '///</ol>
493     
494     printlog( "Selecting extension at pos. " & iPos )
496     ToolsPackageManager
497     kontext "PackageManager"
498     if ( PackageManager.exists( 2 ) ) then
499         try
500             BrowsePackages.select( iPos )
501             hSelectExtensionID() = BrowsePackages.getItemText( iPos , 1 )
502         catch
503             hSelectExtensionID() = ""
504         endcatch
505         PackageManager.close()
506     else
507         hSelectExtensionID() = ""
508     endif
509     
511 end function
513 '*******************************************************************************
515 function hSelectExtensionName( cName as string ) as integer
517     '///<h3>Select an item by name in the list of available extensions</h3>
518     '///<i>This function needs the Extension Manager to be open. It will only
519     '///+ select extensions but not their components.</i><br><br>
520     
521     '///<u>Input:</u>
522     '///<ol>
523     '///+<li>Name of the extension (String)</li>
524     '///<ul>
525     '///+<li>Name of any item in the treelist, even those of top nodes</li>
526     '///</ul>
527     '///</ol>
528     
529     '///<u>Return Value:</u><br>
530     '///<ol>
531     '///+<li>Absolute position of the selected extension (Integer)</li>
532     '///<ul>
533     '///+<li>0 = Extension was not found</li>
534     '///+<li>&gt; 0 = Absolute position of the extension/node</li>
535     '///+<li>-1 = Extension Manager did not open</li>
536     '///</ul>
537     '///</ol>
539     printlog( "Selecting extension by display name: " & cName )
540     
541     ToolsPackageManager
542     kontext "PackageManager"
543     if ( PackageManager.exists( 2 ) ) then
544         try
545             BrowsePackages.select( cName )
546             hSelectExtensionName() = BrowsePackages.getSelIndex()
547         catch
548             hSelectExtensionName() = 0
549         endcatch
550         PackageManager.close()
551     else
552         hSelectExtensionName() = -1
553     endif
556 end function
559 '*******************************************************************************
561 function hSelectOptionsItem( cName as string, iIndex as integer ) as integer
563     '///<h3>Select an item in Tools/Options and verify</h3>
564      '///<i>You need to open the Tools/Options dialog before using this function,
565      '///+ it will not close the dialog either. No warnlogs are printed so evaluation
566      '///+ of the return value is mandatory</i><br><br>
568     '///<u>Parameter(s):</u><br>
569     '///<ol>
571     '///+<li>Name of the extension node (string)</li>
572     '///<ul>
573     '///+<li>Name of the module</li>
574     '///+<li>Name of the leaf</li>
575     '///+<li>Node must be valid</li>
576     '///</ul>
578     '///+<li>Position of the node (absolute) (integer)</li>
579     '///<ul>
580     '///+<li>All nodes are expanded</li>
581     '///+<li>Position must be valid (&gt; 0 and &le; number of nodes in list)</li>
582     '///</ul>
584     '///</ol>
587     '///<u>Returns:</u><br>
588     '///<ol>
589     '///+<li>Errorcondition (integer)</li>
590     '///<ul>
591     '///+<li>0 = Success</li>
592     '///+<li>1 = Partial success - node is at wrong position</li>
593     '///+<li>2 = Node does not exist</li>    
594     '///+<li>3 = Dialog not open</li>
595     '///+<li>4 = Index out of range (incorrect call to function)</li>
596     '///</ul>
597     '///</ol>
599     const CFN = "hSelectOptionsItem::"
600     printlog( CFN & "Enter with option (Name).: " & cName  )
601     printlog( CFN & "Enter with option (Index): " & iIndex )
602         
603     dim brc as boolean ' a multi purpose boolean returnvalue
604     dim irc as integer ' a multi purpose integer returnvalue
605     dim crc as string  ' a multi purpose string  returnvalue
607     '///<u>Description:</u>
608     '///<ul>
609     '///+<li>Make sure we are on the Tools/Options dialog</li>
610     kontext "OptionenDlg"
611     if ( not OptionenDlg.exists( 2 ) ) then
612         warnlog( CFN & "Tools/Options is not open, aborting" )
613         hSelectOptionsItem() = 3
614         exit function
615     endif
616     
617     '///+<li>Expand all nodes on &quot;OptionsListe&quot;</li>
618     irc = hExpandAllNodes( OptionsListe )
619     if ( irc < iIndex ) then
620         warnlog( CFN & "Index out of range, quitting" )
621         hSelectOptionsItem() = 4
622         exit function
623     endif        
624     
625     '///+<li>Search for the node at the given index, handle errors, exit function</li>
626     crc = hSelectNode( OptionsListe , iIndex )
627     
628     ' if the name of the node at given position is ok ...
629     if ( crc = cName ) then
630         printlog( CFN & "Exit: The node was found: " & crc )
631         hSelectOptionsItem() = 0
632         exit function 
634     ' if the name is not ok, try to find the node by name
635     else 
636         printlog( CFN & "Node not found at expected position, retrying" )
637         irc = hSelectNodeByName( OptionsListe , cName )
639         ' if the node is found it is just at the wrong position - bad but not deadly
640         if ( irc > 0 ) then
641             qaerrorlog( CFN & "Exit: Node <" & cName & "> found at pos: " & irc )
642             hSelectOptionsItem() = 1
643             exit function
645         ' if the node was not found at all this is really bad.
646         else
647             warnlog( CFN & "Exit: Node does not exist: " & cName )
648             hSelectOptionsItem() = 3
649             exit function            
650         endif
651     endif
652     
653     '///</ul>
655 end function
658 '*******************************************************************************
660 function hIsExtensionAlreadyInstalled( cName as string ) as boolean
662     '///<h3>Check if an extension is already installed</h3>
663     '///<i>The function opents the Extension Manager, finds (or not) the extension
664     '///+ and returns an appropriate return value. The Extension Manager is
665     '///+ closed again at the end.</i><br><br>
666     
667     '///<u>Input:</u>
668     '///<ol>
669     '///+<li>Name of the extension (String)</li>
670     '///</ol>
671     
672     '///<u>Return Value:</u><br>
673     '///<ol>
674     '///+<li>is the extension allredy installed (boolean)</li>
675     '///<ul>
676     '///+<li>FALSE = Extension is not installed</li>
677     '///+<li>FALSE = Extension Manager did not open</li>
678     '///+<li>TRUE = Extension is installed</li>
679     '///</ul>
680     '///</ol>
681     
682     printlog( "Checking if extension is already installed: " & cname )
684     dim iCountExtensions as integer
685     dim i as integer
686     
687     hIsExtensionAlreadyInstalled() = FALSE
688     
689     ToolsPackageManager
690     kontext "PackageManager"
691     
692     iCountExtensions = BrowsePackages.getItemCount()
693     
694     for i = 1 to iCountExtensions
695         if(Instr(BrowsePackages.getItemText(i,1),cname) <> 0) then
696             hIsExtensionAlreadyInstalled() = TRUE    
697         endif
698     next
699     
700     PackageManager.close()
701         
702 end function
705 '*******************************************************************************
707 function hDisableUserExtensionGUI( extension_name as string ) as integer
709     '///<h3>Disable a userspace extension by name via GUI</h3>
710     '///<i>This function tries to disable an Extension specified by name. There
711     '///+ are several reasons why this might fail so it is required to evaluate the
712     '///+ returnvalue as the function will not print any warnings. If the function 
713     '///+ fails this is most likely caused by a) the extension already being
714     '///+ disabled or b) the extension belonging to the shared layer.<br>
715     '///+ The Extension Manager needs to be open when function is called.</i><br><br>
717     '///<u>Parameter(s):</u><br>
718     '///<ol>
720     '///+<li>Name of the extension to be disabled (string)</li>
721     '///<ul>
722     '///+<li>Only extensions from the user layer can be disabled</li>
723     '///</ul>
725     '///</ol>
728     '///<u>Returns:</u><br>
729     '///<ol>
730     '///+<li>Errorcondition (integer)</li>
731     '///<ul>
732     '///+<li>0 = Extension was found and disabled</li>
733     '///+<li>1 = Extension does not exist</li>
734     '///+<li>2 = Extension could not be disabled</li>
735     '///+<li>3 = Extension Manager did not open</li>
736     '///</ul>
737     
738     printlog( "Disabling user extension" )
740     ToolsPackageManager
741     kontext "PackageManager"
742     if ( PackageManager.exists( 2 ) ) then
743         try
744             BrowsePackages.select( extension_name )
745             if ( Disable.exists() and Disable.isEnabled() ) then
746                 hDisableUserExtensionGUI() = 0
747             else
748                 hDisableUserExtensionGUI() = 2
749             endif
750             PackageManager.close()
751         catch
752             hDisableUserExtensionGUI() = 1
753         endcatch
754     else
755         hDisableUserExtensionGUI() = 3
756     endif
758 end function
760 '*******************************************************************************
762 function hGetExtensionCount() as integer
764     printlog( "Getting number of installed extensions." )
766     ToolsPackageManager
767     kontext "PackageManager"
768     if ( PackageManager.exists( 2 ) ) then
769         try
770             hGetExtensionCount() = BrowsePackages.getItemCount()
771             PackageManager.close()  
772         catch
773             hGetExtensionCount() = -2
774         endcatch
775     else
776         hGetExtensionCount() = -1
777     endif
780 end function