// just store one converted report at a time StringBuffer report2json(const ConstBuf& in) { char *keys, *vals; unsigned short ir[16], ik[32], iv[32], i; StringBuffer reportJson(100, 8); // copy cuz we edit it char *report = (char*)malloc(in.length()); memcpy(report, in, in.length()); report[in.length()] = 0; // in's buf isn't null terminated for some reason // parse this and humanize js0n((unsigned char*)report, strlen(report), ir, 16); if (!*ir) { free(report); } // TODO: Proper JSON escaping in this function reportJson.appendSprintf("{\"type\":\"%s\"", keyGet(atoi(j0g_safe(0, report, ir)))); keys = report + ir[2]; js0n((unsigned char*)keys, ir[3], ik, 32); if (!*ik) { free(report); reportJson = (char*)NULL; return reportJson; } vals = report+ir[4]; js0n((unsigned char*)vals, ir[5], iv, 32); if (!*iv) { free(report); reportJson = (char*)NULL; return reportJson; } for (i=0; ik[i]; i+=2) { reportJson.appendSprintf(",\"%s\":", keyGet(atoi(j0g_safe(i, keys, ik)))); if (vals[iv[i]-1] == '"') { iv[i]--; iv[i+1]+=2; } *(vals+iv[i]+iv[i+1]) = 0; reportJson.appendSprintf("%s", vals + iv[i]); } // newer seq added to end is just a number if(ir[6]) { report[ir[6]+ir[7]] = 0; reportJson.appendSprintf(",\"at\":%s",report+ir[6]); } reportJson += "}"; free(report); return reportJson; }
static void leadAnnouncementSend(uint16_t group, uint16_t from, const ConstBuf& message) { StringBuffer report(100, 8); // reports are expected to be json objects if (group == 0xBEEF) { report.appendSprintf("{\"type\":\"report\",\"from\":%d,\"report\":%s}\n", from, (report2json(message)).c_str()); } else if (group == 0) { report.appendSprintf("{\"type\":\"announce\",\"from\":%d,\"announce\":", from); report.concat(message, message.length()); report += "}\n"; } else { return; } leadSignal(report); }
static void leadAnnouncementSend(uint16_t group, uint16_t from, const ConstBuf& message) { StringBuffer report(100, 8); // reports are expected to be json objects if (group == 0xBEEF) { report.appendSprintf("{\"type\":\"report\",\"from\":%d,\"report\":%s}\n", from, (report2json(message)).c_str()); } else if (group == 0) { report.appendSprintf("{\"type\":\"announce\",\"from\":%d,\"announce\":", from); report.concat(message, message.length()); report += "}\n"; } else { return; } if(leadSignal(report)) { // TODO reentrancy issues, temporarily disabled! // Shell.eval("command.others","hq.online",1); } }