99#include " config.h"
1010
1111#include " common/sbapp.h"
12+ #include " common/fs_socket_client.h"
1213#include " ui/textedit.h"
1314#include " platform/sdl/runtime.h"
1415#include " platform/sdl/settings.h"
1516
1617using namespace strlib ;
1718
19+ String g_exportAddr;
20+ String g_exportToken;
21+
1822void onlineHelp (Runtime *runtime, TextEditInput *widget) {
1923 char path[100 ];
2024 const char *nodeId = widget->getNodeId ();
@@ -60,6 +64,27 @@ void showRecentFiles(TextEditHelpWidget *helpWidget, String &loadPath) {
6064 helpWidget->setText (fileList);
6165}
6266
67+ void exportBuffer (AnsiWidget *out, const char *text, String &dest, String &token) {
68+ char buffer[PATH_MAX];
69+ dev_file_t f;
70+ memset (&f, 0 , sizeof (dev_file_t ));
71+
72+ sprintf (f.name , " SOCL:%s\n " , dest.c_str ());
73+ if (dest.indexOf (' :' , 0 ) != -1 && sockcl_open (&f)) {
74+ sprintf (buffer, " # %s\n " , token.c_str ());
75+ sockcl_write (&f, (byte *)buffer, strlen (buffer));
76+ if (!sockcl_write (&f, (byte *)text, strlen (text))) {
77+ sprintf (buffer, " Failed to write: %s" , dest.c_str ());
78+ } else {
79+ sprintf (buffer, " Exported file to %s" , dest.c_str ());
80+ }
81+ sockcl_close (&f);
82+ } else {
83+ sprintf (buffer, " Failed to open: %s" , dest.c_str ());
84+ }
85+ out->setStatus (buffer);
86+ }
87+
6388void System::editSource (String &loadPath) {
6489 logEntered ();
6590
@@ -73,6 +98,9 @@ void System::editSource(String &loadPath) {
7398 TextEditInput *widget = editWidget;
7499 String dirtyFile;
75100 String cleanFile;
101+ enum InputMode {
102+ kInit , kExportAddr , kExportToken
103+ } inputMode = kInit ;
76104
77105 setupStatus (dirtyFile, cleanFile, loadPath);
78106 _modifiedTime = getModifiedTime ();
@@ -124,7 +152,6 @@ void System::editSource(String &loadPath) {
124152 }
125153
126154 switch (event.key ) {
127- case SB_KEY_F (3 ):
128155 case SB_KEY_F (8 ):
129156 case SB_KEY_F (10 ):
130157 case SB_KEY_F (11 ):
@@ -168,6 +195,22 @@ void System::editSource(String &loadPath) {
168195 redraw = false ;
169196 onlineHelp ((Runtime *)this , editWidget);
170197 break ;
198+ case SB_KEY_F (4 ):
199+ if (editWidget->getTextLength () && g_exportAddr.length () && g_exportToken.length ()) {
200+ exportBuffer (_output, editWidget->getText (), g_exportAddr, g_exportToken);
201+ break ;
202+ }
203+ // else fallthru to F3 handler
204+ case SB_KEY_F (3 ):
205+ if (editWidget->getTextLength ()) {
206+ saveFile (editWidget, loadPath);
207+ _output->setStatus (" Export to mobile SmallBASIC. Enter <IP>:<Port>" );
208+ widget = helpWidget;
209+ helpWidget->createLineEdit (g_exportAddr);
210+ helpWidget->show ();
211+ inputMode = kExportAddr ;
212+ }
213+ break ;
171214 case SB_KEY_F (5 ):
172215 saveFile (editWidget, loadPath);
173216 _output->setStatus (" Debug. F6=Step, F7=Continue, Esc=Close" );
@@ -269,6 +312,25 @@ void System::editSource(String &loadPath) {
269312 if (helpWidget->replaceMode ()) {
270313 _output->setStatus (" Replace string with. Esc=Close" );
271314 dirty = editWidget->isDirty ();
315+ } else if (helpWidget->lineEditMode () && helpWidget->getTextLength ()) {
316+ switch (inputMode) {
317+ case kExportAddr :
318+ g_exportAddr = helpWidget->getText ();
319+ inputMode = kExportToken ;
320+ helpWidget->createLineEdit (g_exportToken);
321+ _output->setStatus (" Enter token. Esc=Close" );
322+ break ;
323+ case kExportToken :
324+ g_exportToken = helpWidget->getText ();
325+ inputMode = kInit ;
326+ widget = editWidget;
327+ exportBuffer (_output, editWidget->getText (), g_exportAddr, g_exportToken);
328+ helpWidget->hide ();
329+ break ;
330+ default :
331+ break ;
332+ }
333+ redraw = true ;
272334 } else if (helpWidget->closeOnEnter () && helpWidget->isVisible ()) {
273335 if (helpWidget->replaceDoneMode ()) {
274336 _output->setStatus (dirtyFile);
0 commit comments