const void* ResourceManager::get(StringId64 type, StringId64 name) { const ResourcePair id = { type, name }; TempAllocator128 ta; DynamicString type_str(ta); DynamicString name_str(ta); type.to_string(type_str); name.to_string(name_str); CE_ASSERT(can_get(type, name) , "Resource not loaded #ID(%s-%s)" , type_str.c_str() , name_str.c_str() ); CE_UNUSED(type_str); CE_UNUSED(name_str); if (_autoload && !sort_map::has(_rm, id)) { load(type, name); flush(); } const ResourceEntry& entry = sort_map::get(_rm, id, ResourceEntry::NOT_FOUND); return entry.data; }
void ResourceManager::load(StringId64 type, StringId64 name) { ResourcePair id = { type, name }; ResourceEntry& entry = sort_map::get(_rm, id, ResourceEntry::NOT_FOUND); if (entry == ResourceEntry::NOT_FOUND) { TempAllocator64 ta; DynamicString type_str(ta); DynamicString name_str(ta); type.to_string(type_str); name.to_string(name_str); CE_ASSERT(_loader->can_load(type, name) , "Can't load resource #ID(%s-%s)" , type_str.c_str() , name_str.c_str() ); CE_UNUSED(type_str); CE_UNUSED(name_str); ResourceRequest rr; rr.type = type; rr.name = name; rr.load_function = sort_map::get(_type_data, type, ResourceTypeData()).load; rr.allocator = &_resource_heap; rr.data = NULL; _loader->add_request(rr); return; } entry.references++; }
void ApkFile::read(void* buffer, size_t size) { CE_ASSERT_NOT_NULL(buffer); size_t bytes_read = (size_t) AAsset_read(_asset, buffer, size); CE_ASSERT(bytes_read == size, "AAsset_read: requested: %lu, read: %lu", size, bytes_read); CE_UNUSED(bytes_read); }
void TCPSocket::set_reuse_address(bool reuse) { int optval = (int)reuse; int err = setsockopt(_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval)); CE_ASSERT(err == 0, "setsockopt: last_error() = %d", last_error()); CE_UNUSED(err); }
void TCPSocket::set_timeout(u32 seconds) { struct timeval timeout; timeout.tv_sec = seconds; timeout.tv_usec = 0; int err = setsockopt(_socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); CE_ASSERT(err == 0, "setsockopt: last_error(): %d", last_error()); err = setsockopt(_socket, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)); CE_ASSERT(err == 0, "setsockopt: last_error(): %d", last_error()); CE_UNUSED(err); }
void TCPSocket::set_blocking(bool blocking) { #if CROWN_PLATFORM_POSIX int flags = fcntl(_socket, F_GETFL, 0); fcntl(_socket, F_SETFL, blocking ? (flags & ~O_NONBLOCK) : O_NONBLOCK); #elif CROWN_PLATFORM_WINDOWS u_long non_blocking = blocking ? 0 : 1; int err = ioctlsocket(_socket, FIONBIO, &non_blocking); CE_ASSERT(err == 0, "ioctlsocket: last_error() = %d", last_error()); CE_UNUSED(err); #endif }
f64 parse_number(const char* json) { CE_ASSERT_NOT_NULL(json); TempAllocator512 alloc; Array<char> number(alloc); if (*json == '-') { array::push_back(number, '-'); ++json; } while (isdigit(*json)) { array::push_back(number, *json); ++json; } if (*json == '.') { array::push_back(number, '.'); while (*++json && isdigit(*json)) { array::push_back(number, *json); } } if (*json == 'e' || *json == 'E') { array::push_back(number, *json); ++json; if (*json == '-' || *json == '+') { array::push_back(number, *json); ++json; } while (isdigit(*json)) { array::push_back(number, *json); ++json; } } array::push_back(number, '\0'); f64 val; int ok = sscanf(array::begin(number), "%lf", &val); CE_ASSERT(ok == 1, "Failed to parse f64: %s", array::begin(number)); CE_UNUSED(ok); return val; }
void flush() { #if CROWN_PLATFORM_POSIX int err = fflush(_file); CE_ASSERT(err == 0, "fflush: errno = %d", errno); #elif CROWN_PLATFORM_WINDOWS BOOL err = FlushFileBuffers(_file); CE_ASSERT(err != 0 , "FlushFileBuffers: GetLastError = %d" , GetLastError() ); #endif CE_UNUSED(err); }
void skip(u32 bytes) { #if CROWN_PLATFORM_POSIX int err = fseek(_file, bytes, SEEK_CUR); CE_ASSERT(err == 0, "fseek: errno = %d", errno); #elif CROWN_PLATFORM_WINDOWS DWORD err = SetFilePointer(_file, bytes, NULL, FILE_CURRENT); CE_ASSERT(err != INVALID_SET_FILE_POINTER , "SetFilePointer: GetLastError = %d" , GetLastError() ); #endif CE_UNUSED(err); }
void seek_to_end() { #if CROWN_PLATFORM_POSIX int err = fseek(_file, 0, SEEK_END); CE_ASSERT(err == 0, "fseek: errno = %d", errno); #elif CROWN_PLATFORM_WINDOWS DWORD err = SetFilePointer(_file, 0, NULL, FILE_END); CE_ASSERT(err != INVALID_SET_FILE_POINTER , "SetFilePointer: GetLastError = %d" , GetLastError() ); #endif CE_UNUSED(err); }
void seek(u32 position) { #if CROWN_PLATFORM_POSIX int err = fseek(_file, (long)position, SEEK_SET); CE_ASSERT(err == 0, "fseek: errno = %d", errno); #elif CROWN_PLATFORM_WINDOWS DWORD err = SetFilePointer(_file, position, NULL, FILE_BEGIN); CE_ASSERT(err != INVALID_SET_FILE_POINTER , "SetFilePointer: GetLastError = %d" , GetLastError() ); #endif CE_UNUSED(err); }
u32 size() { #if CROWN_PLATFORM_POSIX long pos = ftell(_file); CE_ASSERT(pos != -1, "ftell: errno = %d", errno); int err = fseek(_file, 0, SEEK_END); CE_ASSERT(err == 0, "fseek: errno = %d", errno); long size = ftell(_file); CE_ASSERT(size != -1, "ftell: errno = %d", errno); err = fseek(_file, (long)pos, SEEK_SET); CE_ASSERT(err == 0, "fseek: errno = %d", errno); CE_UNUSED(err); return (u32)size; #elif CROWN_PLATFORM_WINDOWS return GetFileSize(_file, NULL); #endif }
void ApkFile::skip(size_t bytes) { off_t seek_result = AAsset_seek(_asset, (off_t) bytes, SEEK_CUR); CE_ASSERT(seek_result != (off_t) -1, "AAsset_seek: error"); CE_UNUSED(seek_result); }
void TCPSocket::listen(u32 max) { int err = ::listen(_socket, max); CE_ASSERT(err == 0, "listen: last_error() = %d", last_error()); CE_UNUSED(err); }
void ApkFile::seek(size_t position) { off_t seek_result = AAsset_seek(_asset, (off_t)position, SEEK_SET); CE_ASSERT(seek_result != (off_t) -1, "AAsset_seek: error"); CE_UNUSED(seek_result); }
void ApkFile::seek_to_end() { off_t seek_result = AAsset_seek(_asset, 0, SEEK_END); CE_ASSERT(seek_result != (off_t) -1, "AAsset_seek: error"); CE_UNUSED(seek_result); }
int32_t run(Filesystem* fs, ConfigSettings* cs) { // http://tronche.com/gui/x/xlib/display/XInitThreads.html Status xs = XInitThreads(); CE_ASSERT(xs != 0, "XInitThreads: error"); CE_UNUSED(xs); _x11_display = XOpenDisplay(NULL); CE_ASSERT(_x11_display != NULL, "XOpenDisplay: error"); int screen = DefaultScreen(_x11_display); int depth = DefaultDepth(_x11_display, screen); Visual* visual = DefaultVisual(_x11_display, screen); _x11_parent_window = (cs->parent_window == 0) ? RootWindow(_x11_display, screen) : (Window) cs->parent_window; // Create main window XSetWindowAttributes win_attribs; win_attribs.background_pixmap = 0; win_attribs.border_pixel = 0; win_attribs.event_mask = FocusChangeMask | StructureNotifyMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; _x11_window = XCreateWindow(_x11_display , _x11_parent_window , 0 , 0 , cs->window_width , cs->window_height , 0 , depth , InputOutput , visual , CWBorderPixel | CWEventMask , &win_attribs); CE_ASSERT(_x11_window != None, "XCreateWindow: error"); // Do we have detectable autorepeat? Bool detectable; _x11_detectable_autorepeat = (bool) XkbSetDetectableAutoRepeat(_x11_display, true, &detectable); // Build hidden cursor Pixmap bm_no; XColor black, dummy; Colormap colormap; static char no_data[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; colormap = XDefaultColormap(_x11_display, screen); XAllocNamedColor(_x11_display, colormap, "black", &black, &dummy); bm_no = XCreateBitmapFromData(_x11_display, _x11_window, no_data, 8, 8); _x11_hidden_cursor = XCreatePixmapCursor(_x11_display, bm_no, bm_no, &black, &black, 0, 0); _wm_delete_message = XInternAtom(_x11_display, "WM_DELETE_WINDOW", False); XSetWMProtocols(_x11_display, _x11_window, &_wm_delete_message, 1); oswindow_set_window(_x11_display, _x11_window); bgfx::x11SetDisplayWindow(_x11_display, _x11_window); XMapRaised(_x11_display, _x11_window); // Save screen configuration _screen_config = XRRGetScreenInfo(_x11_display, RootWindow(_x11_display, screen)); Rotation rr_old_rot; const SizeID rr_old_sizeid = XRRConfigCurrentConfiguration(_screen_config, &rr_old_rot); // Start main thread MainThreadArgs mta; mta.fs = fs; mta.cs = cs; Thread main_thread; main_thread.start(func, &mta); while (!s_exit) { pump_events(); } main_thread.stop(); // Restore previous screen configuration Rotation rr_rot; const SizeID rr_sizeid = XRRConfigCurrentConfiguration(_screen_config, &rr_rot); if (rr_rot != rr_old_rot || rr_sizeid != rr_old_sizeid) { XRRSetScreenConfig(_x11_display , _screen_config , RootWindow(_x11_display, screen) , rr_old_sizeid , rr_old_rot , CurrentTime); } XRRFreeScreenConfigInfo(_screen_config); XDestroyWindow(_x11_display, _x11_window); XCloseDisplay(_x11_display); return EXIT_SUCCESS; }