What's new

Version 6.22

September 24th, 2018

  • wwPdfPrinterDriver PDF Printer for wwPDF
    Added a generic PDF driver that can be used with any printer driver that outputs to PDF including the built-in Microsoft Print to PDF driver in Windows 10 and Windows Server 2016 and later. This driver handles report printing, capturing and waiting for the output file from the print spooler and dealing with unattended mode issues when running in COM modes.

  • wwDotnetBridge - Automatically unblock DLL
    Added logic to automatically unblock wwDotnetBridge.dll. This should help with many common loader error issues.

  • Improved Error Message for wwDotnetBridge Load Errors
    wwDotnetBridge has a few rules required in order to run it - specifically related to Internet downloaded-loaded DLLs and loading from a network. Updated the loader error message with common causes and link to documentation.

  • wwUtils.SanitizeHtml() to sanitize HTML strings Added a new SanitizeHtml() function to wwUtils to strip scriptable code out of HTML text. Useful for cleaning up user captured HTML or Markdown text to prevent XSS attacks from user input. Requires .NET.

  • wwDotnetBridge support for Event Handling
    wwDotnetBridge now supports subscribing to and handling of events via the new loBridge.SubscribeToEvents() method. You provide a source .NET object that fires events and a FoxPro object that implements the corresponding event methods that you want to implement. Thanks to Edward Brey who built out this feature in the OSS version of wwDotnetBridge!

  • wwDotnetBridge Fixup for List return values
    Added additional support for List<T> return values to InvokeMethod() and GetProperty() results, which returns these values as a ComArray now.

  • wwDotnetBridge.dll and wwIpstuff.dll are now signed
    Both wwDotnetBridge and wwipstuff are now signed with a code certificate. To make sure you have authentic versions you should check for the digital signature. Signed assemblies also have fewer security issues in terms of loading from network or downloaded sources.

  • Support >16meg uploads with wwHttp
    You can now upload files larger than 16mb with wwhttp by using the new lUseLargePostBuffer flag and setting it to .T.. Internally this class uses a file stream buffer to hold the POST buffer.

  • Updated wwFileStream Class to create >16mb Strings
    The wwFileStream class provides a file based stream that allows creation of large strings that exceed 16mb and can be loaded into FoxPro strings as a whole. FoxPro supports >16mb strings in limited fashion (basically >16mb string can't be mutated), and this class allows you to create those strings.

  • wwJsonSerializer::Serialize() llFormat Option
    The Serialize() method now has an llFormat parameter that allows specifying that the content should be pretty formatted. This is in addition to the FormattedOutput flag on the serializer itself.

  • Fix: File2Var() UTF-8 Detection
    Fixed bug in File2Var() that would cause problems with UTF-8 BOM detection in non-Western alphabets.

  • Fix: wwEncryption with Upper ASCII Characters
    Fixed issue with wwEncryption not properly two way decrypting upper ASCII characters as the Code Page mapping was off. Switched to UTF-8 character sets when encoding and decoding which works on all ANSI codepages as long as the same code page is used to encode and decode.

  • JsonDate() function in wwUtils
    Added a JsonDate() function that creates a JSON formatted date string that is properly UTC adjusted. Function lives in wwUtils but requires wwDotnetBridge/.NET to work.

  • Fix: wwJsonSerializer UTC Formatting
    Fixed problem with the wwJsonSerializer where UTC dates weren't properly showing time zones other then current time zone.

  • Fix: wwJsonSerializer Deserialization Property Names
    FoxPro supports only alpha-numeric plus _ for property names and this filter ensures that deserialized properties are cleaned up to remove all but those characters via a new PropertyNameCharacterFilter property.

Breaking Changes for v6.22

  • wwJsonSerializer::Serialize() now relies on .NET
    The wwJsonSerializer now uses .NET functions to serialize date values with proper UTC conversions that previously weren't handled. wwJsonSerializer::DeserializeJson() already depended on .NET so not a big change.

Version 6.17

October 20th, 2017

  • Better Error information for wwDotnetBridge Load Errors
    wwDotnetBridge will now report slightly better error information on load failures, when failing to load the runtime or initial wwdotnetbridge instance.

  • JsonSerialize() and JsonDeserialize() Helper Function
    Added helper functions that let you use the JSON serializer without having to create a new object instance of wwJsonSerializer for each serialization process operation. The helpers simply wrap the Serialize() and DeserializeJson() methods for easier usage.

  • wwDotnetBridge InitializeDotnetVersion()
    An explicit function to initialize the .NET Runtime for the entire application. Although this function doesn't really do anything but create an instance of wwDotnetBridge with a specific version, the function makes it clear that this initializes the .NET version for the entire application.

  • Updated GetUniqueId() to be more Random
    Changed the algorithm of GetUniqueId() using Guids that are redistributed over printable characters. The result is truly random Ids that are more unique with much smaller character counts - as little as 8 characters can provide safe ids for low impact applications with a max of 16 for near 100% fidelity.

  • Add content type to wwHttp::AddPostKey() when uploading files
    You can now specify an optional content type when uploading files to a server using .nHttpPostMode=2. The content type is appended to the file data sent to the server.

  • Fix: HMACSHA Hashing in wwEncryption
    Fixed a salt encoding bug in the ComputHash() function when calling the HMAC specific methods that require a salt value. Previously the salt value were added to the original string and then encoded. Now the salt value is only applied to the HMAC algorithm processor.

  • Fix: wwSFTP Large File Upload
    Fixed an issue due to a buffer size issue with the underlying SSH library used in wwSFTP. Fixed by ignoring the nBufferSize parameter. Make sure to update renci.ssh.net dependency dll which has the fix.

Breaking Changes for v6.10

  • wwDotnetBridge recompiled to .NET 4.0
    wwDotnetBridge now runs as a .NET 4.0 assembly and requires .NET 4.0 runtime. We are also shipping wwdotnetbridge_NET20.dll that can be still used with .NET 2.0. The 2.0 assembly will not work for JSON Deserialization or SFTP requests. If trying to run under XP make sure to use the NET20 dll by renaming.

Version 6.10

February 2nd, 2017
Release Blog Post

  • < %: expr % > for Templates and Scripts
    Scripts and templates can now use automatic HTML encoding by using < %: expr % > instead of < %= EncodeHtml(expr) % > (spacing added for rendering). This makes it much easier to create XSS safe string output without more verbose syntax.

  • Visual Studio 2017 Addin Support and Visual Studio Gallery
    The Web Connection Visual Studio Addin now supports Visual Studio 2017 and is also published to the Visual Studio Extension Gallery. This means you can install and update the addin directly from Visual Studio and once installed, the extension can automatically update itself.

  • New wwSFTP Class for SSH based FTP
    There's a new wwSFTP class that provides secure FTP (SFTP only, not FTPS) to connect to SSH based SFTP servers. The class inherits from wwFTP so can be interchangeably with wwFtp based FTP code.

  • wwUserSecurity Password Encryption via cPasswordEncryptionKey
    You can now encrypt your UserSercurity table's passwords by setting the cPasswordEncryptionKey when you create your wwUserSecurity instance. When set passwords are automatically hashed before getting saved to the database.

  • wwEncryption::ComputeHash() adds HMAC Hash Algorithms
    wwEncryption::ComputeHash() adds HMACSHA1, HMACSHA256, HMACSHA384 and HMACSHA512 algorithms. HMAC algorithms use complex salting cycles to add complexity and delay to generated hashes using an industry standard and repeatable algorithm.

  • wwRequest::GetLogicalPath() can return Proxied Urls
    GetLogicalPath() now gets a parameter that when true will return the original URL specified before a proxy redirected the URL to your application. Useful when using extensionless URLs redirected via Rewrite rules in IIS.

  • Switch to Markdig Markdown Parser
    Switch markdown parser to use the MarkDig .NET Markdown parser which natively supports Github flavored markdown and many Markdown extensions, including support for auto-links, extra emphasis (strikeout, sub/superscript etc.)

  • wwUtils::GetUniqueId()
    Allows generation of unique IDs based off a full or partial GUID value. Allows specification of a size that determines the size of the generated string between 15 and 32 characters where 32 is a full GUID.

  • wwUtils::SplitString()
    String utility like ALINES() to return a collection of strings that allows you to specify a length to break lines at. Uses ALINES[] to capture lines and splits lines longer than specified via MEMLINES(). Useful for any code parsing that needs to ensure string literals don't exceed 255 characters in length.

  • wwDotnetBridge now supports TLS 1.2
    wwDotnetBridge now sets the default HTTPS protocols settings to allow for SSL3, TLS1, TLS11 and TLS12. The default previously only allowed for SSL3 and TLS1. Overrides ServicePointManager.SecurityProtocol on initial load of the .NET runtime. This affects any .NET API called that uses HTTP including Web service calls.

  • wwScripting::CompileAspScript
    Explicit function that can be used to compile a single ASP Script page using the same mechanism used to run the page.

  • WCSCompile for pre-compiling Scripts on the Server Fixed the pre-compilation link on the Admin page that allows recompilation of Scripts (wcs style FoxPro script pages) on the the entire site. This feature now works recursively and can reliably compile scripts assuming all referenced dependencies used in scripts are loaded by the application before compilation occurs.

  • wwJsonServiceClient::CreatewwHttp()
    You can now create a new instance of wwHttp to be used in the wwJsonSerializer implementation when making service calls. You can create a new instance of wwHttp that is pre-configured with Authentication, headers etc. and pass it to this method before a service call.

Breaking Changes for v6.10

  • Add Markdig.dll to your Distribution for Markdown Parsing
    The new Markdig Markdown parser requires a new DLL to be used. If you're using the MarkdownParser class or the Markdown() function, make sure to update to this DLL. You can remove CommonMark.dll.

Version 6.10

March 22nd, 2017 • Breaking Changes

  • New wwSFTP Class for SSH based FTP
    There's a new wwSFTP class that provides secure FTP (SFTP only, not FTPS) to connect to SSH based SFTP servers. The class inherits from wwFTP so can be interchangeably with wwFtp based FTP code.

  • wwJsonServiceClient::CreatewwHttp()
    You can now create a new instance of wwHttp to be used in the wwJsonSerializer implementation when making service calls. You can create a new instance of wwHttp that is pre-configured with Authentication, headers etc. and pass it to this method before a service call.

  • wwEncryption::ComputeHash() adds HMAC Hash Algorithms
    wwEncryption::ComputeHash() adds HMACSHA1, HMACSHA256, HMACSHA384 and HMACSHA512 algorithms. HMAC algorithms use complex salting cycles to add complexity and delay to generated hashes using an industry standard and repeatable algorithm.

  • Switch to Markdig Markdown Parser
    Switch markdown parser to use the MarkDig .NET Markdown parser which natively supports Github flavored markdown and many Markdown extensions, including support for auto-links, extra emphasis (strikeout, sub/superscript etc.)

  • wwUtils::GetUniqueId()
    Allows generation of unique IDs based off a full or partial GUID value. Allows specification of a size that determines the size of the generated string between 15 and 32 characters where 32 is a full GUID.

  • wwUtils::SplitString()
    String utility like ALINES() to return a collection of strings that allows you to specify a length to break lines at. Uses ALINES[] to capture lines and splits lines longer than specified via MEMLINES(). Useful for any code parsing that needs to ensure string literals don't exceed 255 characters in length.

  • wwDotnetBridge now supports TLS 1.2
    wwDotnetBridge now sets the default HTTPS protocols settings to allow for SSL3, TLS1, TLS11 and TLS12. The default previously only allowed for SSL3 and TLS1. Overrides ServicePointManager.SecurityProtocol on initial load of the .NET runtime. This affects any .NET API called that uses HTTP including Web service calls.

  • < %: expr % > for Templates and Scripts
    Scripts and templates can now use automatic HTML encoding by using < %: expr % > instead of < %= EncodeHtml(expr) % > (spacing added for rendering). This makes it much easier to create XSS safe string output without more verbose syntax.

  • wwScripting::CompileAspScript
    Explicit function that can be used to compile a single ASP Script page using the same mechanism used to run the page.

  • wwUtils GetWords() Function
    Added a new function that parses a string of multi-word text into a collection of words.

  • wwDotnetBridge::InvokeMethodAsync() and wwDotnetBridge::InvokeStaticMethodAysnc()
    New method that allows invoking .NET methods on an instance asynchronously. You pass in callback object that receives OnCompleted() and OnError() callbacks to get notified of completion of the async operation.

  • wwUtils::HumanizedDate() Function
    Function that returns a human readable string date or time (English only) such as just now, 10 minutes ago, 3 hours ago, yesterday. Anything over a year is turned into a short date: May 1, 2015.

  • wwUtils::FormatValue and wwUtils::FormatString
    Two methods that use .NET string formatting to allow you to use sophisticated string formatting in FoxPro. Easily create nicely formatted date strings, MIME or ISO date formats, non-padded number strings formatted to decimal places with automatic localized formatting.

Breaking Changes for v6.10

  • Add Markdig.dll to your Distribution for Markdown Parsing
    The new Markdig Markdown parser requires a new DLL to be used. If you're using the MarkdownParser class or the Markdown() function, make sure to update to this DLL. You can remove CommonMark.dll.

Version 6.0

May 24th, 2016 • Breaking Changes

  • New wwEncryption Class
    Added a new class that provides two-way TripleDES encryption with a passphrase and and one-way hashes for MD5, SHA256, SHA384 and SHA512. Also includes Checksum generators for files and binary data. Based on wwDotnetBridge (requires .NET).

  • New Markdown Parser
    Added new MarkdownParser and MarkdownParserExtended classes that allow parsing of Markdown text to HTML. Markdown is a popular text editing format for developer Web sites and CMS systems that simplifies text input via the simple markup formatting of the Markdown Syntax.

  • wwDotnetBridge::InvokeMethodAsync() and wwDotnetBridge::InvokeStaticMethodAysnc()
    New methods that allows invoking any .NET methods on an instance asynchronously. You pass in callback object that receives OnCompleted() and OnError() callbacks to get notified of completion of the async operation.

  • ComValue::SetValueFromSystemConvert
    Method that allows wwDotnetBridge to set a value from the .NET System.Convert static class in a simpler way. Allows access to all System.Convert methods.

  • ComValue::SetUInt64 and SetUInt32 Methods
    Added additional type conversions for UInt64 and UInt32 values.

  • wwDotnetBridge::GetIndexedProperty()
    New method adds the ability to retrieve an indexed value from an IList based object like arrays and generic lists.

  • wwUtils::FormatValue and wwUtils::FormatString
    Two methods that use .NET string formatting to allow you to use sophisticated string formatting in FoxPro. Easily create nicely formatted date strings, MIME or ISO date formats, non-padded number strings formatted to decimal places with automatic localized formatting.

  • wwUtils HumanizedDate() Function
    Function that returns a human readable string date or time (English only) such as just now, 10 minutes ago, 3 hours ago, yesterday. Anything over a year is turned into a short date: May 1, 2015.

  • wwUtils CollectionToCursor and CusorToCollection Functions
    Added CollectionToCursor to reverse CursorToCollection SCATTER NAME style objects back into a table after updates. Useful for REST services where inbound data might need updating. Allows for an optional search expression. Cursor must exist and be open to import to.

  • wwUtils.FlattenSql
    Flattens a multi-line SQL into a single line that FoxPro can execute at runtime using Macro expressions. Useful to allow you to write SQL with TEXT/ENDTEXT without semicolons. Used internally in wwBusinessExecute and wwBusinessQuery.

  • wwUtils.IsNumber Returns .T. if the provided value is a number, or a string that contains only digists and decimal/seperators (. and ,). Useful in many data binding scenarios to determine validity of number input.

  • New wwJsonServiceClient Wrapper Class for Calling API Services
    This class provides an abstract CallService() method that automatically handles JSON serialization of parameters, making the HTTP call, and deserializing the JSON result back into a FoxPro class. The method makes the HTTP calls and handles all errors.

  • wwJsonSerializer::FormattedOutput Flag
    Added a flag to automatically format all output from Serialize() to be pretty formatted. This is a post-processing operation, so it adds some additional overhead, but can provide a nicer development experience.

  • Add cursor_legacy:cursorName to wwJsonSerializer table serialization
    You can now serialize cursors in the 'old' default format which included Rows and Count properties for the actual data array and record count. Provided for backwards compatibility.

Breaking Changes in v6.0

  • wwDotnetBridge default .NET Version changed to .NET 4
    Changed the default version that wwDotnetBridge uses if no version is specified to Version 4.0 (which includes all 4.x versions including 4.5.x and 4.6.x). If you want to use .NET 2.0 explicitly pass CREATEOBJECT("wwDotnetBridge","V2"). We recommend you always specify your version explicitly anyway and remember only the first load determines the runtime loaded. We switched to v4 because it is now the most used version of .NET and pre-installed on Windows 7 and newer.

  • wwJsonSerializer::Serialize "cursor:TCursor" now returns a raw Array
    wwJsonSerializer now serializes cursors that are created with cursor:CursorName syntax to a straight array. Previously this generated an object with a Count and Rows properties while cursor_rawarray:CursorName generated a raw array. The cursor:CursorName syntax now has the same behavior as the cursor_rawarray:CursorName syntax, which still works, but it is deprecated in favor of the shorter and more logic syntax.

Version 5.72

May 10th, 2015

  • wwJsonSerializer Large Object Performance Improvements
    Drastically improved performance for large objects by consolidating various object and array routines and removing result values from internal worker methods. For large objects performance can be up to 4 times faster than previously.

  • wwJsonSerializer::AssumeUtcDates
    Flag that allows you to override the UTC generation of dates being serialized. If .T. dates are not UTC adjusted and assumed to already be in UTC format. Useful if you store dates in UTC format in your application.

  • wwJsonSerializer Key Collection Serialization
    wwJsonSerializer now serializes Key/Value collections as an object map in JSON where each key is translated to a JSON property on the object. This can greatly simplify object creation for JSON results by simply creating a collection and adding properties and values rather than creating EMPTY objects and using ADDPROPERTY().

  • wwJsonSerializer::FormatJson()
    Added a new FormatJson() method to wwJsonSerializer that takes any valid JSON string as input and creates indented and more easily readable JSON output. Use for debugging, or error display or any time you prefer to have more easily readable JSON content after you've serialized objects to JSON.

  • **wwJsonSerializer::Property() **
    By default wwJsonSerializer only serializes lower case property names which can be a problem for interacting with services that expect proper cased property names. Added a Property() method to wwJsonSerializer that works in the same way as FoxPro's AddProperty() but also adds the property name to the PropertyNameOverrides property. This allows you to create properties on the object specified that are automatically serialized with the proper casing you used in the name applied.

*** ComValue.SetValueFromInvokeStaticMethod**
You can now set a ComValue from the result of a static method invocation. Useful if the result type of a static method returns a result that is not accessible in FoxPro - like a struct or generic object. You can then use GetProperty/GetPropertyEx to access values of that object.

  • Add support for ByRef Parameters with wwDotnetBridge::InvokeMethod/InvokeStaticMethod
    You can now call InvokeMethod/InvokeStaticMethod and use ComValue parameters pass and recover byref parameters. Previously ByRef parameters only worked on direct COM invokation - now you can use the indirect methods as long as you use ComValue objects for the ByRef parameters.

  • wwUtils::ForceTableRefresh
    Forces a cursor or table to refresh itself from disk reliably in high volume scenarios. Flushes buffers and forces the latest data to be re-read from disk. Used internally by Session object to ensure latest data is always read from disk.

Version 5.70

December 20th, 2014

  • New wwUtils CollectionToCursor and CusorToCollection Functions
    Added CollectionToCursor to reverse CursorToCollection SCATTER NAME style objects back into a table after updates. Useful for REST services where inbound data might need updating. Allows for an optional search expression. Cursor must exist and be open to import to.

  • Improvements to wwDotnetBridge
    Added better support for binary data, singles, and enum types passed as parameters to methods. Fixed error reporting to be more consistent across method calls. Parameter/value fixup now properly works for all indirect method and property access.

  • wwUtils::ForceTableRefresh
    Function to force VFP table read buffers to refresh, to ensure data read is not read from VFP's data cache. Internally this function moves the record pointer explicitly using GOTO RECNO().

  • wwSmtp::ClearAttachments()
    Add ClearAttachments method that clears out attachments added with AddAttachment(). This allows you to control attachment counts when adding during multiple SendMessage() calls on the same SMTP connection.

Version 5.68

Mar 15th, 2014

  • Address concerns for running on XP
    Change compiler target using Visual Studio 2013 runtimes for wwIpstuff. Recent Microsoft compiler changes have caused some failures on XP with certain C++ runtime functions missing. The VS2013 runtimes fix this and wwIPstuff embeds all the required dependencies for no runtime support requirements on XP through 8.1. Affects: wwIpStuff.dll, wwImaging.dll

  • Add support for wwDotnetBridge char parameters and results
    .NET char parameters can now be set with ComValue::SetChar() by passing ineither a string value or number. You can also use loBridge.ConvertToDotnetValue(val,"char")to create the ComValue structure. char results are converted to string when returned from .NET method calls.

  • wwJsonService now uses DeserializeJson
    Updated the Json Service interface to use DeserializeJson which uses the .NET JSON serializer for much more reliable JSON inputs to the service. Much improved performance for large objects.

  • Fix NULL Value Issue wwDotnetBridge
    Fixed bug with NULL values passed to wwDotnetBridge calls. COM Interop changes Fox NULLs to DbNulls which failed. Indirect methods now translate DbNull values to raw .NET nulls when passed. You can still pass DbNull with ComValue if needed.

  • Allow for 24 parameters in wwDotnetBridge::InvokeMethod
    Due to many, many support requests with Invokemethod requirements for an enormous amount of parameters, we bumped the supported parameter count to 24 parameters which is the maximum VFP allows (26 - 2 for object and method). For more parameters yet you can still use the InvokeMethod_ParameterArray() method. This is crazy but there you have it.

  • wwJsonSerializer::Property() to help with mixed case JSON Properties
    A helper that provides ADDPROPERTY() functionality and also adds any property names added to the PropertyNameOverrides list to automatically force proper case for properties exported into JSON. Unfortunately due to Visual FoxPro's reflecting limitations this override is necessary in order to match object structures to actual applications. This method reduces the explicit assignment in PropertyNameOverrides when dynamically creating classes for serialization.

  • wwAPI::MapNetworkDrive
    Added MapNetworkDrive method that allows mapping a network drive programmatically. This updated version supports specifying of username and password.

  • Many small bug fixes
    The bulk of this release are small bug fixes and tweaks for this small maintenance release.


© West Wind Technologies, 2018 • Updated: 09/25/18
Comment or report problem with topic