void VariablesListView::reexpandItems() { //if we don't do this, m_expanded will have duplicates QValueList<QString> paths = m_expanded; m_expanded.clear(); VariablesListViewItem* item; QValueList<QString>::iterator it; for(it = paths.begin(); it != paths.end(); it++) { item = getItemFromPath(*it); if(item) item->setOpen(true); } }
int main() { #if HIGH_LEVEL_INTERFACE == 1 start(); interface_gse_send_E1Q1SB1_C1_Performance(1, 512); return 0; #else int len = 0; initialise_iec61850(); fp = initWinpcap(); srand(time(NULL)); float valueGSE = (float) rand() / (float) RAND_MAX; float valueSV = (float) rand() / (float) RAND_MAX; // test GOOSE E1Q1SB1.S1.C1.TVTRa_1.Vol.instMag.f = valueGSE; len = E1Q1SB1.S1.C1.LN0.ItlPositions.send(buf, 0, 512); pcap_sendpacket(fp, buf, len); gse_sv_packet_filter(buf, len); printf("GSE test: %s\n", D1Q1SB4.S1.C1.RSYNa_1.gse_inputs_ItlPositions.E1Q1SB1_C1_Positions.C1_TVTR_1_Vol_instMag.f == valueGSE ? "passed" : "failed"); fflush(stdout); // test database lookup unsigned char databaseValueResult = 0; Item *ln = getLN("E1Q1SB1", "C1", "TVTRa_1"); if (ln != NULL) { Item *valueDatabaseRef = getItem(ln, 3, "Vol", "instMag", "f"); if (valueDatabaseRef != NULL) { float *databaseValue = (float *) (valueDatabaseRef->data); if (*databaseValue == valueGSE) { databaseValueResult = TRUE; } } else { printf("Database lookup test: item null\n"); } } else { printf("Database lookup test: LN null\n"); } printf("Database lookup test: %s\n", databaseValueResult ? "passed" : "failed"); fflush(stdout); // test database lookup 2 Item *valueDatabaseRef2 = getItemFromPath("E1Q1SB1", "C1/TVTRa_1.Vol.instMag.f"); char databaseBuf[64] = {0}; itemToJSON(databaseBuf, valueDatabaseRef2); printf("Database lookup test 2: %f, %s\n", *(float *) valueDatabaseRef2->data, databaseBuf); fflush(stdout); // test database print printf("Database print test:\n"); char printBuf[10000]; int charsPrinted = itemTreeToJSON(printBuf, getIED("E1Q1SB1"), 0); printf("%d\n%s\n", charsPrinted, printBuf); charsPrinted = itemTreeToJSONPretty(printBuf, getIED("E1Q1SB1"), 0); printf("%d\n%s\n", charsPrinted, printBuf); fflush(stdout); // test Sampled Values E1Q1SB1.S1.C1.exampleRMXU_1.AmpLocPhsA.instMag.f = valueSV; int i = 0; for (i = 0; i < E1Q1SB1.S1.C1.LN0.rmxuCB.noASDU; i++) { len = E1Q1SB1.S1.C1.LN0.rmxuCB.update(buf); if (len > 0) { pcap_sendpacket(fp, buf, len); gse_sv_packet_filter(buf, len); printf("SV test: %s\n", D1Q1SB4.S1.C1.exampleMMXU_1.sv_inputs_rmxuCB.E1Q1SB1_C1_rmxu[15].C1_RMXU_1_AmpLocPhsA.instMag.f == valueSV ? "passed" : "failed"); fflush(stdout); } } pcap_close(fp); return 0; #endif }
/** * Callback function which handles all HTTP requests. */ static int handle_http(struct mg_connection *conn) { char *url = (char *) &conn->uri[1]; // exclude the starting '/' Item *item; ACSIServer *acsiServer = (ACSIServer *) conn->server_param; #ifdef USE_SSL #if USE_HTTP_AUTH == 1 static const char *passwords_file = "htpasswd.txt"; FILE *fp = fopen(passwords_file, "r"); if (fp == NULL || !mg_authorize_digest(conn, fp)) { mg_send_digest_auth_request(conn); return 1; } if (fp != NULL) { fclose(fp); } #endif #endif // check for method names in url if (strcmp(conn->request_method, "GET") == 0) { int len = 0; char printBuf[ACSI_RESPONSE_MAX_SIZE]; if (strncmp(url, ACSI_GET_DEFINITION, strlen(ACSI_GET_DEFINITION)) == 0) { item = getItemFromPath(acsiServer->iedName, (char *) &url[strlen(ACSI_GET_DEFINITION) + 1]); len = itemDescriptionTreeToJSON(printBuf, item, FALSE); } else if (strncmp(url, ACSI_GET_DIRECTORY, strlen(ACSI_GET_DIRECTORY)) == 0) { item = getItemFromPath(acsiServer->iedName, (char *) &url[strlen(ACSI_GET_DIRECTORY) + 1]); len = itemDescriptionTreeToJSON(printBuf, item, TRUE); } // else if (strncmp(url, "scd", strlen("scd")) == 0) { // mg_send_header(conn, "Content-Type", "application/xml"); // mg_send_data(conn, scd_file, strlen(scd_file)); // } else if (strncmp(url, ACSI_ASSOCIATE, strlen(ACSI_ASSOCIATE)) == 0) { acsiServer->clients = addClient(acsiServer->clients, conn->remote_ip, conn->remote_port); mg_send_data(conn, ACSI_OK, strlen(ACSI_OK)); return 1; } else if (strncmp(url, ACSI_RELEASE, strlen(ACSI_RELEASE)) == 0) { // TODO raise flag here, rather than remove? acsiServer->clients = removeClientByConnection(acsiServer->clients, conn->remote_ip, conn->remote_port); mg_send_data(conn, ACSI_OK, strlen(ACSI_OK)); return 1; } else if (strncmp(url, ACSI_ABORT, strlen(ACSI_ABORT)) == 0) { acsiServer->clients = removeClientByConnection(acsiServer->clients, conn->remote_ip, conn->remote_port); mg_send_data(conn, ACSI_OK, strlen(ACSI_OK)); return 1; } else { item = getItemFromPath(acsiServer->iedName, (char *) url); len = itemTreeToJSON(printBuf, item); } if (item != NULL && len == -1) { mg_send_status(conn, 500); mg_send_data(conn, ACSI_BUFFER_OVERRUN, strlen(ACSI_BUFFER_OVERRUN)); return 1; } else if (item != NULL && len > 0) { #if ACSI_AUTO_ASSOCIATE == 1 acsiServer->clients = addClient(acsiServer->clients, conn->remote_ip, conn->remote_port); #endif mg_send_header(conn, "Content-Type", "application/json"); mg_send_header(conn, "Cache-Control", "no-cache"); mg_send_header(conn, "Access-Control-Allow-Origin", "*"); mg_send_data(conn, printBuf, len); // printf("len: %d\n", len); // fflush(stdout); return 1; } } else if (strcmp(conn->request_method, "POST") == 0) { item = getItemFromPath(acsiServer->iedName, (char *) url); int setReturn = setItem(item, conn->content, conn->content_len); // printf("content: %.*s\n", conn->content_len, conn->content); // fflush(stdout); if (setReturn > 0) { mg_send_header(conn, "Cache-Control", "no-cache"); mg_send_header(conn, "Access-Control-Allow-Origin", "*"); mg_send_data(conn, ACSI_OK, strlen(ACSI_OK)); } else { mg_send_data(conn, ACSI_NOT_POSSIBLE, strlen(ACSI_NOT_POSSIBLE)); } return 1; } // by default, return 404 mg_send_status(conn, 404); mg_send_data(conn, ACSI_NOT_FOUND, strlen(ACSI_NOT_FOUND)); return 1; }