#include "Updater.h" #include NAMESPACE_UPP #ifdef PLATFORM_POSIX // scans for theme folders on which put/delete the mimetype icons // that's needed because if themed icons aren't available, the system // uses fallback ones instead of going through hicolor ones // btw...that must be some ill-brained people there // the routine builds a list of folders containing 32x32 icons // it would be of course better with svg, but Upp don't support them VectorUpdater::ScanTheme(void) { // gathers all subfolders of /usr/share/icons that contains 32x32 subfolder VectorsubFolders; FindFile ff("/usr/share/icons/*"); while(ff) { if( ff.IsFolder() && ff.GetName() != "." && ff.GetName() != ".." && DirectoryExists("/usr/share/icons/" + ff.GetName() + "/32x32/") ) subFolders.Add("/usr/share/icons/" + ff.GetName() + "/"); ff.Next(); } return subFolders; } // save an image as png inside multiple theme folders // retrieved with ScanTheme void Updater::InstallThemeIcons(Image const &img, String const &name) { Vectorfolders = ScanTheme(); String imgs = PNGEncoder().SaveString(img); for(int i = 0; i < folders.GetCount(); i++) { SaveFile(folders[i] + "32x32/mimetypes/" + name + ".png", imgs); SysStart("gtk-update-icon-cache", "--quiet " + folders[i]); } } // deletes all icons with given name inside folders retrieved with ScanTheme void Updater::RemoveThemeIcons(String const &name) { Vectorfolders = ScanTheme(); for(int i = 0; i < folders.GetCount(); i++) { FileDelete(folders[i] + "32x32/mimetypes/" + name + ".png"); SysStart("gtk-update-icon-cache", "--quiet " + folders[i]); } } // links application to OS shell // (i.e., add icon, menu entry, mimetype....) bool Updater::ShellLink(void) { bool success = true; // build desktop file String desktop = "[Desktop Entry]\n" "Type=Application\n" "Encoding=UTF-8\n" ; desktop += "Name=" + appName + "\n"; if(comment != "") desktop += "Comment=" + comment + "\n"; if(cathegory != "") desktop += "Categories=" + cathegory + "\n"; desktop += "Exec=" + appName + " %f\n"; if(!IsNull(icon)) desktop += "Icon=" + appName + "\n"; desktop += "MimeType=application/x-" + appName + ";\n"; desktop += "Terminal=false\n"; // stores desktop file in global applications folder success = SaveFile("/usr/share/applications/" + appName + ".desktop", desktop); // places icon in /usr/share/icons/hicolor/32x32/apps // maybe we should look for some better handling of icons... // by now, we support only 32x32 ones in default theme if(!IsNull(icon)) { success &= PNGEncoder().SaveFile("/usr/share/icons/hicolor/32x32/apps/" + appName + ".png", icon); InstallThemeIcons(icon, "application-x-" + appName); } // add mime type for supported extensions String mime = "\n" "\n" "\n"; if(comment != "") mime += "" + comment + "\n"; for(int i = 0; i < extensions.GetCount(); i++) mime += "\n"; mime += "\n" "\n" ; success &= SaveFile("/usr/share/mime/packages/" + appName + ".xml", mime); success &= (SysStart("update-mime-database", "/usr/share/mime") != -1); // updates desktop database to make it sense the changes in mimetype and application success &= (SysStart("update-desktop-database", "") != -1); return success; } // unlinks application bool Updater::ShellUnlink(void) { bool success = true; // remove desktop file FileDelete("/usr/share/applications/" + appName + ".desktop"); // remove icon bool appIcon = FileExists("/usr/share/icons/hicolor/32x32/apps/" + appName + ".png"); if(appIcon) FileDelete("/usr/share/icons/hicolor/32x32/apps/" + appName + ".png"); RemoveThemeIcons("application-x-" + appName); if(FileExists("/usr/share/mime/packages/" + appName + ".xml")) { FileDelete("/usr/share/mime/packages/" + appName + ".xml"); SysStart("update-mime-database", "/usr/share/mime"); } // updates desktop database to make it sense the changes in mimetype and application SysStart("update-desktop-database", ""); return success; } #endif END_UPP_NAMESPACE