#include "asset.hpp" #include "util.hpp" #include #include // for mkdir #include "../ext/osdialog/osdialog.h" #if ARCH_MAC #include #include #endif #if ARCH_WIN #include #include #endif #if ARCH_LIN #include #include #include #endif namespace rack { std::string assetGlobal(std::string filename) { std::string dir; #if defined(RELEASE) #if ARCH_MAC CFBundleRef bundle = CFBundleGetMainBundle(); assert(bundle); CFURLRef resourcesUrl = CFBundleCopyResourcesDirectoryURL(bundle); char buf[PATH_MAX]; Boolean success = CFURLGetFileSystemRepresentation(resourcesUrl, TRUE, (UInt8 *)buf, sizeof(buf)); assert(success); CFRelease(resourcesUrl); dir = buf; #endif #if ARCH_WIN // Must launch Rack with the "Start In" directory as the global directory dir = "."; #endif #if ARCH_LIN // TODO For now, users should launch Rack from their terminal in the global directory dir = "."; #endif #else // RELEASE dir = "."; #endif // RELEASE return dir + "/" + filename; } std::string assetLocal(std::string filename) { std::string dir; #if defined(RELEASE) #if ARCH_MAC // Get home directory struct passwd *pw = getpwuid(getuid()); assert(pw); dir = pw->pw_dir; dir += "/Documents/Rack"; mkdir(dir.c_str(), 0755); #endif #if ARCH_WIN // Get "My Documents" folder char buf[MAX_PATH]; HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, buf); assert(result == S_OK); dir = buf; dir += "/Rack"; CreateDirectory(dir.c_str(), NULL); #endif #if ARCH_LIN const char *home = getenv("HOME"); if (!home) { struct passwd *pw = getpwuid(getuid()); assert(pw); home = pw->pw_dir; } dir = home; dir += "/.Rack"; mkdir(dir.c_str(), 0755); #endif #else // RELEASE dir = "."; #endif // RELEASE return dir + "/" + filename; } std::string assetPlugin(Plugin *plugin, std::string filename) { assert(plugin); return plugin->path + "/" + filename; } } // namespace rack