Page 1 of 1
Platform
Posted: Sat Dec 10, 2022 4:02 am
by Paulm
Hi,
Is there a simple way to get the platform on which a web application runs?
(Windows, Linux, iOS, Android)
Re: Platform
Posted: Sat Dec 10, 2022 5:39 am
by René Houba
Hi Paulm,
I cannot remember a system variable for these, but you can try:
*OSAPI (WIN32 for example for Windows)
Re: Platform
Posted: Sat Dec 10, 2022 6:24 am
by Dino
*OSAPI, here:
https://docs.lansa.com/14/en/lansa015/c ... eneral.htm
*OSAPI
Operating System API Name.
This is a more precise replacement for *CPUTYPE which is less likely to change the name of its values.
Windows Desktop - WIN32 (Note Windows Desktop 64-bit uses WIN32 API)
Windows Metro – WINRT
IBM i – IBMI
Linux - LINUX
Re: Platform
Posted: Mon Dec 12, 2022 9:18 pm
by Paulm
Hi,
*OSAPI is not supported on the Web
Re: Platform
Posted: Tue Dec 13, 2022 12:30 am
by Dino
Hi Paul
If you are in the web, you can find directly what is the browser you are using.
but if you want to know server information, you need to ask the server.
For that, you can create (or add to any server module you are using now) a
server routine like this (in my example here i called test1212 to this server module):
Code: Select all
Begin_Com Role(*EXTENDS #PRIM_SRVM)
Srvroutine Name(GetServerInformation)
Field_Map For(*OUTPUT) Field(#std_strng) Parameter_Name(OSAPI)
#std_strng := *OSAPI
Endroutine
End_Com
then in your webpage:
Code: Select all
Define_Com Class(#test1212.GetServerInformation) Name(#GetServerInformation)
#GetServerInformation.ExecuteAsync OSAPI(#STD_STRNG)
etc.
Re: Platform
Posted: Tue Dec 13, 2022 8:00 am
by adale
So taking the question of what platform a client is running a VL web application from to the next step, I am curious what others might be implementing, or ideas to use.
With the fact our application is VL web, running in a browser.
From the HTTP User Agent string, we can get a good idea of the browser and device OS.
But is there a means to get a more specific device name that we can record as well?
With a remote branch, with several members signing on through the web application, the web IP will all be the ISP assigned to their router connection, so that is really not unique enough (such as LAN ip).
Using a Login ID and pwd, are fine to tell us the "who" and of course we can get the "when", but if there was a more specific "where", that would be helpful. Like the old workstation ID's, it would be great to know that Jim Smith signed in on "Jims iPhone" or "Galaxy Tab A".
I realize the browser is limited, and a simple google search basically confirms a browser on it's own can not pull the computer/device name, but am hopeful someone here might have a good idea to use.
Re: Platform
Posted: Tue Dec 13, 2022 8:43 pm
by Paulm
Dino wrote: Tue Dec 13, 2022 12:30 am
Hi Paul
If you are in the web, you can find directly what is the browser you are using.
but if you want to know server information, you need to ask the server.
Hi Dino,
In fact, I would like to know the platform on which the browser runs (client side)
Re: Platform
Posted: Wed Dec 14, 2022 12:56 am
by Dino
I can see in pages like this one:
https://stackoverflow.com/questions/259 ... he-browser
that you can get some information from the browser,
Code: Select all
navigator["appCodeName"]
navigator["appName"]
navigator["appMinorVersion"]
navigator["cpuClass"]
navigator["platform"]
navigator["plugins"]
navigator["opsProfile"]
navigator["userProfile"]
navigator["systemLanguage"]
navigator["userLanguage"]
navigator["appVersion"]
navigator["userAgent"]
navigator["onLine"]
navigator["cookieEnabled"]
navigator["mimeTypes"]
...using javascript function navigator.
To include javascript in LANSA, one of the possible ways is to use a widget. You can create a new widget
like this:

- widgetnavigator01.jpg (105.24 KiB) Viewed 29373 times
and in the implementation tab use this javascript code:
Code: Select all
function( PROTOTYPE, WIDGET )
{
PROTOTYPE.navigator = function( strvalueRequested )
{
return navigator[strvalueRequested];
}
return WIDGET.Completed;
}
then you can include that widget in any LANSA web page you need and use it like this:
Code: Select all
Begin_Com Role(*EXTENDS #PRIM_WEB) Theme(#SYS_THEME<MaterialDesignBlue>)
Define_Com Class(#getDetailedBrowserInformation) Name(#getDetailedBrowserInformation)
Define_Com Class(#PRIM_MD.Label) Name(#Text) Caption('Text') DisplayPosition(1) Left(33) Parent(#COM_OWNER) TabPosition(1) Top(263) Width(968)
Evtroutine Handling(#Com_owner.Initialize)
#Text.Caption := #getDetailedBrowserInformation.navigator( "appCodeName" )
Endroutine
End_Com
By using a widget, if you ever need to update the way you get this browser information, is just one centralized place to do it in the repository, instead of having different code to achieve the same in several programs.
Re: Platform
Posted: Thu Dec 15, 2022 12:33 am
by adale
Has anyone else tried to utilize the js function navigator?
I have followed Dino's example, created the widget, loaded to a VL web view, but only get some of the fields populated?
Values received for:
appCodeName, appName, platform, appVersion, userAgent, onLine, cookieEnabled
Blank, or no values received for:
appMinorVersion, cpuClass, opsProfile, userProfile, systemLanguage, userLanguage, mimeTypes
I am just wondering if I have something incorrect, or should I not expect to get values for those other fields?

- js_navigator.JPG (51.89 KiB) Viewed 29345 times
Re: Platform
Posted: Fri Dec 16, 2022 7:13 pm
by Paulm
Thank you very much Dino, I will try your solution
Re: Platform
Posted: Fri Dec 23, 2022 1:22 am
by Paulm
Hi Dino,
I tried your solution and it is exactly what I needed.
Thank you very much for your help.
Re: Platform
Posted: Fri Dec 23, 2022 11:37 am
by BrendanB
Browsers do not guarantee that *any* of that information is accurate.
In many browsers, it is possible to configure the browser to 'alter' the provided information (ie. the user can change what is exposed).
So it should not be *relied* upon.
I prefer the idea of asking your 'logged in' user to name their device, and storing a Secure Cookie or using Secure Storage to store a value that you generated as an 'ID' (which you can then 'lookup' in a table).
The bigger question would be 'why do you need to know if they are on Windows/Linux/Android/IOS etc.':
If you are using the supplied controls with LANSA, then these *should* work the same regardless of platform.
If you have something specific which you *know* would only be available on a specific device, then follow the advice since 2001 which is to:
*test* for the feature existence. :
Code: Select all
if (window.navigator.msSaveOrOpenBlob)
{
// do what you need with that feature (typically this would be InternetExplorer specific).
}
else
{
// do things the way it works in most browsers
}
This avoids coding a specific ' IF InternetExplorer running on windows 8' do something.
Re: Platform
Posted: Sat Dec 24, 2022 5:31 am
by adale
Brendan,
I do not know the exact needs Paulm started this thread for, but I am looking for suggestions and ideas on how others might be logging or tracking what would be the "workstation" name or id, when using VL web client applications. This would be for audit or training purposes to track the "Who, When, and Where" of an action being logged. The Who & When is the easy part, I am looking for a good "Where" option. Is there already an example of what you are describing in your idea with the secure storage (maybe in a technical newsletter)?