8000 Use static allocation, add convenience overloads which take String · raydtang/esp8266-arduino-master@ec34dbe · GitHub
[go: up one dir, main page]

Skip to content

Commit ec34dbe

Browse files
committed
Use static allocation, add convenience overloads which take String
1 parent 121806d commit ec34dbe

File tree

2 files changed

+69
-82
lines changed

2 files changed

+69
-82
lines changed

hardware/esp8266com/esp8266/libraries/ESP8266SSDP/ESP8266SSDP.cpp

Lines changed: 30 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ License (MIT license):
2525
THE SOFTWARE.
2626
2727
*/
28-
28+
#define LWIP_OPEN_SRC
2929
#include "ESP8266SSDP.h"
3030

3131
extern "C" {
32-
#include "ip_addr.h"
3332
#include "user_interface.h"
3433
#include "mem.h"
3534
}
35+
#include "lwip/ip_addr.h"
3636
#include "lwip/igmp.h"
3737

3838
//#define DEBUG_SSDP Serial
@@ -43,39 +43,28 @@ extern "C" {
4343
#define SSDP_URI_SIZE 2
4444
#define SSDP_BUFFER_SIZE 64
4545

46-
#define SSDP_UUID_SIZE 37
47-
#define SSDP_SCHEMA_URL_SIZE 64
48-
#define SSDP_FRIENDLY_NAME_SIZE 64
49-
#define SSDP_SERIAL_NUMBER_SIZE 32
50-
#define SSDP_PRESENTATION_URL_SIZE 128
51-
#define SSDP_MODEL_NAME_SIZE 64
52-
#define SSDP_MODEL_URL_SIZE 128
53-
#define SSDP_MODEL_VERSION_SIZE 32
54-
#define SSDP_MANUFACTURER_SIZE 64
55-
#define SSDP_MANUFACTURER_URL_SIZE 128
56-
5746
static const IPAddress SSDP_MULTICAST_ADDR(239, 255, 255, 250);
5847

59-
const char* _ssdp_response_template =
48+
static const char* _ssdp_response_template =
6049
"HTTP/1.1 200 OK\r\n"
6150
"EXT:\r\n"
6251
"ST: upnp:rootdevice\r\n";
6352

64-
const char* _ssdp_notify_template =
53+
static const char* _ssdp_notify_template =
6554
"NOTIFY * HTTP/1.1\r\n"
6655
"HOST: 239.255.255.250:1900\r\n"
6756
"NT: upnp:rootdevice\r\n"
6857
"NTS: ssdp:alive\r\n";
6958

70-
const char* _ssdp_packet_template =
59+
static const char* _ssdp_packet_template =
7160
"%s" // _ssdp_response_template / _ssdp_notify_template
7261
"CACHE-CONTROL: max-age=%u\r\n" // SSDP_INTERVAL
7362
"SERVER: Arduino/1.0 UPNP/1.1 %s/%s\r\n" // _modelName, _modelNumber
7463
"USN: uuid:%s\r\n" // _uuid
7564
"LOCATION: http://%u.%u.%u.%u:%u/%s\r\n" // WiFi.localIP(), _port, _schemaURL
7665
"\r\n";
7766

78-
const char* _ssdp_schema_template =
67+
static const char* _ssdp_schema_template =
7968
"HTTP/1.1 200 OK\r\n"
8069
"Content-Type: text/xml\r\n"
8170
"Connection: close\r\n"
@@ -120,17 +109,6 @@ const char* _ssdp_schema_template =
120109
"\r\n";
121110

122111
SSDPClass::SSDPClass(){
123-
_uuid = (char*)os_malloc(SSDP_UUID_SIZE);
124-
_schemaURL = (char*)os_malloc(SSDP_SCHEMA_URL_SIZE);
125-
_friendlyName = (char*)os_malloc(SSDP_FRIENDLY_NAME_SIZE);
126-
_presentationURL = (char*)os_malloc(SSDP_PRESENTATION_URL_SIZE);
127-
_serialNumber = (char*)os_malloc(SSDP_SERIAL_NUMBER_SIZE);
128-
_modelName = (char*)os_malloc(SSDP_MODEL_NAME_SIZE);
129-
_modelNumber = (char*)os_malloc(SSDP_MODEL_VERSION_SIZE);
130-
_modelURL = (char*)os_malloc(SSDP_MODEL_URL_SIZE);
131-
_manufacturer = (char*)os_malloc(SSDP_MANUFACTURER_SIZE);
132-
_manufacturerURL = (char*)os_malloc(SSDP_MANUFACTURER_URL_SIZE);
133-
134112
_uuid[0] = '\0';
135113
_modelNumber[0] = '\0';
136114
_friendlyName[0] = '\0';
@@ -146,17 +124,6 @@ SSDPClass::SSDPClass(){
146124
}
147125

148126
SSDPClass::~SSDPClass(){
149-
os_free(_uuid);
150-
os_free(_schemaURL);
151-
os_free(_friendlyName);
152-
os_free(_presentationURL);
153-
os_free(_serialNumber);
154-
os_free(_modelName);
155-
os_free(_modelNumber);
156-
os_free(_modelURL);
157-
os_free(_manufacturer);
158-
os_free(_manufacturerURL);
159-
_pending = false;
160127
}
161128

162129
void SSDPClass::begin(){
@@ -207,7 +174,7 @@ void SSDPClass::_send(ssdp_method_t method){
207174
SSDP_INTERVAL,
208175
_modelName, _modelNumber,
209176
_uuid,
210-
(uint8_t)(ip & 0xFF), (uint8_t)((ip >> 8) & 0xFF), (uint8_t)((ip >> 16) & 0xFF), (uint8_t)((ip >> 24) & 0xFF), _port, _schemaURL
177+
IP2STR(&ip), _port, _schemaURL
211178
);
212179

213180
_server.endPacket();
@@ -216,7 +183,7 @@ void SSDPClass::_send(ssdp_method_t method){
216183
void SSDPClass::schema(WiFiClient client){
217184
uint32_t ip = WiFi.localIP();
218185
client.printf(_ssdp_schema_template,
219-
(uint8_t)(ip & 0xFF), (uint8_t)((ip >> 8) & 0xFF), (uint8_t)((ip >> 16) & 0xFF), (uint8_t)((ip >> 24) & 0xFF), _port,
186+
IP2STR(&ip), _port,
220187
_friendlyName,
221188
_presentationURL,
222189
_serialNumber,
@@ -259,14 +226,14 @@ uint8_t SSDPClass::update(){
259226
else state = URI;
260227
cursor = 0;
261228

262-
}else if(cursor < SSDP_METHOD_SIZE - 1){ buffer[cursor++] = c; buffer[cursor] = '\0'; }
229+
} else if(cursor < SSDP_METHOD_SIZE - 1){ buffer[cursor++] = c; buffer[cursor] = '\0'; }
263230
break;
264231
case URI:
265232
if(c == ' '){
266233
if(strcmp(buffer, "*")) state = ABORT;
267234
else state = PROTO;
268235
cursor = 0;
269-
}else if(cursor < SSDP_URI_SIZE - 1){ buffer[cursor++] = c; buffer[cursor] = '\0'; }
236+
} else if(cursor < SSDP_URI_SIZE - 1){ buffer[cursor++] = c; buffer[cursor] = '\0'; }
270237
break;
271238
case PROTO:
272239
if(cr == 2){ state = KEY; cursor = 0; }
@@ -298,7 +265,7 @@ uint8_t SSDPClass::update(){
298265
}
299266

300267
if(state != ABORT){ state = KEY; header = START; cursor = 0; }
301-
}else if(c != '\r' && c != '\n'){
268+
} else if(c != '\r' && c != '\n'){
302269
if(header == START){
303270
if(strncmp(buffer, "MA", 2) == 0) header = MAN;
304271
else if(strcmp(buffer, "ST") == 0) header = ST;
@@ -320,50 +287,50 @@ uint8_t SSDPClass::update(){
320287
if(_pending && (millis() - _process_time) > _delay){
321288
_pending = false; _delay = 0;
322289
_send(NONE);
323-
}else if(_notify_time == 0 || (millis() - _notify_time) > (SSDP_INTERVAL * 1000L)){
290+
} else if(_notify_time == 0 || (millis() - _notify_time) > (SSDP_INTERVAL * 1000L)){
324291
_notify_time = millis();
325292
_send(NOTIFY);
326293
}
327294
}
328295

329-
void SSDPClass::setSchemaURL(char *url){
330-
strcpy(_schemaURL, url);
296+
void SSDPClass::setSchemaURL(const char *url){
297+
strlcpy(_schemaURL, url, sizeof(_schemaURL));
331298
}
332299

333300
void SSDPClass::setHTTPPort(uint16_t port){
334301
_port = port;
335302
}
336303

337-
void SSDPClass::setName(char *name){
338-
strcpy(_friendlyName, name);
304+
void SSDPClass::setName(const char *name){
305+
strlcpy(_friendlyName, name, sizeof(_friendlyName));
339306
}
340307

341-
void SSDPClass::setURL(char *url){
342-
strcpy(_presentationURL, url);
308+
void SSDPClass::setURL(const char *url){
309+
strlcpy(_presentationURL, url, sizeof(_presentationURL));
343310
}
344311

345-
void SSDPClass::setSerialNumber(char *serialNumber){
346-
strcpy(_serialNumber, serialNumber);
312+
void SSDPClass::setSerialNumber(const char *serialNumber){
313+
strlcpy(_serialNumber, serialNumber, sizeof(_serialNumber));
347314
}
348315

349-
void SSDPClass::setModelName(char *name){
350-
strcpy(_modelName, name);
316+
void SSDPClass::setModelName(const char *name){
317+
strlcpy(_modelName, name, sizeof(_modelName));
351318
}
352319

353-
void SSDPClass::setModelNumber(char *num){
354-
strcpy(_modelNumber, num);
320+
void SSDPClass::setModelNumber(const char *num){
321+
strlcpy(_modelNumber, num, sizeof(_modelNumber));
355322
}
356323

357-
void SSDPClass::setModelURL(char *url){
358-
strcpy(_modelURL, url);
324+
void SSDPClass::setModelURL(const char *url){
325+
strlcpy(_modelURL, url, sizeof(_modelURL));
359326
}
360327

361-
void SSDPClass::setManufacturer(char *name){
362-
strcpy(_manufacturer, name);
328+
void SSDPClass::setManufacturer(const char *name){
329+
strlcpy(_manufacturer, name, sizeof(_manufacturer));
363330
}
364331

365-
void SSDPClass::setManufacturerURL(char *url){
366-
strcpy(_manufacturerURL, url);
332+
void SSDPClass::setManufacturerURL(const char *url){
333+
strlcpy(_manufacturerURL, url, sizeof(_manufacturerURL));
367334
}
368335

369336
SSDPClass SSDP;

hardware/esp8266com/esp8266/libraries/ESP8266SSDP/ESP8266SSDP.h

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ License (MIT license):
3333
#include <ESP8266WiFi.h>
3434
#include <WiFiUdp.h>
3535

36+
#define SSDP_UUID_SIZE 37
37+
#define SSDP_SCHEMA_URL_SIZE 64
38+
#define SSDP_FRIENDLY_NAME_SIZE 64
39+
#define SSDP_SERIAL_NUMBER_SIZE 32
40+
#define SSDP_PRESENTATION_URL_SIZE 128
41+
#define SSDP_MODEL_NAME_SIZE 64
42+
#define SSDP_MODEL_URL_SIZE 128
43+
#define SSDP_MODEL_VERSION_SIZE 32
44+
#define SSDP_MANUFACTURER_SIZE 64
45+
#define SSDP_MANUFACTURER_URL_SIZE 128
46+
3647
typedef enum {
3748
NONE,
3849
SEARCH,
@@ -48,16 +59,25 @@ class SSDPClass{
4859
uint8_t update();
4960
void schema(WiFiClient client);
5061

51-
void setName(char *name);
52-
void setURL(char *url);
53-
void setSchemaURL(char *url);
62+
void setName(const String& name) { setName(name.c_str()); }
63+
void setName(const char *name);
64+
void setURL(const String& url) { setURL(url.c_str()); }
65+
void setURL(const char *url);
66+
void setSchemaURL(const String& url) { setSchemaURL(url.c_str()); }
67+
void setSchemaURL(const char *url);
68+
void setSerialNumber(const String& serialNumber) { setSerialNumber(serialNumber.c_str()); }
69+
void setSerialNumber(const char *serialNumber);
70+
void setModelName(const String& name) { setModelName(name.c_str()); }
71+
void setModelName(const char *name);
72+
void setModelNumber(const String& num) { setModelNumber(num.c_str()); }
73+
void setModelNumber(const char *num);
74+
void setModelURL(const String& url) { setModelURL(url.c_str()); }
75+
void setModelURL(const char *url);
76+
void setManufacturer(const String& name) { setManufacturer(name.c_str()); }
77+
void setManufacturer F438 (const char *name);
78+
void setManufacturerURL(const String& url) { setManufacturerURL(url.c_str()); }
79+
void setManufacturerURL(const char *url);
5480
void setHTTPPort(uint16_t port);
55-
void setSerialNumber(char *serialNumber);
56-
void setModelName(char *name);
57-
void setModelNumber(char *num);
58-
void setModelURL(char *url);
59-
void setManufacturer(char *name);
60-
void setManufacturerURL(char *url);
6181

6282
private:
6383
WiFiUDP _server;
@@ -67,16 +87,16 @@ class SSDPClass{
6787
unsigned long _notify_time;
6888

6989
uint16_t _port;
70-
char *_schemaURL;
71-
char *_uuid;
72-
char *_friendlyName;
73-
char *_serialNumber;
74-
char *_presentationURL;
75-
char *_manufacturer;
76-
char *_manufacturerURL;
77-
char *_modelName;
78-
char *_modelURL;
79-
char *_modelNumber;
90+
char _schemaURL[SSDP_SCHEMA_URL_SIZE];
91+
char _uuid[SSDP_UUID_SIZE];
92+
char _friendlyName[SSDP_FRIENDLY_NAME_SIZE];
93+
char _serialNumber[SSDP_SERIAL_NUMBER_SIZE];
94+
char _presentationURL[SSDP_PRESENTATION_URL_SIZE];
95+
char _manufacturer[SSDP_MANUFACTURER_SIZE];
96+
char _manufacturerURL[SSDP_MANUFACTURER_URL_SIZE];
97+
char _modelName[SSDP_MODEL_NAME_SIZE];
98+
char _modelURL[SSDP_MODEL_URL_SIZE];
99+
char _modelNumber[SSDP_MODEL_VERSION_SIZE];
80100

81101
void _send(ssdp_method_t method);
82102
};

0 commit comments

Comments
 (0)
0