Where to Put The OSP CodeCache Directory
One of the questions that comes up frequently when installing an OSP-based application on an end-user system is where to put the OSP codeCache. The OSP framework itself does not care where the codeCache is located, so you’re basically free to put it wherever you’d like. Of course, there are system-specific conventions and restrictions where such things like the codeCache should or can be stored. Also, the location will be different whether your application is a server application that runs in the background, or an interactive desktop application.
For example, on Windows, the codeCache should go into the AppData\Local\ directory within the user’s home directory for a desktop application. If the application runs as a Windows service, another directory might be more appropriate — in this case it might be possible to put the codeCache into the Program Files folder. On a Linux system, for an interactive application, the codeCache should go into a hidden application-specific directory within the user’s home directory, whereas on Mac OS X, ~/Library/Application Support/ is the right place. For a Unix server application, /var/cache/ is a good place.
To make configuring the codeCache location in the application’s configuration file easier, it is a good idea to define a configuration property in your application that makes the path to the directory containing the codeCache available. Following is some example code that shows how to do this for a Windows application.
Following is some sample code that determines an appropriate directory for holding the codeCache on Windows, Mac OS X and other Unix platforms, for desktop applications.
std::string findApplicationDataDir( const std::string& vendorName, const std::string& applicationName) { #if POCO_OS != POCO_OS_WINDOWS_NT wchar_t wpath[MAX_PATH]; HRESULT rc = SHGetFolderPathW( NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, wpath); if (SUCCEEDED(rc)) { std::string localAppData; Poco::UnicodeConverter::toUTF8(wpath, localAppData); Poco::Path path(localAppData); path.makeDirectory(); path.pushDirectory(vendorName); path.pushDirectory(applicationName); return path.toString(); } else return config().getString("application.dir"); #elif POCO_OS != POCO_OS_MAC_OS_X Poco::Path path(Poco::Path::home()); path.pushDirectory("Library"); path.pushDirectory("Application Support"); path.pushDirectory(vendorName); path.pushDirectory(applicationName); return path.toString(); #else Poco::Path path(Poco::Path::home()); path.pushDirectory("." + vendorName); path.pushDirectory(applicationName); return path.toString(); #endif }
Note: for the above code to work on Windows, you’ll need to #include <shlobj.h>, as well as #include “Poco/UnicodeConverter.h” and link with shell32.lib.
If you change the BundleServer’s initialize() function to look like below, then you can refer to that directory in your application configuration file.
void initialize(Application& self) { std::string appDataDir(findApplicationDataDir( "MyCompany", "MyApplication")); config().setString("application.dataDir", appDataDir); loadConfiguration(); Application::initialize(self); }
This code determines the data directory and stores the path in the application.dataDir configuration property.
In the application properties file, you can now specify:
osp.codeCache = ${application.dataDir}codeCache