/* NFS Callback for NFS_getdirent */ static void getdirent_cb(uintptr_t token, int status, int num_entries, struct nfs_filename *filenames, int next_cookie) { dprintf(1, "*** nfsfs_dirent_cb: %d, %d, %d, %d\n", token, status, num_entries, next_cookie); NFS_DirRequest *rq = (NFS_DirRequest *) get_request(token); if (rq == NULL) { dprintf(0, "!!! nfsfs: Corrupt dirent callback, no matching token: %d\n", token); return; } Process *p = process_lookup(rq->p.pid); if (status != NFS_OK) { syscall_reply(process_get_tid(p), status_nfs2vfs(status)); remove_request((NFS_BaseRequest *) rq); return; } // got it if (rq->cpos + num_entries >= rq->pos + 1) { dprintf(2, "found file, getting now\n"); int status = SOS_VFS_ERROR; struct nfs_filename *nfile = &filenames[rq->pos - rq->cpos]; if (nfile->size + 1 <= rq->nbyte) { memcpy(rq->buf, nfile->file, nfile->size); rq->buf[nfile->size] = '\0'; status = nfile->size; } else { dprintf(0, "!!! nfs_getdirent_cb: Filename too big for given buffer! (%d) (%d)\n", nfile->size, rq->nbyte); status = SOS_VFS_NOMEM; } syscall_reply(process_get_tid(p), status); remove_request((NFS_BaseRequest *) rq); } // need later directory entry else if (next_cookie > 0) { dprintf(2, "Need more dir entries to get file\n"); rq->cpos += num_entries; nfs_readdir(&nfs_mnt, next_cookie, IO_MAX_BUFFER, getdirent_cb, rq->p.token); } // error case, just return SOS_VFS_OK to say nothing read, its not an error just eof else { dprintf(2, "nfsfs_getdirent: didnt find file (%d)\n", rq->pos); syscall_reply(process_get_tid(p), SOS_VFS_EOF); remove_request((NFS_BaseRequest *) rq); } }
static void on_configuration_ready (GObject *source, GAsyncResult *result, gpointer user_data) { ResolveClosure *closure = (ResolveClosure *) user_data; GrlTmdbRequest *request = GRL_TMDB_REQUEST (source); GrlTmdbSource *self = closure->self; GError *error = NULL; GValue *value; GRL_DEBUG ("Configuration request ready..."); if (!grl_tmdb_request_run_finish (GRL_TMDB_REQUEST (source), result, &error)) { resolve_closure_callback (closure, error); resolve_closure_free (closure); /* Notify pending requests about failure */ while (!g_queue_is_empty (self->priv->pending_resolves)) { ResolveClosure *pending_closure; pending_closure = g_queue_pop_head (self->priv->pending_resolves); resolve_closure_callback (pending_closure, error); resolve_closure_free (pending_closure); } g_error_free (error); return; } self->priv->configuration = g_object_ref (request); remove_request (closure, request); value = grl_tmdb_request_get (request, "$.images.base_url"); if (value != NULL) { GRL_DEBUG ("Got TMDb configuration."); self->priv->image_base_uri = soup_uri_new (g_value_get_string (value)); g_value_unset (value); g_free (value); } g_queue_push_head (self->priv->pending_resolves, closure); /* Flush queue. GrlNetWc will take care of throttling */ while (!g_queue_is_empty (self->priv->pending_resolves)) { ResolveClosure *pending_closure; pending_closure = g_queue_pop_head (self->priv->pending_resolves); run_pending_requests (pending_closure, G_MAXINT); } }
void Cconditions_list_box::add_condition(QString osp) { this->entries.append( new Cconditions_list_boxItem( this->entries.count() ) ); QObject::connect( this->entries.last(), SIGNAL(edit_request(quint32)), this, SLOT(edit_condition(quint32))); QObject::connect( this->entries.last(), SIGNAL(remove_request(quint32)), this, SLOT(remove_condition(quint32))); this->entries.last()->btn_value_edit->setText( osp ); this->refresh_indexes(); }
void Cconditions_list_box::add_condition() { this->entries.append( new Cconditions_list_boxItem( this->entries.count() ) ); QObject::connect( this->entries.last(), SIGNAL(edit_request(quint32)), this, SLOT(edit_condition(quint32))); QObject::connect( this->entries.last(), SIGNAL(remove_request(quint32)), this, SLOT(remove_condition(quint32))); this->edit_condition( this->entries.last()->index ); if ( this->entries.last()->btn_value_edit->text().contains( "*" ) ) this->remove_condition( this->entries.count()-1 ); this->refresh_indexes(); }
/* NFS Callback for NFS_Write */ static void write_cb(uintptr_t token, int status, fattr_t *attr) { dprintf(1, "*** nfsfs_write_cb: %u, %d, %p\n", token, status, attr); NFS_WriteRequest *rq = (NFS_WriteRequest *) get_request(token); if (rq == NULL) { dprintf(0, "!!! nfsfs: Corrupt write callback, no matching token: %d\n", token); return; } if (status != NFS_OK) { rq->write_done(rq->p.pid, rq->p.vnode, rq->file, 0, rq->buf, 0, status_nfs2vfs(status)); remove_request((NFS_BaseRequest *) rq); return; } cp_stats(&(rq->p.vnode->vstat), attr); // call vfs to handle fp and anything else rq->write_done(rq->p.pid, rq->p.vnode, rq->file, 0, rq->buf, rq->nbyte, rq->nbyte); remove_request((NFS_BaseRequest *) rq); }
int create_new_match(int g, int white_player, int black_player, int wt, int winc, int bt, int binc, int rated, char *category, char *board, int white, int simul) { remove_request(white_player, black_player, -PEND_PARTNER); pick_colors(&white_player,&black_player,white,wt,bt,winc,binc); decline_withdraw_offers(white_player,-1, PEND_MATCH,DO_WITHDRAW | DO_DECLINE); decline_withdraw_offers(black_player,-1, PEND_MATCH,DO_WITHDRAW | DO_DECLINE); if (board_init(g,&game_globals.garray[g].game_state, category, board)) { pprintf(white_player, "PROBLEM LOADING BOARD. Game Aborted.\n"); pprintf(black_player, "PROBLEM LOADING BOARD. Game Aborted.\n"); d_printf( "CHESSD: PROBLEM LOADING BOARD %s %s. Game Aborted.\n", category, board); game_remove(g); return COM_FAILED; } game_globals.garray[g].type = game_isblitz(category,board); prepare_match(g, wt, bt, winc, binc, white_player, black_player, rated); output_match_messages(white_player,black_player, g, "Creating"); // Alex Guo: need to separate output from logic/model gameinfo(white_player, g); gameinfo(black_player, g); player_globals.parray[white_player].game = g; player_globals.parray[white_player].opponent = black_player; player_globals.parray[white_player].side = WHITE; player_globals.parray[white_player].promote = QUEEN; player_globals.parray[black_player].game = g; player_globals.parray[black_player].opponent = white_player; player_globals.parray[black_player].side = BLACK; player_globals.parray[black_player].promote = QUEEN; // Alex Guo: need to separate output from logic/model send_boards(g); gics_globals.userstat.games++; /* obey any 'follow' lists */ follow_start(white_player,black_player); return COM_OK; }
/* NFS_LookUp Callback */ static void lookup_cb(uintptr_t token, int status, struct cookie *fh, fattr_t *attr) { dprintf(1, "*** nfsfs_lookup_cb: %d, %d, %p, %p\n", token, status, fh, attr); NFS_LookupRequest *rq = (NFS_LookupRequest *) get_request(token); if (rq == NULL) { dprintf(0, "!!! nfsfs: Corrupt lookup callback, no matching token: %d\n", token); return; } // open done if (status == NFS_OK) { NFS_File *nf = (NFS_File *) rq->p.vnode->extra; memcpy(&(nf->fh), fh, sizeof(struct cookie)); cp_stats(&(rq->p.vnode->vstat), attr); dprintf(2, "nfsfs: Sending: %d, %d\n", token, rq->p.pid); rq->open_done(rq->p.pid, rq->p.vnode, rq->mode, SOS_VFS_OK); remove_request((NFS_BaseRequest *) rq); } // create the file else if ((status == NFSERR_NOENT) && (rq->mode & FM_WRITE)) { dprintf(2, "nfsfs: Create new file!\n"); // reuse current rq struct, has all we need and is hot and ready sattr_t sat = DEFAULT_SATTR; nfs_create(&nfs_mnt, rq->p.vnode->path, &sat, lookup_cb, rq->p.token); } // error else { dprintf(0, "!!! nfsfs: lookup_cb: Error occured! (%d)\n", status); free_nfsfile(rq->p.vnode); rq->open_done(rq->p.pid, rq->p.vnode, rq->mode, status_nfs2vfs(status)); remove_request((NFS_BaseRequest *) rq); } }
/* NFS Callback for NFS_Remove */ static void remove_cb(uintptr_t token, int status) { dprintf(1, "*** nfsfs: remove_cb %u %d *** \n", token, status); NFS_RemoveRequest *rq = (NFS_RemoveRequest *) get_request(token); if (rq == NULL) { dprintf(0, "!!! nfsfs: Corrupt remove callback, no matching token: %d\n", token); return; } syscall_reply(process_get_tid(process_lookup(rq->p.pid)), status_nfs2vfs(status)); remove_request((NFS_BaseRequest *) rq); }
/* NFS callback for nfs_read */ static void read_cb(uintptr_t token, int status, fattr_t *attr, int bytes_read, char *data) { dprintf(1, "*** nfsfs_read_cb: %u, %d, %d, %p\n", token, status, bytes_read, data); NFS_ReadRequest *rq = (NFS_ReadRequest *) get_request(token); if (rq == NULL) { dprintf(0, "!!! nfsfs: Corrupt read callback, no matching token: %d\n", token); return; } if (status != NFS_OK) { rq->read_done(rq->p.pid, rq->p.vnode, rq->file, 0, rq->buf, 0, status_nfs2vfs(status)); remove_request((NFS_BaseRequest *) rq); return; } memcpy((void *) rq->buf, (void *) data, bytes_read); cp_stats(&(rq->p.vnode->vstat), attr); // call vfs to handle fp and anything else rq->read_done(rq->p.pid, rq->p.vnode, rq->file, 0, rq->buf, bytes_read, bytes_read); remove_request((NFS_BaseRequest *) rq); }
void request_response_search(struct gg_event *data){ int hash; Request *r; hash=gg_pubdir50_seq(data->event.pubdir50); r=g_hash_table_lookup(lookups, &hash); g_hash_table_remove(lookups, &hash); if (r){ switch(r->type){ case RT_VCARD: vcard_done(r, data->event.pubdir50); remove_request(r); return; case RT_SEARCH: search_done(r, data->event.pubdir50); remove_request(r); return; default: break; } } }
/* NFS Callback for NFS_Stat */ static void stat_cb(uintptr_t token, int status, struct cookie *fh, fattr_t *attr) { dprintf(1, "*** nfsfs_stat_cb: %d, %d, %p, %p\n", token, status, fh, attr); NFS_StatRequest *rq = (NFS_StatRequest *) get_request(token); if (rq == NULL) { dprintf(0, "!!! nfsfs: Corrupt stat callback, no matching token: %d\n", token); return; } if (status == NFS_OK) { cp_stats(rq->stat, attr); } syscall_reply(process_get_tid(process_lookup(rq->p.pid)), status_nfs2vfs(status)); remove_request((NFS_BaseRequest *) rq); }
/** * Wait operation with node-ref and tag * * @param[in] node node number * @param[in] tag tag */ void _xmp_mpi_wait(const int node, const int tag) { XACC_DEBUG("wait (%d,%d)", node,tag); if(remove_request(node, tag)){ XACC_DEBUG("wait end (already recved)"); return; } while(1){ int recv_tag; int recv_node; receive_request(&recv_node, &recv_tag); if(recv_node == node && recv_tag == tag){ XACC_DEBUG("wait end (recved)"); return; } do_post(recv_node, recv_tag); } }
static void on_request_ready (GObject *source, GAsyncResult *result, gpointer user_data) { ResolveClosure *closure = (ResolveClosure *) user_data; GrlTmdbRequest *request = GRL_TMDB_REQUEST (source); const GrlTmdbRequestDetail detail = grl_tmdb_request_get_detail (request); GError *error = NULL; GList *values, *iter; GValue *value; if (detail != GRL_TMDB_REQUEST_DETAIL_COUNT) { GRL_DEBUG ("Detail request (%s) ready for movie #%" G_GUINT64_FORMAT "...", grl_tmdb_request_detail_to_string (detail), closure->id); } else { GRL_DEBUG ("Detail request (aggregated) ready for movie #%" G_GUINT64_FORMAT "...", closure->id); } if (!grl_tmdb_request_run_finish (GRL_TMDB_REQUEST (source), result, &error)) { /* Just remove the request and hope the others have some data */ GRL_WARNING ("Failed to get %s: %s", grl_tmdb_request_get_uri (request), error->message); goto out; } if (SHOULD_RESOLVE (GRL_METADATA_KEY_GENRE)) { iter = values = grl_tmdb_request_get_string_list (request, "$.genres..name"); while (iter != NULL) { grl_data_add_string (GRL_DATA (closure->rs->media), GRL_METADATA_KEY_GENRE, iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_METADATA_KEY_STUDIO)) { iter = values = grl_tmdb_request_get_string_list (request, "$.production_companies..name"); while (iter != NULL) { grl_data_add_string (GRL_DATA (closure->rs->media), GRL_METADATA_KEY_STUDIO, iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_METADATA_KEY_SITE)) { value = grl_tmdb_request_get (request, "$.homepage"); if (value != NULL) { grl_media_set_site (closure->rs->media, g_value_get_string (value)); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_METADATA_KEY_DESCRIPTION)) { value = grl_tmdb_request_get (request, "$.overview"); if (value != NULL) { grl_media_set_description (closure->rs->media, g_value_get_string (value)); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_IMDB_ID)) { value = grl_tmdb_request_get (request, "$.imdb_id"); if (value != NULL) { grl_data_set_string (GRL_DATA (closure->rs->media), GRL_TMDB_METADATA_KEY_IMDB_ID, g_value_get_string (value)); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_METADATA_KEY_RATING)) { value = grl_tmdb_request_get (request, "$.vote_average"); if (value != NULL) { grl_media_set_rating (closure->rs->media, (float) g_value_get_double (value), 10.0f); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_METADATA_KEY_ORIGINAL_TITLE)) { value = grl_tmdb_request_get (request, "$.original_title"); if (value != NULL) { grl_media_set_original_title (closure->rs->media, g_value_get_string (value)); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_METADATA_KEY_TITLE)) { value = grl_tmdb_request_get (request, "$.title"); if (value != NULL) { grl_media_set_title (closure->rs->media, g_value_get_string (value)); grl_data_set_boolean (GRL_DATA (closure->rs->media), GRL_METADATA_KEY_TITLE_FROM_FILENAME, FALSE); g_value_unset (value); g_free (value); } } if (!closure->slow) { /* Add thumbnails first and poster and backdrops later. * Posters more likely make a good thumbnail than backdrops. */ if (SHOULD_RESOLVE (GRL_METADATA_KEY_THUMBNAIL)) { value = grl_tmdb_request_get (request, "$.poster_path"); if (value != NULL) { add_image (closure->self, closure->rs->media, GRL_METADATA_KEY_THUMBNAIL, g_value_get_string (value)); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_POSTER)) { value = grl_tmdb_request_get (request, "$.poster_path"); if (value != NULL) { add_image (closure->self, closure->rs->media, GRL_TMDB_METADATA_KEY_POSTER, g_value_get_string (value)); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_BACKDROP)) { value = grl_tmdb_request_get (request, "$.backdrop_path"); if (value != NULL) { add_image (closure->self, closure->rs->media, GRL_TMDB_METADATA_KEY_BACKDROP, g_value_get_string (value)); g_value_unset (value); g_free (value); } } } /* Add thumbnails first, and posters and backdrops later. * Posters more likely make a good thumbnail than backdrops. */ if (SHOULD_RESOLVE (GRL_METADATA_KEY_THUMBNAIL)) { values = grl_tmdb_request_get_string_list_with_filter (request, "$.posters", neutral_backdrop_filter); if (!values) values = grl_tmdb_request_get_string_list_with_filter (request, "$.images.posters", neutral_backdrop_filter); iter = values; while (iter != NULL) { add_image (closure->self, closure->rs->media, GRL_METADATA_KEY_THUMBNAIL, iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_POSTER)) { values = grl_tmdb_request_get_string_list_with_filter (request, "$.posters", neutral_backdrop_filter); if (!values) values = grl_tmdb_request_get_string_list_with_filter (request, "$.images.posters", neutral_backdrop_filter); iter = values; while (iter != NULL) { add_image (closure->self, closure->rs->media, GRL_TMDB_METADATA_KEY_POSTER, iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_BACKDROP)) { values = grl_tmdb_request_get_string_list_with_filter (request, "$.backdrops", neutral_backdrop_filter); if (!values) values = grl_tmdb_request_get_string_list_with_filter (request, "$.images.backdrops", neutral_backdrop_filter); iter = values; while (iter != NULL) { add_image (closure->self, closure->rs->media, GRL_TMDB_METADATA_KEY_BACKDROP, iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_METADATA_KEY_KEYWORD)) { values = grl_tmdb_request_get_string_list (request, "$.keywords..name"); if (!values) values = grl_tmdb_request_get_string_list (request, "$.keywords.keywords..name"); iter = values; while (iter != NULL) { grl_media_add_keyword (closure->rs->media, iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_METADATA_KEY_PERFORMER)) { values = grl_tmdb_request_get_string_list (request, "$.cast..name"); if (!values) values = grl_tmdb_request_get_string_list (request, "$.casts.cast..name"); iter = values; while (iter != NULL) { grl_media_add_performer (closure->rs->media, iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_METADATA_KEY_PRODUCER)) { values = grl_tmdb_request_get_string_list_with_filter (request, "$.crew[*]", producer_filter); if (!values) values = grl_tmdb_request_get_string_list_with_filter (request, "$.casts.crew[*]", producer_filter); iter = values; while (iter != NULL) { grl_media_add_producer (closure->rs->media, iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_METADATA_KEY_DIRECTOR)) { values = grl_tmdb_request_get_string_list_with_filter (request, "$.crew[*]", director_filter); if (!values) values = grl_tmdb_request_get_string_list_with_filter (request, "$.casts.crew[*]", director_filter); iter = values; while (iter != NULL) { grl_media_add_director (closure->rs->media, iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_METADATA_KEY_AUTHOR)) { values = grl_tmdb_request_get_string_list_with_filter (request, "$.crew[*]", writer_filter); if (!values) values = grl_tmdb_request_get_string_list_with_filter (request, "$.casts.crew[*]", writer_filter); iter = values; while (iter != NULL) { grl_media_add_author (GRL_MEDIA (closure->rs->media), iter->data); iter = iter->next; } g_list_free_full (values, g_free); } if (SHOULD_RESOLVE (GRL_METADATA_KEY_REGION) || SHOULD_RESOLVE (GRL_METADATA_KEY_CERTIFICATE) || SHOULD_RESOLVE (GRL_METADATA_KEY_PUBLICATION_DATE)) { values = grl_tmdb_request_get_list_with_filter (request, "$.countries[*]", NULL); if (!values) values = grl_tmdb_request_get_list_with_filter (request, "$.releases.countries[*]", NULL); for (iter = values; iter != NULL; iter = iter->next) { const char *region, *cert, *date; GDateTime *pubdate; JsonObject *object; object = json_node_get_object (iter->data); region = json_object_get_string_member (object, "iso_3166_1"); cert = json_object_get_string_member (object, "certification"); date = json_object_get_string_member (object, "release_date"); pubdate = parse_date (date); grl_media_add_region_data (closure->rs->media, region, pubdate, cert); g_date_time_unref (pubdate); } g_list_free_full (values, (GDestroyNotify) json_node_free); } out: if (error != NULL) { g_error_free (error); } remove_request (closure, request); if (g_queue_is_empty (closure->pending_requests)) { resolve_closure_callback (closure, NULL); resolve_closure_free (closure); } }
void requests_done(){ while(requests) remove_request((Request *)requests->data); g_hash_table_destroy(lookups); }
// Show info about the received packets. // This is only for debugging and only few messages are supported. The definition // of all packets must be known at the PC program that's processing the data. void decode_data(uint8_t len) { uint32_t u32, messagegroupid, messageid; uint16_t u16; pkg_header_adjust_offset(); uint16_t senderid = pkg_header_get_senderid(); uint32_t packetcounter = pkg_header_get_packetcounter(); MessageTypeEnum messagetype = pkg_header_get_messagetype(); UART_PUTF("Packet Data: SenderID=%u;", senderid); UART_PUTF("PacketCounter=%lu;", packetcounter); UART_PUTF("MessageType=%u;", messagetype); // show ReceiverID for all requests if ((messagetype == MESSAGETYPE_GET) || (messagetype == MESSAGETYPE_SET) || (messagetype == MESSAGETYPE_SETGET)) { uint16_t receiverid = pkg_headerext_common_get_receiverid(); UART_PUTF("ReceiverID=%u;", receiverid); } uint16_t acksenderid = 65000; uint32_t ackpacketcounter = 0; // show AckSenderID, AckPacketCounter and Error for "Ack" and "AckStatus" if ((messagetype == MESSAGETYPE_ACK) || (messagetype == MESSAGETYPE_ACKSTATUS)) { acksenderid = pkg_headerext_common_get_acksenderid(); ackpacketcounter = pkg_headerext_common_get_ackpacketcounter(); uint8_t error = pkg_headerext_common_get_error(); UART_PUTF("AckSenderID=%u;", acksenderid); UART_PUTF("AckPacketCounter=%lu;", ackpacketcounter); UART_PUTF("Error=%u;", error); } // show MessageGroupID and MessageID for all MessageTypes except "Ack" if (messagetype != MESSAGETYPE_ACK) { messagegroupid = pkg_headerext_common_get_messagegroupid(); messageid = pkg_headerext_common_get_messageid(); UART_PUTF("MessageGroupID=%u;", messagegroupid); UART_PUTF("MessageID=%u;", messageid); } // show raw message data for all MessageTypes with data (= all except "Get" and "Ack") if ((messagetype != MESSAGETYPE_GET) && (messagetype != MESSAGETYPE_ACK)) { uint8_t i; uint8_t start = __HEADEROFFSETBITS / 8; uint8_t shift = __HEADEROFFSETBITS % 8; uint16_t count = (((uint16_t)len * 8) - __HEADEROFFSETBITS + 7) / 8; //UART_PUTF4("\r\n\r\nLEN=%u, START=%u, SHIFT=%u, COUNT=%u\r\n\r\n", len, start, shift, count); UART_PUTS("MessageData="); for (i = start; i < start + count; i++) { UART_PUTF("%02x", array_read_UIntValue8(i, shift, 8, 0, 255, bufx)); } UART_PUTS(";"); // additionally decode the message data for a small number of messages switch (messagegroupid) { case MESSAGEGROUP_GENERIC: switch (messageid) { case MESSAGEID_GENERIC_VERSION: UART_PUTF("Major=%u;", msg_generic_version_get_major()); UART_PUTF("Minor=%u;", msg_generic_version_get_minor()); UART_PUTF("Patch=%u;", msg_generic_version_get_patch()); UART_PUTF("Hash=%08lx;", msg_generic_version_get_hash()); break; case MESSAGEID_GENERIC_BATTERYSTATUS: UART_PUTF("Percentage=%u;", msg_generic_batterystatus_get_percentage()); break; /*DateTime Status: UART_PUTS("Command Name=DateTime Status;"); UART_PUTF3("Date=%u-%02u-%02u;", bufx[6] + 2000, bufx[7], bufx[8]); UART_PUTF3("Time=%02u:%02u:%02u", bufx[9], bufx[10], bufx[11]);*/ default: break; } break; case MESSAGEGROUP_WEATHER: switch (messageid) { case MESSAGEID_WEATHER_TEMPERATURE: UART_PUTS("Temperature="); print_signed(msg_weather_temperature_get_temperature()); UART_PUTS(";"); break; case MESSAGEID_WEATHER_HUMIDITYTEMPERATURE: u16 = msg_weather_humiditytemperature_get_humidity(); UART_PUTF2("Humidity=%u.%u;Temperature=", u16 / 10, u16 % 10); print_signed(msg_weather_humiditytemperature_get_temperature()); UART_PUTS(";"); break; case MESSAGEID_WEATHER_BAROMETRICPRESSURETEMPERATURE: u32 = msg_weather_barometricpressuretemperature_get_barometricpressure(); UART_PUTF("Pressure=%ld;Temperature=", u32); print_signed(msg_weather_barometricpressuretemperature_get_temperature()); UART_PUTS(";"); break; default: break; } break; case MESSAGEGROUP_POWERSWITCH: switch (messageid) { case MESSAGEID_POWERSWITCH_SWITCHSTATE: UART_PUTF("On=%u;", msg_powerswitch_switchstate_get_on()); UART_PUTF("TimeoutSec=%u;", msg_powerswitch_switchstate_get_timeoutsec()); break; default: break; } break; default: break; } } UART_PUTS("\r\n"); // Detect and process Acknowledges to base station, whose requests have to be removed from the request queue if ((messagetype == MESSAGETYPE_ACK) || (messagetype == MESSAGETYPE_ACKSTATUS)) { if (acksenderid == device_id) // request sent from base station { remove_request(senderid, device_id, ackpacketcounter); } } }
// Show info about the received packets. // This is only for debugging. The definition of all packets must be known at the PC program // that's processing the data. void decode_data(uint8_t len) { uint16_t u16; int16_t s16; uint32_t u32; UART_PUTF("Sender ID=%u;", bufx[0]); UART_PUTF("Packet Counter=%lu;", getBuf32(1)); uint8_t cmd = bufx[5]; UART_PUTF("Command ID=%u;", cmd); switch (cmd) { case 1: // Generic Acknowledge u32 = getBuf32(7); UART_PUTS("Command Name=Generic Acknowledge;"); UART_PUTF("Request Sender ID=%u;", bufx[6]); UART_PUTF("Request Packet Counter=%lu\r\n", u32); remove_request(bufx[0], bufx[6], u32); break; case 10: // Temperature Sensor Status UART_PUTS("Command Name=Temperature Sensor Status;"); s16 = (int16_t)getBuf16(7); UART_PUTF("Battery=%u;", bufx[6]); UART_PUTS("Temperature="); printSigned(s16); u16 = getBuf16(9); UART_PUTF2("Humidity=%u.%02u;", u16 / 100, u16 % 100); UART_PUTF("Brightness=%u", bufx[11]); break; case 20: // Power Switch Status UART_PUTS("Command Name=Power Switch Status"); print_switch_state(3); break; case 21: // Power Switch Status Extended UART_PUTS("Command Name=Power Switch Status Extended"); print_switch_state(8); break; case 30: // DateTime Status UART_PUTS("Command Name=DateTime Status;"); UART_PUTF3("Date=%u-%02u-%02u;", bufx[6] + 2000, bufx[7], bufx[8]); UART_PUTF3("Time=%02u:%02u:%02u", bufx[9], bufx[10], bufx[11]); break; case 140: // Power Switch Request UART_PUTS("Command Name=Power Switch Request;"); uint16_t u16 = getBuf16(8); UART_PUTF("Receiver ID=%u;", bufx[6]); UART_PUTF("Switch Bitmask=%u;", bufx[7]); // TODO: Set binary mode like 00010110 UART_PUTF("Requested State=%u;", u16 & 0b1); UART_PUTF("Timeout=%u", u16 >> 1); break; case 141: // Dimmer Request UART_PUTS("Command Name=Dimmer Request;"); UART_PUTF("Receiver ID=%u;", bufx[6]); UART_PUTF("Animation Mode=%u;", bufx[7] >> 5); UART_PUTF("Dimmer Bitmask=%u;", bufx[7] & 0b111); UART_PUTF("Timeout=%u;", getBuf16(8)); UART_PUTF("Start Brightness=%u;", bufx[10]); UART_PUTF("End Brightness=%u", bufx[11]); break; default: UART_PUTS("Command Name=Unknown;"); UART_PUTS("Data="); printbytearray(bufx + 6, len - 6); } if (cmd != 1) { UART_PUTS("\r\n"); } }
void* consumerThread(void *args) { int id = *((int *)args); double random; struct drand48_data randBuffer; int sock; QElement *elmnt; ssize_t rcvBytes; int type; int ret; HttpGet httpGet; ssize_t totalSize; char *savedBuffer; int lenBuffer = sizeof(char) * BUFSIZE; char *buffer; srand48_r(time(NULL), &randBuffer); while (1) { totalSize = 0; pthread_mutex_lock(&queue_mutex); while (hasPending == 0) { LOG_INFO("Consumer[%d] is waiting.\n", id); pthread_cond_wait(&queue_cond, &queue_mutex); } if (queue_clients.size > 0 && queue_webservers.size > 0) { drand48_r(&randBuffer, &random); if (random < 0.5) { elmnt = pop_queue(&queue_clients); } else { elmnt = pop_queue(&queue_webservers); } } else if (queue_clients.size > 0) { elmnt = pop_queue(&queue_clients); } else { elmnt = pop_queue(&queue_webservers); } hasPending--; if (hasPending > 0) { pthread_cond_signal(&queue_cond); } pthread_mutex_unlock(&queue_mutex); buffer = (char *) malloc(lenBuffer); if (buffer == NULL) { LOG_ERROR("Not enough free memory space\n"); return NULL; } sock = elmnt->clSock; free(elmnt); rcvBytes = recv(sock, buffer, lenBuffer, 0); if (rcvBytes < 0) { LOG_ERROR("Consumer[%d]: An error occurred while receiving data from the client.\n", id); continue; } else if (rcvBytes == 0) { LOG_ERROR("Consumer[%d]: The client has performed a shutdown.\n", id); continue; } totalSize += rcvBytes; type = findHttpMessageType(buffer, rcvBytes); if (type == HTTP_GET) { int webSock; LOG_INFO("Consumer[%d]: Get Message received\n", id); ret = parseHttpGetMsg(buffer, rcvBytes, &httpGet); if (ret == HTTP_PARSER_ERROR || ret == NO_MEMORY_ERROR) { sendHttpBadReqMsg(sock); } else if (ret == HTTP_HOST_NOT_FOUND){ sendHttpNotFoundMsg(sock); } else if (ret == OK) { char* response = get_response_cache(cache, httpGet.request, httpGet.reqLen); if (response != NULL) { LOG_INFO("\tConsumer[%d]: Cache Hit\n", id); update_cache(cache, httpGet.request, httpGet.reqLen); ret = sendSingleHttpResponseMsg(response, strlen(response), sock); if (ret != OK) { LOG_ERROR("Consumer[%d]: Unable to send the response Message\n", id); } } else { LOG_INFO("\tConsumer[%d]: No Cache Hit\n", id); if (contains_request(httpGet.request, httpGet.reqLen) != FOUND) { LOG_INFO("\tConsumer[%d]: Does not contain that request\n", id); webSock = sendHttpGetMsgToServer(&httpGet); if (webSock < 0) { LOG_ERROR("Consumer[%d]: Did not send the HttpGetMessage to the Webserver\n", id); } else { if (save_request(httpGet.request, httpGet.reqLen, webSock, sock) != OK) { LOG_ERROR("Consumer[%d]: An error occurred while saving the request\n", id); } if (insertFD(webSock) != OK) { LOG_ERROR("Consumer[%d]: An error occurred while saving the socket\n", id); } } } else { LOG_INFO("\tConsumer[%d]: Does contain that request\n", id); webSock = get_request(httpGet.request, httpGet.reqLen); } if (map_client_with_webserver(webSock, sock) != OK) { LOG_ERROR("Consumer[%d]: An error occurred while making the mapping between client's socket and webserver's one.\n", id); } } clear_httpGetMsg(&httpGet); } } else if (type == HTTP_RESPONSE) { LOG_INFO("Consumer[%d]: Response Message received\n", id); Queue* clSocks = find_appropriate_clients(sock); if (clSocks == NULL) { LOG_ERROR("Consumer[%d]: Could not find the appropriate clients.\n", id); continue; } savedBuffer = (char *) malloc(sizeof(char) * rcvBytes); if (savedBuffer == NULL) { LOG_ERROR("Consumer[%d]: Not enough free memory space.\n", id); continue; } memcpy(savedBuffer, buffer, rcvBytes); char *t; ssize_t prevSize = rcvBytes; memset(buffer, 0, lenBuffer); while ((rcvBytes = recv(sock, buffer, lenBuffer, 0)) != 0) { totalSize += rcvBytes; t = realloc(savedBuffer, totalSize); if (t == NULL) { LOG_ERROR("Consumer[%d]: Not enough free memory space.\n", id); break; } savedBuffer = t; memcpy(savedBuffer + prevSize, buffer, rcvBytes); prevSize = totalSize; } QElement *iter; char *req; int clSock = -1; for (iter = clSocks->head; iter != NULL; iter = iter->next) { req = get_hashmap(&cl_req_map, &iter->clSock, sizeof(int)); if (req != NULL) { if (put_response_cache(cache, req, strlen(req) + 1, savedBuffer, totalSize) != OK) { LOG_ERROR("Consumer[%d]: Could not insert it in the cache\n", id); } clSock = iter->clSock; break; } } ret = sendHttpResponseMsg(savedBuffer, totalSize, clSocks); if (ret != OK) { LOG_ERROR("Consumer[%d]: Unable to send the response Message\n", id); } if (remove_appropiate_clients(sock) != OK) { LOG_ERROR("Consumer[%d]: Could not remove the appropriate clients from the hash map\n", id); } if (remove_request(sock, clSock) != OK) { LOG_ERROR("Consumer[%d]: Could not remove the request from the hash map\n", id); } if (savedBuffer != NULL) { free(savedBuffer); } } else { LOG_INFO("Consumer[%d]: Unknown type of message\n", id); sendHttpBadReqMsg(sock); } free(buffer); } return NULL; }
static void on_search_ready (GObject *source, GAsyncResult *result, gpointer user_data) { ResolveClosure *closure = (ResolveClosure *) user_data; GrlTmdbRequest *request = GRL_TMDB_REQUEST (source); GValue *value; GError *error = NULL; GRL_DEBUG ("Initial search ready..."); if (!grl_tmdb_request_run_finish (GRL_TMDB_REQUEST (source), result, &error)) { resolve_closure_callback (closure, error); resolve_closure_free (closure); g_error_free (error); return; } value = grl_tmdb_request_get (request, "$.total_results"); if (g_value_get_int64 (value) == 0) { /* Nothing found */ resolve_closure_callback (closure, NULL); resolve_closure_free (closure); g_value_unset (value); g_free (value); return; } g_value_unset (value); g_free (value); value = grl_tmdb_request_get (request, "$.results[0].id"); if (value == NULL) { /* Cannot continue without id */ error = g_error_new_literal (GRL_CORE_ERROR, GRL_CORE_ERROR_RESOLVE_FAILED, _("Remote data does not contain valid identifier")); resolve_closure_callback (closure, error); resolve_closure_free (closure); g_error_free (error); return; } if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_TMDB_ID)) { char *tmdb_id = g_strdup_printf ("%" G_GINT64_FORMAT, g_value_get_int64 (value)); grl_data_set_string (GRL_DATA (closure->rs->media), GRL_TMDB_METADATA_KEY_TMDB_ID, tmdb_id); g_free (tmdb_id); } closure->id = g_value_get_int64 (value); g_value_unset (value); g_free (value); if (grl_data_get_boolean (GRL_DATA (closure->rs->media), GRL_METADATA_KEY_TITLE_FROM_FILENAME)) { value = grl_tmdb_request_get (request, "$.results[0].title"); if (value) { grl_media_set_title (closure->rs->media, g_value_get_string (value)); grl_data_set_boolean (GRL_DATA (closure->rs->media), GRL_METADATA_KEY_TITLE_FROM_FILENAME, FALSE); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_METADATA_KEY_RATING)) { value = grl_tmdb_request_get (request, "$.results[0].vote_average"); if (value != NULL) { grl_media_set_rating (closure->rs->media, (float) g_value_get_double (value), 10.0f); g_value_unset (value); g_free (value); } g_hash_table_remove (closure->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_RATING)); } /* Add thumbnails first, and posters and backdrops later. * Posters more likely make a good thumbnail than backdrops. */ if (SHOULD_RESOLVE (GRL_METADATA_KEY_THUMBNAIL)) { value = grl_tmdb_request_get (request, "$.results[0].poster_path"); if (value != NULL) { add_image (closure->self, closure->rs->media, GRL_METADATA_KEY_THUMBNAIL, g_value_get_string (value)); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_POSTER)) { value = grl_tmdb_request_get (request, "$.results[0].poster_path"); if (value != NULL) { add_image (closure->self, closure->rs->media, GRL_TMDB_METADATA_KEY_POSTER, g_value_get_string (value)); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_BACKDROP)) { value = grl_tmdb_request_get (request, "$.results[0].backdrop_path"); if (value != NULL) { add_image (closure->self, closure->rs->media, GRL_TMDB_METADATA_KEY_BACKDROP, g_value_get_string (value)); g_value_unset (value); g_free (value); } } if (SHOULD_RESOLVE (GRL_METADATA_KEY_ORIGINAL_TITLE)) { value = grl_tmdb_request_get (request, "$.results[0].original_title"); if (value != NULL) { grl_media_set_original_title (closure->rs->media, g_value_get_string (value)); g_value_unset (value); g_free (value); } g_hash_table_remove (closure->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ORIGINAL_TITLE)); } remove_request (closure, request); /* Check if we need to do additional requests. */ if (closure->slow) { resolve_slow_details (closure); if (run_pending_requests (closure, G_MAXINT) > 0) return; } resolve_closure_callback (closure, NULL); resolve_closure_free (closure); }