static int encode(config *cfg) { uint8_t window_sz2 = cfg->window_sz2; size_t window_sz = 1 << window_sz2; heatshrink_encoder *hse = heatshrink_encoder_alloc(window_sz2, cfg->lookahead_sz2); if (hse == NULL) { die("failed to init encoder: bad settings"); } ssize_t read_sz = 0; io_handle *in = cfg->in; /* Process input until end of stream */ while (1) { uint8_t *input = NULL; read_sz = handle_read(in, window_sz, &input); if (input == NULL) { printf("handle read failure\n"); die("read"); } if (read_sz < 0) { die("read"); } /* Pass read to encoder and check if input is fully processed. */ if (encoder_sink_read(cfg, hse, input, read_sz)) break; if (handle_drop(in, read_sz) < 0) { die("drop"); } }; if (read_sz == -1) { err(1, "read"); } heatshrink_encoder_free(hse); close_and_report(cfg); return 0; }
void combo_drag::mouse_up(const SDL_MouseButtonEvent& event) { if ((drag_ == PRESSED || drag_ == PRESSED_MOVE || drag_ == MOVED) && event.button == SDL_BUTTON_LEFT) { if (drag_ == PRESSED || drag_ == PRESSED_MOVE) { free_mouse_lock(); drag_ = DROP_DOWN; } else if (drag_ == MOVED) { free_mouse_lock(); handle_drop(); drag_ = RETURN; hide(); } } button::mouse_up(event); }
static int decode(config *cfg) { uint8_t window_sz2 = cfg->window_sz2; size_t window_sz = 1 << window_sz2; size_t ibs = cfg->decoder_input_buffer_size; heatshrink_decoder *hsd = heatshrink_decoder_alloc(ibs, window_sz2, cfg->lookahead_sz2); if (hsd == NULL) { die("failed to init decoder"); } ssize_t read_sz = 0; io_handle *in = cfg->in; HSD_finish_res fres; /* Process input until end of stream */ while (1) { uint8_t *input = NULL; read_sz = handle_read(in, window_sz, &input); if (input == NULL) { printf("handle read failure\n"); die("read"); } if (read_sz == 0) { fres = heatshrink_decoder_finish(hsd); if (fres < 0) { die("finish"); } if (fres == HSDR_FINISH_DONE) break; } else if (read_sz < 0) { die("read"); } else { if (decoder_sink_read(cfg, hsd, input, read_sz)) { break; } if (handle_drop(in, read_sz) < 0) { die("drop"); } } } if (read_sz == -1) { err(1, "read"); } heatshrink_decoder_free(hsd); close_and_report(cfg); return 0; }
static LRESULT WINAPI fuse_window_proc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { #if defined USE_JOYSTICK && !defined HAVE_JSW_H case WM_CREATE: if( joysticks_supported > 0 ) if( joySetCapture( hWnd, JOYSTICKID1, 0, FALSE ) ) ui_error( UI_ERROR_ERROR, "Couldn't start capture for joystick 1" ); if( joysticks_supported > 1 ) if( joySetCapture( hWnd, JOYSTICKID2, 0, FALSE ) ) ui_error( UI_ERROR_ERROR, "Couldn't start capture for joystick 2" ); break; #endif /* if defined USE_JOYSTICK && !defined HAVE_JSW_H */ case WM_COMMAND: if( ! handle_menu( LOWORD( wParam ), hWnd ) ) return 0; break; case WM_DROPFILES: handle_drop( ( HDROP )wParam ); return 0; case WM_CLOSE: menu_file_exit( 0 ); return 0; case WM_KEYDOWN: win32keyboard_keypress( wParam, lParam ); return 0; case WM_KEYUP: win32keyboard_keyrelease( wParam, lParam ); return 0; case WM_PAINT: if( ! win32ui_window_paint( hWnd, wParam, lParam ) ) return 0; break; case WM_SIZING: if( win32ui_window_resizing( hWnd, wParam, lParam ) ) return TRUE; break; case WM_SIZE: if( ! win32ui_window_resize( hWnd, wParam, lParam ) ) return 0; break; case WM_DRAWITEM: if( wParam == ID_STATUSBAR ) { win32statusbar_redraw( hWnd, lParam ); return TRUE; } break; case WM_DESTROY: fuse_exiting = 1; PostQuitMessage( 0 ); /* Stop the paused state to allow us to exit (occurs from main emulation loop) */ if( paused ) menu_machine_pause( 0 ); return 0; case WM_ENTERMENULOOP: case WM_ENTERSIZEMOVE: { fuse_emulation_pause(); return 0; } case WM_EXITMENULOOP: case WM_EXITSIZEMOVE: { fuse_emulation_unpause(); return 0; } case WM_LBUTTONUP: win32mouse_button( 1, 0 ); return 0; case WM_LBUTTONDOWN: win32mouse_button( 1, 1 ); return 0; case WM_MBUTTONUP: win32mouse_button( 2, 0 ); return 0; case WM_MBUTTONDOWN: win32mouse_button( 2, 1 ); return 0; case WM_RBUTTONUP: win32mouse_button( 3, 0 ); return 0; case WM_RBUTTONDOWN: win32mouse_button( 3, 1 ); return 0; case WM_MOUSEMOVE: win32mouse_position( lParam ); return 0; case WM_SETCURSOR: /* prevent the cursor from being redrawn if fuse has grabbed the mouse */ if( ui_mouse_grabbed ) return TRUE; else return( DefWindowProc( hWnd, msg, wParam, lParam ) ); case WM_ACTIVATE: if( ( LOWORD( wParam ) == WA_ACTIVE ) || ( LOWORD( wParam ) == WA_CLICKACTIVE ) ) win32ui_gain_focus( hWnd, wParam, lParam ); else if( LOWORD( wParam ) == WA_INACTIVE ) win32ui_lose_focus( hWnd, wParam, lParam ); /* We'll call DefWindowProc to get keyboard focus when debugger window is open and inactive */ break; case WM_USER_EXIT_PROCESS_MESSAGES: /* Odd case when message loop is overridden by a modal dialog. This should not be caught here, so we delay this notification */ exit_process_messages++; return 0; case WM_ERASEBKGND: /* Improves speed and avoid flickering when main window is invalidated by another window */ return TRUE; #if defined USE_JOYSTICK && !defined HAVE_JSW_H case MM_JOY1BUTTONDOWN: win32joystick_buttonevent( 0, 1, wParam ); break; case MM_JOY1BUTTONUP: win32joystick_buttonevent( 0, 0, wParam ); break; case MM_JOY2BUTTONDOWN: win32joystick_buttonevent( 1, 1, wParam ); break; case MM_JOY2BUTTONUP: win32joystick_buttonevent( 1, 0, wParam ); break; case MM_JOY1MOVE: win32joystick_move( 0, LOWORD( lParam ), HIWORD( lParam ) ); break; case MM_JOY2MOVE: win32joystick_move( 1, LOWORD( lParam ), HIWORD( lParam ) ); break; #endif /* if defined USE_JOYSTICK && !defined HAVE_JSW_H */ } return( DefWindowProc( hWnd, msg, wParam, lParam ) ); }
// handle_datagram is the handler for datagrams received from the Astron cluster void Client::handle_datagram(Datagram &dg, DatagramIterator &dgi) { channel_t sender = dgi.read_uint64(); uint16_t msgtype = dgi.read_uint16(); switch(msgtype) { case CLIENTAGENT_EJECT: { uint16_t reason = dgi.read_uint16(); std::string error_string = dgi.read_string(); send_disconnect(reason, error_string); return; } break; case CLIENTAGENT_DROP: { handle_drop(); return; } break; case CLIENTAGENT_SET_STATE: { m_state = (ClientState)dgi.read_uint16(); } break; case STATESERVER_OBJECT_SET_FIELD: { uint32_t do_id = dgi.read_uint32(); if(!lookup_object(do_id)) { m_log->warning() << "Received server-side field update for unknown object " << do_id << std::endl; return; } if(sender != m_channel) { uint16_t field_id = dgi.read_uint16(); handle_set_field(do_id, field_id, dgi); } } break; case STATESERVER_OBJECT_DELETE_RAM: { uint32_t do_id = dgi.read_uint32(); if(!lookup_object(do_id)) { m_log->warning() << "Received server-side object delete for unknown object " << do_id << std::endl; return; } if(m_seen_objects.find(do_id) != m_seen_objects.end()) { m_seen_objects.erase(do_id); m_id_history.insert(do_id); handle_remove_object(do_id); } if(m_owned_objects.find(do_id) != m_owned_objects.end()) { m_owned_objects.erase(do_id); handle_remove_ownership(do_id); } m_dist_objs.erase(do_id); } break; case STATESERVER_OBJECT_ENTER_OWNER_WITH_REQUIRED_OTHER: case STATESERVER_OBJECT_ENTER_OWNER_WITH_REQUIRED: { uint32_t do_id = dgi.read_uint32(); uint32_t parent = dgi.read_uint32(); uint32_t zone = dgi.read_uint32(); uint16_t dc_id = dgi.read_uint16(); m_owned_objects.insert(do_id); if(m_dist_objs.find(do_id) == m_dist_objs.end()) { VisibleObject obj; obj.id = do_id; obj.parent = parent; obj.zone = zone; obj.dcc = g_dcf->get_class(dc_id); m_dist_objs[do_id] = obj; } handle_add_ownership(do_id, parent, zone, dc_id, dgi, true); } break; case CLIENTAGENT_SET_CLIENT_ID: { if(m_channel != m_allocated_channel) { unsubscribe_channel(m_channel); } m_channel = dgi.read_uint64(); subscribe_channel(m_channel); } break; case CLIENTAGENT_SEND_DATAGRAM: { Datagram forward; forward.add_data(dgi.read_string()); send_datagram(forward); } break; case CLIENTAGENT_OPEN_CHANNEL: { subscribe_channel(dgi.read_uint64()); } break; case CLIENTAGENT_CLOSE_CHANNEL: { unsubscribe_channel(dgi.read_uint64()); } break; case CLIENTAGENT_ADD_POST_REMOVE: { add_post_remove(dgi.read_string()); } break; case CLIENTAGENT_CLEAR_POST_REMOVES: { clear_post_removes(); } break; case STATESERVER_OBJECT_ENTER_LOCATION_WITH_REQUIRED: case STATESERVER_OBJECT_ENTER_LOCATION_WITH_REQUIRED_OTHER: { uint32_t do_id = dgi.read_uint32(); uint32_t parent = dgi.read_uint32(); uint32_t zone = dgi.read_uint32(); uint16_t dc_id = dgi.read_uint16(); if(m_owned_objects.find(do_id) != m_owned_objects.end() || m_seen_objects.find(do_id) != m_seen_objects.end()) { return; } if(m_dist_objs.find(do_id) == m_dist_objs.end()) { VisibleObject obj; obj.id = do_id; obj.dcc = g_dcf->get_class(dc_id); obj.parent = parent; obj.zone = zone; m_dist_objs[do_id] = obj; } m_seen_objects.insert(do_id); handle_add_object(do_id, parent, zone, dc_id, dgi, msgtype == STATESERVER_OBJECT_ENTER_LOCATION_WITH_REQUIRED_OTHER); // TODO: This is a tad inefficient as it checks every pending interest. // In practice, there shouldn't be many add-interest operations active // at once, however. std::list<uint32_t> deferred_deletes; for(auto it = m_pending_interests.begin(); it != m_pending_interests.end(); ++it) { if(it->second->is_ready(m_dist_objs)) { handle_interest_done(it->second->m_interest_id, it->second->m_client_context); deferred_deletes.push_back(it->first); } } for(auto it = deferred_deletes.begin(); it != deferred_deletes.end(); ++it) { m_pending_interests.erase(*it); } } break; case STATESERVER_OBJECT_GET_ZONES_COUNT_RESP: { uint32_t context = dgi.read_uint32(); uint32_t count = dgi.read_uint32(); if(m_pending_interests.find(context) == m_pending_interests.end()) { m_log->error() << "Received GET_ZONES_COUNT_RESP for unknown context " << context << std::endl; return; } m_pending_interests[context]->store_total(count); if(m_pending_interests[context]->is_ready(m_dist_objs)) { handle_interest_done(m_pending_interests[context]->m_interest_id, m_pending_interests[context]->m_client_context); m_pending_interests.erase(context); } } break; case STATESERVER_OBJECT_CHANGING_LOCATION: { uint32_t do_id = dgi.read_uint32(); uint32_t n_parent = dgi.read_uint32(); uint32_t n_zone = dgi.read_uint32(); dgi.read_uint32(); // Old parent; we don't care about this. dgi.read_uint32(); // Old zone; we don't care about this. bool disable = true; for(auto it = m_interests.begin(); it != m_interests.end(); ++it) { Interest &i = it->second; for(auto it2 = i.zones.begin(); it2 != i.zones.end(); ++it2) { if(*it2 == n_zone) { disable = false; break; } } } if(m_dist_objs.find(do_id) != m_dist_objs.end()) { m_dist_objs[do_id].parent = n_parent; m_dist_objs[do_id].zone = n_zone; } if(disable && m_owned_objects.find(do_id) == m_owned_objects.end()) { handle_remove_object(do_id); m_seen_objects.erase(do_id); m_dist_objs.erase(do_id); } else { handle_change_location(do_id, n_parent, n_zone); } } break; default: m_log->error() << "Recv'd unk server msgtype " << msgtype << std::endl; } }