A few threads on the forums have commented that the URLConnection isnt quite as easy to use as many might expect. In particular there are comments about having to know what error codes a platform might return makes it harder to use than it should be.
Normally Xojo hides this level of detail from us.
I was thinking about this problem and have come up with something of a solution that makes it possible to both know the specific error code and yet still write code that is portable.
My solution relies on the fact that, at compile time, numeric constants will take on one of many possible values if you set up platform specific versions of a numeric constant. Its possible to set up a constant with a specific value for macOS, Windows, Linux, and iOS (as well as a couple that are legacy types) as follows :
If you were to compile this code on macOS the Foo constant would have the value 1, on Windows it would be 2 and so on. The nice thing is that code could simply use the symbolic constant Foo instead of having to rely on the specific value. Instead of writing
// is someVariable = Foo on macOS ? if someVariable = 1 then // do whatever should be done end if
you could, and probably should write
// is someVariable = Foo on macOS ? if someVariable = Foo then // do whatever should be done end if
This is has the added benefit of making your code more robust since a simple change to a constant is all thats required to instead of finding all the magic number 1’s everywhere. But how does this help us to making generic platform specific error codes (which I admit is a bit of an oxymoron ?)
An enumerated value can be set from one of several possible sources. It can have no specific value assigned, have a literal value, an enumerated value from another enum, or a constant.
IF Enum2 is is defined as
Public Enum Enum2 value1 = 10 End Enum
Enum1 can be defined as
Public Enum Enum1 value1 // no specific value assigned value2 = 99999 value3 = enum2.value1 value4 = kConst End Enum
That we can use a constant is especially notable as we just saw we can make a constant platform specific. So its possible to have an enumerated value that takes on the value of a platform specific version of a constant (but be careful with this as you would not want to have many enumerated values with the same value as that makes them harder to use)
If we defined our enum as
Public Enum kDemoEnum value1 = kConstant End Enum
and the constant as
Public Const kConstant as Number = -1 OS X, default language, 1 Windows, default language, 2 end Const
when we compiled on macOS the value for kDemoEnum.value1 would be 1, on Windows 2 and on any other it would be -1 (the default for the enum)
So now you can make enumerations that give you the flexibility of named values without having to know the specific values AND a generic set of enumerated values that reflect platform specific values taken from constants.