diff --git a/CMakeLists.txt b/CMakeLists.txt index 35e54560c..939a6da36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -848,6 +848,7 @@ add_subdirectory( licenses ) add_subdirectory( dnssd ) add_subdirectory( pics ) add_subdirectory( mimetypes ) +add_subdirectory( kfile-plugins ) ##### install import cmake modules ############### diff --git a/kfile-plugins/CMakeLists.txt b/kfile-plugins/CMakeLists.txt new file mode 100644 index 000000000..61e9dd6a3 --- /dev/null +++ b/kfile-plugins/CMakeLists.txt @@ -0,0 +1,12 @@ +################################################# +# +# (C) 2012 Timothy Pearson +# kb9vqf (AT) pearsoncomputing.net +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +tde_conditional_add_subdirectory( HAVE_ELFICON elf ) diff --git a/kfile-plugins/elf/CMakeLists.txt b/kfile-plugins/elf/CMakeLists.txt new file mode 100644 index 000000000..91e9d5e32 --- /dev/null +++ b/kfile-plugins/elf/CMakeLists.txt @@ -0,0 +1,42 @@ +################################################# +# +# (C) 2012 Timothy Pearson +# kb9vqf (AT) pearsoncomputing.net +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_BINARY_DIR} + ${TDE_INCLUDE_DIR} + ${TQT_INCLUDE_DIRS} + ${CMAKE_SOURCE_DIR}/tdecore + ${CMAKE_BINARY_DIR}/tdecore + ${CMAKE_SOURCE_DIR}/tdeui + ${CMAKE_BINARY_DIR}/tdeui + ${CMAKE_SOURCE_DIR}/kio/kio + ${LIBR_INCLUDEDIR} +) + +link_directories( + ${TQT_LIBRARY_DIRS} + ${LIBR_LIBDIR} +) + +#### other data ################################# + +install( FILES kfile_elf.desktop DESTINATION ${SERVICES_INSTALL_DIR} ) + + +#### kfile_elf (module) ######################### + +tde_add_kpart( kfile_elf AUTOMOC + SOURCES kfile_elf.cpp + EMBED tdelficon-static + LINK kio-shared ${LIBR_LIBRARIES} + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/kfile-plugins/elf/kfile_elf.cpp b/kfile-plugins/elf/kfile_elf.cpp new file mode 100644 index 000000000..f816cdb35 --- /dev/null +++ b/kfile-plugins/elf/kfile_elf.cpp @@ -0,0 +1,159 @@ +/* This file is part of the KDE project + * Copyright (C) 2012 Timothy Pearson + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include +#include "kfile_elf.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "tdelficon.h" + +#if !defined(__osf__) +#include +#else +typedef unsigned long uint32_t; +typedef unsigned short uint16_t; +#endif + +TQString elf_get_resource(libr_file *handle, char *section_name) +{ + size_t buffer_size = 0; + char *buffer = NULL; + TQString result = TQString("") + i18n("not set") + TQString(""); + + /* Get the resource from the ELF binary */ + if(!libr_size(handle, section_name, &buffer_size)) + { + kdWarning() << "failed to obtain ELF resource size: " << libr_errmsg() << endl; + return result; + } + /* Get the resource from the ELF file */ + buffer = (char *) malloc(buffer_size); + if(!libr_read(handle, section_name, buffer)) + { + kdWarning() << "failed to obtain ELF resource: " << libr_errmsg() << endl; + goto fail; + } + result = buffer; + +fail: + free(buffer); + + return result; +} + +typedef KGenericFactory ElfFactory; + +K_EXPORT_COMPONENT_FACTORY(kfile_elf, ElfFactory( "kfile_elf" )) + +KElfPlugin::KElfPlugin(TQObject *parent, const char *name, + const TQStringList &args) + + : KFilePlugin(parent, name, args) +{ + KFileMimeTypeInfo* info = addMimeTypeInfo( "application/x-executable" ); + + KFileMimeTypeInfo::GroupInfo* group = 0L; + KFileMimeTypeInfo::GroupInfo* group2 = 0L; + + group = addGroupInfo(info, "Technical", i18n("Embedded Metadata")); + group2 = addGroupInfo(info, "Icon", i18n("Embedded Icon(s)")); + + KFileMimeTypeInfo::ItemInfo* item; + + item = addItemInfo(group, "Name", i18n("Internal Name"), TQVariant::String); + item = addItemInfo(group, "Description", i18n("Description"), TQVariant::String); + item = addItemInfo(group, "License", i18n("License"), TQVariant::String); + item = addItemInfo(group, "Copyright", i18n("Copyright"), TQVariant::String); + item = addItemInfo(group, "Authors", i18n("Author(s)"), TQVariant::String); + item = addItemInfo(group, "Product", i18n("Product"), TQVariant::String); + item = addItemInfo(group, "Organization", i18n("Organization"), TQVariant::String); + item = addItemInfo(group, "Version", i18n("Version"), TQVariant::String); + item = addItemInfo(group, "DateTime", i18n("Creation Date/Time"), TQVariant::String); + item = addItemInfo(group, "Notes", i18n("Comments"), TQVariant::String); + + item = addItemInfo(group2, "EmbeddedIcon", i18n("Icon Name(s)"), TQVariant::String); +} + + +bool KElfPlugin::readInfo( KFileMetaInfo& info, uint what) +{ + libr_icon *icon = NULL; + libr_file *handle = NULL; + libr_access_t access = LIBR_READ; + + if((handle = libr_open(const_cast(info.path().ascii()), access)) == NULL) + { + kdWarning() << "failed to open file" << info.path() << endl; + } + + KFileMetaInfoGroup group = appendGroup(info, "Technical"); + KFileMetaInfoGroup group2 = appendGroup(info, "Icon"); + + appendItem(group, "Name", elf_get_resource(handle, ".metadata_name")); + appendItem(group, "Description", elf_get_resource(handle, ".metadata_description")); + appendItem(group, "License", elf_get_resource(handle, ".metadata_license")); + appendItem(group, "Copyright", elf_get_resource(handle, ".metadata_copyright")); + appendItem(group, "Authors", elf_get_resource(handle, ".metadata_authors")); + appendItem(group, "Product", elf_get_resource(handle, ".metadata_product")); + appendItem(group, "Organization", elf_get_resource(handle, ".metadata_organization")); + appendItem(group, "Version", elf_get_resource(handle, ".metadata_version")); + appendItem(group, "DateTime", elf_get_resource(handle, ".metadata_datetime")); + appendItem(group, "Notes", elf_get_resource(handle, ".metadata_notes")); + + TQString iconListing; + + iconentry *entry = NULL; + iconlist icons; + if(!get_iconlist(handle, &icons)) + { + // Failed to obtain a list of ELF icons + } + while((entry = get_nexticon(&icons, entry)) != NULL) + { + if (iconListing.isEmpty()) { + iconListing = entry->name; + } + else { + iconListing = iconListing.append("

").append(entry->name); + } + break; + } + if (iconListing.isEmpty()) { + iconListing = TQString("") + i18n("not set") + TQString(""); + } + + appendItem(group2, "EmbeddedIcon", iconListing); + + libr_close(handle); + + return true; +} + +#include "kfile_elf.moc" diff --git a/kfile-plugins/elf/kfile_elf.desktop b/kfile-plugins/elf/kfile_elf.desktop new file mode 100644 index 000000000..6bc6dd489 --- /dev/null +++ b/kfile-plugins/elf/kfile_elf.desktop @@ -0,0 +1,66 @@ +[Desktop Entry] +Type=Service +Name=ELF Info +Name[af]=ELF Inligting +Name[ar]=معلومات ELF +Name[br]=Titouroù ELF +Name[ca]=Informació de ELF +Name[cs]=ELF info +Name[cy]=Gwybodaeth ELF +Name[da]=ELF-info +Name[de]=ELF-Info +Name[el]=Πληροφορίες ELF +Name[eo]=ELF-informo +Name[es]=Info ELF +Name[et]=ELF info +Name[fa]=اطلاعات ELF +Name[fi]=ELF-tiedot +Name[fr]=Informations ELF +Name[ga]=Eolas faoi ELF +Name[gl]=Inf. ELF +Name[he]=מידע ELF +Name[hi]=ELF जानकारी +Name[hr]=ELF informacije +Name[hu]=ELF-jellemzők +Name[is]=ELF upplýsingar +Name[it]=Informazioni ELF +Name[ja]=ELF 情報 +Name[kk]=ELF мәліметі +Name[km]=ព័ត៌មាន ELF +Name[lt]=ELF informacija +Name[ms]=Maklumat ELF +Name[nds]=ELF-Info +Name[ne]=ELF सूचना +Name[nl]=ELF-info +Name[nn]=ELF-info +Name[nso]=Tshedimoso ya ELF +Name[pa]=ELF ਜਾਣਕਾਰੀ +Name[pl]=Informacja o pliku ELF +Name[pt]=Informação do ELF +Name[pt_BR]=Informação sobre ELF +Name[ro]=Informaţii ELF +Name[ru]=Информация о ELF +Name[se]=ELF-dieđut +Name[sl]=Podatki o ELF +Name[sr]=ELF информације +Name[sr@Latn]=ELF informacije +Name[sv]=ELF-information +Name[ta]=ELF தகவல் +Name[tg]=Иттилоот оиди ELF +Name[th]=ข้อมูลแฟ้ม ELF +Name[tr]=ELF Bilgisi +Name[uk]=Інформація по ELF +Name[uz]=ELF haqida maʼlumot +Name[uz@cyrillic]=ELF ҳақида маълумот +Name[ven]=Mafhungo ELF +Name[wa]=Informåcion sol imådje ELF +Name[xh]=Ulwazi lwe ELF +Name[zh_CN]=ELF 信息 +Name[zh_HK]=ELF 資訊 +Name[zh_TW]=ELF 資訊 +Name[zu]=Ulwazi lwe-ELF +ServiceTypes=KFilePlugin +X-KDE-Library=kfile_elf +MimeType=application/x-executable +PreferredItems=Name,Description,License,Copyright,Authors,Product,Organization,Version,DateTime,Notes" +SupportsThumbnail=false \ No newline at end of file diff --git a/kfile-plugins/elf/kfile_elf.h b/kfile-plugins/elf/kfile_elf.h new file mode 100644 index 000000000..def7e50d9 --- /dev/null +++ b/kfile-plugins/elf/kfile_elf.h @@ -0,0 +1,50 @@ +/* This file is part of the KDE project + * Copyright (C) 2002 Shane Wright + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef __KFILE_BMP_H__ +#define __KFILE_BMP_H__ + +#include + +// Elven things +extern "C" { + #include + #include +} + +#include + +#include +#include +#include + +class TQStringList; + +class KElfPlugin: public KFilePlugin +{ + Q_OBJECT + TQ_OBJECT + +public: + KElfPlugin( TQObject *parent, const char *name, const TQStringList& args ); + + virtual bool readInfo( KFileMetaInfo& info, uint what); +}; + +#endif