no message
This commit is contained in:
		@@ -540,7 +540,7 @@ static void copyToClipboard(Code* code)
 | 
			
		||||
	{
 | 
			
		||||
		memcpy(clipboard, start, size);
 | 
			
		||||
		clipboard[size] = '\0';
 | 
			
		||||
		setClipboardText(clipboard);
 | 
			
		||||
		getSystem()->setClipboardText(clipboard);
 | 
			
		||||
		free(clipboard);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -554,9 +554,9 @@ static void cutToClipboard(Code* code)
 | 
			
		||||
 | 
			
		||||
static void copyFromClipboard(Code* code)
 | 
			
		||||
{
 | 
			
		||||
	if(hasClipboardText())
 | 
			
		||||
	if(getSystem()->hasClipboardText())
 | 
			
		||||
	{
 | 
			
		||||
		char* clipboard = getClipboardText();
 | 
			
		||||
		char* clipboard = getSystem()->getClipboardText();
 | 
			
		||||
 | 
			
		||||
		if(clipboard)
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -2573,7 +2573,7 @@ static NetVersion netVersionRequest()
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	s32 size = 0;
 | 
			
		||||
	void* buffer = getUrlRequest("/api?fn=version", &size);
 | 
			
		||||
	void* buffer = getSystem()->getUrlRequest("/api?fn=version", &size);
 | 
			
		||||
 | 
			
		||||
	if(buffer && size)
 | 
			
		||||
	{
 | 
			
		||||
@@ -3055,7 +3055,7 @@ void initConsole(Console* console, tic_mem* tic, FileSystem* fs, Config* config,
 | 
			
		||||
			{
 | 
			
		||||
				char buf[256];
 | 
			
		||||
				sprintf(buf, "parameter or file not processed: %s\n", argv[i]);
 | 
			
		||||
				showMessageBox("Warning", buf);
 | 
			
		||||
				getSystem()->showMessageBox("Warning", buf);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								src/fs.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/fs.c
									
									
									
									
									
								
							@@ -280,7 +280,7 @@ static void netDirRequest(const char* path, ListCallback callback, void* data)
 | 
			
		||||
	sprintf(request, "/api?fn=dir&path=%s", path);
 | 
			
		||||
 | 
			
		||||
	s32 size = 0;
 | 
			
		||||
	void* buffer = getUrlRequest(request, &size);
 | 
			
		||||
	void* buffer = getSystem()->getUrlRequest(request, &size);
 | 
			
		||||
 | 
			
		||||
	NetDirData netDirData = {callback, data};
 | 
			
		||||
	onDirResponse(buffer, size, &netDirData);
 | 
			
		||||
@@ -420,7 +420,7 @@ void fsAddFile(FileSystem* fs, AddCallback callback, void* data)
 | 
			
		||||
 | 
			
		||||
	*addFileData = (AddFileData) { fs, callback, data };
 | 
			
		||||
 | 
			
		||||
	_file_dialog_load(&onAddFile, addFileData);
 | 
			
		||||
	getSystem()->file_dialog_load(&onAddFile, addFileData);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
@@ -552,7 +552,7 @@ void fsGetFileData(GetCallback callback, const char* name, void* buffer, size_t
 | 
			
		||||
	GetFileData* command = (GetFileData*)malloc(sizeof(GetFileData));
 | 
			
		||||
	*command = (GetFileData) {callback, data, buffer};
 | 
			
		||||
 | 
			
		||||
	_file_dialog_save(onGetFile, name, buffer, size, command, mode);
 | 
			
		||||
	getSystem()->file_dialog_save(onGetFile, name, buffer, size, command, mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
@@ -576,7 +576,7 @@ void fsOpenFileData(OpenCallback callback, void* data)
 | 
			
		||||
 | 
			
		||||
	*command = (OpenFileData){callback, data};
 | 
			
		||||
 | 
			
		||||
	_file_dialog_load(onOpenFileData, command);
 | 
			
		||||
	getSystem()->file_dialog_load(onOpenFileData, command);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void fsGetFile(FileSystem* fs, GetCallback callback, const char* name, void* data)
 | 
			
		||||
@@ -590,7 +590,7 @@ void fsGetFile(FileSystem* fs, GetCallback callback, const char* name, void* dat
 | 
			
		||||
		*command = (GetFileData) {callback, data, buffer};
 | 
			
		||||
 | 
			
		||||
		s32 mode = fsGetMode(fs, name);
 | 
			
		||||
		_file_dialog_save(onGetFile, name, buffer, size, command, mode);
 | 
			
		||||
		getSystem()->file_dialog_save(onGetFile, name, buffer, size, command, mode);
 | 
			
		||||
	}
 | 
			
		||||
	else callback(FS_FILE_NOT_DOWNLOADED, data);
 | 
			
		||||
}
 | 
			
		||||
@@ -843,7 +843,7 @@ void* fsLoadFile(FileSystem* fs, const char* name, s32* size)
 | 
			
		||||
 | 
			
		||||
			char path[FILENAME_MAX] = {0};
 | 
			
		||||
			sprintf(path, "/cart/%s/cart.tic", loadPublicCartData.hash);
 | 
			
		||||
			void* data = getUrlRequest(path, size);
 | 
			
		||||
			void* data = getSystem()->getUrlRequest(path, size);
 | 
			
		||||
 | 
			
		||||
			if(data)
 | 
			
		||||
				fsSaveRootFile(fs, cachePath, data, *size, false);
 | 
			
		||||
@@ -900,7 +900,7 @@ void fsOpenWorkingFolder(FileSystem* fs)
 | 
			
		||||
	if(isPublic(fs))
 | 
			
		||||
		path = fs->dir;
 | 
			
		||||
 | 
			
		||||
	openSystemPath(path);
 | 
			
		||||
	getSystem()->openSystemPath(path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
FileSystem* createFileSystem(const char* path)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								src/main.h
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								src/main.h
									
									
									
									
									
								
							@@ -1 +1,27 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "tic.h"
 | 
			
		||||
#include "ext/file_dialog.h"
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	void	(*setClipboardText)(const char* text);
 | 
			
		||||
	bool	(*hasClipboardText)();
 | 
			
		||||
	char* 	(*getClipboardText)();
 | 
			
		||||
	u64 	(*getPerformanceCounter)();
 | 
			
		||||
	u64 	(*getPerformanceFrequency)();
 | 
			
		||||
 | 
			
		||||
	void* (*getUrlRequest)(const char* url, s32* size);
 | 
			
		||||
 | 
			
		||||
	void (*file_dialog_load)(file_dialog_load_callback callback, void* data);
 | 
			
		||||
	void (*file_dialog_save)(file_dialog_save_callback callback, const char* name, const u8* buffer, size_t size, void* data, u32 mode);
 | 
			
		||||
 | 
			
		||||
	void (*goFullscreen)();
 | 
			
		||||
	void (*showMessageBox)(const char* title, const char* message);
 | 
			
		||||
	void (*setWindowTitle)(const char* title);
 | 
			
		||||
 | 
			
		||||
	void (*openSystemPath)(const char* path);
 | 
			
		||||
 | 
			
		||||
} System;
 | 
			
		||||
 | 
			
		||||
System* getSystem();
 | 
			
		||||
 
 | 
			
		||||
@@ -976,9 +976,9 @@ static void cutToClipboard(Map* map)
 | 
			
		||||
 | 
			
		||||
static void copyFromClipboard(Map* map)
 | 
			
		||||
{
 | 
			
		||||
	if(hasClipboardText())
 | 
			
		||||
	if(getSystem()->hasClipboardText())
 | 
			
		||||
	{
 | 
			
		||||
		char* clipboard = getClipboardText();
 | 
			
		||||
		char* clipboard = getSystem()->getClipboardText();
 | 
			
		||||
 | 
			
		||||
		if(clipboard)
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -619,9 +619,9 @@ static void copyFromClipboard(Music* music)
 | 
			
		||||
{
 | 
			
		||||
	tic_track_pattern* pattern = getChannelPattern(music);
 | 
			
		||||
 | 
			
		||||
	if(pattern && hasClipboardText())
 | 
			
		||||
	if(pattern && getSystem()->hasClipboardText())
 | 
			
		||||
	{
 | 
			
		||||
		char* clipboard = getClipboardText();
 | 
			
		||||
		char* clipboard = getSystem()->getClipboardText();
 | 
			
		||||
 | 
			
		||||
		if(clipboard)
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -183,8 +183,8 @@ void initRun(Run* run, Console* console, tic_mem* tic)
 | 
			
		||||
		{
 | 
			
		||||
			.error = onError,
 | 
			
		||||
			.trace = onTrace,
 | 
			
		||||
			.counter = getPerformanceCounter,
 | 
			
		||||
			.freq = getPerformanceFrequency,
 | 
			
		||||
			.counter = getSystem()->getPerformanceCounter,
 | 
			
		||||
			.freq = getSystem()->getPerformanceFrequency,
 | 
			
		||||
			.start = 0,
 | 
			
		||||
			.data = run,
 | 
			
		||||
			.exit = onExit,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										116
									
								
								src/studio.c
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								src/studio.c
									
									
									
									
									
								
							@@ -49,12 +49,7 @@
 | 
			
		||||
#include <lauxlib.h>
 | 
			
		||||
#include <lualib.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// #define TEXTURE_SIZE (TIC80_FULLWIDTH)
 | 
			
		||||
// #define STUDIO_PIXEL_FORMAT SDL_PIXELFORMAT_ARGB8888
 | 
			
		||||
#define FRAME_SIZE (TIC80_FULLWIDTH * TIC80_FULLHEIGHT * sizeof(u32))
 | 
			
		||||
// #define OFFSET_LEFT ((TIC80_FULLWIDTH-TIC80_WIDTH)/2)
 | 
			
		||||
// #define OFFSET_TOP ((TIC80_FULLHEIGHT-TIC80_HEIGHT)/2)
 | 
			
		||||
#define POPUP_DUR (TIC_FRAMERATE*2)
 | 
			
		||||
 | 
			
		||||
#define KEYBOARD_HOLD 20
 | 
			
		||||
@@ -372,7 +367,7 @@ void toClipboard(const void* data, s32 size, bool flip)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			setClipboardText(clipboard);
 | 
			
		||||
			getSystem()->setClipboardText(clipboard);
 | 
			
		||||
			free(clipboard);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -416,9 +411,9 @@ bool fromClipboard(void* data, s32 size, bool flip, bool remove_white_spaces)
 | 
			
		||||
{
 | 
			
		||||
	if(data)
 | 
			
		||||
	{
 | 
			
		||||
		if(hasClipboardText())
 | 
			
		||||
		if(getSystem()->hasClipboardText())
 | 
			
		||||
		{
 | 
			
		||||
			char* clipboard = getClipboardText();
 | 
			
		||||
			char* clipboard = getSystem()->getClipboardText();
 | 
			
		||||
 | 
			
		||||
			if(clipboard)
 | 
			
		||||
			{
 | 
			
		||||
@@ -1649,8 +1644,6 @@ static void renderStudio()
 | 
			
		||||
 | 
			
		||||
	if(studioImpl.mode != TIC_RUN_MODE)
 | 
			
		||||
		useSystemPalette();
 | 
			
		||||
	
 | 
			
		||||
	// renderCursor();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void updateSystemFont()
 | 
			
		||||
@@ -1716,60 +1709,6 @@ static void initKeymap()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// #if defined(__EMSCRIPTEN__)
 | 
			
		||||
 | 
			
		||||
// #define DEFAULT_CART "cart.tic"
 | 
			
		||||
 | 
			
		||||
// static void onEmscriptenWget(const char* file)
 | 
			
		||||
// {
 | 
			
		||||
// 	studioImpl.argv[1] = DEFAULT_CART;
 | 
			
		||||
// 	createFileSystem(NULL, onFSInitialized);
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// static void onEmscriptenWgetError(const char* error) {}
 | 
			
		||||
 | 
			
		||||
// static void emstick()
 | 
			
		||||
// {
 | 
			
		||||
// 	static double nextTick = -1.0;
 | 
			
		||||
 | 
			
		||||
// 	studioImpl.missedFrame = false;
 | 
			
		||||
 | 
			
		||||
// 	if(nextTick < 0.0)
 | 
			
		||||
// 		nextTick = emscripten_get_now();
 | 
			
		||||
 | 
			
		||||
// 	nextTick += 1000.0/TIC_FRAMERATE;
 | 
			
		||||
// 	tick();
 | 
			
		||||
// 	double delay = nextTick - emscripten_get_now();
 | 
			
		||||
 | 
			
		||||
// 	if(delay < 0.0)
 | 
			
		||||
// 	{
 | 
			
		||||
// 		nextTick -= delay;
 | 
			
		||||
// 		studioImpl.missedFrame = true;
 | 
			
		||||
// 	}
 | 
			
		||||
// 	else
 | 
			
		||||
// 		emscripten_set_main_loop_timing(EM_TIMING_SETTIMEOUT, delay);
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// #endif
 | 
			
		||||
 | 
			
		||||
// #if defined(__EMSCRIPTEN__)
 | 
			
		||||
 | 
			
		||||
// 	if(studioImpl.argc == 2)
 | 
			
		||||
// 	{
 | 
			
		||||
// 		emscripten_async_wget(studioImpl.argv[1], DEFAULT_CART, onEmscriptenWget, onEmscriptenWgetError);
 | 
			
		||||
// 	}
 | 
			
		||||
// 	else createFileSystem(NULL, onFSInitialized);
 | 
			
		||||
 | 
			
		||||
// 	// emscripten_set_main_loop(emstick, TIC_FRAMERATE, 1);
 | 
			
		||||
 | 
			
		||||
// #else
 | 
			
		||||
 | 
			
		||||
// 	FileSystem* fs = createFileSystem(argc > 1 && fsExists(argv[1]) ? fsBasename(argv[1]) : folder);
 | 
			
		||||
// 	onFSInitialized(fs);
 | 
			
		||||
 | 
			
		||||
// #endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder, System* system)
 | 
			
		||||
{
 | 
			
		||||
	setbuf(stdout, NULL);
 | 
			
		||||
@@ -1935,52 +1874,7 @@ void studioClose()
 | 
			
		||||
		tic80_delete((tic80*)studioImpl.tic80local);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void setClipboardText(const char* text)
 | 
			
		||||
System* getSystem()
 | 
			
		||||
{
 | 
			
		||||
	studioImpl.system->setClipboardText(text);
 | 
			
		||||
	return studioImpl.system;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool hasClipboardText()
 | 
			
		||||
{
 | 
			
		||||
	return studioImpl.system->hasClipboardText();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char* getClipboardText()
 | 
			
		||||
{
 | 
			
		||||
	return studioImpl.system->getClipboardText();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u64 getPerformanceCounter()
 | 
			
		||||
{
 | 
			
		||||
	return studioImpl.system->getPerformanceCounter();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u64 getPerformanceFrequency()
 | 
			
		||||
{
 | 
			
		||||
	return studioImpl.system->getPerformanceFrequency();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _file_dialog_load(file_dialog_load_callback callback, void* data)
 | 
			
		||||
{
 | 
			
		||||
	studioImpl.system->file_dialog_load(callback, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _file_dialog_save(file_dialog_save_callback callback, const char* name, const u8* buffer, size_t size, void* data, u32 mode)
 | 
			
		||||
{
 | 
			
		||||
	studioImpl.system->file_dialog_save(callback, name, buffer, size, data, mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void showMessageBox(const char* title, const char* message)
 | 
			
		||||
{
 | 
			
		||||
	studioImpl.system->showMessageBox(title, message);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void openSystemPath(const char* path)
 | 
			
		||||
{
 | 
			
		||||
	studioImpl.system->openSystemPath(path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void* getUrlRequest(const char* url, s32* size)
 | 
			
		||||
{
 | 
			
		||||
	return studioImpl.system->getUrlRequest(url, size);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								src/studio.h
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								src/studio.h
									
									
									
									
									
								
							@@ -27,8 +27,6 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
// #include <SDL.h>
 | 
			
		||||
 | 
			
		||||
#if defined(__EMSCRIPTEN__)
 | 
			
		||||
#include <emscripten.h>
 | 
			
		||||
#endif
 | 
			
		||||
@@ -38,12 +36,11 @@
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "tools.h"
 | 
			
		||||
#include "ext/file_dialog.h"
 | 
			
		||||
#include "main.h"
 | 
			
		||||
 | 
			
		||||
#define TIC_LOCAL ".local/"
 | 
			
		||||
#define TIC_CACHE TIC_LOCAL "cache/"
 | 
			
		||||
 | 
			
		||||
// #define TIC_MOD_CTRL (KMOD_GUI|KMOD_CTRL)
 | 
			
		||||
 | 
			
		||||
#define TOOLBAR_SIZE 7
 | 
			
		||||
#define STUDIO_TEXT_WIDTH (TIC_FONT_WIDTH)
 | 
			
		||||
#define STUDIO_TEXT_HEIGHT (TIC_FONT_HEIGHT+1)
 | 
			
		||||
@@ -211,54 +208,17 @@ void runProject();
 | 
			
		||||
tic_tiles* getBankTiles();
 | 
			
		||||
tic_map* getBankMap();
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	tic_mem* tic;
 | 
			
		||||
	bool quit;
 | 
			
		||||
 | 
			
		||||
} Studio;
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	void	(*setClipboardText)(const char* text);
 | 
			
		||||
	bool	(*hasClipboardText)();
 | 
			
		||||
	char* 	(*getClipboardText)();
 | 
			
		||||
	u64 	(*getPerformanceCounter)();
 | 
			
		||||
	u64 	(*getPerformanceFrequency)();
 | 
			
		||||
 | 
			
		||||
	void* (*getUrlRequest)(const char* url, s32* size);
 | 
			
		||||
 | 
			
		||||
	void (*file_dialog_load)(file_dialog_load_callback callback, void* data);
 | 
			
		||||
	void (*file_dialog_save)(file_dialog_save_callback callback, const char* name, const u8* buffer, size_t size, void* data, u32 mode);
 | 
			
		||||
 | 
			
		||||
	void (*goFullscreen)();
 | 
			
		||||
	void (*showMessageBox)(const char* title, const char* message);
 | 
			
		||||
	void (*setWindowTitle)(const char* title);
 | 
			
		||||
 | 
			
		||||
	void (*openSystemPath)(const char* path);
 | 
			
		||||
 | 
			
		||||
} System;
 | 
			
		||||
 | 
			
		||||
TIC80_API Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* appFolder, System* system);
 | 
			
		||||
TIC80_API void studioTick(void* pixels);
 | 
			
		||||
TIC80_API void studioClose();
 | 
			
		||||
 | 
			
		||||
char getKeyboardText();
 | 
			
		||||
bool keyWasPressed(tic_key key);
 | 
			
		||||
bool anyKeyWasPressed();
 | 
			
		||||
 | 
			
		||||
void setClipboardText(const char* text);
 | 
			
		||||
bool hasClipboardText();
 | 
			
		||||
char* getClipboardText();
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	tic_mem* tic;
 | 
			
		||||
	bool quit;
 | 
			
		||||
} Studio;
 | 
			
		||||
 | 
			
		||||
u64 getPerformanceCounter();
 | 
			
		||||
u64 getPerformanceFrequency();
 | 
			
		||||
 | 
			
		||||
void _file_dialog_load(file_dialog_load_callback callback, void* data);
 | 
			
		||||
void _file_dialog_save(file_dialog_save_callback callback, const char* name, const u8* buffer, size_t size, void* data, u32 mode);
 | 
			
		||||
 | 
			
		||||
void showMessageBox(const char* title, const char* message);
 | 
			
		||||
TIC80_API Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* appFolder, System* system);
 | 
			
		||||
TIC80_API void studioTick(void* pixels);
 | 
			
		||||
TIC80_API void studioClose();
 | 
			
		||||
TIC80_API void updateStudioProject();
 | 
			
		||||
 | 
			
		||||
void openSystemPath(const char* path);
 | 
			
		||||
void* getUrlRequest(const char* url, s32* size);
 | 
			
		||||
 
 | 
			
		||||
@@ -477,7 +477,7 @@ static void* requestCover(Surf* surf, const char* hash, s32* size)
 | 
			
		||||
 | 
			
		||||
	char path[FILENAME_MAX] = {0};
 | 
			
		||||
	sprintf(path, "/cart/%s/cover.gif", hash);
 | 
			
		||||
	void* data = getUrlRequest(path, size);
 | 
			
		||||
	void* data = getSystem()->getUrlRequest(path, size);
 | 
			
		||||
 | 
			
		||||
	if(data)
 | 
			
		||||
	{
 | 
			
		||||
@@ -780,7 +780,7 @@ static void processGamepad(Surf* surf)
 | 
			
		||||
			{
 | 
			
		||||
				char url[FILENAME_MAX];
 | 
			
		||||
				sprintf(url, "https://" TIC_HOST "/play?cart=%i", item->id);
 | 
			
		||||
				openSystemPath(url);
 | 
			
		||||
				getSystem()->openSystemPath(url);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user