bool machine_t::dialog_response(cookie_t c, int value) { if (events.count(c)==0) { log_error("Invalid cookie [%d] in respond", c.value()) ; return false ; } event_t *e = events[c] ; if (e->state == state_dlg_requ) { if (e->request_watcher) e->request_watcher->detach(e) ; } else if (e->state != state_dlg_user) { log_error("Unexpected response for event [%d] in state '%s'", c.value(), e->state->name()) ; return false ; } if (value < -Maemo::Timed::Number_of_Sys_Buttons) { log_error("Invalid negative value in respond: event [%d], value=%d", c.value(), value) ; return false ; } int b = e->b_attr.size() ; if (value > b) { log_error("Invalid value in respond: event [%d], value=%d, number of buttons: %d", c.value(), value, b) ; return false ; } log_assert(buttons.count(value)>0, "no button with value=%d present", value) ; request_state(e, buttons[value]) ; e->flags &= ~ EventFlags::In_Dialog ; invoke_process_transition_queue() ; return true ; }
void machine_t::request_state(event_t *e, const string &state_name) { state *new_state = NULL ; if(not state_name.empty()) { map<string, state*>::iterator it = states.find(state_name) ; log_assert(it!=states.end(), "Unknown state: '%s'", state_name.c_str()) ; new_state = it->second ; } request_state(e, new_state) ; }
//----------------------------------------------------------------------------- int main( int argc, char* argv[] ) { if( init( argc, argv ) != 0 ) //quit.store( 1, std::memory_order_seq_cst ); quit = true; while( !quit ) { //while( !quit.load( std::memory_order_seq_cst ) ) { request_state(); compute_command(); publish_command(); publish_yield(); } shutdown(); return 0; }
// internal pwrite, do a write query with offset on a different descriptor, do not change the position of the current one. ssize_t gridftp_rw_internal_pwrite(GridFTPFactory * factory, GridFTPFileDesc* desc, const void* buffer, size_t s_buff, off_t offset) { // throw Gfal::CoreException gfal_log(GFAL_VERBOSE_TRACE, " -> [GridFTPModule::internal_pwrite]"); GridFTPSessionHandler handler(factory, desc->url); GridFTPRequestState request_state(&handler); GridFTPStreamState stream(&handler); globus_result_t res = globus_ftp_client_partial_put( stream.handler->get_ftp_client_handle(), desc->url.c_str(), stream.handler->get_ftp_client_operationattr(), NULL, offset, offset + s_buff, globus_ftp_client_done_callback, &request_state); gfal_globus_check_result(GFAL_GRIDFTP_SCOPE_INTERNAL_PWRITE, res); ssize_t r_size = gridftp_write_stream(GFAL_GRIDFTP_SCOPE_INTERNAL_PWRITE, &stream, buffer, s_buff, false); // write block request_state.wait(GFAL_GRIDFTP_SCOPE_INTERNAL_PWRITE); gfal_log(GFAL_VERBOSE_TRACE, "[GridFTPModule::internal_pwrite] <-"); return r_size; }
// internal pread, do a read query with offset on a different descriptor, do not change the position of the current one. ssize_t gridftp_rw_internal_pread(GridFTPFactory * factory, GridFTPFileDesc* desc, void* buffer, size_t s_buff, off_t offset) { // throw Gfal::CoreException gfal_log(GFAL_VERBOSE_TRACE, " -> [GridFTPModule::internal_pread]"); GridFTPSessionHandler handler(factory, desc->url); GridFTPRequestState request_state(&handler); GridFTPStreamState stream_state(&handler); globus_result_t res = globus_ftp_client_partial_get( handler.get_ftp_client_handle(), desc->url.c_str(), handler.get_ftp_client_operationattr(), NULL, offset, offset + s_buff, globus_ftp_client_done_callback, &request_state); gfal_globus_check_result(GFAL_GRIDFTP_SCOPE_INTERNAL_PREAD, res); ssize_t r_size = gridftp_read_stream(GFAL_GRIDFTP_SCOPE_INTERNAL_PREAD, &stream_state, buffer, s_buff); request_state.wait(GFAL_GRIDFTP_SCOPE_INTERNAL_PREAD); gfal_log(GFAL_VERBOSE_TRACE, "[GridFTPModule::internal_pread] <-"); return r_size; }
void machine_t::request_state(event_t *e, const char *state_name) { request_state(e, string(state_name)) ; }