Search code examples
delphijvcl

JEDI JVCL TJvProgramVersionCheck How to use HTTP


I'm wondering if someone has an example on how can be used the TJvProgramVersionCheck component performing the check via HTTP.

The example in the JVCL examples dir doesn't show how to use HTTP

thank you


Solution

  • The demo included in your $(JVCL)\Examples\JvProgramVersionCheck folder seems to be able to do so. Edit the properties of the JVProgramVersionHTTPLocation, and add the URL to it's VersionInfoLocation list (a TStrings). You can also set up any username, password, proxy, and port settings if needed.

    You also need to add an OnLoadFileFromRemote event handler. I don't see anything in the demo that addresses that requirement, but the source code says:

    { Simple HTTP location class with no http logic.
    The logic must be implemented manually in the OnLoadFileFromRemote event }
    

    It appears from the parameters that event receives that you do your checking there:

    function TJvProgramVersionFTPLocation.LoadFileFromRemoteInt(
      const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
      ABaseThread: TJvBaseThread): string;
    

    So you'll need to add an event handler for this event, and then change the TJVProgramVersionCheck.LocationType property to pvltHTTP and run the demo. After testing, it seems you're provided the server and filename for the remote version, and a local path and temp filename for the file you download. The event handler's Result should be the full path and filename of the newly downloaded file. Your event handler should take care of the actual retrieval of the file.

    There are a couple of additional types defined in JvProgramVersionCheck.pas, (TJvProgramVersionHTTPLocationICS and TJvProgramVersionHTTPLocationIndy, both protected by compiler defines so they don't exist in the default compilation. However, setting the ICS related define resulted in lots of compilation errors (it apparently was written against an old version of ICS), and setting the Indy define (and then setting it again to use Indy10 instead) allowed it to compile but didn't change any of the behavior. I'm going to look more into this later today.

    Also, make sure that the VersionInfoLocation entry is only the URL (without the filename); the filename itself goes in the VersionInfoFileName property. If you put it in the URL, it gets repeated (as in http://localhost/Remote/ProjectVersions_http.iniProjectVersions_http.ini, and will fail anyway. (I found this while tracing through the debugger trying to solve the issue.)

    Finally...

    The solution is slightly (but not drastically) complicated. Here's what I did:

    Copy JvProgramVersionCheck.pas to the demo folder. (It needs to be recompiled because of the next step.)

    Go to Project->Options->Directories and Conditionals, and add the following line to the DEFINES entry:

    USE_3RDPARTY_INDY10;USE_THIRDPARTY_INDY;
    

    Delete the JvProgramVersionHTTPLocation component from the demo form.

    Add a new private section to the form declaration:

    private
      HTTPLocation: TJvProgramVersionHTTPLocationIndy;
    

    In the FormCreate event, add the following code:

    procedure TForm1.FormCreate(Sender: TObject);
    const
      RemoteFileURL = 'http://localhost/';
      RemoteFileName = 'ProjectVersions_http.ini';
    begin
      HTTPLocation := TJvProgramVersionHTTPLocationIndy.Create(Self); // Self means we don't free
      HTTPLocation.VersionInfoLocationPathList.Add(RemoteFileURL);
      HTTPLocation.VersionInfoFileName := RemoteFileName;
      ProgramVersionCheck.LocationHTTP := HTTPLocation;
      ProgramVersionCheck.LocationType := pvltHTTP;
      VersionCheck;  // This line is already there
    end;
    

    In the ProgramVersionCheck component properties, expand the VersionInfoFileOptions property, and change the FileFormat from hffXML to hffIni.

    Delete or rename the versioninfolocal.ini from the demo's folder. (If you've run the app once, it stores the http location info, and the changes above are overwritten. This took a while to track down.)

    Make sure your local http server is running, and the ProjectVersions_http.ini file is in the web root folder. You should then be able to run the demo. Once the form appears, click on the Edit History button to see the information retrieved from the remote version info file. You'll also have a new copy of the versioninfolocal.ini that has the saved configuration info you entered above.