summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Marques <george@gmarqu.es>2016-09-03 19:41:36 -0300
committerGeorge Marques <george@gmarqu.es>2016-09-03 19:46:26 -0300
commit5f5db46e8d0a28c3b5ac5fab36c14d3393217bfe (patch)
treeec9bb6c9152927f023063e52218df4ed0626739e
parentc9b82498b4b8de7b5f4c19873421d32ca1749ed2 (diff)
Patch thirdy-party libraries to build for WinRT
- Patch enet code. - Patch OpenSSL code and add shims for unavailable API. - Add extra definition header for Freetype.
-rw-r--r--drivers/builtin_openssl2/SCsub4
-rw-r--r--drivers/builtin_openssl2/crypto/rand/rand_win.c9
-rw-r--r--drivers/builtin_openssl2/openssl/dtls1.h3
-rw-r--r--drivers/builtin_openssl2/winrt.cpp155
-rw-r--r--drivers/builtin_openssl2/winrt_fix.patch64
-rw-r--r--drivers/freetype/SCsub5
-rw-r--r--drivers/freetype/winrtdef.h32
-rw-r--r--modules/enet/win32.c13
8 files changed, 283 insertions, 2 deletions
diff --git a/drivers/builtin_openssl2/SCsub b/drivers/builtin_openssl2/SCsub
index bd0f428cfc..a28bc2922c 100644
--- a/drivers/builtin_openssl2/SCsub
+++ b/drivers/builtin_openssl2/SCsub
@@ -642,6 +642,7 @@ openssl_sources = [
#env.drivers_sources+=openssl_sources
+env.Append(CPPPATH=["#drivers/builtin_openssl2"])
env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto"])
env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/openssl"])
env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/evp"])
@@ -650,6 +651,9 @@ env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/modes"])
#env_ssl.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/store"])
env_drivers.Append(CPPFLAGS=["-DOPENSSL_NO_ASM","-DOPENSSL_THREADS","-DL_ENDIAN"])
+if "platform" in env and env["platform"] == "winrt":
+ openssl_sources += ['winrt.cpp']
+
# Workaround for compilation error with GCC/Clang when -Werror is too greedy (GH-4517)
import os
if not (os.name=="nt" and os.getenv("VSINSTALLDIR")!=None): # not Windows and not MSVC
diff --git a/drivers/builtin_openssl2/crypto/rand/rand_win.c b/drivers/builtin_openssl2/crypto/rand/rand_win.c
index 06670ae017..70fd52a7aa 100644
--- a/drivers/builtin_openssl2/crypto/rand/rand_win.c
+++ b/drivers/builtin_openssl2/crypto/rand/rand_win.c
@@ -118,8 +118,10 @@
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400
# endif
+#ifndef WINRT_ENABLED
# include <wincrypt.h>
# include <tlhelp32.h>
+#endif
/*
* Limit the time spent walking through the heap, processes, threads and
@@ -161,7 +163,7 @@ typedef struct tagCURSORINFO {
# define CURSOR_SHOWING 0x00000001
# endif /* CURSOR_SHOWING */
-# if !defined(OPENSSL_SYS_WINCE)
+# if !defined(OPENSSL_SYS_WINCE) && !defined(WINRT_ENABLED)
typedef BOOL(WINAPI *CRYPTACQUIRECONTEXTW) (HCRYPTPROV *, LPCWSTR, LPCWSTR,
DWORD, DWORD);
typedef BOOL(WINAPI *CRYPTGENRANDOM) (HCRYPTPROV, DWORD, BYTE *);
@@ -196,6 +198,7 @@ typedef NET_API_STATUS(NET_API_FUNCTION *NETFREE) (LPBYTE);
# endif /* 1 */
# endif /* !OPENSSL_SYS_WINCE */
+#if !defined(WINRT_ENABLED)
int RAND_poll(void)
{
MEMORYSTATUS m;
@@ -580,6 +583,8 @@ int RAND_poll(void)
return (1);
}
+#endif // WINRT_ENABLED
+
int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam)
{
double add_entropy = 0;
@@ -682,7 +687,7 @@ static void readtimer(void)
static void readscreen(void)
{
-# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN)
+# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN) && !defined(WINRT_ENABLED)
HDC hScrDC; /* screen DC */
HBITMAP hBitmap; /* handle for our bitmap */
BITMAP bm; /* bitmap properties */
diff --git a/drivers/builtin_openssl2/openssl/dtls1.h b/drivers/builtin_openssl2/openssl/dtls1.h
index 64ad3c87d0..a58aca248d 100644
--- a/drivers/builtin_openssl2/openssl/dtls1.h
+++ b/drivers/builtin_openssl2/openssl/dtls1.h
@@ -81,6 +81,9 @@
# include <sys/time.h>
# endif
# endif
+#ifdef WINRT_ENABLED
+#include <winsock2.h>
+#endif
#ifdef __cplusplus
extern "C" {
diff --git a/drivers/builtin_openssl2/winrt.cpp b/drivers/builtin_openssl2/winrt.cpp
new file mode 100644
index 0000000000..c3a6f8bfcc
--- /dev/null
+++ b/drivers/builtin_openssl2/winrt.cpp
@@ -0,0 +1,155 @@
+/* Snippets extracted from https://github.com/Microsoft/openssl/blob/ec7e430e06e4e3ac87c183dee33cb216814cf980/ms/winrt.cpp
+ * Adapted for Godot definitions
+ */
+/* winrt.cpp
+ * Copyright 2014 Microsoft Corporation
+ * C++/CX Entropy/shims for Windows Phone/Windows Store platform
+ * written by Alejandro Jimenez Martinez
+ * (aljim@microsoft.com) for the OpenSSL project 2014.
+ */
+
+#include <windows.h>
+#if defined(WINAPI_FAMILY)
+extern "C"
+{
+ unsigned entropyRT(BYTE *buffer, unsigned len);
+ void RAND_add(const void *buf,int num,double entropy);
+ int RAND_poll(void);
+}
+#endif
+
+unsigned entropyRT(BYTE *buffer, unsigned len)
+ {
+ using namespace Platform;
+ using namespace Windows::Foundation;
+ using namespace Windows::Foundation::Collections;
+ using namespace Windows::Security::Cryptography;
+ using namespace Windows::Storage::Streams;
+ IBuffer ^buf = CryptographicBuffer::GenerateRandom(len);
+ Array<unsigned char> ^arr;
+ CryptographicBuffer::CopyToByteArray(buf, &arr);
+ unsigned arrayLen = arr->Length;
+
+ // Make sure not to overflow the copy
+ arrayLen = (arrayLen > len) ? len : arrayLen;
+ memcpy(buffer, arr->Data, arrayLen);
+ return arrayLen;
+ }
+
+int RAND_poll(void)
+ {
+ BYTE buf[60];
+ unsigned collected = entropyRT(buf , sizeof(buf));
+ RAND_add(buf, collected, collected);
+ return 1;
+ }
+
+#if defined(WINRT_ENABLED)
+extern "C"
+{
+#include<stdio.h>
+#include<string.h>
+#include<stdlib.h>
+
+ void* GetModuleHandle(
+ _In_opt_ LPCTSTR lpModuleName
+ )
+ {
+ return NULL;
+ }
+ //no log for phone
+ int RegisterEventSource(
+ _In_ LPCTSTR lpUNCServerName,
+ _In_ LPCTSTR lpSourceName
+ )
+ {
+ return NULL;
+ }
+
+ int ReportEvent(
+ _In_ HANDLE hEventLog,
+ _In_ WORD wType,
+ _In_ WORD wCategory,
+ _In_ DWORD dwEventID,
+ _In_ PSID lpUserSid,
+ _In_ WORD wNumStrings,
+ _In_ DWORD dwDataSize,
+ _In_ LPCTSTR *lpStrings,
+ _In_ LPVOID lpRawData
+ )
+ {
+ return 0;
+ }
+ int MessageBox(
+ _In_opt_ HWND hWnd,
+ _In_opt_ LPCTSTR lpText,
+ _In_opt_ LPCTSTR lpCaption,
+ _In_ UINT uType
+ )
+ {
+ return 0;
+ }
+ int __cdecl GetProcessWindowStation(void)
+ {
+ return NULL;
+ }
+ BOOL __cdecl GetUserObjectInformationW(
+ _In_ HANDLE hObj,
+ _In_ int nIndex,
+ _Out_opt_ PVOID pvInfo,
+ _In_ DWORD nLength,
+ _Out_opt_ LPDWORD lpnLengthNeeded
+ )
+ {
+ return 0;
+ }
+ int __cdecl GetStdHandle(
+ _In_ DWORD nStdHandle
+ )
+ {
+ return 0;
+ }
+ BOOL DeregisterEventSource(
+ _Inout_ HANDLE hEventLog
+ )
+ {
+ return 0;
+ }
+ char *getenv(
+ const char *varname
+ )
+ {
+ //hardcoded environmental variables used for the appx testing application for store/phone
+ if (!strcmp(varname, "OPENSSL_CONF"))
+ {
+ return "./openssl.cnf";
+ }
+ return 0;
+ }
+ int setenv(const char *envname, const char *envval, int overwrite)
+ {
+ return -1;
+ }
+ int _getch(void)
+ {
+ return 0;
+ }
+ int _kbhit()
+ {
+ return 0;
+ }
+ BOOL __cdecl FlushConsoleInputBuffer(
+ _In_ HANDLE hConsoleInput
+ )
+ {
+ return 0;
+ }
+ int winrt_GetTickCount(void)
+ {
+ LARGE_INTEGER t;
+ return(int) (QueryPerformanceCounter(&t) ? t.QuadPart : 0);
+ }
+ void *OPENSSL_UplinkTable [26]= {0};
+} //extern C
+
+#endif /*defined(WINRT_ENABLED)*/
diff --git a/drivers/builtin_openssl2/winrt_fix.patch b/drivers/builtin_openssl2/winrt_fix.patch
new file mode 100644
index 0000000000..caf180a75b
--- /dev/null
+++ b/drivers/builtin_openssl2/winrt_fix.patch
@@ -0,0 +1,64 @@
+diff --git a/drivers/builtin_openssl2/crypto/rand/rand_win.c b/drivers/builtin_openssl2/crypto/rand/rand_win.c
+index 06670ae..70fd52a 100644
+--- a/drivers/builtin_openssl2/crypto/rand/rand_win.c
++++ b/drivers/builtin_openssl2/crypto/rand/rand_win.c
+@@ -118,8 +118,10 @@
+ # ifndef _WIN32_WINNT
+ # define _WIN32_WINNT 0x0400
+ # endif
++#ifndef WINRT_ENABLED
+ # include <wincrypt.h>
+ # include <tlhelp32.h>
++#endif
+
+ /*
+ * Limit the time spent walking through the heap, processes, threads and
+@@ -161,7 +163,7 @@ typedef struct tagCURSORINFO {
+ # define CURSOR_SHOWING 0x00000001
+ # endif /* CURSOR_SHOWING */
+
+-# if !defined(OPENSSL_SYS_WINCE)
++# if !defined(OPENSSL_SYS_WINCE) && !defined(WINRT_ENABLED)
+ typedef BOOL(WINAPI *CRYPTACQUIRECONTEXTW) (HCRYPTPROV *, LPCWSTR, LPCWSTR,
+ DWORD, DWORD);
+ typedef BOOL(WINAPI *CRYPTGENRANDOM) (HCRYPTPROV, DWORD, BYTE *);
+@@ -196,6 +198,7 @@ typedef NET_API_STATUS(NET_API_FUNCTION *NETFREE) (LPBYTE);
+ # endif /* 1 */
+ # endif /* !OPENSSL_SYS_WINCE */
+
++#if !defined(WINRT_ENABLED)
+ int RAND_poll(void)
+ {
+ MEMORYSTATUS m;
+@@ -580,6 +583,8 @@ int RAND_poll(void)
+ return (1);
+ }
+
++#endif // WINRT_ENABLED
++
+ int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam)
+ {
+ double add_entropy = 0;
+@@ -682,7 +687,7 @@ static void readtimer(void)
+
+ static void readscreen(void)
+ {
+-# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN)
++# if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN) && !defined(WINRT_ENABLED)
+ HDC hScrDC; /* screen DC */
+ HBITMAP hBitmap; /* handle for our bitmap */
+ BITMAP bm; /* bitmap properties */
+diff --git a/drivers/builtin_openssl2/openssl/dtls1.h b/drivers/builtin_openssl2/openssl/dtls1.h
+index 64ad3c8..a58aca2 100644
+--- a/drivers/builtin_openssl2/openssl/dtls1.h
++++ b/drivers/builtin_openssl2/openssl/dtls1.h
+@@ -81,6 +81,9 @@
+ # include <sys/time.h>
+ # endif
+ # endif
++#ifdef WINRT_ENABLED
++#include <winsock2.h>
++#endif
+
+ #ifdef __cplusplus
+ extern "C" {
diff --git a/drivers/freetype/SCsub b/drivers/freetype/SCsub
index 0c7ab91ba2..4ddc785088 100644
--- a/drivers/freetype/SCsub
+++ b/drivers/freetype/SCsub
@@ -48,6 +48,11 @@ ft_sources=[\
if (env["freetype"]=="builtin"):
+
+ # Include header for WinRT to fix build issues
+ if "platform" in env and env["platform"] == "winrt":
+ env.Append(CCFLAGS=['/FI', '"drivers/freetype/winrtdef.h"'])
+
# fix for Windows' shell miserably failing on long lines, split in two libraries
half1=[]
half2=[]
diff --git a/drivers/freetype/winrtdef.h b/drivers/freetype/winrtdef.h
new file mode 100644
index 0000000000..69c6baf532
--- /dev/null
+++ b/drivers/freetype/winrtdef.h
@@ -0,0 +1,32 @@
+/*************************************************************************/
+/* winrtdef.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+// "generic" is a reserved keyword in C++/CX code
+// this avoids the errors in the variable name from Freetype code
+#define generic freetype_generic
diff --git a/modules/enet/win32.c b/modules/enet/win32.c
index d77fa9a49a..15edd7acbb 100644
--- a/modules/enet/win32.c
+++ b/modules/enet/win32.c
@@ -28,7 +28,9 @@ enet_initialize (void)
return -1;
}
+#ifndef WINRT_ENABLED
timeBeginPeriod (1);
+#endif
return 0;
}
@@ -36,11 +38,22 @@ enet_initialize (void)
void
enet_deinitialize (void)
{
+#ifndef WINRT_ENABLED
timeEndPeriod (1);
+#endif
WSACleanup ();
}
+#ifdef WINRT_ENABLED
+enet_uint32
+timeGetTime() {
+ ULONGLONG ticks = GetTickCount64();
+ return (enet_uint32)ticks;
+}
+#endif
+
+
enet_uint32
enet_host_random_seed (void)
{