Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Fix compile error on windows platform #1968

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build-windows/build_headers.list
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,9 @@ src\async\imap\MCIMAPAsyncSession.h
src\async\imap\MCIMAPOperation.h
src\async\imap\MCIMAPFetchFoldersOperation.h
src\async\imap\MCIMAPAppendMessageOperation.h
src\async\imap\MCIMAPCheckAccountOperation.h
src\async\imap\MCIMAPCopyMessagesOperation.h
src\async\imap\MCIMAPCustomCommandOperation.h
src\async\imap\MCIMAPMoveMessagesOperation.h
src\async\imap\MCIMAPFetchMessagesOperation.h
src\async\imap\MCIMAPFetchContentOperation.h
Expand Down
922 changes: 462 additions & 460 deletions build-windows/mailcore2/mailcore2/mailcore2.vcxproj

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/async/imap/MCIMAPOperation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ void IMAPOperation::afterMain()
performMethodOnMainThread((Object::Method) &IMAPOperation::afterMainOnMainThread, NULL);
}

void IMAPOperation::afterMainOnMainThread()
void IMAPOperation::afterMainOnMainThread(void *)
{
if (mSession->session()->isAutomaticConfigurationDone()) {
mSession->owner()->automaticConfigurationDone(mSession->session());
Expand Down
2 changes: 1 addition & 1 deletion src/async/imap/MCIMAPOperation.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ namespace mailcore {

virtual void beforeMain();
virtual void afterMain();
virtual void afterMainOnMainThread();
virtual void afterMainOnMainThread(void *);

virtual void start();

Expand Down
7 changes: 7 additions & 0 deletions src/core/basetypes/MCData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,14 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

#if defined(_MSC_VER)
#include "MmanWin32.h"
#include "MmanWin32.c"
#else
#include <sys/mman.h>
#endif

#include <pthread.h>
#if USE_UCHARDET
#include <uchardet/uchardet.h>
Expand Down
2 changes: 2 additions & 0 deletions src/core/basetypes/MCDataDecoderUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
#include <libetpan/libetpan.h>

#include <string.h>
#if !defined(_WIN32)
#include <strings.h>
#endif

namespace mailcore {

Expand Down
2 changes: 1 addition & 1 deletion src/core/basetypes/MCString.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,7 @@ static inline int skip_subj_refwd(char * subj, size_t * begin,

if (!has_suffix) {
if (length - cur_token >= 3) {
if (strncasecmp(subj + cur_token, "", 3) == 0) {
if (strncasecmp(subj + cur_token, ":", 3) == 0) {
cur_token += 3;
has_suffix = 1;
}
Expand Down
7 changes: 6 additions & 1 deletion src/core/basetypes/MCUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,12 @@ extern unsigned long long wcstoull(const wchar_t*, wchar_t**, int);

#endif

#ifndef DEPRECATED_ATTRIBUTE
#ifdef _MSC_VER
// for now we just omit it. Modify usages to put macro at start of
// declaration, compatible with both gcc and msvc.
// #define DEPRECATED_ATTRIBUTE __declspec(deprecated)
#define DEPRECATED_ATTRIBUTE
#else
#define DEPRECATED_ATTRIBUTE __attribute__((deprecated))
#endif

Expand Down
180 changes: 180 additions & 0 deletions src/core/basetypes/MmanWin32.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@

#include <windows.h>
#include <errno.h>
#include <io.h>

#include "MmanWin32.h"

#ifndef FILE_MAP_EXECUTE
#define FILE_MAP_EXECUTE 0x0020
#endif /* FILE_MAP_EXECUTE */

static int __map_mman_error(const DWORD err, const int deferr)
{
if (err == 0)
return 0;
//TODO: implement
return err;
}

static DWORD __map_mmap_prot_page(const int prot)
{
DWORD protect = 0;

if (prot == PROT_NONE)
return protect;

if ((prot & PROT_EXEC) != 0)
{
protect = ((prot & PROT_WRITE) != 0) ?
PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
}
else
{
protect = ((prot & PROT_WRITE) != 0) ?
PAGE_READWRITE : PAGE_READONLY;
}

return protect;
}

static DWORD __map_mmap_prot_file(const int prot)
{
DWORD desiredAccess = 0;

if (prot == PROT_NONE)
return desiredAccess;

if ((prot & PROT_READ) != 0)
desiredAccess |= FILE_MAP_READ;
if ((prot & PROT_WRITE) != 0)
desiredAccess |= FILE_MAP_WRITE;
if ((prot & PROT_EXEC) != 0)
desiredAccess |= FILE_MAP_EXECUTE;

return desiredAccess;
}

void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off)
{
HANDLE fm, h;

void * map = MAP_FAILED;

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4293)
#endif

const DWORD dwFileOffsetLow = (sizeof(off_t) <= sizeof(DWORD)) ?
(DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
const DWORD dwFileOffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
(DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
const DWORD protect = __map_mmap_prot_page(prot);
const DWORD desiredAccess = __map_mmap_prot_file(prot);

const off_t maxSize = off + (off_t)len;

const DWORD dwMaxSizeLow = (sizeof(off_t) <= sizeof(DWORD)) ?
(DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL);
const DWORD dwMaxSizeHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
(DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL);

#ifdef _MSC_VER
#pragma warning(pop)
#endif

errno = 0;

if (len == 0
/* Unsupported flag combinations */
|| (flags & MAP_FIXED) != 0
/* Usupported protection combinations */
|| prot == PROT_EXEC)
{
errno = EINVAL;
return MAP_FAILED;
}

h = ((flags & MAP_ANONYMOUS) == 0) ?
(HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE;

if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE)
{
errno = EBADF;
return MAP_FAILED;
}

fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL);

if (fm == NULL)
{
errno = __map_mman_error(GetLastError(), EPERM);
return MAP_FAILED;
}

map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len);

CloseHandle(fm);

if (map == NULL)
{
errno = __map_mman_error(GetLastError(), EPERM);
return MAP_FAILED;
}

return map;
}

int munmap(void *addr, size_t len)
{
if (UnmapViewOfFile(addr))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}

int mprotect(void *addr, size_t len, int prot)
{
DWORD newProtect = __map_mmap_prot_page(prot);
DWORD oldProtect = 0;

if (VirtualProtect(addr, len, newProtect, &oldProtect))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}

int msync(void *addr, size_t len, int flags)
{
if (FlushViewOfFile(addr, len))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}

int mlock(const void *addr, size_t len)
{
if (VirtualLock((LPVOID)addr, len))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}

int munlock(const void *addr, size_t len)
{
if (VirtualUnlock((LPVOID)addr, len))
return 0;

errno = __map_mman_error(GetLastError(), EPERM);

return -1;
}
55 changes: 55 additions & 0 deletions src/core/basetypes/MmanWin32.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* sys/mman.h
* mman-win32
*/

#ifndef _SYS_MMAN_H_
#define _SYS_MMAN_H_

#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

/* All the headers include this file. */
#ifndef _MSC_VER
#include <_mingw.h>
#endif

#include <sys/types.h>

#ifdef __cplusplus
extern "C" {
#endif

#define PROT_NONE 0
#define PROT_READ 1
#define PROT_WRITE 2
#define PROT_EXEC 4

#define MAP_FILE 0
#define MAP_SHARED 1
#define MAP_PRIVATE 2
#define MAP_TYPE 0xf
#define MAP_FIXED 0x10
#define MAP_ANONYMOUS 0x20
#define MAP_ANON MAP_ANONYMOUS

#define MAP_FAILED ((void *)-1)

/* Flags for msync. */
#define MS_ASYNC 1
#define MS_SYNC 2
#define MS_INVALIDATE 4

void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
int munmap(void *addr, size_t len);
int mprotect(void *addr, size_t len, int prot);
int msync(void *addr, size_t len, int flags);
int mlock(const void *addr, size_t len);
int munlock(const void *addr, size_t len);

#ifdef __cplusplus
};
#endif

#endif /* _SYS_MMAN_H_ */