get a block from AT socket receive buffer list */
| 193 | |
| 194 | /* get a block from AT socket receive buffer list */ |
| 195 | static size_t at_recvpkt_get(rt_slist_t *rlist, char *mem, size_t len) |
| 196 | { |
| 197 | rt_slist_t *node = RT_NULL; |
| 198 | rt_slist_t *free_node = RT_NULL; |
| 199 | at_recv_pkt_t pkt = RT_NULL; |
| 200 | size_t content_pos = 0, page_pos = 0; |
| 201 | |
| 202 | if (rt_slist_isempty(rlist)) |
| 203 | { |
| 204 | return 0; |
| 205 | } |
| 206 | |
| 207 | for (node = rt_slist_first(rlist); node;) |
| 208 | { |
| 209 | pkt = rt_slist_entry(node, struct at_recv_pkt, list); |
| 210 | |
| 211 | free_node = node; |
| 212 | node = rt_slist_next(node); |
| 213 | |
| 214 | if (!pkt) continue; |
| 215 | |
| 216 | page_pos = pkt->bfsz_totle - pkt->bfsz_index; |
| 217 | |
| 218 | if (page_pos >= len - content_pos) |
| 219 | { |
| 220 | rt_memcpy((char *) mem + content_pos, pkt->buff + pkt->bfsz_index, len - content_pos); |
| 221 | pkt->bfsz_index += len - content_pos; |
| 222 | if (pkt->bfsz_index == pkt->bfsz_totle) |
| 223 | { |
| 224 | at_recvpkt_node_delete(rlist, free_node); |
| 225 | } |
| 226 | content_pos = len; |
| 227 | break; |
| 228 | } |
| 229 | else |
| 230 | { |
| 231 | rt_memcpy((char *) mem + content_pos, pkt->buff + pkt->bfsz_index, page_pos); |
| 232 | content_pos += page_pos; |
| 233 | pkt->bfsz_index += page_pos; |
| 234 | at_recvpkt_node_delete(rlist, free_node); |
| 235 | } |
| 236 | } |
| 237 | |
| 238 | return content_pos; |
| 239 | } |
| 240 | |
| 241 | static void at_do_event_changes(struct at_socket *sock, at_event_t event, rt_bool_t is_plus) |
| 242 | { |
no test coverage detected