summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--kio/kio/tdelficon.cpp61
-rw-r--r--kio/kio/tdelficon.h48
3 files changed, 111 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 86c2fcdda..4e8a6902c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -729,9 +729,9 @@ if( WITH_ELFICON )
if( NOT LIBR_FOUND )
message(FATAL_ERROR "\nelficon support was requested, but libr was not found on your system" )
endif( NOT LIBR_FOUND )
- if( LIBR_VERSION != 0.6.0 )
+ if( NOT "${LIBR_VERSION}" STREQUAL "0.6.0" )
message(FATAL_ERROR "\nelficon support was requested, but the libr version on your system may not be compatible with TDE" )
- endif( LIBR_VERSION != 0.6.0 )
+ endif( NOT "${LIBR_VERSION}" STREQUAL "0.6.0" )
set( HAVE_ELFICON 1 )
endif( )
diff --git a/kio/kio/tdelficon.cpp b/kio/kio/tdelficon.cpp
new file mode 100644
index 000000000..8c5a0d9de
--- /dev/null
+++ b/kio/kio/tdelficon.cpp
@@ -0,0 +1,61 @@
+#include "tdelficon.h"
+
+#include <cstring>
+
+/*
+ * Obtain an existing icon resource list
+ */
+int get_iconlist(libr_file *file_handle, iconlist *icons)
+{
+ if(icons == NULL)
+ {
+ /* Need to be able to return SOMETHING */
+ return false;
+ }
+ /* Obtain the icon resource list */
+ icons->buffer = libr_malloc(file_handle, ICON_SECTION, &(icons->size));
+ if(icons->buffer == NULL)
+ return false;
+ return true;
+}
+
+/*
+ * Get the next entry in an icon resource list
+ */
+iconentry *get_nexticon(iconlist *icons, iconentry *last_entry)
+{
+ size_t i;
+
+ /* The icon list is needed both for the data buffer and for a call-specific iconentry instance */
+ if(icons == NULL)
+ return NULL;
+ /* If this is the first call (last_entry == NULL) then return the first entry */
+ if(last_entry == NULL)
+ icons->entry.offset = sizeof(uint32_t)+sizeof(UUID);
+ else
+ icons->entry.offset += icons->entry.entry_size;
+ /* Check to see if we've run out of entries */
+ if(icons->entry.offset >= icons->size)
+ return NULL;
+ i = icons->entry.offset;
+ memcpy(&(icons->entry.entry_size), &(icons->buffer[i]), sizeof(uint32_t));
+ i += sizeof(uint32_t);
+ icons->entry.type = (libr_icontype_t)icons->buffer[i];
+ i += sizeof(unsigned char);
+ switch(icons->entry.type)
+ {
+ case LIBR_SVG:
+ icons->entry.icon_size = 0;
+ icons->entry.name = &(icons->buffer[i]);
+ break;
+ case LIBR_PNG:
+ memcpy(&(icons->entry.icon_size), &(icons->buffer[i]), sizeof(uint32_t));
+ i += sizeof(uint32_t);
+ icons->entry.name = &(icons->buffer[i]);
+ break;
+ default:
+ /* Invalid entry type */
+ return NULL;
+ }
+ return &(icons->entry);
+} \ No newline at end of file
diff --git a/kio/kio/tdelficon.h b/kio/kio/tdelficon.h
new file mode 100644
index 000000000..7b17df818
--- /dev/null
+++ b/kio/kio/tdelficon.h
@@ -0,0 +1,48 @@
+
+#include <alloca.h>
+#include <stdint.h>
+#include <cstdlib>
+
+extern "C" {
+ #include <libr-icons.h>
+
+ // BEGIN HACK
+ // libr does not export these structures and defines,
+ // but we need access to them to make the UI behave sanely
+ // Keep them in sync with libr and all should be OK
+
+ // Valid for libr version 0.6.0
+ // See libr detection code in ConfigureChecks.cmake
+
+ typedef uint32_t ID8;
+ typedef uint16_t ID4;
+ typedef struct {uint64_t p:48;} __attribute__((__packed__)) ID12;
+
+ typedef struct {
+ ID8 g1;
+ ID4 g2;
+ ID4 g3;
+ ID4 g4;
+ ID12 g5;
+ } __attribute__((__packed__)) UUID;
+
+ typedef struct {
+ char *name;
+ size_t offset;
+ size_t entry_size;
+ libr_icontype_t type;
+ unsigned int icon_size;
+ } iconentry;
+
+ typedef struct{
+ size_t size;
+ char *buffer;
+ iconentry entry;
+ } iconlist;
+
+ #define ICON_SECTION ".icon"
+ // END HACK
+}
+
+int get_iconlist(libr_file *file_handle, iconlist *icons);
+iconentry *get_nexticon(iconlist *icons, iconentry *last_entry); \ No newline at end of file