Changeset 290

Show
Ignore:
Timestamp:
06/18/09 16:32:42 (15 years ago)
Author:
wrodgers
Message:

Works for 3 levels of nested if's. Nested while support still to come. Shell commands implemented for sending data directly to shell.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • vtcross/trunk/src/service_management_layer/ServiceManagementLayer.cpp

    r289 r290  
    600600    {    
    601601        //Check whether the current service is an actual service or a conditional 
    602         if(miss[activeMission].services[i].name.compare("if") && miss[activeMission].services[i].name.compare("while") && \ 
     602        if(miss[activeMission].services[i].name.compare("if") && miss[activeMission].services[i].name.compare("dowhile") && \ 
    603603           miss[activeMission].services[i].name.compare("shell")){ 
    604604            //If it is a service, search the database of registered services to find the ID of the component that registered it 
     
    648648ServiceManagementLayer::TransactData(int32_t sourceID) 
    649649{ 
    650     LOG("ServiceManagementLayer:: Data transaction occuring.\n"); 
     650   // LOG("ServiceManagementLayer:: Data transaction occuring.\n"); 
    651651    char buffer[256]; 
    652652    std::string data; 
     
    679679                else { 
    680680                    //TODO could do shell output here if not in DB 
     681                data.append("1@"); 
     682                data.append(miss[activeMission].services[sourceID].output[0]); 
     683                data.append("@"); 
     684                data.append(miss[activeMission].services[sourceID].output[0]); 
     685                data.append("@"); 
     686                //printf("data = %s\n", data.c_str()); 
     687                 
    681688                    printf("data_DB:: Data not yet in DB.\n"); 
    682689                    rc=31337; 
     
    695702            } 
    696703        } 
    697         //Otherwise, just return the value specified by output TODO (in 1 - <output name> - <output name> format) 
    698         else{ 
    699             printf("taken2\n"); 
    700             memset(buffer, 0, 256); 
    701             SendMessage(shellSocketFD, "1"); 
    702             miss[activeMission].services[sourceID].output[0].erase(0); 
    703             SendMessage(shellSocketFD, miss[activeMission].services[sourceID].output[0].c_str()); 
    704             SendMessage(shellSocketFD, miss[activeMission].services[sourceID].output[0].c_str()); 
    705         } 
    706704        //printf("done shell\n"); 
     705       // LOG("ServiceManagementLayer:: Finished with data transaction.\n"); 
    707706        return; 
    708707   }  
     
    850849    } 
    851850    //printf("done transact data!\n"); 
    852     LOG("ServiceManagementLayer:: Finished with data transaction.\n"); 
     851   // LOG("ServiceManagementLayer:: Finished with data transaction.\n"); 
    853852 
    854853 
     
    962961    ReadMessage(shellSocketFD, buffer); 
    963962    t=atoi(buffer); 
    964     for(int k = 0; k < t; k++) { 
     963    for(int m = 0; m < t; m++) { 
    965964        //printf("data=%s\n", data_obsv.c_str()); 
    966965        memset(buffer1, 0, 256); 
     
    10021001 
    10031002   // printf("done\n"); 
    1004     i=0; 
    1005     int32_t numstatements = 0; 
     1003    i=0;  
     1004    int32_t numstatements[3] = {0,0,0}; 
    10061005    data.clear(); 
    10071006    while(i < miss[activeMission].numServices) 
     
    10151014            for(t = 0; t < 5; t++){ 
    10161015                if(!miss[activeMission].services[i].output[t].empty()){ 
    1017                     //printf("i-numstmts = %d\n", i-numstatements-1); 
    1018                     input=miss[activeMission].services[i-numstatements-1].output[t]; 
     1016                    //printf("i-numstmts-1 = %d\n", i-numstatements[0]-1); 
     1017                    input=miss[activeMission].services[i-numstatements[0]-1].output[t]; 
    10191018                    strcpy(_data_DB->command, "SELECT "); 
    10201019                    strcat(_data_DB->command, _data_DB->tablename); 
     
    10451044            } 
    10461045            //printf("L0:--- %s  %s---\n", miss[activeMission].services[i].output[t].c_str(), token); 
    1047             if(!miss[activeMission].services[i].output[t].compare(token)){ 
     1046            //TODO change to strstr 
     1047            if(strstr(miss[activeMission].services[i].output[t].c_str(), token)){ 
    10481048                //printf("L0:if taken\n"); 
    10491049                for(uint16_t k = i+1; k <= i+miss[activeMission].services[i].num_conds; k++){  
    1050                     //printf("transacting data for k=%d\n", k); 
    1051                     TransactData(k); 
     1050                        //printf("transacting data for k=%d\n", k); 
     1051                    //printf("%s---%d\n", miss[activeMission].services[k].name.c_str(), k); 
     1052                    if(miss[activeMission].services[k].name.compare("if")==0){ 
     1053                        //printf("L1:if detected\n"); 
     1054                            input.clear(); 
     1055                            check.clear(); 
     1056                            for(t = 0; t < 5; t++){ 
     1057                                if(!miss[activeMission].services[k].output[t].empty()){ 
     1058                                    //printf("i-numstmts = %d\n", i-numstatements-1); 
     1059                                    input=miss[activeMission].services[k-numstatements[1]-1].output[t]; 
     1060                                    strcpy(_data_DB->command, "SELECT "); 
     1061                                    strcat(_data_DB->command, _data_DB->tablename); 
     1062                                    strcat(_data_DB->command, ".* from "); 
     1063                                    strcat(_data_DB->command, _data_DB->tablename); 
     1064                                    strcat(_data_DB->command, " where Tag=="); 
     1065                                    sprintf(_data_DB->command, "%s'%s';", _data_DB->command, input.c_str()); 
     1066                                    sqlite3_stmt * pStatement; 
     1067                                    rc = sqlite3_prepare_v2(_data_DB->db, _data_DB->command, -1, &pStatement, NULL); 
     1068                                    if (rc == SQLITE_OK){  
     1069                                        if (sqlite3_step(pStatement) == SQLITE_ROW) 
     1070                                             data = (const char *) sqlite3_column_text(pStatement, 1);  
     1071                                        else { 
     1072                                                printf("1 data_DB:: Data not yet in DB.\n"); 
     1073                                                rc=31337; 
     1074                                        } 
     1075                                    } else { 
     1076                                        printf("data_DB:: Error executing SQL statement. rc = %i\n%s\n",rc,_data_DB->command); 
     1077                                    } 
     1078                                    sqlite3_finalize(pStatement); 
     1079                                    //printf("data=%s\n", data.c_str()); 
     1080                                    token = strtok((char *)data.c_str(), "@"); 
     1081                                    token = strtok(NULL, "@"); 
     1082                                    token = strtok(NULL, "@"); 
     1083                                    //printf("data=%s\n", token); 
     1084                                    break; 
     1085                                } 
     1086                            } 
     1087                            //printf("L1:--- %s  %s---\n", miss[activeMission].services[k].output[t].c_str(), token); 
     1088                            //TODO change to strstr 
     1089                            if(strstr(miss[activeMission].services[k].output[t].c_str(), token)){ 
     1090                                //printf("L1:if taken\n"); 
     1091                                for(uint16_t j = k+1; j <= k+miss[activeMission].services[k].num_conds; j++){  
     1092                                    //printf("transacting data for k=%d\n", k); 
     1093                                    //printf("%s---%d\n", miss[activeMission].services[j].name.c_str(), j); 
     1094                                    if(miss[activeMission].services[j].name.compare("if")==0){ 
     1095                                        //printf("L2:if detected\n"); 
     1096                                            input.clear(); 
     1097                                            check.clear(); 
     1098                                            for(t = 0; t < 5; t++){ 
     1099                                                if(!miss[activeMission].services[j].output[t].empty()){ 
     1100                                                    //printf("i-numstmts = %d\n", i-numstatements-1); 
     1101                                                    input=miss[activeMission].services[j-numstatements[2]-1].output[t]; 
     1102                                                    strcpy(_data_DB->command, "SELECT "); 
     1103                                                    strcat(_data_DB->command, _data_DB->tablename); 
     1104                                                    strcat(_data_DB->command, ".* from "); 
     1105                                                    strcat(_data_DB->command, _data_DB->tablename); 
     1106                                                    strcat(_data_DB->command, " where Tag=="); 
     1107                                                    sprintf(_data_DB->command, "%s'%s';", _data_DB->command, input.c_str()); 
     1108                                                    sqlite3_stmt * pStatement; 
     1109                                                    rc = sqlite3_prepare_v2(_data_DB->db, _data_DB->command, -1, &pStatement, NULL); 
     1110                                                    if (rc == SQLITE_OK){  
     1111                                                        if (sqlite3_step(pStatement) == SQLITE_ROW) 
     1112                                                             data = (const char *) sqlite3_column_text(pStatement, 1);  
     1113                                                        else { 
     1114                                                                printf("1 data_DB:: Data not yet in DB.\n"); 
     1115                                                                rc=31337; 
     1116                                                        } 
     1117                                                    } else { 
     1118                                                        printf("data_DB:: Error executing SQL statement. rc = %i\n%s\n",rc,_data_DB->command); 
     1119                                                    } 
     1120                                                    sqlite3_finalize(pStatement); 
     1121                                                    //printf("data=%s\n", data.c_str()); 
     1122                                                    token = strtok((char *)data.c_str(), "@"); 
     1123                                                    token = strtok(NULL, "@"); 
     1124                                                    token = strtok(NULL, "@"); 
     1125                                                    //printf("data=%s\n", token); 
     1126                                                    break; 
     1127                                                } 
     1128                                            } 
     1129                                            //printf("L2:--- %s  %s---\n", miss[activeMission].services[j].output[t].c_str(), token); 
     1130                                            //TODO change to strstr 
     1131                                            if(strstr(miss[activeMission].services[j].output[t].c_str(), token)){ 
     1132                                                //printf("L1:if taken\n"); 
     1133                                                for(uint16_t l = j+1; l <= j+miss[activeMission].services[j].num_conds; l++){  
     1134                                                    //printf("transacting data for k=%d\n", k); 
     1135                                                    TransactData(l); 
     1136                                                } 
     1137                                            } 
     1138                                            else 
     1139                                                //printf("L2: if not taken\n"); 
     1140                                                numstatements[2] +=miss[activeMission].services[j].num_conds+1; 
     1141                                                j+=miss[activeMission].services[j].num_conds; 
     1142                                            //printf("doneif %d, %d, %d\n", numstatements, miss[activeMission].services[i].num_conds, i); 
     1143                                        } 
     1144                                        else{ 
     1145                                            //printf("NO L2 COND!\n"); 
     1146                                            numstatements[2]=0; 
     1147                                            TransactData(j); 
     1148                                        } 
     1149                                } 
     1150                            } 
     1151                            else 
     1152                                //printf("L1: if not taken\n"); 
     1153                                numstatements[1] +=miss[activeMission].services[k].num_conds+1; 
     1154                                k+=miss[activeMission].services[k].num_conds; 
     1155                            //printf("doneif %d, %d, %d\n", numstatements, miss[activeMission].services[i].num_conds, i); 
     1156                        } else if(miss[activeMission].services[k].name.compare("dowhile")==0){ 
     1157                            //printf("while detected\n"); 
     1158                            while(true){ 
     1159                                uint16_t m; 
     1160                                for(uint16_t m = k+1; m <= k+miss[activeMission].services[k].num_conds; m++){  
     1161                                    TransactData(m); 
     1162                                    printf("transact! %d\n", m); 
     1163                                } 
     1164                                    data.clear(); 
     1165                                    printf("L1:while detected %d, %d\n", miss[activeMission].services[k].num_conds, k); 
     1166                                    input.clear(); 
     1167                                    check.clear(); 
     1168                                    int t; 
     1169                                    for(t = 0; t < 5; t++){ 
     1170                                        if(!miss[activeMission].services[k-1].output[t].empty()){ 
     1171                                            input=miss[activeMission].services[m].output[t]; 
     1172                                            strcpy(_data_DB->command, "SELECT "); 
     1173                                            strcat(_data_DB->command, _data_DB->tablename); 
     1174                                            strcat(_data_DB->command, ".* from "); 
     1175                                            strcat(_data_DB->command, _data_DB->tablename); 
     1176                                            strcat(_data_DB->command, " where Tag=="); 
     1177                                            sprintf(_data_DB->command, "%s'%s';", _data_DB->command, input.c_str()); 
     1178                                            sqlite3_stmt * pStatement; 
     1179                                            rc = sqlite3_prepare_v2(_data_DB->db, _data_DB->command, -1, &pStatement, NULL); 
     1180                                            if (rc == SQLITE_OK){  
     1181                                                if (sqlite3_step(pStatement) == SQLITE_ROW) 
     1182                                                     data = (const char *) sqlite3_column_text(pStatement, 1);  
     1183                                                else { 
     1184                                                        printf("1 data_DB:: Data not yet in DB.\n"); 
     1185                                                        rc=31337; 
     1186                                                } 
     1187                                            } else { 
     1188                                                printf("data_DB:: Error executing SQL statement. rc = %i\n%s\n",rc,_data_DB->command); 
     1189                                            } 
     1190                                            sqlite3_finalize(pStatement); 
     1191                                            //printf("data=%s\n", data.c_str()); 
     1192                                            token = strtok((char *)data.c_str(), "@"); 
     1193                                            token = strtok(NULL, "@"); 
     1194                                            token = strtok(NULL, "@"); 
     1195                                            //printf("data=%s\n", token); 
     1196                                            break; 
     1197                                        } 
     1198                                    } 
     1199                                    printf("L1:--- %s  %s---\n", miss[activeMission].services[k].output[t].c_str(), token); 
     1200                                    if(strstr(miss[activeMission].services[k].output[t].c_str(), token)){ 
     1201                                        printf("L1:do it again!\n"); 
     1202                                    } 
     1203                                    else 
     1204                                        break; 
     1205                            } 
     1206                            k+=miss[activeMission].services[k].num_conds; 
     1207                            //printf("donewhile\n"); 
     1208                        } 
     1209                        else{ 
     1210                            //printf("NO L1 COND!\n"); 
     1211                            numstatements[1]=0; 
     1212                            TransactData(k); 
     1213                        } 
     1214                 
     1215                        //numstatements[0] +=miss[activeMission].services[i].num_conds+1; 
     1216                        //i+=miss[activeMission].services[i].num_conds; 
     1217            //printf("doneif %d, %d, %d\n", numstatements, miss[activeMission].services[i].num_conds, i); 
    10521218                } 
    10531219            } 
    1054             numstatements +=miss[activeMission].services[i].num_conds+1; 
     1220           // else 
     1221                //printf("LO if not taken\n"); 
     1222            numstatements[0] +=miss[activeMission].services[i].num_conds+1; 
    10551223            i+=miss[activeMission].services[i].num_conds; 
    10561224            //printf("doneif %d, %d, %d\n", numstatements, miss[activeMission].services[i].num_conds, i); 
    10571225        } 
    1058         else if(miss[activeMission].services[i].name.compare("while")==0) 
     1226        else if(miss[activeMission].services[i].name.compare("dowhile")==0) 
    10591227        { 
    1060             numstatements=0; 
     1228            numstatements[0]=0; 
    10611229            //printf("while detected\n"); 
    10621230            while(true){ 
     1231                uint16_t k; 
     1232                    for(k = i+1; k <= i+miss[activeMission].services[i].num_conds; k++){  
     1233                        TransactData(k); 
     1234                    } 
    10631235                    data.clear(); 
    1064                     printf("L0:if detected\n"); 
     1236                    //printf("L0:while detected %d, %d\n", k, miss[activeMission].services[i].num_conds); 
    10651237                    input.clear(); 
    10661238                    check.clear(); 
     
    10681240                    for(t = 0; t < 5; t++){ 
    10691241                        if(!miss[activeMission].services[i].output[t].empty()){ 
    1070                             input=miss[activeMission].services[i-1].output[t]; 
     1242                            input=miss[activeMission].services[k-1].output[t]; 
     1243                            //printf("input=%s\n", input.c_str()); 
    10711244                            strcpy(_data_DB->command, "SELECT "); 
    10721245                            strcat(_data_DB->command, _data_DB->tablename); 
     
    10961269                        } 
    10971270                    } 
    1098                     printf("L0:--- %s  %s---\n", miss[activeMission].services[i].output[t].c_str(), token); 
    1099                     if(!miss[activeMission].services[i].output[t].compare(token)){ 
    1100                         printf("L0:if taken\n"); 
    1101                         for(uint16_t k = i+i; k <= i+miss[activeMission].services[i].num_conds; k++){  
    1102                             TransactData(k); 
    1103                         } 
     1271                    //printf("L0:--- %s  %s---\n", miss[activeMission].services[i].output[t].c_str(), token); 
     1272                    if(strstr(miss[activeMission].services[i].output[t].c_str(), token)){ 
     1273                        //printf("L0:while taken again!\n"); 
    11041274                    } 
    11051275                    else 
     
    11101280        } 
    11111281        else{ 
    1112             numstatements=0; 
     1282            numstatements[0]=0; 
    11131283            //printf("L0 Neither if nor while\n"); 
    11141284            TransactData(i);} 
     
    12231393    TiXmlElement *pChild0, *pChild1, *pChild2, *pChild3, *pChild4; 
    12241394    TiXmlHandle hRoot(0); 
    1225     //printf("ServiceManagementLayer:: Loading Configuration.\n"); 
     1395    printf("ServiceManagementLayer:: Loading Configuration.\n"); 
    12261396    TiXmlDocument doc("."); 
    12271397    doc.LoadFile(SML_Config); 
     
    12591429                int32_t conditional_1 = service_num; 
    12601430                for(pChild3 = pChild2->FirstChildElement(); \ 
    1261                     pChild3; pChild3 = pChild3 ->NextSiblingElement()) 
     1431                    pChild3; pChild3 = pChild3->NextSiblingElement()) 
    12621432                { 
    12631433                    service_num++; 
    12641434                    int32_t conditional_2 = service_num; 
    12651435                        for(pChild4 = pChild3->FirstChildElement(); \ 
    1266                             pChild4; pChild4 = pChild4 ->NextSiblingElement()) 
     1436                            pChild4; pChild4 = pChild4->NextSiblingElement()) 
    12671437                        { 
    1268                             service_num++; 
    1269                             mList[mission_num].services[service_num].name = pChild4->Attribute("name"); 
     1438                            service_num++; 
     1439                            if(pChild4->Attribute("name")) 
     1440                                mList[mission_num].services[service_num].name = pChild4->Attribute("name"); 
     1441                            else 
     1442                                mList[mission_num].services[service_num].name = pChild4->Value(); 
     1443                                 
    12701444                            if(pChild4->Attribute("input1")) 
    12711445                                mList[mission_num].services[service_num].input[0] = pChild4->Attribute("input1"); 
     
    13231497 
    13241498                } 
    1325                 //printf("here\n"); 
    13261499                if(!strcmp(pChild2->Value(), "shell") || conditional_1 != service_num) { 
    13271500                    mList[mission_num].services[conditional_1].name = pChild2->Value(); 
     
    13501523                    if(pChild2->Attribute("output5")) 
    13511524                        mList[mission_num].services[conditional_1].output[4] = pChild2->Attribute("output5"); 
    1352             //printf("2%s %s\n", mList[mission_num].services[conditional_1].output[0].c_str(), mList[mission_num].services[conditional_1].output[1].c_str()); 
    13531525 
    13541526                mList[mission_num].services[conditional_1].num_conds = cond_array[1]; 
     
    13851557                if(pChild1->Attribute("output5")) 
    13861558                    mList[mission_num].services[service_num].output[4] = pChild1->Attribute("output4"); 
    1387             //printf("1%s %s\n", mList[mission_num].services[conditional_0].output[0].c_str(), mList[mission_num].services[conditional_0].output[1].c_str()); 
    13881559            mList[mission_num].services[conditional_0].num_conds = cond_array[0]; 
    13891560            cond_array[0] = 0;