Skip to content

Commit feaec91

Browse files
committed
[[ Emscripten ]] Add engine interface module for emscripten system functions
1 parent 1982118 commit feaec91

5 files changed

Lines changed: 239 additions & 30 deletions

File tree

engine/engine-sources.gypi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,7 @@
986986
'src/module-resources.cpp',
987987

988988
'src/module-browser.cpp',
989+
'src/module-emscripten.cpp',
989990
],
990991

991992
# Engine LCB files containing syntax
@@ -1007,6 +1008,7 @@
10071008
'engine_other_lcb_files':
10081009
[
10091010
'src/browser.lcb',
1011+
'src/emscripten.lcb',
10101012
],
10111013

10121014
# Engine cpptest source files

engine/src/em-system.cpp

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,16 +1102,31 @@ MCEmscriptenSystem::LaunchUrl(MCStringRef p_document)
11021102
MCresult -> sets("no association");
11031103
}
11041104

1105+
bool
1106+
MCEmscriptenSystem::GetDNSservers(MCListRef & r_list)
1107+
{
1108+
/* DNS servers aren't available */
1109+
return false;
1110+
}
1111+
1112+
// These functions is implemented in javascript
1113+
extern "C" int32_t MCEmscriptenDialogShowAlert(const unichar_t* p_message, size_t p_message_length);
1114+
11051115
void
1106-
MCEmscriptenSystem::DoAlternateLanguage(MCStringRef p_script,
1107-
MCStringRef p_language)
1116+
MCEmscriptenSystem::ShowMessageDialog(MCStringRef p_title,
1117+
MCStringRef p_message)
11081118
{
1109-
if (!MCStringIsEqualToCString(p_language, "javascript", kMCStringOptionCompareCaseless))
1110-
{
1111-
MCresult -> sets("alternate language not found");
1112-
return;
1113-
}
1119+
MCAutoStringRefAsUTF16String t_message_u16;
1120+
t_message_u16.Lock(p_message);
1121+
MCEmscriptenDialogShowAlert(t_message_u16.Ptr(), t_message_u16.Size());
1122+
}
1123+
1124+
/* ----------------------------------------------------------------
1125+
* Interface with browser JavaScript
1126+
* ---------------------------------------------------------------- */
11141127

1128+
bool MCEmscriptenSystemEvaluateJavaScriptAsString(MCStringRef p_script, MCStringRef &r_result)
1129+
{
11151130
MCAutoStringRefAsUTF16String t_script_u16;
11161131
t_script_u16.Lock(p_script);
11171132

@@ -1121,14 +1136,32 @@ MCEmscriptenSystem::DoAlternateLanguage(MCStringRef p_script,
11211136
bool t_success;
11221137
t_success = MCEmscriptenSystemEvaluateJavaScript(t_script_u16.Ptr(), t_script_u16.Size(), &t_result_u16, &t_result_length);
11231138

1124-
if (!t_success)
1139+
if (t_success)
1140+
t_success = MCStringCreateWithBytesAndRelease((byte_t*)t_result_u16, t_result_length, kMCStringEncodingUTF16, false, r_result);
1141+
1142+
return t_success;
1143+
}
1144+
1145+
void
1146+
MCEmscriptenSystem::DoAlternateLanguage(MCStringRef p_script,
1147+
MCStringRef p_language)
1148+
{
1149+
if (!MCStringIsEqualToCString(p_language, "javascript", kMCStringOptionCompareCaseless))
11251150
{
1126-
MCresult->sets("execution error");
1151+
MCresult -> sets("alternate language not found");
11271152
return;
11281153
}
11291154

1155+
bool t_success = true;
1156+
11301157
MCAutoStringRef t_result;
1131-
MCStringCreateWithBytesAndRelease((byte_t*)t_result_u16, t_result_length, kMCStringEncodingUTF16, false, &t_result);
1158+
t_success = MCEmscriptenSystemEvaluateJavaScriptAsString(p_script, &t_result);
1159+
1160+
if (!t_success)
1161+
{
1162+
MCresult->sets("execution error");
1163+
return;
1164+
}
11321165

11331166
MCresult->setvalueref(*t_result);
11341167
}
@@ -1145,26 +1178,7 @@ MCEmscriptenSystem::AlternateLanguages(MCListRef & r_list)
11451178
MCListCopy(*t_list, r_list);
11461179
}
11471180

1148-
bool
1149-
MCEmscriptenSystem::GetDNSservers(MCListRef & r_list)
1150-
{
1151-
/* DNS servers aren't available */
1152-
return false;
1153-
}
1154-
1155-
// These functions is implemented in javascript
1156-
extern "C" int32_t MCEmscriptenDialogShowAlert(const unichar_t* p_message, size_t p_message_length);
1157-
1158-
void
1159-
MCEmscriptenSystem::ShowMessageDialog(MCStringRef p_title,
1160-
MCStringRef p_message)
1161-
{
1162-
MCAutoStringRefAsUTF16String t_message_u16;
1163-
t_message_u16.Lock(p_message);
1164-
MCEmscriptenDialogShowAlert(t_message_u16.Ptr(), t_message_u16.Size());
1165-
}
1166-
1167-
///////////
1181+
//////////
11681182

11691183
#include "dispatch.h"
11701184

engine/src/em-system.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,6 @@ class MCEmscriptenSystem: public MCSystemInterface
165165

166166
MCSystemInterface * MCDesktopCreateEmscriptenSystem(void);
167167

168+
extern bool MCEmscriptenSystemEvaluateJavaScriptAsString(MCStringRef p_script, MCStringRef &r_result);
169+
168170
#endif /* ! __MC_EMSCRIPTEN_SYSTEM_H__ */

engine/src/emscripten.lcb

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/* Copyright (C) 2018 LiveCode Ltd.
2+
3+
This file is part of LiveCode.
4+
5+
LiveCode is free software; you can redistribute it and/or modify it under
6+
the terms of the GNU General Public License v3 as published by the Free
7+
Software Foundation.
8+
9+
LiveCode is distributed in the hope that it will be useful, but WITHOUT ANY
10+
WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
for more details.
13+
14+
You should have received a copy of the GNU General Public License
15+
along with LiveCode. If not see <http://www.gnu.org/licenses/>. */
16+
17+
/**
18+
This module provides utility handlers for converting to and from Emscripten types.
19+
20+
Description:
21+
22+
*/
23+
24+
module com.livecode.emscripten
25+
26+
use com.livecode.foreign
27+
28+
public type JSObjectRef is UIntPtr
29+
30+
foreign handler MCEmscriptenPointerFromObjectRef(in pRef as JSObjectRef, out rPtr as optional Pointer) returns nothing binds to "<builtin>"
31+
foreign handler MCEmscriptenPointerToObjectRef(in pPtr as optional Pointer, out rRef as JSObjectRef) returns nothing binds to "<builtin>"
32+
__safe foreign handler MCEmscriptenEvaluateJavaScriptAsString(in pScript as String, out rResult as String) returns bool binds to "<builtin>"
33+
34+
/**
35+
Summary: Convert a JavaScript object reference to a pointer
36+
37+
Parameters:
38+
pObj: The object reference to convert
39+
40+
Example:
41+
42+
public handler InitNativeButton()
43+
variable tButton as JSObjectRef
44+
put EvalJavaScript("LiveCodeUtil.storeObject(document.createElement('button'))") into tButton
45+
46+
variable tPointer as Pointer
47+
put PointerFromJSObjectRef(tButton) into tPointer
48+
49+
set my native layer to tPointer
50+
end handler
51+
52+
53+
Description:
54+
Use <PointerFromJSObjectRef> to convert a reference to a JavaScript object
55+
to a variable of type Pointer.
56+
57+
*/
58+
public handler PointerFromJSObjectRef(in pObj as JSObjectRef) returns Pointer
59+
variable tPointer as Pointer
60+
unsafe
61+
MCEmscriptenPointerFromObjectRef(pObj, tPointer)
62+
end unsafe
63+
return tPointer
64+
end handler
65+
66+
/**
67+
Summary: Convert a Pointer into a JavaScript object reference
68+
69+
Parameters:
70+
pPointer: The Pointer to convert
71+
72+
Returns:
73+
An value of type JSObjectRef
74+
75+
Example:
76+
variable mButtonPointer
77+
78+
public handler SetButtonText(in pText as String)
79+
variable tButtonRef as JSObjectRef
80+
put PointerToJSObjectRef(mButtonPointer) into tButtonRef
81+
82+
EvalJavaScript("LiveCodeUtil.fetchObject(" & tButtonRef & ").innerHTML = '" + EscapeJSString(pText) + "'")
83+
end handler
84+
85+
Description:
86+
Use <PointerToJSObjectRef> to convert a variable of type Pointer to a JavaScript object reference.
87+
*/
88+
public handler PointerToJSObjectRef(in pPointer as Pointer) returns JSObjectRef
89+
variable tObjectRef as JSObjectRef
90+
unsafe
91+
MCEmscriptenPointerToObjectRef(pPointer, tObjectRef)
92+
end unsafe
93+
return tObjectRef
94+
end handler
95+
96+
/**
97+
Summary: Evaluate JavaScript code within the browser
98+
99+
Parameters:
100+
pScript: The script to evaluate
101+
102+
Returns:
103+
An value of type String
104+
105+
Example:
106+
variable mButtonPointer
107+
108+
public handler SetButtonText(in pText as String)
109+
variable tButtonRef as JSObjectRef
110+
put PointerToJSObjectRef(mButtonPointer) into tButtonRef
111+
112+
EvalJavaScript("LiveCodeUtil.fetchObject(" & tButtonRef & ").innerHTML = '" + EscapeJSString(pText) + "'")
113+
end handler
114+
115+
Description:
116+
Use <PointerToJSObjectRef> to convert a variable of type Pointer to a JavaScript object reference.
117+
*/
118+
public handler EvalJavaScript(in pScript as String) returns optional String
119+
variable tResult as String
120+
if MCEmscriptenEvaluateJavaScriptAsString(pScript, tResult) then
121+
return tResult
122+
end if
123+
124+
return nothing
125+
end handler
126+
127+
end module

engine/src/module-emscripten.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/* Copyright (C) 2018 LiveCode Ltd.
2+
3+
This file is part of LiveCode.
4+
5+
LiveCode is free software; you can redistribute it and/or modify it under
6+
the terms of the GNU General Public License v3 as published by the Free
7+
Software Foundation.
8+
9+
LiveCode is distributed in the hope that it will be useful, but WITHOUT ANY
10+
WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
for more details.
13+
14+
You should have received a copy of the GNU General Public License
15+
along with LiveCode. If not see <http://www.gnu.org/licenses/>. */
16+
17+
#include <foundation.h>
18+
#include <foundation-auto.h>
19+
20+
////////////////////////////////////////////////////////////////////////////////////////////////////
21+
22+
extern bool MCEmscriptenSystemEvaluateJavaScriptAsString(MCStringRef p_script, MCStringRef &r_result);
23+
24+
#if defined(__EMSCRIPTEN__)
25+
26+
extern "C" MC_DLLEXPORT_DEF bool MCEmscriptenEvaluateJavaScriptAsString(MCStringRef p_script, MCStringRef &r_result)
27+
{
28+
return MCEmscriptenSystemEvaluateJavaScriptAsString(p_script, r_result);
29+
}
30+
31+
#else // !defined(__EMSCRIPTEN__)
32+
33+
extern "C" MC_DLLEXPORT_DEF bool MCEmscriptenEvaluateJavaScriptAsString(MCStringRef p_script, MCStringRef &r_result)
34+
{
35+
return false;
36+
}
37+
38+
#endif
39+
40+
////////////////////////////////////////////////////////////////////////////////////////////////////
41+
42+
extern "C" MC_DLLEXPORT_DEF void MCEmscriptenPointerFromObjectRef(uintptr_t p_ref, void *&r_ptr)
43+
{
44+
r_ptr = reinterpret_cast<void*>(p_ref);
45+
}
46+
47+
extern "C" MC_DLLEXPORT_DEF void MCEmscriptenPointerToObjectRef(void *p_ptr, uintptr_t &r_ref)
48+
{
49+
r_ref = reinterpret_cast<uintptr_t>(p_ptr);
50+
}
51+
52+
////////////////////////////////////////////////////////////////
53+
54+
extern "C" bool com_livecode_emscripten_Initialize (void)
55+
{
56+
return true;
57+
}
58+
59+
extern "C" void com_livecode_emscripten_Finalize (void)
60+
{
61+
}
62+
63+
////////////////////////////////////////////////////////////////
64+

0 commit comments

Comments
 (0)