update dev300-m58
[ooovba.git] / testautomation / global / tools / includes / optional / t_extension_manager_tools.inc
blobf207ede209520ed14af8b151a62e14f2104e9e0a
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                     else
343                         warnlog( CFN & "Expected confirmation dialog is missing" )
344                     endif
345                     hExtensionRemoveGUI() = 0
346                 else
347                     hExtensionRemoveGUI() = 2
348                 endif
349             else
350                 hExtensionRemoveGUI() = 4
351             endif
352         catch
353             hExtensionRemoveGUI() = 3
354         endcatch
355         
356         kontext "PackageManager"
357         PackageManager.close()
358     else
359         hExtensionRemoveGUI() = 1
360     endif
362 end function
364 '*******************************************************************************
366 function sExtensionCLI(sCommand as string, sExtensionName as string, optional sExtensionPath as string) as string
367     '/// Add/remove an extension with the command line tool 'unopkg'///'
368     '/// INPUT: sCommand: string of command from "add remove list reinstall" ///'
369    '/// INPUT: sExtensionName: name of the extension ///'
370    '/// INPUT: optional sExtensionPath: path to the extension ///'
371    '/// RETURN: currently nothing ///'
372     dim sLokalExtensionPath as string
373     dim sCommands as string
374     dim sUnoPkg as string
375     dim i, a, b as integer
376     dim args as string
377     Dim sFile as string
378     Dim sEnv as string
379     Dim sContent(5) as string
380     Dim sPlatformProgramPath as string
381     
382     if isMissing(sExtensionPath) then
383         sLokalExtensionPath = ""
384     else
385         sLokalExtensionPath = sExtensionPath
386     endif
387     
388     sCommands = "add remove list reinstall"
389     
390     a = len(sAppExe)
391     if a > 12 then
392         b = inStr(a-12, sAppExe, "soffice")
393         sUnoPkg = left(sAppExe, b-1) + "unopkg" + mid(sAppExe, b+len("soffice"))
394         'printlog sUnoPkg
395         'sUnoPkg = convertToUrl(sUnoPkg)
396     else
397         qaErrorLog ("Need to think about another solution..." + sAppExe)
398     endif
399     args = sCommand+" "+sLokalExtensionPath + sExtensionName
400     printlog "Executing: "+sUnopkg+" "+args
401     if gPlatGroup <> "unx" then
402         shell(sUnoPkg,2,args)
403     else
404         sFile = ConvertPath (gOfficePath + "user/work/uno.sh")
405         if gPlatform = lcase("osx") then
406             sPlatformProgramPath = "MacOS"
407         else
408             sPlatformProgramPath = "program"
409         end if
410         sEnv = convertToURL(convertPath(gNetzOfficePath + sPlatformProgramPath + "/fundamentalrc")
411         listAppend(sContent(), "export URE_BOOTSTRAP=" + sEnv) 
412         listAppend(sContent(), sUnoPkg + " " + args)
413         listWrite(sContent(), sFile)
414         shell("bash",1,sFile)
415     endif
416 end function
418 '*******************************************************************************
420 function hExtensionGetItemList( cItemList() as string ) as integer
422     '///<h3>Get the list of all items in the extensions list</h3>
423     '///<i>The array contains the list of all items in the extension manager GUI,
424     '///+ including all components of the extensions. Consider this when defining
425     '///+ the size of the array to be passed to this function as problems here are
426     '///+ hard to debug.<br>
427     '///+ Starting point is any document, the function will return to the 
428     '///+ calling document on completion</i><br><br>
429     
430     '///<u>Input:</u>
431     '///<ol>
432     '///+<li>Array for the list items (string)</li>
433     '///</ol>
434     
435     
436     '///<u>Return Value:</u><br>
437     '///<ol>
438     '///+<li>Number of items (integer)</li>
439     '///<ul>
440     '///+<li>0 on any error</li>
441     '///+<li>2 if no extensions exist (My Macros/OpenOffice.org macros nodes present</li>
442     '///+<li>&gt; 2 if any changes to the default exist</li>
443     '///</ul>
444     '///</ol>
445     
446     dim iItemCount as integer
447     dim iCurrentExtension as integer
448     
449     printlog( "Retrieving extension list" )
451     ToolsPackageManager
452     kontext "PackageManager"
453     if ( PackageManager.exists( 2 ) ) then
455         iItemCount = BrowsePackages.getItemCount()
457         for iCurrentExtension = 1 to iItemCount
458             cItemList( iCurrentExtension ) = BrowsePackages.getItemText( iCurrentExtension , 1 )
459             printlog( " * " & cItemList( iCurrentExtension )
460         next iCurrentExtension
462         hExtensionGetItemList() = iItemCount
463         cItemList( 0 ) = iItemCount
464         PackageManager.close()
466     else
467     
468         hExtensionGetItemList() = 0
469         
470     endif    
472 end function
474 '*******************************************************************************
476 function hSelectExtensionID( iPos as integer ) as string
478     '///<h3>Select an item by index in the list of available extensions</h3>
479     '///<i>This function needs the Extension Manager to be open. It will only
480     '///+ select extensions but not their components.</i><br><br>
481         
482     '///<u>Input:</u>
483     '///<ol>
484     '///+<li>Absolute position of the extension to be selected (Integer)</li>
485     '///</ol>
486     
487     '///<u>Return Value:</u><br>
488     '///<ol>
489     '///+<li>Name of the selected extension (String)</li>
490     '///+<li>Empty string on index out of range or Extension Manager not open</li>
491     '///</ol>
492     
493     printlog( "Selecting extension at pos. " & iPos )
495     ToolsPackageManager
496     kontext "PackageManager"
497     if ( PackageManager.exists( 2 ) ) then
498         try
499             BrowsePackages.select( iPos )
500             hSelectExtensionID() = BrowsePackages.getItemText( iPos , 1 )
501         catch
502             hSelectExtensionID() = ""
503         endcatch
504         PackageManager.close()
505     else
506         hSelectExtensionID() = ""
507     endif
508     
510 end function
512 '*******************************************************************************
514 function hSelectExtensionName( cName as string ) as integer
516     '///<h3>Select an item by name in the list of available extensions</h3>
517     '///<i>This function needs the Extension Manager to be open. It will only
518     '///+ select extensions but not their components.</i><br><br>
519     
520     '///<u>Input:</u>
521     '///<ol>
522     '///+<li>Name of the extension (String)</li>
523     '///<ul>
524     '///+<li>Name of any item in the treelist, even those of top nodes</li>
525     '///</ul>
526     '///</ol>
527     
528     '///<u>Return Value:</u><br>
529     '///<ol>
530     '///+<li>Absolute position of the selected extension (Integer)</li>
531     '///<ul>
532     '///+<li>0 = Extension was not found</li>
533     '///+<li>&gt; 0 = Absolute position of the extension/node</li>
534     '///+<li>-1 = Extension Manager did not open</li>
535     '///</ul>
536     '///</ol>
538     printlog( "Selecting extension by display name: " & cName )
539     
540     ToolsPackageManager
541     kontext "PackageManager"
542     if ( PackageManager.exists( 2 ) ) then
543         try
544             BrowsePackages.select( cName )
545             hSelectExtensionName() = BrowsePackages.getSelIndex()
546         catch
547             hSelectExtensionName() = 0
548         endcatch
549         PackageManager.close()
550     else
551         hSelectExtensionName() = -1
552     endif
555 end function
558 '*******************************************************************************
560 function hSelectOptionsItem( cName as string, iIndex as integer ) as integer
562     '///<h3>Select an item in Tools/Options and verify</h3>
563      '///<i>You need to open the Tools/Options dialog before using this function,
564      '///+ it will not close the dialog either. No warnlogs are printed so evaluation
565      '///+ of the return value is mandatory</i><br><br>
567     '///<u>Parameter(s):</u><br>
568     '///<ol>
570     '///+<li>Name of the extension node (string)</li>
571     '///<ul>
572     '///+<li>Name of the module</li>
573     '///+<li>Name of the leaf</li>
574     '///+<li>Node must be valid</li>
575     '///</ul>
577     '///+<li>Position of the node (absolute) (integer)</li>
578     '///<ul>
579     '///+<li>All nodes are expanded</li>
580     '///+<li>Position must be valid (&gt; 0 and &le; number of nodes in list)</li>
581     '///</ul>
583     '///</ol>
586     '///<u>Returns:</u><br>
587     '///<ol>
588     '///+<li>Errorcondition (integer)</li>
589     '///<ul>
590     '///+<li>0 = Success</li>
591     '///+<li>1 = Partial success - node is at wrong position</li>
592     '///+<li>2 = Node does not exist</li>    
593     '///+<li>3 = Dialog not open</li>
594     '///+<li>4 = Index out of range (incorrect call to function)</li>
595     '///</ul>
596     '///</ol>
598     const CFN = "hSelectOptionsItem::"
599     printlog( CFN & "Enter with option (Name).: " & cName  )
600     printlog( CFN & "Enter with option (Index): " & iIndex )
601         
602     dim brc as boolean ' a multi purpose boolean returnvalue
603     dim irc as integer ' a multi purpose integer returnvalue
604     dim crc as string  ' a multi purpose string  returnvalue
606     '///<u>Description:</u>
607     '///<ul>
608     '///+<li>Make sure we are on the Tools/Options dialog</li>
609     kontext "OptionenDlg"
610     if ( not OptionenDlg.exists( 2 ) ) then
611         warnlog( CFN & "Tools/Options is not open, aborting" )
612         hSelectOptionsItem() = 3
613         exit function
614     endif
615     
616     '///+<li>Expand all nodes on &quot;OptionsListe&quot;</li>
617     irc = hExpandAllNodes( OptionsListe )
618     if ( irc < iIndex ) then
619         warnlog( CFN & "Index out of range, quitting" )
620         hSelectOptionsItem() = 4
621         exit function
622     endif        
623     
624     '///+<li>Search for the node at the given index, handle errors, exit function</li>
625     crc = hSelectNode( OptionsListe , iIndex )
626     
627     ' if the name of the node at given position is ok ...
628     if ( crc = cName ) then
629         printlog( CFN & "Exit: The node was found: " & crc )
630         hSelectOptionsItem() = 0
631         exit function 
633     ' if the name is not ok, try to find the node by name
634     else 
635         printlog( CFN & "Node not found at expected position, retrying" )
636         irc = hSelectNodeByName( OptionsListe , cName )
638         ' if the node is found it is just at the wrong position - bad but not deadly
639         if ( irc > 0 ) then
640             qaerrorlog( CFN & "Exit: Node <" & cName & "> found at pos: " & irc )
641             hSelectOptionsItem() = 1
642             exit function
644         ' if the node was not found at all this is really bad.
645         else
646             warnlog( CFN & "Exit: Node does not exist: " & cName )
647             hSelectOptionsItem() = 3
648             exit function            
649         endif
650     endif
651     
652     '///</ul>
654 end function
657 '*******************************************************************************
659 function hIsExtensionAlreadyInstalled( cName as string ) as boolean
661     '///<h3>Check if an extension is already installed</h3>
662     '///<i>The function opents the Extension Manager, finds (or not) the extension
663     '///+ and returns an appropriate return value. The Extension Manager is
664     '///+ closed again at the end.</i><br><br>
665     
666     '///<u>Input:</u>
667     '///<ol>
668     '///+<li>Name of the extension (String)</li>
669     '///</ol>
670     
671     '///<u>Return Value:</u><br>
672     '///<ol>
673     '///+<li>is the extension allredy installed (boolean)</li>
674     '///<ul>
675     '///+<li>FALSE = Extension is not installed</li>
676     '///+<li>FALSE = Extension Manager did not open</li>
677     '///+<li>TRUE = Extension is installed</li>
678     '///</ul>
679     '///</ol>
680     
681     printlog( "Checking if extension is already installed: " & cname )
683     dim iCountExtensions as integer
684     dim i as integer
685     
686     hIsExtensionAlreadyInstalled() = FALSE
687     
688     ToolsPackageManager
689     kontext "PackageManager"
690     
691     iCountExtensions = BrowsePackages.getItemCount()
692     
693     for i = 1 to iCountExtensions
694         if(Instr(BrowsePackages.getItemText(i,1),cname) <> 0) then
695             hIsExtensionAlreadyInstalled() = TRUE    
696         endif
697     next
698     
699     PackageManager.close()
700         
701 end function
704 '*******************************************************************************
706 function hDisableUserExtensionGUI( extension_name as string ) as integer
708     '///<h3>Disable a userspace extension by name via GUI</h3>
709     '///<i>This function tries to disable an Extension specified by name. There
710     '///+ are several reasons why this might fail so it is required to evaluate the
711     '///+ returnvalue as the function will not print any warnings. If the function 
712     '///+ fails this is most likely caused by a) the extension already being
713     '///+ disabled or b) the extension belonging to the shared layer.<br>
714     '///+ The Extension Manager needs to be open when function is called.</i><br><br>
716     '///<u>Parameter(s):</u><br>
717     '///<ol>
719     '///+<li>Name of the extension to be disabled (string)</li>
720     '///<ul>
721     '///+<li>Only extensions from the user layer can be disabled</li>
722     '///</ul>
724     '///</ol>
727     '///<u>Returns:</u><br>
728     '///<ol>
729     '///+<li>Errorcondition (integer)</li>
730     '///<ul>
731     '///+<li>0 = Extension was found and disabled</li>
732     '///+<li>1 = Extension does not exist</li>
733     '///+<li>2 = Extension could not be disabled</li>
734     '///+<li>3 = Extension Manager did not open</li>
735     '///</ul>
736     
737     printlog( "Disabling user extension" )
739     ToolsPackageManager
740     kontext "PackageManager"
741     if ( PackageManager.exists( 2 ) ) then
742         try
743             BrowsePackages.select( extension_name )
744             if ( Disable.exists() and Disable.isEnabled() ) then
745                 hDisableUserExtensionGUI() = 0
746             else
747                 hDisableUserExtensionGUI() = 2
748             endif
749             PackageManager.close()
750         catch
751             hDisableUserExtensionGUI() = 1
752         endcatch
753     else
754         hDisableUserExtensionGUI() = 3
755     endif
757 end function
759 '*******************************************************************************
761 function hGetExtensionCount() as integer
763     printlog( "Getting number of installed extensions." )
765     ToolsPackageManager
766     kontext "PackageManager"
767     if ( PackageManager.exists( 2 ) ) then
768         try
769             hGetExtensionCount() = BrowsePackages.getItemCount()
770             PackageManager.close()  
771         catch
772             hGetExtensionCount() = -2
773         endcatch
774     else
775         hGetExtensionCount() = -1
776     endif
779 end function