Initial commit

master
Jos van den Oever 2017-08-02 23:29:32 +02:00
commit d23de0ce40
7 changed files with 206 additions and 0 deletions

66
CMakeLists.txt Normal file
View File

@ -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})

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# RMail
A very simple proof of concept to parse mail with rust and show it in a qt ui.

11
common-rust/Cargo.toml Normal file
View File

@ -0,0 +1,11 @@
[package]
name = "rust"
version = "0.1.0"
[dependencies]
libc = "*"
[lib]
name = "rust"
crate-type = ["staticlib"]

51
common-rust/src/lib.rs Normal file
View File

@ -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); }
}

2
dev Normal file
View File

@ -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

62
src/main.cpp Normal file
View File

@ -0,0 +1,62 @@
#include "rust.h"
#include <cstdlib>
#include <QApplication>
#include <QCommandLineParser>
#include <KAboutData>
#include <KLocalizedString>
#include <KMessageBox>
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;
}

11
src/rust.h Normal file
View File

@ -0,0 +1,11 @@
#include <cstdint>
#include <unistd.h>
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 *);
}