Changeset 917 for trunk/zoo-project/zoo-kernel/service_internal_mono.c
- Timestamp:
- May 7, 2019, 2:17:08 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property
svn:mergeinfo
set to
False
/branches/prototype-v0 merged eligible
-
Property
svn:mergeinfo
set to
False
-
trunk/zoo-project/zoo-kernel/service_internal_mono.c
r794 r917 30 30 #include "response_print.h" 31 31 32 MonoClass *iclasses[4]; 33 MonoMethod *imethods[10]; 34 32 35 /** 33 36 * Load a Mono dll then run the static public method corresponding to the … … 69 72 mono_config_parse(NULL); 70 73 71 MonoDomain* monoDomain = mono_jit_init_version("ZOO_Embedded_Domain", 72 "v4.0.30319"); 73 74 map* cwdMap=getMapFromMaps(*main_conf,"main","servicePath"); 75 if(cwdMap==NULL) 76 cwdMap=getMapFromMaps(*main_conf,"lenv","cwd"); 77 78 char *zooAssembly=(char*)malloc((strlen(cwdMap->value)+11)*sizeof(char)); 79 sprintf(zooAssembly,"%s/ZMaps.dll",cwdMap->value); 80 assembly = mono_domain_assembly_open(monoDomain,zooAssembly); 81 if(assembly==NULL){ 82 setMapInMaps(*main_conf,"lenv","message",_("The ZMaps.dll assembly cannot be found!")); 83 return 4; 84 } 85 mono_add_internal_call ("ZOO_API::Translate", MonoTranslate); 86 mono_add_internal_call ("ZOO_API::UpdateStatus", MonoUpdateStatus); 87 74 MonoDomain* monoDomain; 75 map* mono; 76 if (hasvalue(*main_conf, "mono", "version", &mono)) { 77 monoDomain = mono_jit_init_version("ZOO_Embedded_Domain", mono->value); 78 } 79 else { 80 monoDomain = mono_jit_init("ZOO_Embedded_Domain"); // use default framework version 81 } 82 83 //MonoDomain* monoDomain = mono_jit_init_version("ZOO_Embedded_Domain", "v4.0.30319"); 84 //MonoDomain* monoDomain = mono_jit_init("ZOO_Embedded_Domain"); 85 86 char* ZMapsLib = "ZMaps.dll"; 87 char *zooAssembly = NULL; 88 89 map* config = NULL, *basedir = NULL; 90 if (hasvalue(*main_conf, "mono", "configdir", &basedir) && // knut: rename to e.g. "base_dir"? 91 hasvalue(*main_conf, "mono", "configfile", &config)) { 92 mono_domain_set_config(monoDomain, basedir->value, config->value); 93 zooAssembly = file_exists(basedir->value, ZMapsLib); 94 } 95 else { 96 mono_domain_set_config(monoDomain, "./", ""); 97 } 98 99 map* cwdMap; 100 if (! hasvalue(*main_conf, "main", "servicePath", &cwdMap) && 101 ! hasvalue(*main_conf, "main", "libPath", &cwdMap) ) { 102 cwdMap = getMapFromMaps(*main_conf, "lenv", "cwd"); 103 } 104 105 if (zooAssembly != NULL || (zooAssembly = file_exists(cwdMap->value, ZMapsLib)) != NULL) { 106 assembly = mono_domain_assembly_open(monoDomain, zooAssembly); 107 } 108 else { 109 // try to load from default locations (GAC?) 110 assembly = mono_domain_assembly_open(monoDomain, ZMapsLib); 111 } 112 free(zooAssembly); 113 114 if (assembly == NULL) { 115 setMapInMaps(*main_conf, "lenv", "message", _("The ZMaps.dll assembly cannot be found!")); 116 return 4; 117 } 118 119 mono_add_internal_call ("ZOO_API::Translate", MonoTranslate); 120 mono_add_internal_call("ZOO_API::UpdateStatus", MonoUpdateStatus); 121 88 122 monoImage = mono_assembly_get_image(assembly); 89 123 MonoClass *KeysList = mono_class_from_name(monoImage, "ZooGenerics", "KeysList"); … … 104 138 MonoClass *classes[3]={_ZMapsClass,ZMapsClass,ZMapClass}; 105 139 MonoMethod *methods[5]={ZMapsAdd,_ZMapsSetContent,_ZMapsSetChild,ZMapAdd,ZMapDisplay}; 106 140 107 141 MonoMethod *ZMapsGetKeys = mono_class_get_method_from_name(ZMapsClass, "getKeys", 0); 142 108 143 MonoMethod *ZMapsGetKeysCount = mono_class_get_method_from_name(ZMapsClass, "getKeysCount", 0); 109 144 MonoMethod *ZMapsGetKey = mono_class_get_method_from_name(ZMapsClass, "getKey", 1); … … 116 151 MonoClass *oclasses[4]={_ZMapsClass,ZMapsClass,ZMapClass,KeysList}; 117 152 MonoMethod *omethods[10]={ZMapsGetMaps,ZMapsGetKeysCount,ZMapsGetKey,ZMapGetMap,ZMapGetKeysCount,ZMapGetKey,_ZMapsGetContent,_ZMapsGetChild,ZMapGetSize,ZMapGetMapAsBytes}; 118 153 119 154 for(int i=0;i<4;i++){ 120 155 iclasses[i]=oclasses[i]; … … 131 166 132 167 MonoObject * out=ZMapsFromMaps(monoDomain,classes,methods,&exc,outputs); 133 168 134 169 args [0] = main; 135 170 args [1] = in; 136 171 args [2] = out; 137 172 138 tmp=getMap(s->content,"serviceProvider"); 139 char *sName=(char*)malloc((strlen(tmp->value)+strlen(cwdMap->value)+2)*sizeof(char)); 140 sprintf(sName,"%s/%s",cwdMap->value,tmp->value); 141 MonoAssembly* serviceAssembly = mono_domain_assembly_open(monoDomain,sName); 173 char* sName = NULL; 174 MonoAssembly* serviceAssembly = NULL; 175 176 tmp = getMap(s->content, "serviceProvider"); 177 char* test = file_exists(NULL, "log.txt"); 178 if ( (sName = file_exists(cwdMap->value, tmp->value)) != NULL || 179 (sName = file_exists(".", tmp->value)) != NULL || // in case servicePath is defined but serviceProvider is in working directory 180 (basedir != NULL && (sName = file_exists(basedir->value, tmp->value)) != NULL) ) { 181 182 serviceAssembly = mono_domain_assembly_open(monoDomain, sName); 183 } 184 else { 185 // try to open from default locations 186 serviceAssembly = mono_domain_assembly_open(monoDomain, tmp->value); 187 } 188 free(sName); 189 190 //char *sName=(char*)malloc((strlen(tmp->value)+strlen(cwdMap->value)+2)*sizeof(char)); 191 //sprintf(sName,"%s/%s",cwdMap->value,tmp->value); 192 //MonoAssembly* serviceAssembly = mono_domain_assembly_open(monoDomain,sName); 193 142 194 if(serviceAssembly==NULL){ 143 195 char *msg=(char*)malloc((strlen(_("Your service assembly: %s cannot be found!"))+strlen(tmp->value)+1)*sizeof(char)); … … 147 199 return 4; 148 200 } 149 201 150 202 MonoImage* serviceImage = mono_assembly_get_image(serviceAssembly); 151 203 152 204 map* tmp1=getMap(s->content,"serviceNameSpace"); 205 153 206 tmp=getMap(s->content,"serviceClass"); 154 207 MonoClass *serviceClass = mono_class_from_name(serviceImage, tmp1->value, tmp->value); … … 160 213 return 4; 161 214 } 215 162 216 MonoMethod *serviceFunction = mono_class_get_method_from_name(serviceClass, s->name, 3); 163 217 if(serviceFunction==NULL){ … … 168 222 return 4; 169 223 } 224 170 225 MonoObject *exception=NULL; 171 226 MonoObject *result = mono_runtime_invoke(serviceFunction,NULL,args,&exception); 227 228 if (exception != NULL) { // knut: add exception handling 229 MonoString* pMsg = mono_object_to_string(exception, NULL); 230 setErrorMessage(*main_conf, s->name, NoApplicableCode, mono_string_to_utf8(pMsg)); 231 return 4; 232 } 233 172 234 res=*(int*)mono_object_unbox (result); 235 173 236 if(res==3){ 174 237 freeMaps(&outputs); 175 238 free(outputs); 176 outputs=mapsFromZMaps(monoDomain,oclasses,omethods, args[2]);239 outputs=mapsFromZMaps(monoDomain,oclasses,omethods,(MonoObject*)args[2]); 177 240 *real_outputs=outputs; 178 241 } 242 179 243 freeMaps(&m); 180 244 free(m); 181 m=mapsFromZMaps(monoDomain,oclasses,omethods, args[0]);245 m=mapsFromZMaps(monoDomain,oclasses,omethods,(MonoObject*)args[0]); 182 246 *main_conf=m; 183 mono_jit_cleanup (monoDomain); 247 mono_jit_cleanup (monoDomain); 184 248 return res; 185 249 } … … 288 352 values[0]=&i; 289 353 exc=NULL; 290 Mono Object*okey = (MonoString*) mono_runtime_invoke(methods[2],m,values,&exc);354 MonoString *okey = (MonoString*) mono_runtime_invoke(methods[2],m,values,&exc); 291 355 char* key = mono_string_to_utf8(okey); 292 356 maps* tmp=createMaps(key); 293 357 values[0]=mono_string_new (domain, key); 294 Mono Object*content_ZMaps = (MonoString*) mono_runtime_invoke(methods[0],m,values,&exc);295 MonoObject *content = mono_runtime_invoke(methods[6], content_ZMaps,NULL,&exc);358 MonoString *content_ZMaps = (MonoString*) mono_runtime_invoke(methods[0],m,values,&exc); 359 MonoObject *content = mono_runtime_invoke(methods[6],(MonoObject*)content_ZMaps,NULL,&exc); 296 360 tmp->content=mapFromZMap(domain,classes,methods,content); 297 361 MonoObject *childs = mono_runtime_invoke(methods[7],content_ZMaps,NULL,&exc); … … 329 393 values[0]=&i; 330 394 exc=NULL; 331 Mono Object*okey = (MonoString*) mono_runtime_invoke(methods[5],m,values,&exc);395 MonoString *okey = (MonoString*) mono_runtime_invoke(methods[5],m,values,&exc); 332 396 char* key = mono_string_to_utf8(okey); 333 397 values[0]=mono_string_new (domain, key); 334 398 exc=NULL; 335 Mono Object*ovalue = (MonoString*) mono_runtime_invoke(methods[3],m,values,&exc);399 MonoString *ovalue = (MonoString*) mono_runtime_invoke(methods[3],m,values,&exc); 336 400 char* value = mono_string_to_utf8(ovalue); 337 401 if(res==NULL) … … 350 414 */ 351 415 static MonoString* MonoTranslate(MonoString *str){ 352 return mono_string_new (mono_domain_get(), mono_string_to_utf8(_(str)));416 return mono_string_new (mono_domain_get(), _(mono_string_to_utf8(str))); 353 417 } 354 418 … … 360 424 * @return the translated string 361 425 */ 362 static void MonoUpdateStatus(MonoObject* obj,MonoString *str,int* p){ 363 MonoDomain* domain = mono_object_get_domain (obj); 364 maps *confMaps=mapsFromZMaps(domain,iclasses,imethods,obj); 365 setMapInMaps(confMaps,"lenv","message",mono_string_to_utf8(str)); 366 int tmp=p; 367 if (p < 0 || p > 100){ 368 tmp=-1; 369 } 370 char tmpStatus[5]; 371 snprintf(tmpStatus, 4, "%d", tmp); 372 setMapInMaps(confMaps,"lenv","status",(char*)tmpStatus); 373 _updateStatus(confMaps); 374 freeMaps(&confMaps); 375 free(confMaps); 376 return; 377 } 426 static void MonoUpdateStatus(MonoObject* obj, MonoString *str, int p) { 427 MonoDomain* domain = mono_object_get_domain(obj); 428 maps *confMaps = mapsFromZMaps(domain, iclasses, imethods, obj); 429 setMapInMaps(confMaps, "lenv", "message", mono_string_to_utf8(str)); 430 int tmp = p > 100 || p < 0 ? -1 : p; 431 char tmpStatus[5]; 432 snprintf(tmpStatus, 4, "%d", tmp); 433 setMapInMaps(confMaps, "lenv", "status", (char*)tmpStatus); 434 _updateStatus(confMaps); 435 freeMaps(&confMaps); 436 free(confMaps); 437 return; 438 }
Note: See TracChangeset
for help on using the changeset viewer.