TIdUDPServer, TIdTelnet, and TIdIPMCastClient changes in XE3

In XE3, Embarcadero changed the signature of the TIdUDPServer.OnUDPRead event in their bundled copy of Indy 10. This was done in an attempt to address a slew of related QC bug reports (#88816, #89298, #89662, #92067, #93672, #94969, #97943, #99863, #103088, #104825) caused by the Delphi compiler not generating RTTI that would allow the IDE to produce an event handler that was compatible with both Delphi and C++Builder without errors. Additional RTL/compiler changes would have been required to solve the root cause of the original errors, but Embarcadero was trying to avoid that in this release.

Specifically, Embarcadero changed the AData parameter of the OnUDPRead event from a Dynamic Array to an Open Array. Consequently, the parameter signature of this event is now different (as an Open Array requires an extra parameter to carry the array’s length. A Dynamic Array does not need such a parameter), which means that pre-existing user code that uses this event in earlier IDE versions will no longer work correctly without being updated accordingly.

This change was NOT approved by the Indy development team, and Embarcadero did NOT apply their change to other areas of Indy that are affected by the same issue, such as the TIdTelnet.OnDataAvailable and TIdIPMCastClient.OnIPMCastRead events.

To maintain a single codebase, Embarcadero’s changes have now been merged into subsequent SVN releases of Indy 10.

Update, Oct 23 2012: changing the events to use an Open Array has caused new problems. So in a near-future Indy release, the events will go back to using a Dynamic Array again. However, changing TIdBytes into a plain Dynamic Array on all compiler versions, not mapping to System.TBytes or System.TArray anymore (which was the root of the problems), breaks compatibility with the SysUtils.TEncoding class in Delphi/C++Builder 2009+, so we have some compatibility issues to resolve before the events can be fixed.