Jun Furutani / libMiMic

Fork of libMiMic by Ryo Iizuka

Committer:
nyatla
Date:
Fri Sep 27 12:47:51 2013 +0000
Revision:
58:03b89038b21a
Child:
72:c118a7aa37a3
add classes; checked:modwebsocket; unchecked:tcpsocket,udpsocket,httpclient.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 58:03b89038b21a 1 #include "ModWebSocket.h"
nyatla 58:03b89038b21a 2 #include "../net/httpd/mod/NyLPC_cModWebSocket_protected.h"
nyatla 58:03b89038b21a 3 #include "HttpdConnection.h"
nyatla 58:03b89038b21a 4
nyatla 58:03b89038b21a 5 namespace MiMic
nyatla 58:03b89038b21a 6 {
nyatla 58:03b89038b21a 7 ModWebSocket::ModWebSocket(const char* i_path):ModBaseClass(i_path)
nyatla 58:03b89038b21a 8 {
nyatla 58:03b89038b21a 9 this->_mod=NULL;
nyatla 58:03b89038b21a 10 }
nyatla 58:03b89038b21a 11 ModWebSocket::ModWebSocket()
nyatla 58:03b89038b21a 12 {
nyatla 58:03b89038b21a 13 this->_mod=NULL;
nyatla 58:03b89038b21a 14 }
nyatla 58:03b89038b21a 15 ModWebSocket::~ModWebSocket()
nyatla 58:03b89038b21a 16 {
nyatla 58:03b89038b21a 17 if(this->_mod!=NULL){
nyatla 58:03b89038b21a 18 NyLPC_cModWebSocket_finalize(this->_mod);
nyatla 58:03b89038b21a 19 this->_mod=NULL;
nyatla 58:03b89038b21a 20 }
nyatla 58:03b89038b21a 21 }
nyatla 58:03b89038b21a 22 void ModWebSocket::setParam(const char* i_path)
nyatla 58:03b89038b21a 23 {
nyatla 58:03b89038b21a 24 ModBaseClass::setParam(i_path);
nyatla 58:03b89038b21a 25 }
nyatla 58:03b89038b21a 26
nyatla 58:03b89038b21a 27 bool ModWebSocket::execute(HttpdConnection& i_connection)
nyatla 58:03b89038b21a 28 {
nyatla 58:03b89038b21a 29 if(this->_mod!=NULL){
nyatla 58:03b89038b21a 30 return false;
nyatla 58:03b89038b21a 31 }
nyatla 58:03b89038b21a 32 this->_mod=(NyLPC_TcModWebSocket_t*)malloc(sizeof(NyLPC_TcModWebSocket_t));
nyatla 58:03b89038b21a 33 if(this->_mod==NULL){
nyatla 58:03b89038b21a 34 return false;
nyatla 58:03b89038b21a 35 }
nyatla 58:03b89038b21a 36 //initialize websocket
nyatla 58:03b89038b21a 37 NyLPC_cModWebSocket_initialize(this->_mod,this->_path);
nyatla 58:03b89038b21a 38 if(NyLPC_cModWebSocket_canHandle(this->_mod,i_connection._ref_inst)){
nyatla 58:03b89038b21a 39 if(NyLPC_cModWebSocket_execute(this->_mod,i_connection._ref_inst)){
nyatla 58:03b89038b21a 40 return true;
nyatla 58:03b89038b21a 41 }
nyatla 58:03b89038b21a 42 }
nyatla 58:03b89038b21a 43 NyLPC_cModWebSocket_finalize(this->_mod);
nyatla 58:03b89038b21a 44 free(this->_mod);
nyatla 58:03b89038b21a 45 this->_mod=NULL;
nyatla 58:03b89038b21a 46 return false;
nyatla 58:03b89038b21a 47 }
nyatla 58:03b89038b21a 48 bool ModWebSocket::write(const void* i_tx_buf,int i_tx_size)
nyatla 58:03b89038b21a 49 {
nyatla 58:03b89038b21a 50 if(this->_mod==NULL){
nyatla 58:03b89038b21a 51 return false;
nyatla 58:03b89038b21a 52 }
nyatla 58:03b89038b21a 53 return NyLPC_cModWebSocket_write(this->_mod,i_tx_buf,i_tx_size)?true:false;
nyatla 58:03b89038b21a 54 }
nyatla 58:03b89038b21a 55
nyatla 58:03b89038b21a 56 static NyLPC_TBool fmt_handler(void* i_inst,const void* i_buf,NyLPC_TUInt32 i_len)
nyatla 58:03b89038b21a 57 {
nyatla 58:03b89038b21a 58 return NyLPC_iHttpPtrStream_write((NyLPC_TiHttpPtrStream_t*)i_inst,i_buf,i_len);
nyatla 58:03b89038b21a 59 }
nyatla 58:03b89038b21a 60
nyatla 58:03b89038b21a 61 bool ModWebSocket::writeF(const char* i_fmt,...)
nyatla 58:03b89038b21a 62 {
nyatla 58:03b89038b21a 63 NyLPC_TInt16 l;
nyatla 58:03b89038b21a 64 va_list a;
nyatla 58:03b89038b21a 65 //ストリームの状態を更新する。
nyatla 58:03b89038b21a 66 NyLPC_cModWebSocket_update(this->_mod,0);
nyatla 58:03b89038b21a 67
nyatla 58:03b89038b21a 68 //書式文字列の長さを計算
nyatla 58:03b89038b21a 69 va_start(a,i_fmt);
nyatla 58:03b89038b21a 70 l=NyLPC_cFormatWriter_length(i_fmt,a);
nyatla 58:03b89038b21a 71 va_end(a);
nyatla 58:03b89038b21a 72 if(!NyLPC_cModWebSocket_writePayloadHeader(this->_mod,l)){
nyatla 58:03b89038b21a 73 //CLOSE
nyatla 58:03b89038b21a 74 NyLPC_OnErrorGoto(Error);
nyatla 58:03b89038b21a 75 }
nyatla 58:03b89038b21a 76 va_start(a,i_fmt);
nyatla 58:03b89038b21a 77 if(!NyLPC_cFormatWriter_print(fmt_handler,NyLPC_cHttpdConnection_refStream(this->_mod->_ref_connection),i_fmt,a)){
nyatla 58:03b89038b21a 78 va_end(a);
nyatla 58:03b89038b21a 79 NyLPC_OnErrorGoto(Error);
nyatla 58:03b89038b21a 80 }
nyatla 58:03b89038b21a 81 va_end(a);
nyatla 58:03b89038b21a 82 NyLPC_iHttpPtrStream_flush(NyLPC_cHttpdConnection_refStream(this->_mod->_ref_connection));
nyatla 58:03b89038b21a 83 return true;
nyatla 58:03b89038b21a 84 Error:
nyatla 58:03b89038b21a 85 NyLPC_cHttpdConnection_closeSocket(this->_mod->_ref_connection);
nyatla 58:03b89038b21a 86 this->_mod->_payload_st=NyLPC_TcModWebSocket_ST_CLOSED;
nyatla 58:03b89038b21a 87 return false;
nyatla 58:03b89038b21a 88 }
nyatla 58:03b89038b21a 89
nyatla 58:03b89038b21a 90 int ModWebSocket::read(void* i_rx_buf,int i_rx_size)
nyatla 58:03b89038b21a 91 {
nyatla 58:03b89038b21a 92 if(this->_mod==NULL){
nyatla 58:03b89038b21a 93 return false;
nyatla 58:03b89038b21a 94 }
nyatla 58:03b89038b21a 95 //write here!
nyatla 58:03b89038b21a 96 return NyLPC_cModWebSocket_read(this->_mod,i_rx_buf,i_rx_size);
nyatla 58:03b89038b21a 97 }
nyatla 58:03b89038b21a 98 bool ModWebSocket::canRead()
nyatla 58:03b89038b21a 99 {
nyatla 58:03b89038b21a 100 return NyLPC_cModWebSocket_canRead(this->_mod)?true:false;
nyatla 58:03b89038b21a 101 }
nyatla 58:03b89038b21a 102
nyatla 58:03b89038b21a 103 void ModWebSocket::close()
nyatla 58:03b89038b21a 104 {
nyatla 58:03b89038b21a 105 if(this->_mod==NULL){
nyatla 58:03b89038b21a 106 return;
nyatla 58:03b89038b21a 107 }
nyatla 58:03b89038b21a 108 NyLPC_cModWebSocket_finalize(this->_mod);
nyatla 58:03b89038b21a 109 this->_mod=NULL;
nyatla 58:03b89038b21a 110 return;
nyatla 58:03b89038b21a 111 }
nyatla 58:03b89038b21a 112 }