We are happy to announce v. 5.24.00 of the most complete development toolkit for Delphi and C++Builder for building native modular and fast multi-tier solutions.
5.24.00 is a major release which includes new RAD Studio and Delphi 13 support, JSON5 support and many additions, updates and fixes..
If you like kbmMW, please let others know! Share the word!
We strive hard to ensure kbmMW continues to set the bar for what an n-tier product must be capable of in the real world!
This release require the use of kbmMemTable Professional v. 8.00.00 (Pro/Ent).
Community Edition installer includes Community Edition of kbmMemTable.
The release includes:
- RAD Studio and Delphi 13 support
- Significant updates to native sockets library and SSL support including OpenSSL v3.
- Significant updates to logging, configuration, LINQ, I18n, Scheduler, SmartBind, SmartEvent and more
- OAUTH2 and JTW support
Please check the end of this post for a detailed change list.
Professional and Enterprise Edition is available for all with a current active SAU. If your SAU has run out, please visit our shop to extend it with another 12 months.
Community Edition (CE) can be used as a 60 day trial, alternatively as a free product, provided the license is followed. Please read license.txt file for details. CE supports a large subset of the Enterprise Edition features, but may have technical and artificial limitations in certain areas. It only supports a specific Delphi/Win32 SKU, produce Win32 executables and do not include source.
Please visit https://portal.components4developers.com to download.
Notice that Community Edition (CE) is currently only available on request, and after signing up with COMPLETE and CORRECT info on the portal, due to export restrictions to Russia and Belarusia.
—-
kbmMW is the premiere n-tier product for Delphi, C++Builder and FPC on Win32, Win64, Linux, Java, PHP, Android, IOS, .Net, embedded devices, websites, mainframes and more.
Please visit http://www.components4developers.com for more information about kbmMW.
—-
Components4Developers is a brand established in 1999 with the purpose of providing high quality development tools for developers and enterprises. The primary focus is on SOA, EAI and systems integration via our flagship product kbmMW.
kbmMW is currently used as the backbone in hundreds of central systems, in hospitals, courts, private, industries, offshore industry, finance, telecom, governments, schools, laboratories, rentals, culture institutions, FDA approved medical devices, military and more.
5.24.00 Sep 17 2025
New stuff
=========
- Added support for adding custom Delphi based functions to SQLite database via kbmMWSQLite.
Use AddCustomFunction method.
- Added property AltTransport:TkbmMWCustomTransport to TkbmMWRemoteDesktopServer.
Allows having two transports to have concurrent access to the remote desktop.
- Added rewrite support in kbmMW_HTTP attribute (kbmMW_HTTPAttribute).
use: rewrite: { mask:"...", replace:"...", ifFileNotExists:true/false, break:true/false }
or rewrites: [ {...},{...} ]
to control when rewrites are in action and what the resulting replacement should be.
- Added property DetectedMaxOutstandingSends:integer to TkbmMWCustomTCPServerTransport and TkbmMWCustomTCPMessagingServerTransport.
Returns -1 if no socket transport available and a non negative value for the maximum number of
outstanding sends (still not acked and lingering in OS socket buffers) on that particular transport.
If too high, something is sending faster than stuff can be shipped to receivers and you might running out of
socket kernel memory.
- Added numerous new functions to TkbmMWCustomHash descendants:
class function HashAsString(const AStream:TStream; const ASalt:string=''; const AUTF8:boolean = true):string; overload;
class function HashAsString(const AStream:TStream; const ASalt:TkbmMWBytes):string; overload;
class function HashAsBytes(const AStream:TStream; const ASalt:string=''; const AUTF8:boolean = true):TkbmMWBytes; overload;
class function HashAsBytes(const AStream:TStream; const ASalt:TkbmMWBytes):TkbmMWBytes; overload;
class function HMACAsString(const AString:string; const AKey:string; const AUTF8:boolean = true):string; overload;
class function HMACAsString(const AString:string; const AKey:TkbmMWBytes; const AUTF8:boolean = true):string; overload;
class function HMACAsString(const ABytes:TkbmMWBytes; const AKey:string):string; overload;
class function HMACAsString(const ABytes:TkbmMWBytes; const AKey:TkbmMWBytes):string; overload;
class function HMACAsString(const AStream:TStream; const AKey:string):string; overload;
class function HMACAsString(const AStream:TStream; const AKey:TkbmMWBytes):string; overload;
class function HMACAsBytes(const AString:string; const AKey:string; const AUTF8:boolean = true):TkbmMWBytes; overload;
class function HMACAsBytes(const AString:string; const AKey:TkbmMWBytes; const AUTF8:boolean = true):TkbmMWBytes; overload;
class function HMACAsBytes(const ABytes:TkbmMWBytes; const AKey:string):TkbmMWBytes; overload;
class function HMACAsBytes(const ABytes:TkbmMWBytes; const AKey:TkbmMWBytes):TkbmMWBytes; overload;
class function HMACAsBytes(const AStream:TStream; const AKey:string):TkbmMWBytes; overload;
class function HMACAsBytes(const AStream:TStream; const AKey:TkbmMWBytes):TkbmMWBytes; overload;
- Added function TkbmMWAuthorizationManager.IsAuthorized(const ALogin:TkbmMWAuthorizationLogin; const AResourceName:string; var AAccessPermissions:TkbmMWAccessPermissions; var AMessage:string):TkbmMWAuthorizationStatus;
- Major update to kbmMWOpenSSL.pas. Now its possible to use OpenSSL to generate self signed certificates.
- Major update to all native (non Indy) socket transports.
- Added support for construcing Object Notation streamer with settings as a simplified YAML string.
TkbmMWBSONStreamer supports:
dontStreamNullProperties
TkbmMWYAMLStreamer supports:
dontStreamNullProperties,dontExceptOnEmptyString,indent,alignChildren,simplifiedInline,
inlineCommentColumn,emptyLineAboveComment,emptyLineBetweenObjects,strictComment
TkbmMWTXTStreamer supports:
fields, header, recordDelimiterChar1, recordDelimiterChar2, autoDetectType,
defaultNamePrefix, skip, skipBeforeHeader, limit, recordSize, dontExceptOnEmptyString
TkbmMWJSON5Streamer supports:
dontStreamNullProperties, dontExceptOnEmptyString, indent, nullOnEmptyString,
pretty, comments, lateTyping.
TkbmMWJSONStreamer supports:
dontStreamNullProperties, dontExceptOnEmptyString, indent, nullOnEmptyString,
pretty, comments, lateTyping, jQueryEscaping.
- Added support for StreamEncoding for all releavant TkbmMWxxxStreamer classes.
- Added support for TkbmMWDOMXML parser to define settings as simplified YAML string:
TkbmMWCustomXMLParser supports:
streamBOM, autoDetectEncoding, ignoreDuplicateIDs, autoIndent, autoIndentCount,
preserveWhitespace, collapseNil, autoLineFeed
- Added mwloAutoLogUnhandledExceptions to TkbmMWLogOption.
When set on a logmanager.Options flag (default), unhandled exceptions will not automatically be logged.
- Added mwltAlert log type to TkbmMWLogType along with a set of log.Alert methods to match.
- Added support for continuous logging to files like JSON and XML which require an opening/closing tag.
Closing tag will only be added when the log file is closed for further logging.
- Added TkbmMWCSVLogFormatter, TkbmMWJSONLogFormatter, TkbmMWXMLLogFormatter as structured log formatters.
- Added methods to IkbmMWLogManager (and classes) to allow for ignoring specific kbmMW error numbers in addition to
ignoring specific exceptions.
- Added new IkbmMWLogContext interface, which is exposed numerous places, including in IkbmMWLogSubscriber.Notify,
TkbmMWOnLog and TkbmMWOnAfterLog event handlers and HandleLog virtual methods, and in TkbmMWServerLogManager and TkbmWMClientLogManager (remote logging)
- Added methods to IkbmMWLog (and classes) to easy setup a logger to output to specific places.
eg function OutputToSystemAndAuditFile(const ASystemFileName:string=''; const AAuditFileName:string=''; const ATypes:TkbmMWLogTypes = [mwltInfo,mwltWarning,mwltError,mwltFatal]; const ALevel:TkbmMWLogLevel = mwllNormal):IkbmMWTeeLogManager;
function OutputToJSONSystemAndAuditFile(const ASystemFileName:string=''; const AAuditFileName:string=''; const ATypes:TkbmMWLogTypes = [mwltInfo,mwltWarning,mwltError,mwltFatal]; const ALevel:TkbmMWLogLevel = mwllNormal):IkbmMWTeeLogManager;
function OutputToXMLSystemAndAuditFile(const ASystemFileName:string=''; const AAuditFileName:string=''; const ATypes:TkbmMWLogTypes = [mwltInfo,mwltWarning,mwltError,mwltFatal]; const ALevel:TkbmMWLogLevel = mwllNormal):IkbmMWTeeLogManager;
function OutputToDebugAndSystemAndAuditFile(const ADebugFileName:string=''; const ASystemFileName:string=''; const AAuditFileName:string=''; const ATypes:TkbmMWLogTypes = [mwltInfo,mwltWarning,mwltError,mwltFatal]; const ALevel:TkbmMWLogLevel = mwllNormal):IkbmMWTeeLogManager;
function OutputToJSONDebugAndSystemAndAuditFile(const ADebugFileName:string=''; const ASystemFileName:string=''; const AAuditFileName:string=''; const ATypes:TkbmMWLogTypes = [mwltInfo,mwltWarning,mwltError,mwltFatal]; const ALevel:TkbmMWLogLevel = mwllNormal):IkbmMWTeeLogManager;
function OutputToXMLDebugAndSystemAndAuditFile(const ADebugFileName:string=''; const ASystemFileName:string=''; const AAuditFileName:string=''; const ATypes:TkbmMWLogTypes = [mwltInfo,mwltWarning,mwltError,mwltFatal]; const ALevel:TkbmMWLogLevel = mwllNormal):IkbmMWTeeLogManager;
- Added methods to find a log manager based on name.
function FindLogManager(const ALogManager:IkbmMWLogManager; const AName:string; const ALogManagerIID:TGUID; const ALogTypes:TkbmMWLogTypes):IkbmMWLogManager; overload;
function FindLogManager(const AName:string; const ALogManagerIID:TGUID):IkbmMWLogManager; overload;
function FindLogManager(const AName:string):IkbmMWLogManager; overload;
- Added properties to get to typical logmanagers:
function GetSystemLogManager:IkbmMWLogManager; overload;
function GetAuditLogManager:IkbmMWLogManager; overload;
function GetDebugLogManager:IkbmMWLogManager; overload;
and the files they may output to:
function GetSystemLogFileName:string;
function GetAuditLogFileName:string;
function GetDebugLogFileName:string;
- Added procedure LogUnhandledException(const AException:Exception); to IkbmMWLog.
- Added Alert log methods to IkbmMWLog.
- Added features for sending context when using Audit and Alert log methods to IkbmMWLog.
Define the context using the new NewContext methods:
function NewContext:IkbmMWLogContext; overload;
function NewContext(const AUserID:string; const AUserName:string):IkbmMWLogContext; overload;
function NewContext(const AUserID:string; const AUserGroupID:string; const ALocationID:string):IkbmMWLogContext; overload;
function NewContext(const AUserID:string; const AUserName:string; const AUserGroupID:string; const AUserGroupName:string):IkbmMWLogContext; overload;
function NewContext(const AUserID:string; const AUserName:string; const AUserGroupID:string; const AUserGroupName:string; const ALocationID:string; const ALocationName:string):IkbmMWLogContext; overload;
The context will be forwarded to all log subscribers/event handlers and be written by audit and alert aware log managers.
- Added new methods for defining complex log values when logging:
function NewValue(const AValue:TValue):IkbmMWLogKeyValues; overload;
function NewValue(const AName:string; const AValue:TValue):IkbmMWLogKeyValues; overload;
function NewValues(const AValues:array of TValue):IkbmMWLogKeyValues; overload;
function NewValues(const ANames:array of string; const AValues:array of TValue):IkbmMWLogKeyValues; overload;
- Added new methods for checking for if a specific exception (by class or classname) is set to be ignored by the log mananger.
function IsExceptionIgnored(const AExceptionClass:TClass):boolean; overload;
function IsExceptionIgnored(const AExceptionClass:string):boolean; overload;
- Added new methods for ignoring specific kbmMW errors in a log mananger.
procedure IgnoreError(const AErrorCode:integer);
procedure IgnoreErrors(const AErrorCodes:array of integer);
procedure ClearIgnoreErrors;
function IsErrorIgnored(const AErrorCode:integer):boolean;
Default KBMMW_ERR_DATASTORE_RESOLVER_MODIFYFAILEDTRYINGINSERT is ignored.
- Added new methods for logging (by Delphi) unhandled exceptions:
procedure LogException(const AType:TkbmMWLogType; const ALevel:TkbmMWLogLevel; const ADateTime:TkbmMWDateTime; const AOrigin:string; const AString:string; const AException:Exception; const AUnhandled:boolean); overload;
procedure LogUnhandledException(const AException:Exception);
- Split out handling of audit vs other log types to separate log managers.
That meant removing:
procedure CloseAuditFile; virtual;
procedure OpenAuditFile(const ADeleteOld:boolean); virtual;
function GetAuditFile:string;
function GetSeparateAudit:boolean;
function GetMaxAuditFileSize:integer;
procedure SetMaxAuditFileSize(const AValue:integer);
function GetMaxAuditFileAge:TkbmMWDuration;
procedure SetMaxAuditFileAge(const AValue:TkbmMWDuration);
function GetAuditFileCreation:TkbmMWDateTime;
property AuditFile:string read GetAuditFile;
property MaxAuditFileSize:integer read GetMaxAuditFileSize write SetMaxAuditFileSize;
property MaxAuditFileAge:TkbmMWDuration read GetMaxAuditFileAge write SetMaxAuditFileAge;
property SeparateAudit:boolean read GetSeparateAudit;
property AuditFileCreation:TkbmMWDateTime read GetAuditFileCreation;
Instead configure in a specific logmanager to handle audit logging specifically.
- Added to file log manager:
function GetMaxBackupAgeSecs:integer;
procedure SetMaxBackupAgeSecs(const AValue:integer);
property MaxBackupAgeSecs:integer read GetMaxBackupAgeSecs write SetMaxBackupAgeSecs;
Controls how long a backup file can be before it will be automatically removed.
- Added to Tee log manager:
property ForwardLogTypeSettings:boolean read GetForwardLogTypeSettings write SetForwardLogTypeSettings;
property ForwardLogDataTypeSettings:boolean read GetForwardLogDataTypeSettings write SetForwardLogDataTypeSettings;
property ForwardLogLevelSettings:boolean read GetForwardLogLevelSettings write SetForwardLogLevelSettings;
Controls if and how property changes on the tee log manager properties will be propogated
to log managers handled by the tee log manager, or the settings are only pertinent to the
tee log manager itself.
- Added mwlfcLogContext,mwlfcLogValues,mwlfcLogRemoteContext to TkbmMWLogFormatterColumn.
mwlfcLogContext - If specified for columns to log, will log all relevant provided contaxt (IkbmMWLogContext).
mwlfcLogRemoteContext - If specified for columns to log, will log all relevant provided remote contaxt (IkbmMWLogContext.RemoteContext).
Remote context is usually context provided by a different process.
Local context is context provided by the local process.
mwlfcLogValues - If specified will log provided name/value pairs provided during logging where value can be objects.
Only log managers that supports data hierarchies (eg. JSON, YAML, XML) will be able to output logged name/value data.
- Improved SQL rewriters:
Added support for insert by select in SQL rewriters:
function RewriteInsertSelect(const AOperation:TkbmSQLCustomOperation; const ATable:TkbmSQLTable; const AFields:TkbmSQLFieldNodes; const AStringBuilder:TkbmMWStringBuilder):boolean;
Provides support for INSERT SELECT ... statement rewriting.
Added support for constraint handling in SQL rewriters:
function RewriteBeforeCreateTable(const ATableName:string; const AStatements:TStrings):boolean; virtual;
function RewriteBeforeDropTable(const ATableName:string; const AStatements:TStrings):boolean; virtual;
function RewriteBeforeAlterTable(const AOperation:TkbmSQLAlterTableOperation; const AStatements:TStrings):boolean; virtual;
property DDL_UniqueConstraintPlacement:TkbmMWConstraintPlacement read FDDL_UniqueConstraintPlacement write FDDL_UniqueConstraintPlacement;
Provides support for rewriting different constraints layout mechanisms during CREATE TABLE statements.
Added:
function RewriteFuncUpper(const ANode:TkbmSQLFunctionNode):string; override;
function RewriteFuncLower(const ANode:TkbmSQLFunctionNode):string; override;
Provides support for automatically rewrite Upper/Lower SQL functions.
Useful in SQLite which do not support Unicode Upper/lower directly,
but where kbmMW provides custom SQLfunctions (UCUpper/UCLower) for that purpose.
The rewriter makes it transparent in use.
- Added class function IskbmMWONCustomObject(const AValue:TValue):boolean to TkbmMWRTTI.
- Added TkbmMWJWT class for JSON web token support in kbmMWHTTPUtils.pas.
- Added TkbmMWOAUTH2 class for OAuth2 support in kbmMWHTTPUtils.pas.
- Added TkbmMWURL class for easy URL encoding/decoding.
- Added class function Hex2Bytes(const AHex:string):TkbmMWBytes to TkbmMWPlatformMarshal.
- Added methods to TkbmMWTextPChar:
class function OnlySpaces(const AString:string):boolean; overload;
class function OnlySpaces(APChar:PChar):boolean; overload; {$IFDEF KBMMW_SUPPORTINLINE} inline;{$ENDIF}
- Added methods and reference type handlers to kbmMWGlobal.pas:
TkbmMWOnFileCopy = reference to procedure(const ABefore:boolean; const ASourceFile:string; var ADestFile:string);
TkbmMWOnFileMove = reference to procedure(const ABefore:boolean; const ASourceFile:string; var ADestFile:string);
TkbmMWOnFileDelete = reference to procedure(const ABefore:boolean; var AFile:string);
function kbmMWBackupFile(AFile:string; ADestPath:string; const AMaxBackups:integer; AExtension:string; const AOptions:TkbmMWBackupFileOptions; const AGetBackupFileName:TkbmMWGetBackupFileName; const AMaxBackupAgeSecs:integer):string; overload;
function kbmMWFileDelete(const ASrc:string; const AOnDelete:TkbmMWOnFileDelete):integer; overload;
function kbmMWFileDelete(const ASrc:string):integer; overload;
function kbmMWFileCopy(const ASrc,ADst:string; const AOverwrite:boolean; const AForceDirectories:boolean; const ADestMapping:string; const AOnCopy:TkbmMWOnFileCopy):integer; overload;
function kbmMWFileCopy(const ASrc,ADst:string):integer; overload;
function kbmMWFileCopy(const ASrc,ADst:string; const AOverwrite:boolean):integer; overload;
function kbmMWFileCopy(const ASrc,ADst:string; const AOverwrite:boolean; const AForceDirectories:boolean):integer; overload;
function kbmMWFileMove(const ASrc,ADst:string):integer; overload;
function kbmMWFileMove(const ASrc,ADst:string; const AOverwrite:boolean; const AForceDirectories:boolean; const ADestMapping:string; const AOnMove:TkbmMWOnFileMove):integer; overload;
function kbmMWFileMove(const ASrc,ADst:string; const AOverwrite:boolean):integer; overload;
function kbmMWFileMove(const ASrc,ADst:string; const AOverwrite:boolean; const AForceDirectories:boolean):integer; overload;
- Added methods to kbmMWGlobal.pas
function kbmMWExtractKeyValue(const AString:string; var AValue:string; const AQuote:char = '"'; const ADelimiter:char = '='):string;
function kbmMWFindReplace(const AString,AFind,AReplace:string):string;
function kbmMWGetCurrentProcessMemory:NativeUInt;
function kbmMWGetIsRunningInRemoteDesktop:boolean; (Windows only)
- Added support for detecting memory overruns in kbmMWDebugMemory.
- Improved TkbmMWCustomClient.
Added request cancelling features, which will stop waiting for a response if activated.
Only relevant when using the client via a messaging transport.
- Added function HTTPResponseFromFile(const APath:string; var AAbsoluteFilePath:string; var AMimeType:string; var ACharset:string; const AMapPath:boolean = true):variant; overload; virtual;
to TkbmMWCustomHTTPService.
- Added support for augmenting URL with default file (eg. index.html etc.) if missing.
- Added a plethora of Array methods to TkbmMWConfiguration.
- Added a plethora of Asxxxx functions to IkbmMWLinqStage to allow for easy conversion
of Linq data to CSV, XML, JSON, TXT, YAML, BSON, Messagepack formats.
- Added IkbmMWLinqSettings and WithSettings(...) to IkbmMWLinqStage.
Provides access to easy load CSV, XML, JSON, TXT, YAML, BSON, Messagepack formatted data
into a LINQ stage to do LINQ operations with it via numerous Usingxxxx methods.
- Significantly improvements in kbmMWORM.pas:
To handle ALTER TABLE statements in cases where a rewrite is needed.
To handle INSERT SELECT type use.
To handle constraint definitions.
- Added custom SQL function JSONValue which can be used to extract data from a JSON document
within SQL operations. Takes 1 or 2 arguments: (path) or (tablename,path).
path follows the syntax by TkbmMWONObject(o).Path(APath,[mwonpoLastIsValue]) to access a node.
- Added TkbmMWStreamEncoding enumeration to kbmMWGlobal.
- Added function kbmMWIsGUIDEmpty(const AGUID:TGUID):boolean to kbmMWGlobal.pas
- Added SearchText function to TkbmMWTextPChar and TkbmMWTextPByte in kbmMWGlobal.
- Added TkbmMWTextPAnsiChar class to kbmMWGlobal.
- Updated TkbmMWBoyerMoore to be able to optionally search from end of string.
- Updated TkbmMWBoyerMoore with search methods for searching on String and ansistring
in addition to the search on TBytes.
- Added uint64 suppport to TkbmMWDOMXMLParser.
- Added uint64 support to kbmMWSmartBind.
- Added uint64 support to TkbmMWONCustomStreamFormat.
- Added class function GetIsUInt64(const ATypeInfo:PTypeInfo):boolean; to TkbmMWRTTI.
- Added class function ArrayOfValue(const AValues: array of const):TArray<TValue>; to TkbmMWRTTI.
- Added class function ConvertToUInt64(const AValue:TValue):TValue; to TkbmMWRTTI.
- Added uint64 / ftLargeuint support to kbmMWORM.
- Added mwqoCaseInsensitive to TkbmMWORMQueryOptions in kbmMWORM.
If set will do operation case insensitively.
- Added uint64 support to TkbmMWObjectNotation.
- Added multiple class functions to TkbmMWObjectNotation to allow for easy conversion.
- Added uint64 support in MessagePack format.
- Added ftLargeUint support to dataset related routines, including dataset streaming and marshalling.
Changes/minor additions
=======================
- Added optional AVersion argument to TkbmMWDefinedServiceList.RemoveService.
- Added ANoPadding argument to functions in kbmMWMime.pas. Default false.
- Added property FailedTotal:int64 and property Failed:int64 to TkbmMWCustomMessagingSpoke.
FailedTotal returns number of failed deliveries totally for the lifetime of the spoke.
Failed returns number of failed deliveries since last sucessfull delivery by the spoke.
- Added property FailedDeliveryResults[const AType:TkbmMWMessageProcessingFailedAction]:integer
to TkbmMWCustomMessagingHubServerTransport. It returns the number of failed deliveries to
spokes of this hub, within variout delivery failure types: mwpfaRollback, mwpfaReject, mwpfaDelete, mwpfaSkip
- Changed spoke cleanup logic slightly within TkbmMWSAFHubOutboundQueueProcessor.InternalProcessMessage.
- Added boolean return to IkbmMWSocketState.CommitWrite:boolean. Purpose is to be able to
return simple fail/success from underlying hardware transport and prevent attempting
additional Write to failed socket.
- Added property DontOwnDOM:boolean to TkbmMWONCustomMarshal which indicates if the marshal
classes are the owners of the object tree or not.
- Updated TkbmMWONCustomMarshal.InternalMarshal to handle marshalling empty root value, and
marshalling root value which in it self is an object notation object.
- Updated various hashing methods so they return appropriate block size (TkbmMWHashTiger,TkbmMWHashRipeMD128,
TkbmMWHashMD4, TkbmMWHashMD5, TkbmMWHashMetro64, TkbmMWHashMetro128, TkbmMWHashHaval,
TkbmMWHashSHA1, TkbmMWHashSHA384, TkbmMWHashSHA512, TkbmMWHashRipeMD160, TkbmMWHashSHA256)
- Improved function TkbmMWSAFSyncRequestResponseBinder.WaitForResponse(const ACaller:TkbmMWCustomClient; const ARequestID:integer; const ARequestStream:IkbmMWCustomRequestTransportStream; const ATimeOut:integer; const AWaitingEvent:TkbmMWOnClientWaitingResponse; var AResponseStream:IkbmMWCustomResponseTransportStream):TkbmMWSAFSyncRequestResponseStatus;
Added support for if caller has cancelled the request.
- Improved TkbmMWCustomTCPMessagingServerTransport and TkbmMWCustomTCPServerTransport.EndTransmit to
raise an exception if the transmission could not be sent.
- Added ReferenceID:variant to several authorization classes in kbmMWSecurity:
TkbmMWAuthorizationResource, TkbmMWAuthorizationActor, TkbmMWAuthorizationRole
Can be used to reference actual external entity.
- Added optional ALearn:boolean argument to TkbmMWI18N
function DecomposeTranslate(const AName:string; const AText:string; const ALearn:boolean = true):string; overload;
function DecomposeTranslate(const ALanguage:string; const AName:string; const AText:string; const ALearn:boolean = true):string; overload;
- Added event OnLanguagesLoaded to TkbmMWI18N.
- Added check in procedure TkbmMWI18N.TranslateComponent(const ALanguage:TkbmMWI18NLanguage; const AComponent:TComponent; const AParentName:string);
- Rewrote function TkbmMWI18N.InternalDecomposeTranslate(const ALanguage:TkbmMWI18NLanguage; const AName:string; AText:string; ALearn:boolean):string;
- Changed Tee log manager to support an unlimited number of handled log manangers, rather than max 10.
- Updated connection pools to use kbmMWScheduler for garbage collection to minimize thread usage.
- Improved shutdown of kbmMWScheduler during shutdown.
- Improved TkbmMWPathMatchers and TkbmMWPathMatcher classes with additional methods.
- Improved TkbmMWSmartEvent:
Added support for Tag and TagObject properties on IkbmMWEventSubscriber.
They can also be set using WithTag() and WithTagObject() fluent methods.
Added AUpPrioritize:boolean (default false) argument to Activate.
Will run this event subscriber before other event subscribers already defined.
Use with care as having to define order is something you should very very rarely need to do
in a properly setup system.
- Improved kbmMWCSV.pas to fix end of line and end of file issues.
- Added TurnaroundStart and TurnaroundEnd to TkbmMWCustomStat in kbmMWStats unit.
- Added mwsgCustom (statistics group custom) to TkbmMWStatGroupType in kbmMWStats unit.
- Added access to raw data via property Data:pointer in TkbmMWDIB.
- Moved kbmMWDebugLevel,kbmMWDebugWhere,kbmMWDebugTypes,kbmMWDebugFile,
kbmMWDebugPrefix,kbmMWDebugCS,kbmMWDebugEncoding from kbmMWLog.pas to kbmMWGlobal.pas.
- Removed reliance of kbmMWLog from kbmMWGlobal.
- Added additional check if DLL library is loaded in kbmMWJPEG.
- Extensively rewritten kbmMWDependency unit to improve performance and circular loop detection
and debugging.
- Changed to use TThread.ForceQueue instead of TThread.Queue to queue sync'ed notification in SmartEvent.
- Improved debug visualizing kbmMWNullable, TkbmMWDateTime, TkbmMWDuration, IkbmMWAutoValue.
Fixes
=====
- Fixed TkbmMWCustomTCPMessagingServerTransport and TkbmCustomTCPServerTransport.DoOnDisconnected release mechanism.
- Fixed TkbmMWCustomPasswordGen32.Create(ARandomizer:TkbmMWCustomRandomUInt32 = nil) to
not own the given randomizer, and thus not attempt to free it.
- Fixed class function TkbmMWBinaryPasswordGen.Make(const ALength:integer = 64;
const ARandomizer:TkbmMWCustomRandomUInt32 = nil):TkbmMWBytes;
to actually return the generated random password as bytes.
- Fixed bug in kbmMWParseAuthorization -> ParseBearerAuthorization in kbmMWHTTPUtils.pas.
- Fixed bug in procedure TkbmMWI18NDecompositionVariant.Compile(const APhrase:string);
- Fixed bug in function TkbmMWI18NCustomONStorage.LoadPhrases(const AObject:TObject; const APhrases:TkbmMWI18NPhrases):boolean;
- Fixed bug in function TkbmMWI18NCustomONStorage.LoadDecompositions(const AObject:TObject; const ADecompositions:TkbmMWI18NDecompositions):boolean;
- Fixed bug in function TkbmMWI18N.GetCurrentLanguage:string;
- Fixed problem with SSL connection being disconnected for all connected nodes, if a non SSL node attempts to connect using native socket transport.
- Fixed bug in: TkbmMWHTTPServiceDefinition.GetAbsoluteFilePath
- Fixed bug in:
class operator TkbmMWDateTime.Add(AValue1:TkbmMWDateTime; AValue2:TDateTime):TkbmMWDateTime;
class operator TkbmMWDateTime.Add(AValue1:TkbmMWDateTime; AValue2:TkbmMWDuration):TkbmMWDateTime;
class operator TkbmMWDateTime.Add(AValue1:TkbmMWDateTime; AValue2:TkbmMWDateTime):TkbmMWDateTime;
class operator TkbmMWDateTime.Subtract(AValue1:TkbmMWDateTime; AValue2:TkbmMWDateTime):TkbmMWDateTime;
class operator TkbmMWDateTime.Subtract(AValue1:TkbmMWDateTime; AValue2:TkbmMWDuration):TkbmMWDateTime;
- Fixed SmartBind bug related to ComboBoxes which were not refilled correctly.
- Fixed race condition issue during shutdown of kbmMW due to circular dependency resolving.
- Fixed YAML streaming to correctly quote + and ;.
![]()





