Changes in trunk/zoo-kernel/service_internal.c [9:26]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/zoo-kernel/service_internal.c
r9 r26 35 35 return hex[code & 15]; 36 36 } 37 38 void* unhandleStatus(maps *conf){ 39 int shmid,i; 40 key_t key; 41 void *shm; 42 struct shmid_ds shmids; 43 char *s,*s1; 44 map *tmpMap=getMapFromMaps(conf,"lenv","sid"); 45 if(tmpMap!=NULL){ 46 key=atoi(tmpMap->value); 47 if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) { 48 #ifdef DEBUG 49 fprintf(stderr,"shmget failed to update value\n"); 50 #endif 51 }else{ 52 if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) { 53 #ifdef DEBUG 54 fprintf(stderr,"shmat failed to update value\n"); 55 #endif 56 }else{ 57 shmdt(shm); 58 shmctl(shmid,IPC_RMID,&shmids); 59 } 60 } 61 } 62 } 63 64 #ifdef USE_JS 65 66 JSBool 67 JSUpdateStatus(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) 68 { 69 JS_MaybeGC(cx); 70 char *sid; 71 int istatus=0; 72 char *status=NULL; 73 maps *conf; 74 int i=0; 75 if(argc>2){ 76 #ifdef JS_DEBUG 77 fprintf(stderr,"Number of arguments used to call the function : %i",argc); 78 #endif 79 return JS_FALSE; 80 } 81 conf=mapsFromJSObject(cx,argv[0]); 82 dumpMaps(conf); 83 if(JS_ValueToInt32(cx,argv[1],&istatus)==JS_TRUE){ 84 char tmpStatus[4]; 85 sprintf(tmpStatus,"%i",istatus); 86 tmpStatus[3]=0; 87 status=strdup(tmpStatus); 88 } 89 if(getMapFromMaps(conf,"lenv","status")!=NULL){ 90 if(status!=NULL) 91 setMapInMaps(conf,"lenv","status",status); 92 else 93 setMapInMaps(conf,"lenv","status","15"); 94 updateStatus(conf); 95 } 96 freeMaps(&conf); 97 free(conf); 98 JS_MaybeGC(cx); 99 return JS_TRUE; 100 } 101 102 #endif 103 104 void* updateStatus(maps *conf){ 105 int shmid,i; 106 key_t key; 107 char *shm,*s,*s1; 108 map *tmpMap=NULL; 109 tmpMap=getMapFromMaps(conf,"lenv","sid"); 110 if(tmpMap!=NULL){ 111 key=atoi(tmpMap->value); 112 if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) { 113 #ifdef DEBUG 114 fprintf(stderr,"shmget failed to update value\n"); 115 #endif 116 }else{ 117 if ((shm = (char*) shmat(shmid, NULL, 0)) == (char *) -1) { 118 #ifdef DEBUG 119 fprintf(stderr,"shmat failed to update value\n"); 120 #endif 121 } 122 else{ 123 tmpMap=getMapFromMaps(conf,"lenv","status"); 124 s1=shm; 125 for(s=tmpMap->value;*s!=NULL;s++) 126 *s1++=*s; 127 shmdt((void *)shm); 128 } 129 } 130 } 131 } 132 133 char* getStatus(int pid){ 134 int shmid,i; 135 key_t key; 136 void *shm; 137 char *s; 138 key=pid; 139 if ((shmid = shmget(key, SHMSZ, 0666)) < 0) { 140 #ifdef DEBUG 141 fprintf(stderr,"shmget failed in getStatus\n"); 142 #endif 143 }else{ 144 if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) { 145 #ifdef DEBUG 146 fprintf(stderr,"shmat failed in getStatus\n"); 147 #endif 148 }else{ 149 return (char*)shm; 150 } 151 } 152 return "-1"; 153 } 154 37 155 38 156 /* Returns a url-encoded version of str */ … … 729 847 char tmp[1024]; 730 848 sprintf(tmp,"http://www.w3.org/TR/xmlschema-2/#%s",tmp1->value); 731 xmlNewNsProp(nc6,ns_ xlink,BAD_CAST "reference",BAD_CAST tmp);849 xmlNewNsProp(nc6,ns_ows,BAD_CAST "reference",BAD_CAST tmp); 732 850 xmlAddChild(nc3,nc6); 733 851 tmp1=tmp1->next; … … 841 959 xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en"); 842 960 char tmp[256]; 843 char url[ 256];961 char url[1024]; 844 962 memset(tmp,0,256); 845 963 memset(url,0,256); 846 964 maps* tmp_maps=getMaps(m,"main"); 847 965 if(tmp_maps!=NULL){ 848 map* tmpm=getMap(tmp_maps->content,"serverAddress"); 849 map* tmpm1=getMap(tmp_maps->content,"tmpUrl"); 850 if(tmpm!=NULL && tmpm1!=NULL){ 851 sprintf(url,"%s/%s/%s_%i.xml",tmpm->value,tmpm1->value,service,pid); 852 } 853 if(tmpm!=NULL) 854 sprintf(tmp,"%s/",tmpm->value); 966 dumpMaps(getMaps(m,"lenv")); 967 map* tmpm1=getMap(tmp_maps->content,"serverAddress"); 968 /** 969 * Check if the ZOO Service GetStatus is available in the local directory. 970 * If yes, then it uses a reference to an URL which the client can access 971 * to get information on the status of a running Service (using the 972 * percentCompleted attribute). 973 * Else fallback to the initial method using the xml file to write in ... 974 */ 975 char ntmp[1024]; 976 #ifndef WIN32 977 getcwd(ntmp,1024); 978 #else 979 _getcwd(ntmp,1024); 980 #endif 981 struct stat myFileInfo; 982 int statRes; 983 char file_path[1024]; 984 sprintf(file_path,"%s/GetStatus.zcfg",ntmp); 985 statRes=stat(file_path,&myFileInfo); 986 if(statRes==0){ 987 char currentSid[128]; 988 map* tmpm=getMap(tmp_maps->content,"rewriteUrl"); 989 map *tmp_lenv=NULL; 990 tmp_lenv=getMapFromMaps(m,"lenv","sid"); 991 if(tmp_lenv==NULL) 992 sprintf(currentSid,"%i",pid); 993 else 994 sprintf(currentSid,"%s",tmp_lenv->value); 995 if(tmpm==NULL || strcasecmp(tmpm->value,"false")==0){ 996 sprintf(url,"%s/?request=Execute&service=WPS&version=1.0.0&Identifier=GetStatus&DataInputs=sid=%s&RawDataOutput=Result",tmpm1->value,currentSid); 997 }else{ 998 if(strlen(tmpm->value)>0) 999 if(strcasecmp(tmpm->value,"true")!=0) 1000 sprintf(url,"%s/%s/GetStatus/%s",tmpm1->value,tmpm->value,currentSid); 1001 else 1002 sprintf(url,"%s/GetStatus/%s",tmpm1->value,currentSid); 1003 else 1004 sprintf(url,"%s/?request=Execute&service=WPS&version=1.0.0&Identifier=GetStatus&DataInputs=sid=%s&RawDataOutput=Result",tmpm1->value,currentSid); 1005 } 1006 }else{ 1007 map* tmpm2=getMap(tmp_maps->content,"tmpUrl"); 1008 if(tmpm1!=NULL && tmpm2!=NULL){ 1009 sprintf(url,"%s/%s/%s_%i.xml",tmpm1->value,tmpm2->value,service,pid); 1010 } 1011 } 1012 if(tmpm1!=NULL) 1013 sprintf(tmp,"%s/",tmpm1->value); 855 1014 } 856 1015 857 1016 xmlNewProp(n,BAD_CAST "serviceInstance",BAD_CAST tmp); 858 if(status!=SERVICE_SUCCEEDED ){1017 if(status!=SERVICE_SUCCEEDED && status!=SERVICE_FAILED){ 859 1018 xmlNewProp(n,BAD_CAST "statusLocation",BAD_CAST url); 860 1019 } … … 876 1035 time_t now; 877 1036 char *tmp1; 1037 map *tmpStatus; 878 1038 879 1039 now = time ( NULL ); … … 884 1044 len = strftime ( tmp1, TIME_SIZE, "%Y-%m-%dT%I:%M:%SZ", tm ); 885 1045 1046 xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1); 1047 1048 char sMsg[2048]; 886 1049 switch(status){ 887 1050 case SERVICE_SUCCEEDED: 888 xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);889 1051 nc1 = xmlNewNode(ns, BAD_CAST "ProcessSucceeded"); 1052 sprintf(sMsg,"Service \"%s\" run successfully.",serv->name); 1053 nc3=xmlNewText(BAD_CAST sMsg); 1054 xmlAddChild(nc1,nc3); 890 1055 break; 891 1056 case SERVICE_STARTED: 892 xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);893 1057 nc1 = xmlNewNode(ns, BAD_CAST "ProcessStarted"); 894 xmlNewProp(nc1,BAD_CAST "percentCompleted",BAD_CAST "NEED_SERVICE_ACCESS"); 1058 tmpStatus=getMapFromMaps(m,"lenv","status"); 1059 xmlNewProp(nc1,BAD_CAST "percentCompleted",BAD_CAST tmpStatus->value); 1060 sprintf(sMsg,"ZOO Service \"%s\" is currently running. Please, reload this document to get the up-to-date status of the Service.",serv->name); 1061 nc3=xmlNewText(BAD_CAST sMsg); 1062 xmlAddChild(nc1,nc3); 895 1063 break; 896 1064 case SERVICE_ACCEPTED: 897 xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);898 1065 nc1 = xmlNewNode(ns, BAD_CAST "ProcessAccepted"); 1066 sprintf(sMsg,"Service \"%s\" was accepted by the ZOO Kernel and it run as a background task. Please consult the statusLocation attribtue providen in this document to get the up-to-date document.",serv->name); 1067 nc3=xmlNewText(BAD_CAST sMsg); 1068 xmlAddChild(nc1,nc3); 899 1069 break; 900 1070 case SERVICE_FAILED: 901 1071 nc1 = xmlNewNode(ns, BAD_CAST "ProcessFailed"); 1072 map *errorMap; 1073 map *te; 1074 te=getMapFromMaps(m,"lenv","code"); 1075 if(te!=NULL) 1076 errorMap=createMap("code",te->value); 1077 else 1078 errorMap=createMap("code","NoApplicableCode"); 1079 te=getMapFromMaps(m,"lenv","message"); 1080 if(te!=NULL) 1081 addToMap(errorMap,"text",te->value); 1082 else 1083 addToMap(errorMap,"text","No more information available"); 1084 nc3=createExceptionReportNode(m,errorMap,0); 1085 xmlAddChild(nc1,nc3); 902 1086 break; 903 1087 default : 904 1088 printf("error code not know : %i\n",status); 905 exit(1);1089 //exit(1); 906 1090 break; 907 1091 } … … 1059 1243 nc1=xmlNewNode(ns_wps, BAD_CAST type); 1060 1244 map *tmp=e->content; 1061 //#ifdef DEBUG1245 #ifdef DEBUG 1062 1246 dumpMap(tmp); 1063 1247 dumpElements(e); 1064 //#endif1248 #endif 1065 1249 nc2=xmlNewNode(ns_ows, BAD_CAST "Identifier"); 1066 1250 nc3=xmlNewText(BAD_CAST e->name); … … 1085 1269 * IO type Reference or full Data ? 1086 1270 */ 1087 //#ifdef DEBUG1271 #ifdef DEBUG 1088 1272 fprintf(stderr,"FORMAT %s %s\n",e->format,e->format); 1089 //#endif1273 #endif 1090 1274 map *tmpMap=getMap(m->content,"Reference"); 1091 1275 if(tmpMap==NULL){ … … 1210 1394 maps* tmpMap=getMaps(m,"main"); 1211 1395 char *encoding=getEncoding(tmpMap); 1212 printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding); 1396 map *tmpSid=getMapFromMaps(m,"lenv","sid"); 1397 if(tmpSid==NULL) 1398 printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding); 1213 1399 1214 1400 ns=xmlNewNs(NULL,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows"); … … 1217 1403 ns_xlink=xmlNewNs(n,BAD_CAST "http://www.w3.org/1999/xlink",BAD_CAST "xlink"); 1218 1404 ns_xsi=xmlNewNs(n,BAD_CAST "http://www.w3.org/2001/XMLSchema-instance",BAD_CAST "xsi"); 1219 xmlNewProp(n,BAD_CAST "xsi:schemaLocation",BAD_CAST "http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1 /owsExceptionReport.xsd");1405 xmlNewProp(n,BAD_CAST "xsi:schemaLocation",BAD_CAST "http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd"); 1220 1406 xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en"); 1221 xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS"); 1222 1223 xmlNewProp(n,BAD_CAST "version",BAD_CAST getVersion(tmpMap)); 1407 xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.1.0"); 1224 1408 1225 1409 nc = xmlNewNode(ns, BAD_CAST "Exception"); … … 1251 1435 xmlFreeNs(ns); 1252 1436 xmlCleanupParser(); 1437 } 1438 1439 xmlNodePtr createExceptionReportNode(maps* m,map* s,int use_ns){ 1440 1441 int buffersize; 1442 xmlChar *xmlbuff; 1443 xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi; 1444 xmlNodePtr n,nc,nc1,nc2; 1445 1446 maps* tmpMap=getMaps(m,"main"); 1447 1448 ns=xmlNewNs(NULL,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows"); 1449 n = xmlNewNode(ns, BAD_CAST "ExceptionReport"); 1450 1451 if(use_ns==1){ 1452 ns_ows=xmlNewNs(n,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows"); 1453 int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi"); 1454 ns_xsi=usedNs[xsiId]; 1455 int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink"); 1456 ns_xlink=usedNs[xlinkId]; 1457 xmlNewNsProp(n,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd"); 1458 } 1459 xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en"); 1460 xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.1.0"); 1461 1462 nc = xmlNewNode(ns, BAD_CAST "Exception"); 1463 1464 map* tmp=getMap(s,"code"); 1465 if(tmp!=NULL) 1466 xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST tmp->value); 1467 else 1468 xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST "NoApplicableCode"); 1469 1470 tmp=getMap(s,"text"); 1471 nc1 = xmlNewNode(ns, BAD_CAST "ExceptionText"); 1472 nc2=NULL; 1473 if(tmp!=NULL){ 1474 xmlNodeSetContent(nc1, BAD_CAST tmp->value); 1475 } 1476 else{ 1477 xmlNodeSetContent(nc1, BAD_CAST "No debug message available"); 1478 } 1479 xmlAddChild(nc,nc1); 1480 xmlAddChild(n,nc); 1481 return n; 1253 1482 } 1254 1483 … … 1296 1525 #endif 1297 1526 printProcessResponse(m,request_inputs1,cpid, 1298 s,r_inputs->value,res, 1299 request_inputs, 1300 request_outputs); 1301 } 1302 else{ 1303 /** 1304 * We get the first output only !! 1305 */ 1306 char mime[1024]; 1307 map* mi=getMap(request_outputs->content,"mimeType"); 1308 #ifdef DEBUG 1309 fprintf(stderr,"SERVICE OUTPUTS\n"); 1310 dumpMaps(request_outputs); 1311 fprintf(stderr,"SERVICE OUTPUTS\n"); 1312 #endif 1313 map* en=getMap(request_outputs->content,"encoding"); 1314 if(mi!=NULL && en!=NULL) 1315 sprintf(mime, 1316 "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n", 1317 mi->value,en->value); 1318 else 1319 if(mi!=NULL) 1527 s,r_inputs->value,res, 1528 request_inputs, 1529 request_outputs); 1530 } 1531 else 1532 if(res!=SERVICE_FAILED){ 1533 /** 1534 * We get the first output only !! 1535 */ 1536 char mime[1024]; 1537 map* mi=getMap(request_outputs->content,"mimeType"); 1538 #ifdef DEBUG 1539 fprintf(stderr,"SERVICE OUTPUTS\n"); 1540 dumpMaps(request_outputs); 1541 fprintf(stderr,"SERVICE OUTPUTS\n"); 1542 #endif 1543 map* en=getMap(request_outputs->content,"encoding"); 1544 if(mi!=NULL && en!=NULL) 1320 1545 sprintf(mime, 1321 "Content-Type: %s; charset= UTF-8\r\nStatus: 200 OK\r\n\r\n",1322 mi->value );1546 "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n", 1547 mi->value,en->value); 1323 1548 else 1324 sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n"); 1325 printf("%s",mime); 1326 toto=getMap(request_outputs->content,"value"); 1327 if(mi!=NULL && strncmp(mi->value,"image",5)==0){ 1328 map* rs=getMapFromMaps(request_outputs,request_outputs->name,"size"); 1329 fwrite(toto->value,atoi(rs->value),1,stdout); 1330 } 1331 else 1332 printf("%s",toto->value); 1333 #ifdef DEBUG 1334 dumpMap(toto); 1335 #endif 1336 } 1549 if(mi!=NULL) 1550 sprintf(mime, 1551 "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n", 1552 mi->value); 1553 else 1554 sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n"); 1555 printf("%s",mime); 1556 toto=getMap(request_outputs->content,"value"); 1557 if(mi!=NULL && strncmp(mi->value,"image",5)==0){ 1558 map* rs=getMapFromMaps(request_outputs,request_outputs->name,"size"); 1559 fwrite(toto->value,atoi(rs->value),1,stdout); 1560 } 1561 else 1562 printf("%s",toto->value); 1563 #ifdef DEBUG 1564 dumpMap(toto); 1565 #endif 1566 }else{ 1567 char tmp[1024]; 1568 map * errormap; 1569 map *lenv; 1570 lenv=getMapFromMaps(m,"lenv","message"); 1571 if(lenv!=NULL) 1572 sprintf(tmp,"Unable to run the Service. The message returned back by the Service was the following : %s",lenv->value); 1573 else 1574 sprintf(tmp,"Unable to run the Service. No more information was returned back by the Service."); 1575 errormap = createMap("text",tmp); 1576 addToMap(errormap,"code", "InternalError"); 1577 printf("Content-Type: text/xml; charset=utf-8\r\nStatus: 200 OK\r\n\r\n"); 1578 printExceptionReportResponse(m,errormap); 1579 freeMap(&errormap); 1580 free(errormap); 1581 } 1337 1582 } 1338 1583
Note: See TracChangeset
for help on using the changeset viewer.