commit d23de0ce4032842d2f9ccd98f80f679f3e57e652 Author: Jos van den Oever Date: Wed Aug 2 23:29:32 2017 +0200 Initial commit diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..3ae6917 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,66 @@ +project (RMail) + +cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) +cmake_policy(SET CMP0046 NEW) +cmake_policy(SET CMP0063 NEW) +set(QT_MIN_VERSION "5.3.0") +set(KF5_MIN_VERSION "5.2.0") + +find_package(ECM 1.0.0 REQUIRED NO_MODULE) +set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +include(ExternalProject) +include(KDEInstallDirs) +include(KDECMakeSettings) +include(KDECompilerSettings) +include(FeatureSummary) + +set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/Rust) + +ExternalProject_Add( + rust + DOWNLOAD_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND cargo build + COMMAND cargo build --release + BINARY_DIR "${CMAKE_SOURCE_DIR}/common-rust" + INSTALL_COMMAND "" + LOG_BUILD ON) + + +# Find Qt modules +find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS + Core # QCommandLineParser, QStringLiteral + Widgets # QApplication +) + +# Find KDE modules +find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS + CoreAddons # KAboutData + I18n # KLocalizedString + WidgetsAddons # KMessageBox +) + +feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) + +set(RMail_SRCS src/main.cpp) + +add_executable(RMail ${RMail_SRCS}) + +add_dependencies(RMail rust) + +target_link_libraries(RMail + Qt5::Widgets + KF5::CoreAddons + KF5::I18n + KF5::WidgetsAddons + debug "${CMAKE_SOURCE_DIR}/common-rust/target/debug/librust.a" + optimized "${CMAKE_SOURCE_DIR}/common-rust/target/release/librust.a" +) + +set_target_properties(RMail PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON +) + +install(TARGETS RMail ${INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/README.md b/README.md new file mode 100644 index 0000000..298c5c2 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# RMail + +A very simple proof of concept to parse mail with rust and show it in a qt ui. diff --git a/common-rust/Cargo.toml b/common-rust/Cargo.toml new file mode 100644 index 0000000..780c7a4 --- /dev/null +++ b/common-rust/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "rust" +version = "0.1.0" + +[dependencies] +libc = "*" + +[lib] +name = "rust" +crate-type = ["staticlib"] + diff --git a/common-rust/src/lib.rs b/common-rust/src/lib.rs new file mode 100644 index 0000000..089b71c --- /dev/null +++ b/common-rust/src/lib.rs @@ -0,0 +1,51 @@ +extern crate libc; + +use std::slice; +use std::ffi::CString; +use std::ffi::CStr; +use libc::{uint8_t, c_char, uint32_t, uint16_t, size_t}; + +pub struct Hello { + hello: String +} + +#[no_mangle] +pub extern fn add(lhs: u32, rhs: u32) -> u32 { + lhs + rhs +} + +#[no_mangle] +pub extern fn hello_new() -> *mut Hello { + let s = String::from("hello"); + Box::into_raw(Box::new(Hello { hello: s })) +} + +#[no_mangle] +pub extern fn hello_set(ptr: *mut Hello, s: *const uint16_t, len: size_t) { + let (hello, data) = unsafe { + (&mut *ptr, slice::from_raw_parts(s, len as usize)) + }; + hello.hello = String::from_utf16_lossy(data); +} + +#[no_mangle] +pub extern fn hello_size(ptr: *mut Hello) -> size_t { + let hello = unsafe { + &mut *ptr + }; + hello.hello.len() +} + +#[no_mangle] +pub extern fn hello_get(ptr: *mut Hello) -> *const uint8_t { + let hello = unsafe { + &mut *ptr + }; + hello.hello.as_ptr() +} + +#[no_mangle] +pub extern fn hello_free(ptr: *mut Hello) { + if ptr.is_null() { return } + unsafe { Box::from_raw(ptr); } +} diff --git a/dev b/dev new file mode 100644 index 0000000..6ea0b6a --- /dev/null +++ b/dev @@ -0,0 +1,2 @@ +#!/usr/bin/bash +nix-shell -p qtcreator cmake ninja gcc rustc cargo qt5.full extra-cmake-modules kdeFrameworks.kwidgetsaddons kdeFrameworks.kcoreaddons kdeFrameworks.ki18n appstream diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..d5f77f0 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,62 @@ +#include "rust.h" +#include + +#include +#include +#include +#include +#include + +int main (int argc, char *argv[]) +{ + QApplication app(argc, argv); + KLocalizedString::setApplicationDomain("RMail"); + + KAboutData aboutData( + // The program name used internally. (componentName) + QStringLiteral("RMail"), + // A displayable program name string. (displayName) + i18n("RMail"), + // The program version string. (version) + QStringLiteral("0.1"), + // Short description of what the app does. (shortDescription) + i18n("Displays a mails from a maildir"), + // The license this code is released under + KAboutLicense::GPL, + // Copyright Statement (copyrightStatement = QString()) + i18n("(c) 2017"), + // Optional text shown in the About box. + // Can contain any information desired. (otherText) + i18n("Some text..."), + // The program homepage string. (homePageAddress = QString()) + QStringLiteral("http://kde.org/"), + // The bug report email address + // (bugsEmailAddress = QLatin1String("submit@bugs.kde.org") + QStringLiteral("submit@bugs.kde.org")); + aboutData.addAuthor(i18n("Jos van den Oever"), i18n("Task"), QStringLiteral("your@email.com"), + QStringLiteral("http://vandenoever.info"), QStringLiteral("OSC Username")); + KAboutData::setApplicationData(aboutData); + + QCommandLineParser parser; + parser.addHelpOption(); + parser.addVersionOption(); + aboutData.setupCommandLine(&parser); + parser.process(app); + aboutData.processCommandLine(&parser); + + void* hello = hello_new(); + QString qhello = QString::fromUtf8(hello_get(hello), hello_size(hello)); + hello_set(hello, qhello.utf16(), qhello.size()); + hello_free(hello); + + KGuiItem yesButton( i18n( "hello" ), QString(), + i18n( "This is a tooltip" ), + i18n( "This is a WhatsThis help text." ) ); + + add(0, 1); + + return + KMessageBox::questionYesNo + (0, i18n( "Hello World" ), i18n( "Hello" ), yesButton ) + == KMessageBox::Yes? EXIT_SUCCESS: EXIT_FAILURE; +} diff --git a/src/rust.h b/src/rust.h new file mode 100644 index 0000000..b4a9022 --- /dev/null +++ b/src/rust.h @@ -0,0 +1,11 @@ +#include +#include + +extern "C" { + uint32_t add(uint32_t lhs, uint32_t rhs); + void* hello_new(); + void hello_set(void*, const uint16_t *, size_t); + size_t hello_size(void*); + const char* hello_get(void*); + void hello_free(void *); +}