Fork of HttpServer_snapshot_mbed-os library
Fork of HttpServer_snapshot_mbed-os by
Handler/SnapshotHandler.cpp@15:371fbad587ed, 2017-06-23 (annotated)
- Committer:
- dkato
- Date:
- Fri Jun 23 11:34:54 2017 +0000
- Revision:
- 15:371fbad587ed
- Parent:
- 14:d3dc6ad09790
Added a function to notify the transfer completion of SnapshotHandler.
; Changed to process with a single task. This can be switched by compile switch.
;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dkato | 6:d9e6379eefac | 1 | /******************************************************************************* |
dkato | 6:d9e6379eefac | 2 | * DISCLAIMER |
dkato | 6:d9e6379eefac | 3 | * This software is supplied by Renesas Electronics Corporation and is only |
dkato | 6:d9e6379eefac | 4 | * intended for use with Renesas products. No other uses are authorized. This |
dkato | 6:d9e6379eefac | 5 | * software is owned by Renesas Electronics Corporation and is protected under |
dkato | 6:d9e6379eefac | 6 | * all applicable laws, including copyright laws. |
dkato | 6:d9e6379eefac | 7 | * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING |
dkato | 6:d9e6379eefac | 8 | * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT |
dkato | 6:d9e6379eefac | 9 | * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
dkato | 6:d9e6379eefac | 10 | * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. |
dkato | 6:d9e6379eefac | 11 | * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS |
dkato | 6:d9e6379eefac | 12 | * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE |
dkato | 6:d9e6379eefac | 13 | * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR |
dkato | 6:d9e6379eefac | 14 | * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE |
dkato | 6:d9e6379eefac | 15 | * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
dkato | 6:d9e6379eefac | 16 | * Renesas reserves the right, without notice, to make changes to this software |
dkato | 6:d9e6379eefac | 17 | * and to discontinue the availability of this software. By using this software, |
dkato | 6:d9e6379eefac | 18 | * you agree to the additional terms and conditions found by accessing the |
dkato | 6:d9e6379eefac | 19 | * following link: |
dkato | 6:d9e6379eefac | 20 | * http://www.renesas.com/disclaimer* |
dkato | 6:d9e6379eefac | 21 | * Copyright (C) 2015 Renesas Electronics Corporation. All rights reserved. |
dkato | 6:d9e6379eefac | 22 | *******************************************************************************/ |
dkato | 6:d9e6379eefac | 23 | |
dkato | 6:d9e6379eefac | 24 | #include "SnapshotHandler.h" |
dkato | 6:d9e6379eefac | 25 | |
dkato | 6:d9e6379eefac | 26 | int (*SnapshotHandler::callback_func_req)(const char ** pp_data); |
dkato | 14:d3dc6ad09790 | 27 | int (*SnapshotHandler::callback_func_req2)(const char* rootPath, const char* path, const char ** pp_data); |
dkato | 15:371fbad587ed | 28 | void (*SnapshotHandler::callback_func_send_end)(const char* rootPath, const char* path, const char * p_data); |
dkato | 6:d9e6379eefac | 29 | Semaphore SnapshotHandler::req_sem(1); |
dkato | 6:d9e6379eefac | 30 | |
dkato | 6:d9e6379eefac | 31 | |
dkato | 11:0700755d64ae | 32 | SnapshotHandler::SnapshotHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, path, pTCPSocket), m_err404(false) |
dkato | 6:d9e6379eefac | 33 | { |
dkato | 6:d9e6379eefac | 34 | } |
dkato | 6:d9e6379eefac | 35 | |
dkato | 6:d9e6379eefac | 36 | SnapshotHandler::~SnapshotHandler() |
dkato | 6:d9e6379eefac | 37 | { |
dkato | 6:d9e6379eefac | 38 | } |
dkato | 6:d9e6379eefac | 39 | |
dkato | 6:d9e6379eefac | 40 | void SnapshotHandler::doGet() |
dkato | 6:d9e6379eefac | 41 | { |
dkato | 6:d9e6379eefac | 42 | const char * p_data = NULL; |
dkato | 6:d9e6379eefac | 43 | int size = 0; |
dkato | 6:d9e6379eefac | 44 | |
dkato | 6:d9e6379eefac | 45 | req_sem.wait(); |
dkato | 6:d9e6379eefac | 46 | if (callback_func_req != NULL) { |
dkato | 6:d9e6379eefac | 47 | size = callback_func_req(&p_data); |
dkato | 6:d9e6379eefac | 48 | } |
dkato | 13:d3571c244759 | 49 | if (callback_func_req2 != NULL) { |
dkato | 14:d3dc6ad09790 | 50 | size = callback_func_req2((rootPath()).c_str(), (path()).c_str(), &p_data); |
dkato | 13:d3571c244759 | 51 | } |
dkato | 6:d9e6379eefac | 52 | |
dkato | 6:d9e6379eefac | 53 | if ((p_data == NULL) || (size <= 0)) { |
dkato | 15:371fbad587ed | 54 | if (callback_func_send_end != NULL) { |
dkato | 15:371fbad587ed | 55 | callback_func_send_end((rootPath()).c_str(), (path()).c_str(), p_data); |
dkato | 15:371fbad587ed | 56 | } |
dkato | 6:d9e6379eefac | 57 | m_err404 = true; |
dkato | 6:d9e6379eefac | 58 | setErrCode(404); |
dkato | 6:d9e6379eefac | 59 | const char* msg = "File not found."; |
dkato | 6:d9e6379eefac | 60 | setContentLen(strlen(msg)); |
dkato | 6:d9e6379eefac | 61 | respHeaders()["Content-Type"] = "text/html"; |
dkato | 6:d9e6379eefac | 62 | respHeaders()["Connection"] = "close"; |
dkato | 6:d9e6379eefac | 63 | writeData(msg,strlen(msg)); //Only send header |
dkato | 6:d9e6379eefac | 64 | printf("\r\nExit SnapshotHandler::doGet() w Error 404\r\n"); |
dkato | 6:d9e6379eefac | 65 | req_sem.release(); |
dkato | 6:d9e6379eefac | 66 | return; |
dkato | 6:d9e6379eefac | 67 | } |
dkato | 6:d9e6379eefac | 68 | send_data_buf = p_data; |
dkato | 6:d9e6379eefac | 69 | send_size = size; |
dkato | 6:d9e6379eefac | 70 | send_index = 0; |
dkato | 6:d9e6379eefac | 71 | |
dkato | 6:d9e6379eefac | 72 | //Response |
dkato | 6:d9e6379eefac | 73 | setContentLen(send_size); |
dkato | 6:d9e6379eefac | 74 | |
dkato | 6:d9e6379eefac | 75 | //Make sure that the browser won't cache this request |
dkato | 6:d9e6379eefac | 76 | respHeaders()["Cache-Control"] = "no-store"; |
dkato | 6:d9e6379eefac | 77 | respHeaders()["Pragma"] = "no-cache"; |
dkato | 6:d9e6379eefac | 78 | respHeaders()["Expires"] = "0"; |
dkato | 6:d9e6379eefac | 79 | |
dkato | 6:d9e6379eefac | 80 | //Write data |
dkato | 6:d9e6379eefac | 81 | respHeaders()["Connection"] = "close"; |
dkato | 6:d9e6379eefac | 82 | onWriteable(); |
dkato | 6:d9e6379eefac | 83 | |
dkato | 6:d9e6379eefac | 84 | req_sem.release(); |
dkato | 6:d9e6379eefac | 85 | } |
dkato | 6:d9e6379eefac | 86 | |
dkato | 6:d9e6379eefac | 87 | void SnapshotHandler::doPost() |
dkato | 6:d9e6379eefac | 88 | { |
dkato | 6:d9e6379eefac | 89 | |
dkato | 6:d9e6379eefac | 90 | } |
dkato | 6:d9e6379eefac | 91 | |
dkato | 6:d9e6379eefac | 92 | void SnapshotHandler::doHead() |
dkato | 6:d9e6379eefac | 93 | { |
dkato | 6:d9e6379eefac | 94 | |
dkato | 6:d9e6379eefac | 95 | } |
dkato | 6:d9e6379eefac | 96 | |
dkato | 6:d9e6379eefac | 97 | void SnapshotHandler::onReadable() //Data has been read |
dkato | 6:d9e6379eefac | 98 | { |
dkato | 6:d9e6379eefac | 99 | |
dkato | 6:d9e6379eefac | 100 | } |
dkato | 6:d9e6379eefac | 101 | |
dkato | 6:d9e6379eefac | 102 | void SnapshotHandler::onWriteable() //Data has been written & buf is free |
dkato | 6:d9e6379eefac | 103 | { |
dkato | 6:d9e6379eefac | 104 | if (m_err404) { |
dkato | 6:d9e6379eefac | 105 | //Error has been served, now exit |
dkato | 6:d9e6379eefac | 106 | close(); |
dkato | 6:d9e6379eefac | 107 | } else { |
dkato | 6:d9e6379eefac | 108 | while (true) { |
dkato | 6:d9e6379eefac | 109 | int len = send_size - send_index; |
dkato | 6:d9e6379eefac | 110 | if (len > 0) { |
dkato | 6:d9e6379eefac | 111 | int writtenLen = writeData((char *)&send_data_buf[send_index], len); |
dkato | 6:d9e6379eefac | 112 | if (writtenLen < 0) { //Socket error |
dkato | 6:d9e6379eefac | 113 | close(); |
dkato | 15:371fbad587ed | 114 | if (callback_func_send_end != NULL) { |
dkato | 15:371fbad587ed | 115 | callback_func_send_end((rootPath()).c_str(), (path()).c_str(), send_data_buf); |
dkato | 15:371fbad587ed | 116 | } |
dkato | 6:d9e6379eefac | 117 | return; |
dkato | 6:d9e6379eefac | 118 | } else { |
dkato | 6:d9e6379eefac | 119 | send_index += writtenLen; |
dkato | 6:d9e6379eefac | 120 | } |
dkato | 6:d9e6379eefac | 121 | } else { |
dkato | 6:d9e6379eefac | 122 | close(); |
dkato | 15:371fbad587ed | 123 | if (callback_func_send_end != NULL) { |
dkato | 15:371fbad587ed | 124 | callback_func_send_end((rootPath()).c_str(), (path()).c_str(), send_data_buf); |
dkato | 15:371fbad587ed | 125 | } |
dkato | 6:d9e6379eefac | 126 | return; |
dkato | 6:d9e6379eefac | 127 | } |
dkato | 6:d9e6379eefac | 128 | } |
dkato | 6:d9e6379eefac | 129 | } |
dkato | 6:d9e6379eefac | 130 | } |
dkato | 6:d9e6379eefac | 131 | |
dkato | 6:d9e6379eefac | 132 | void SnapshotHandler::onClose() //Connection is closing |
dkato | 6:d9e6379eefac | 133 | { |
dkato | 6:d9e6379eefac | 134 | //Nothing to do |
dkato | 6:d9e6379eefac | 135 | } |
dkato | 11:0700755d64ae | 136 |