The structure of an Add-In is important to what we are trying to accomplish here.
I could put all my code as part of a Console Tab and have people manually getting it working.
That would no doubt work, but its kind of lame and falls short of expectations.
So we want an application that reacts in real-time to folder and file changes, but is also able to be scheduled ( say for 3am after a defrag or back-up session).
This requires a number of different application blocks, each an application in its own right.
To see how an Add-In works in code, the WHS Photo Uploader for Flickr is hosted on Codeplex. Unfortunately its a totally different application for a totally different service. But I did get a good look at the Console and Settings Tabs to see what the code would/should look like.
If you want to download and run it, I’d download the WIX Installer XML for Visual Studio 2005 to allow the Add-in’s installer to be recognised by VS and compiled.
So the lesson is that Console Code is run from the Console (doh!) and any file monitoring code will only work while the console is running.
So we’ll require a service to be running to monitor our gallery folders and record the events to our Master XML file. Hence this application will consists of XML code and our FileWatcher Object. It will need to use the Windows API to allow it to be installed and run as a service.
Then, we want to schedule our uploads so that they are not taking over your broadband connection. We could use System.Threading to calculate the number of seconds remaining and have the timer call our upload method once the time is reached.
However, we want to keep things as simple as possible. This means using windows’ Scheduled Tasks to call our uploader (an exe file). Scheduling Tasks is for some reason not in the .Net Framework 2.0 so we’ll use a library to wrap all the C++ Interop code. There is a CodeProject article here on it with the library. This also means we can run tasks with a users username and password (i.e “Administrator” and whatever the password is) so tasks will run, in theory, even when no one is logged in.
So we have three applications here, all rather trivial:
- The Console Tab and Settings Tab with code for usernames/passwords as well as rescheduling uploads and manually starting the uploader. I have the idea of getting album stats and displaying the charts by using the Google Charts API, but that’s for version 1.1.
- The Service app that will take file and folder change events and writes them to our Master Settings file. This runs independent of any user being logged in.
- The Uploader that is scheduled to run at such and such a time to execute the events in our Settings file on the server using he SmugMug API. Also runs independent of any users being logged in.
Slowly but surely the Add-in progresses.