calc: on editing invalidation of view with different zoom is wrong
[LibreOffice.git] / wizards / source / scriptforge / SF_Platform.xba
blob8403866fffe83541dad38ff69d526e82c10f3ee6
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
3 <script:module xmlns:script="http://openoffice.org/2000/script" script:name="SF_Platform" script:language="StarBasic" script:moduleType="normal">REM =======================================================================================================================
4 REM === The ScriptForge library and its associated libraries are part of the LibreOffice project. ===
5 REM === Full documentation is available on https://help.libreoffice.org/ ===
6 REM =======================================================================================================================
8 Option Compatible
9 Option Explicit
11 &apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
12 &apos;&apos;&apos; SF_Platform
13 &apos;&apos;&apos; ===========
14 &apos;&apos;&apos; Singleton class implementing the &quot;ScriptForge.Platform&quot; service
15 &apos;&apos;&apos; Implemented as a usual Basic module
16 &apos;&apos;&apos;
17 &apos;&apos;&apos; A collection of properties about the execution environment:
18 &apos;&apos;&apos; - HW platform
19 &apos;&apos;&apos; - Operating System
20 &apos;&apos;&apos; - current user
21 &apos;&apos;&apos; - LibreOffice version
22 &apos;&apos;&apos;
23 &apos;&apos;&apos; Service invocation example:
24 &apos;&apos;&apos; Dim platform As Variant
25 &apos;&apos;&apos; platform = CreateScriptService(&quot;Platform&quot;)
26 &apos;&apos;&apos;
27 &apos;&apos;&apos; Detailed user documentation:
28 &apos;&apos;&apos; https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03/sf_platform.html?DbPAR=BASIC
29 &apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
31 REM ================================================================== EXCEPTIONS
33 REM ============================================================ MODULE CONSTANTS
35 REM ===================================================== CONSTRUCTOR/DESTRUCTOR
37 REM -----------------------------------------------------------------------------
38 Public Function Dispose() As Variant
39 Set Dispose = Nothing
40 End Function &apos; ScriptForge.SF_Array Explicit destructor
42 REM ================================================================== PROPERTIES
44 REM -----------------------------------------------------------------------------
45 Property Get Architecture() As String
46 &apos;&apos;&apos; Returns the actual bit architecture
47 &apos;&apos;&apos; Example:
48 &apos;&apos;&apos; MsgBox platform.Architecture &apos; 64bit
49 Architecture = _PropertyGet(&quot;Architecture&quot;)
50 End Property &apos; ScriptForge.SF_Platform.Architecture (get)
52 REM -----------------------------------------------------------------------------
53 Property Get ComputerName() As String
54 &apos;&apos;&apos; Returns the computer&apos;s network name
55 &apos;&apos;&apos; Example:
56 &apos;&apos;&apos; MsgBox platform.ComputerName
57 ComputerName = _PropertyGet(&quot;ComputerName&quot;)
58 End Property &apos; ScriptForge.SF_Platform.ComputerName (get)
60 REM -----------------------------------------------------------------------------
61 Property Get CPUCount() As Integer
62 &apos;&apos;&apos; Returns the number of Central Processor Units
63 &apos;&apos;&apos; Example:
64 &apos;&apos;&apos; MsgBox platform.CPUCount &apos; 4
65 CPUCount = _PropertyGet(&quot;CPUCount&quot;)
66 End Property &apos; ScriptForge.SF_Platform.CPUCount (get)
68 REM -----------------------------------------------------------------------------
69 Property Get CurrentUser() As String
70 &apos;&apos;&apos; Returns the name of logged in user
71 &apos;&apos;&apos; Example:
72 &apos;&apos;&apos; MsgBox platform.CurrentUser
73 CurrentUser = _PropertyGet(&quot;CurrentUser&quot;)
74 End Property &apos; ScriptForge.SF_Platform.CurrentUser (get)
76 REM -----------------------------------------------------------------------------
77 Property Get Extensions() As Variant
78 &apos;&apos;&apos; Returns the list of availableeExtensions as an unsorted array of unique strings
79 &apos;&apos;&apos; To get the list sorted, use SF_Array.Sort()
80 &apos;&apos;&apos; Example:
81 &apos;&apos;&apos; myExtensionsList = platform.Extensions
82 Extensions = _PropertyGet(&quot;Extensions&quot;)
83 End Property &apos; ScriptForge.SF_Platform.Extensions (get)
85 REM -----------------------------------------------------------------------------
86 Property Get FilterNames() As Variant
87 &apos;&apos;&apos; Returns the list of available document import and export filter names as an unsorted array of unique strings
88 &apos;&apos;&apos; To get the list sorted, use SF_Array.Sort()
89 &apos;&apos;&apos; Example:
90 &apos;&apos;&apos; myFilterNamesList = platform.FilterNames
91 FilterNames = _PropertyGet(&quot;FilterNames&quot;)
92 End Property &apos; ScriptForge.SF_Platform.FilterNames (get)
94 REM -----------------------------------------------------------------------------
95 Property Get Fonts() As Variant
96 &apos;&apos;&apos; Returns the list of available fonts as an unsorted array of unique strings
97 &apos;&apos;&apos; To get the list sorted, use SF_Array.Sort()
98 &apos;&apos;&apos; Example:
99 &apos;&apos;&apos; myFontsList = platform.Fonts
100 Fonts = _PropertyGet(&quot;Fonts&quot;)
101 End Property &apos; ScriptForge.SF_Platform.Fonts (get)
103 REM -----------------------------------------------------------------------------
104 Property Get FormatLocale() As String
105 &apos;&apos;&apos; Returns the locale used for number and date formats, combining language-COUNTRY (la-CO)
106 &apos;&apos;&apos; Example:
107 &apos;&apos;&apos; MsgBox platform.FormatLocale
108 FormatLocale = _PropertyGet(&quot;FormatLocale&quot;)
109 End Property &apos; ScriptForge.SF_Platform.FormatLocale (get)
111 REM -----------------------------------------------------------------------------
112 Property Get Locale() As String
113 &apos;&apos;&apos; Returns the locale of the operating system, combining language-COUNTRY (la-CO)
114 &apos;&apos;&apos; Example:
115 &apos;&apos;&apos; MsgBox platform.Locale
116 Locale = _PropertyGet(&quot;Locale&quot;)
117 End Property &apos; ScriptForge.SF_Platform.Locale (get)
119 REM -----------------------------------------------------------------------------
120 Property Get Machine() As String
121 &apos;&apos;&apos; Returns the machine type like &apos;i386&apos; or &apos;x86_64&apos;
122 &apos;&apos;&apos; Example:
123 &apos;&apos;&apos; MsgBox platform.Machine
124 Machine = _PropertyGet(&quot;Machine&quot;)
125 End Property &apos; ScriptForge.SF_Platform.Machine (get)
127 REM -----------------------------------------------------------------------------
128 Property Get ObjectType As String
129 &apos;&apos;&apos; Only to enable object representation
130 ObjectType = &quot;SF_Platform&quot;
131 End Property &apos; ScriptForge.SF_Platform.ObjectType
133 REM -----------------------------------------------------------------------------
134 Property Get OfficeLocale() As String
135 &apos;&apos;&apos; Returns the locale of the user interface, combining language-COUNTRY (la-CO)
136 &apos;&apos;&apos; Example:
137 &apos;&apos;&apos; MsgBox platform.OfficeLocale
138 OfficeLocale = _PropertyGet(&quot;OfficeLocale&quot;)
139 End Property &apos; ScriptForge.SF_Platform.OfficeLocale (get)
141 REM -----------------------------------------------------------------------------
142 Property Get OfficeVersion() As String
143 &apos;&apos;&apos; Returns the office software version in the form &apos;LibreOffice w.x.y.z (The Document Foundation)&apos;
144 &apos;&apos;&apos; Example:
145 &apos;&apos;&apos; MsgBox platform.OfficeVersion
146 OfficeVersion = _PropertyGet(&quot;OfficeVersion&quot;)
147 End Property &apos; ScriptForge.SF_Platform.OfficeVersion (get)
149 REM -----------------------------------------------------------------------------
150 Property Get OSName() As String
151 &apos;&apos;&apos; Returns the name of the operating system like &apos;Linux&apos; or &apos;Windows&apos;
152 &apos;&apos;&apos; Example:
153 &apos;&apos;&apos; MsgBox platform.OSName
154 OSName = _PropertyGet(&quot;OSName&quot;)
155 End Property &apos; ScriptForge.SF_Platform.OSName (get)
157 REM -----------------------------------------------------------------------------
158 Property Get OSPlatform() As String
159 &apos;&apos;&apos; Returns a single string identifying the underlying platform with as much useful and human-readable information as possible
160 &apos;&apos;&apos; Example:
161 &apos;&apos;&apos; MsgBox platform.OSPlatform &apos; Linux-4.15.0-117-generic-x86_64-with-Ubuntu-18.04-bionic
162 OSPlatform = _PropertyGet(&quot;OSPlatform&quot;)
163 End Property &apos; ScriptForge.SF_Platform.OSPlatform (get)
165 REM -----------------------------------------------------------------------------
166 Property Get OSRelease() As String
167 &apos;&apos;&apos; Returns the operating system&apos;s release
168 &apos;&apos;&apos; Example:
169 &apos;&apos;&apos; MsgBox platform.OSRelease &apos; 4.15.0-117-generic
170 OSRelease = _PropertyGet(&quot;OSRelease&quot;)
171 End Property &apos; ScriptForge.SF_Platform.OSRelease (get)
173 REM -----------------------------------------------------------------------------
174 Property Get OSVersion() As String
175 &apos;&apos;&apos; Returns the name of the operating system build or version
176 &apos;&apos;&apos; Example:
177 &apos;&apos;&apos; MsgBox platform.OSVersion &apos; #118-Ubuntu SMP Fri Sep 4 20:02:41 UTC 2020
178 OSVersion = _PropertyGet(&quot;OSVersion&quot;)
179 End Property &apos; ScriptForge.SF_Platform.OSVersion (get)
181 REM -----------------------------------------------------------------------------
182 Property Get Printers() As Variant
183 &apos;&apos;&apos; Returns the list of available printers type as a zero-based array
184 &apos;&apos;&apos; The default printer is put in the 1st position in the list (index = 0)
185 &apos;&apos;&apos; Example:
186 &apos;&apos;&apos; MsgBox join(platform.Printers, &quot;,&quot;)
187 Printers = _PropertyGet(&quot;Printers&quot;)
188 End Property &apos; ScriptForge.SF_Platform.Printers (get)
190 REM -----------------------------------------------------------------------------
191 Property Get Processor() As String
192 &apos;&apos;&apos; Returns the (real) processor name, e.g. &apos;amdk6&apos;. Might return the same value as Machine
193 &apos;&apos;&apos; Example:
194 &apos;&apos;&apos; MsgBox platform.Processor
195 Processor = _PropertyGet(&quot;Processor&quot;)
196 End Property &apos; ScriptForge.SF_Platform.Processor (get)
198 REM -----------------------------------------------------------------------------
199 Property Get PythonVersion() As String
200 &apos;&apos;&apos; Returns the Python version as string &apos;Python major.minor.patchlevel&apos;
201 &apos;&apos;&apos; Example:
202 &apos;&apos;&apos; MsgBox platform.PythonVersion &apos; Python 3.7.7
203 PythonVersion = _PropertyGet(&quot;PythonVersion&quot;)
204 End Property &apos; ScriptForge.SF_Platform.PythonVersion (get)
206 REM -----------------------------------------------------------------------------
207 Property Get ServiceName As String
208 &apos;&apos;&apos; Internal use
209 ServiceName = &quot;ScriptForge.Platform&quot;
210 End Property &apos; ScriptForge.SF_Platform.ServiceName
212 REM -----------------------------------------------------------------------------
213 Property Get SystemLocale() As String
214 &apos;&apos;&apos; Returns the locale of the operating system, combining language-COUNTRY (la-CO)
215 &apos;&apos;&apos; Example:
216 &apos;&apos;&apos; MsgBox platform.SystemLocale
217 SystemLocale = _PropertyGet(&quot;SystemLocale&quot;)
218 End Property &apos; ScriptForge.SF_Platform.SystemLocale (get)
220 REM ===================================================================== METHODS
222 REM -----------------------------------------------------------------------------
223 Public Function GetProperty(Optional ByVal PropertyName As Variant) As Variant
224 &apos;&apos;&apos; Return the actual value of the given property
225 &apos;&apos;&apos; Args:
226 &apos;&apos;&apos; PropertyName: the name of the property as a string
227 &apos;&apos;&apos; Returns:
228 &apos;&apos;&apos; The actual value of the property
229 &apos;&apos;&apos; If the property does not exist, returns Null
230 &apos;&apos;&apos; Exceptions:
231 &apos;&apos;&apos; ARGUMENTERROR The property does not exist
233 Const cstThisSub = &quot;Platform.GetProperty&quot;
234 Const cstSubArgs = &quot;&quot;
236 If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
237 GetProperty = Null
239 Check:
240 If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
241 If Not SF_Utils._Validate(PropertyName, &quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
242 End If
244 Try:
245 GetProperty = _PropertyGet(PropertyName)
247 Finally:
248 SF_Utils._ExitFunction(cstThisSub)
249 Exit Function
250 Catch:
251 GoTo Finally
252 End Function &apos; ScriptForge.SF_Platform.GetProperty
254 REM -----------------------------------------------------------------------------
255 Public Function Methods() As Variant
256 &apos;&apos;&apos; Return the list of public methods of the Model service as an array
258 Methods = Array( _
261 End Function &apos; ScriptForge.SF_Platform.Methods
263 REM -----------------------------------------------------------------------------
264 Public Function Properties() As Variant
265 &apos;&apos;&apos; Return the list or properties of the Platform class as an array
267 Properties = Array( _
268 &quot;Architecture&quot; _
269 , &quot;ComputerName&quot; _
270 , &quot;CPUCount&quot; _
271 , &quot;CurrentUser&quot; _
272 , &quot;Extensions&quot; _
273 , &quot;FilterNames&quot; _
274 , &quot;Fonts&quot; _
275 , &quot;FormatLocale&quot; _
276 , &quot;Locale&quot; _
277 , &quot;Machine&quot; _
278 , &quot;OfficeLocale&quot; _
279 , &quot;OfficeVersion&quot; _
280 , &quot;OSName&quot; _
281 , &quot;OSPlatform&quot; _
282 , &quot;OSRelease&quot; _
283 , &quot;OSVersion&quot; _
284 , &quot;Printers&quot; _
285 , &quot;Processor&quot; _
286 , &quot;PythonVersion&quot; _
287 , &quot;SystemLocale&quot; _
290 End Function &apos; ScriptForge.SF_Platform.Properties
292 REM =========================================================== PRIVATE FUNCTIONS
294 REM -----------------------------------------------------------------------------
295 Public Function _GetPrinters() as Variant
296 &apos;&apos;&apos; Returns the list of available printers.
297 &apos;&apos;&apos; The default printer is put in the 1st position (index = 0)
299 Dim oPrinterServer As Object &apos; com.sun.star.awt.PrinterServer
300 Dim vPrinters As Variant &apos; Array of printer names
301 Dim sDefaultPrinter As String &apos; The default printer
302 Dim lDefault As Long &apos; Initial position of the default printer in the list
304 On Local Error GoTo Catch &apos; Prevent any error
305 vPrinters = Array()
307 Try:
308 &apos; Find printers
309 Set oPrinterServer = SF_Utils._GetUNOService(&quot;PrinterServer&quot;)
310 With oPrinterServer
311 vPrinters = .getPrinterNames()
312 sDefaultPrinter = .getDefaultPrinterName()
313 End With
315 &apos; Put the default printer on top of the list
316 If Len(sDefaultPrinter) &gt; 0 Then
317 lDefault = SF_Array.IndexOf(vPrinters, sDefaultPrinter, CaseSensitive := True)
318 If lDefault &gt; 0 Then &apos; Invert 2 printers
319 vPrinters(lDefault) = vPrinters(0)
320 vPrinters(0) = sDefaultPrinter
321 End If
322 End If
324 Finally:
325 _GetPrinters() = vPrinters()
326 Exit Function
327 Catch:
328 GoTo Finally
329 End Function &apos; ScriptForge.SF_Platform._GetPrinters
331 REM -----------------------------------------------------------------------------
332 Public Function _GetProductName() as String
333 &apos;&apos;&apos; Returns Office product and version numbers found in configuration registry
334 &apos;&apos;&apos; Derived from the Tools library
336 Dim oProdNameAccess as Object &apos; configmgr.RootAccess
337 Dim sProdName as String
338 Dim sVersion as String
339 Dim sVendor As String
341 On Local Error GoTo Catch &apos; Prevent any error
342 _GetProductName = &quot;&quot;
344 Try:
345 Set oProdNameAccess = SF_Utils._GetRegistryKeyContent(&quot;org.openoffice.Setup/Product&quot;)
347 sProdName = oProdNameAccess.ooName
348 sVersion = oProdNameAccess.ooSetupVersionAboutBox
349 sVendor = oProdNameAccess.ooVendor
351 _GetProductName = sProdName &amp; &quot; &quot; &amp; sVersion &amp; &quot; (&quot; &amp; sVendor &amp; &quot;)&quot;
353 Finally:
354 Exit Function
355 Catch:
356 GoTo Finally
357 End Function &apos; ScriptForge.SF_Platform._GetProductName
359 REM -----------------------------------------------------------------------------
360 Private Function _PropertyGet(Optional ByVal psProperty As String) As Variant
361 &apos;&apos;&apos; Return the value of the named property
362 &apos;&apos;&apos; Args:
363 &apos;&apos;&apos; psProperty: the name of the property
365 Dim sOSName As String &apos; Operating system
366 Dim oLocale As Object &apos; com.sun.star.lang.Locale
367 Dim oPrinterServer As Object &apos; com.sun.star.awt.PrinterServer
368 Dim oToolkit As Object &apos; com.sun.star.awt.Toolkit
369 Dim oDevice As Object &apos; com.sun.star.awt.XDevice
370 Dim oFilterFactory As Object &apos; com.sun.star.document.FilterFactory
371 Dim oFontDescriptors As Variant &apos; Array of com.sun.star.awt.FontDescriptor
372 Dim sFonts As String &apos; Comma-separated list of fonts
373 Dim sFont As String &apos; A single font name
374 Dim vExtensionsList As Variant &apos; Array of extension descriptors
375 Dim sExtensions As String &apos; Comma separated list of extensions
376 Dim sExtension As String &apos; A single extension name
377 Dim i As Long
379 Const cstPyHelper = &quot;$&quot; &amp; &quot;_SF_Platform&quot;
380 Dim cstThisSub As String
381 Const cstSubArgs = &quot;&quot;
383 cstThisSub = &quot;Platform.get&quot; &amp; psProperty
384 SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
386 Select Case psProperty
387 Case &quot;Architecture&quot;, &quot;ComputerName&quot;, &quot;CPUCount&quot;, &quot;CurrentUser&quot;, &quot;Machine&quot; _
388 , &quot;OSPlatform&quot;, &quot;OSRelease&quot;, &quot;OSVersion&quot;, &quot;Processor&quot;, &quot;PythonVersion&quot;
389 With ScriptForge.SF_Session
390 _PropertyGet = .ExecutePythonScript(.SCRIPTISSHARED, _SF_.PythonHelper &amp; cstPyHelper, psProperty)
391 End With
392 Case &quot;Extensions&quot;
393 Set vExtensionsList = SF_Utils._GetUnoService(&quot;PackageInformationProvider&quot;).ExtensionList
394 sExtensions = &quot;&quot;
395 For i = 0 To UBound(vExtensionsList)
396 sExtensions = sExtensions &amp; &quot;,&quot; &amp; vExtensionsList(i)(0)
397 Next i
398 If Len(sExtensions) &gt; 0 Then _PropertyGet = Split(Mid(sExtensions, 2), &quot;,&quot;) Else _PropertyGet = Array()
399 Case &quot;FilterNames&quot;
400 Set oFilterFactory = SF_Utils._GetUNOService(&quot;FilterFactory&quot;)
401 _PropertyGet = oFilterFactory.getElementNames()
402 Case &quot;Fonts&quot;
403 Set oToolkit = SF_Utils._GetUnoService(&quot;Toolkit&quot;)
404 Set oDevice = oToolkit.createScreenCompatibleDevice(0, 0)
405 oFontDescriptors = oDevice.FontDescriptors()
406 sFonts = &quot;,&quot;
407 &apos; Select only not yet registered fonts
408 For i = 0 To UBound(oFontDescriptors)
409 sFont = oFontDescriptors(i).Name
410 If InStr(1, sFonts, &quot;,&quot; &amp; sFont &amp; &quot;,&quot;, 0) = 0 Then sFonts = sFonts &amp; sFont &amp; &quot;,&quot; &apos; Case-sensitive comparison
411 Next i
412 &apos; Remove leading and trailing commas
413 If Len(sFonts) &gt; 1 Then _PropertyGet = Split(Mid(sFonts, 2, Len(sFonts) - 2), &quot;,&quot;) Else _PropertyGet = Array()
414 Case &quot;FormatLocale&quot;
415 Set oLocale = SF_Utils._GetUNOService(&quot;FormatLocale&quot;)
416 _PropertyGet = oLocale.Language &amp; &quot;-&quot; &amp; oLocale.Country
417 Case &quot;OfficeLocale&quot;
418 Set oLocale = SF_Utils._GetUNOService(&quot;OfficeLocale&quot;)
419 _PropertyGet = oLocale.Language &amp; &quot;-&quot; &amp; oLocale.Country
420 Case &quot;OfficeVersion&quot;
421 _PropertyGet = _GetProductName()
422 Case &quot;OSName&quot;
423 &apos; Calc INFO function preferred to Python script to avoid ScriptForge initialization risks when Python is not installed
424 sOSName = _SF_.OSName
425 If sOSName = &quot;&quot; Then
426 sOSName = SF_Session.ExecuteCalcFunction(&quot;INFO&quot;, &quot;system&quot;)
427 Select Case sOSName
428 Case &quot;WNT&quot; : sOSName = &quot;Windows&quot;
429 Case &quot;MACOSX&quot; : sOSName = &quot;macOS&quot;
430 Case &quot;LINUX&quot; : sOSName = &quot;Linux&quot;
431 Case &quot;SOLARIS&quot; : sOSName = &quot;Solaris&quot;
432 Case Else : sOSName = SF_String.Capitalize(sOSName)
433 End Select
434 EndIf
435 _PropertyGet = sOSName
436 Case &quot;Printers&quot;
437 _PropertyGet = _GetPrinters()
438 Case &quot;SystemLocale&quot;, &quot;Locale&quot;
439 Set oLocale = SF_Utils._GetUNOService(&quot;SystemLocale&quot;)
440 _PropertyGet = oLocale.Language &amp; &quot;-&quot; &amp; oLocale.Country
441 Case Else
442 _PropertyGet = Null
443 End Select
445 Finally:
446 SF_Utils._ExitFunction(cstThisSub)
447 Exit Function
448 End Function &apos; ScriptForge.SF_Platform._PropertyGet
450 REM ============================================ END OF SCRIPTFORGE.SF_PLATFORM
451 </script:module>