Content Manager
Qui n'a jamais rêvé d'une application qui se met à jour toute seule?
Le développeur prépare son application, qui est dans un dossier.
Lorsqu'il lance l'exe développeur, ça scanne le projet et uploade
en FTP les changements sur un serveur web.
Quand un client lance son application, elle vérifie si elle
est à jour ou pas pour éventuellement se mettre à jour (voir ordinogramme ci-dessous).
Download C source (57.2Ko)
il manque les sources web, le GUI FLTK, ils sont probablement encore dans le moteur 3D
donc à retrouver ou refaire ...
README
Basically, as a developer you are working on a project, located inside
a directory. When you want to release your application to all the clients,
simply launch the developer exe. It will scan the project folder to detect
changes, and invite you to upload files on the web server via FTP. Done.
Next, any client who starts the program will check if the local version
number is the latest. If not, download the list of files of the latest version,
and download only files that are more recent, or new. This means all clients
are using the exact same version.
Surtout pas d'espace dans les noms de fichiers/dossiers!
ALGORITHM, DEVELOPER SIDE
*************************
First step : create the list of files, stored in xxx/version/files.
This list is what clients will request in order to check their local content.
The content of the file looks like this:
[demo]
[demo/maps]
demo/maps/sk8.bsp 1242636520 929868 7a9071276cb3645fb6c66dbbb79d3092
demo/maps/sk8.jpg 1242575742 290159 d03d864b7f43db9ce34df5f720509d0e
demo/maps/SK8.map 1242636490 251139 3c0969feb1e22a7794c0fb0143854ace
[demo/maps/tools]
demo/maps/tools/clean.bat 1242474634 69 86ad0060e2a85a7bd5f5a9b1d69f7e30
demo/maps/tools/ase.bat 1242461706 475 a6ba8dd5e369f8c8095fa8dd7fc64bb1
demo/core.dll 1242843896 291840 82bef32153657dc25dc439a3b500a614
demo/GUI.dll 1241041448 104960 82bef32153657dc25dc439a3b500a614
demo/Irrlicht.dll 1229237360 5831715 82bef32153657dc25dc439a3b500a614
demo/platoon.exe 1242646904 386048 82bef32153657dc25dc439a3b500a614
[demo/effects]
demo/effects/split.c 1170556454 1174 b66dc3e130fd178fa25f8d082ed161f1
demo/effects/developer.c 1244016362 9819 a5b71066a7d4d853a5725913495f4d72
demo/bx_net.dll 1244225498 9728 82bef32153657dc25dc439a3b500a614
[demo/include]
demo/include/HTTP.h 1244229540 2104 51ee3f50fd21766a5cd6512eaab01505
demo/include/TCPsocket.h 1244226398 1767 ff5ee7dfb8ab732c8f477eaead31c621
demo/include/bx_net.h 1244226398 868 3ca04506aefc8a121b2531b28552921e
Each entry is a folder, or a file.
* A folder is recognized by the usage of a [ beginning the line.
* A file entry: Relative path, last modification time, size (bytes), and md5
Second step : determine what files have been
(+) added
(-) removed
(>) modified
(=) unchanged
HOW TO USE IT, DEVELOPER SIDE
*****************************
As the developer of your project, you manage the files on your development
machine. One folder is monitored by the developer program : this is the
project folder.
You do absolutely what you want in the project folder :
add/remove/modifiy files, everything you want.
Then, when you want to release yuor project to the all the clients at once,
you simply launch the developer program. it will search for modifications on
the project (the operating system stores the timestamp of the last modification
of a file).
CMGR-developer.exe does generate or overwrite the xxx/version folder and its
content, which describe the version.
When it is done, open your FTP program and rename the xxx/version folder to
prevent clients from being updated (they'll see the message "please try later")
then upload files that have been modified locally.
Endly, upload the version folder onto your HTTP server to indicate to clients
that a new version is available. Any client who starts the program will get
the update before launching the main application!
CLIENT SIDE
***********
When a client is launching the application, it connects to the web server to
get the latest version number. If it is different from the version number
on disk, then he gets the list of files of the latest version, to compare each
entry timestamp to the timestamp of the local file, to download it a more
recent version is available.
Also an md5 comparison is done by the program just after the download, to be
sure the file was not corrupted during download. This is good if a download is
brutally stopped (electricity cut for example), it is not resumed but
redownloaded entirely.
When the application is started, the local arborescence is scanned in order
to detect if some files have been deleted, or modified. If so, the original
is downloaded from server.
I think this is good to prevent hacking, a must-have.
For example if you delete a file by mistake, the program will see it, and
download automagically the file before launching the application. you won't
even notice it.
If a client wants to "reset" and do a full reinstall, he just has to
delete the version folder. Simple as that. Or delete absolutely everything,
except the updater.
That means all clients have the same copy, the latest.
But the clients can also have custom content, ignored by the updater.
If someone buys the version 1, then waits six months without using it, the next
launch it will automatically update to the latest version, say 247 and it will
be compatible with other clients.
Moreover I used this example because the client will not download and install
several updates from version 1 to 247 but it will download directly what it
needs from the latest version.
So far this might seem simple, but it is rock solid when it comes to manage
hundreds of users not having the same files, or using the same network
protocol : the updater solves all this from start.
It is cool for users because they can benefit of multiple updates, without
worrying about what file to download and where to put files... All is done
automatically, and done fast.
FINAL NOTES
***********
I wanted the best algorithm, the fatest. The kind of application that does not
do things that are not needed, like download/overwrite unneeded files, or
scan the disk without reason. An intelligent application that takes decisions
depending on the situation.
Both approaches are done via a library, to make it portable between platforms,
and to use this middleware to present it with a GUI or 3D application, showing
a progress bar.