void gToxFileRecv::resume() { if (m_state != PAUSED) { return; } m_state = RECVING; if (m_file.file_size == m_position) { cancel(); std::clog << "Friend " << m_file.nr << " File " << m_file.file_number << " " << m_position << "/" << m_file.file_size << std::endl; observer_notify(ToxEvent(EventFileProgress{ this, m_file.nr, m_file.kind, m_file.file_number, m_position, m_file.file_size })); if (m_file.kind == TOX_FILE_KIND_AVATAR) { WidgetAvatar::set_avatar(observable(), m_path, WidgetAvatar::get_avatar(m_path, true)); } return; } tox().file_control(m_file.nr, m_file.file_number, TOX_FILE_CONTROL_RESUME); }
/*! * Function which is used for notify all the observers. * * \param this_ptr - A pointer to the subject. * \param msg - A pointer to the message that is sent to the observers. */ int subject_notify(subject_t *this_ptr, void *msg) { int status = SUBJECT_SUCESS; if (this_ptr != NULL) { observer_t *current; queue_first(&this_ptr->queue); while((current = queue_get_current(&this_ptr->queue)) != NULL) { if (observer_notify(current, this_ptr, msg) != OBSERVER_SUCESS) { status = SUBJECT_MISSING_OBSERVER; } queue_next(&this_ptr->queue); } } else { status = SUBJECT_NULL; } return status; }
/** * This is the default key handler, called after * all other handlers have had their chance to * do their special processing. This handler * pushes all input in the keyboard FIFO buffer. */ static keymask_t kbd_defHandlerFunc(keymask_t key) { if (key) { /* Force a single event in kbd buffer */ kbd_buf = key; kbd_cnt = 1; #if CONFIG_KBD_OBSERVER observer_notify(&kbd_subject, KBD_EVENT_KEY, &key); #endif #if CONFIG_KBD_BEEP if (!(key & K_REPEAT)) buz_beep(KBD_BEEP_TIME); #endif } /* Eat all input */ return 0; }
void gToxFileRecv::observer_handle(const ToxEvent& ev) { if (ev.type() != typeid(Toxmm::EventFileRecvChunk)) { return; } auto data = ev.get<Toxmm::EventFileRecvChunk>(); if (data.nr != m_file.nr && data.file_number != m_file.file_number) { return; } if (m_fd == -1) { return; } //Handle download std::clog << "Recv fd " << m_fd << std::endl; auto ret = write(m_fd, data.file_data.data(), data.file_data.size()); if (ret != ssize_t(data.file_data.size())) { std::clog << Glib::strerror(errno) << std::endl; throw std::runtime_error("gToxFileRecv couldn't write file"); } m_position += data.file_data.size(); std::clog << "Friend " << m_file.nr << " File " << m_file.file_number << " " << m_position << "/" << m_file.file_size << std::endl; observer_notify(ToxEvent(EventFileProgress{ this, m_file.nr, m_file.kind, m_file.file_number, m_position, m_file.file_size })); }