00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef _WIN32
00035 #include "config.h"
00036 #else
00037 #include "winconfig.h"
00038 #endif
00039
00040 #ifndef _WIN32
00041 #include <unistd.h>
00042 #include <pthread.h>
00043 #include <sys/socket.h>
00044 #include <netdb.h>
00045 #else
00046 #include <windows.h>
00047 #include <memory.h>
00048 #endif
00049 #include <embedch.h>
00050
00051 #include <sys/types.h>
00052 #include <sys/stat.h>
00053 #ifndef _WIN32
00054 #include <sys/time.h>
00055 #else
00056 #include <time.h>
00057 #endif
00058
00059 #include <b64/cdecode.h>
00060
00061 #include "include/libmc.h"
00062 #include "include/mc_error.h"
00063 #include "include/macros.h"
00064 #include "include/mc_platform.h"
00065 #include "include/message.h"
00066 #include "include/data_structures.h"
00067 #include "include/fipa_acl_envelope.h"
00068 #include "include/fipa_acl.h"
00069 #include "include/agent.h"
00070 #include "include/agent_task.h"
00071 #include "include/agent_lib.h"
00072 #ifndef HOST_NAME_MAX
00073 #define HOST_NAME_MAX 255
00074 #endif
00075
00076
00077 mc_platform_p g_mc_platform;
00078
00079
00080
00081
00082
00083 EXPORTMC int
00084 MC_AclDestroy(struct fipa_acl_message_s* message)
00085 {
00086 return fipa_acl_message_Destroy(message);
00087 }
00088
00089 EXPORTMC fipa_acl_message_t*
00090 MC_AclNew(void) {
00091 return fipa_acl_message_New();
00092 }
00093
00094 EXPORTMC int
00095 MC_AclPost(MCAgent_t agent, struct fipa_acl_message_s* message)
00096 {
00097 return agent_mailbox_Post(agent->mailbox, message);
00098 }
00099
00100 EXPORTMC fipa_acl_message_t*
00101 MC_AclReply(fipa_acl_message_t* acl_message)
00102 {
00103 return fipa_Reply(acl_message);
00104 }
00105
00106 EXPORTMC fipa_acl_message_t*
00107 MC_AclRetrieve(MCAgent_t agent)
00108 {
00109 return agent_mailbox_Retrieve(agent->mailbox);
00110 }
00111
00112 EXPORTMC int
00113 MC_AclSend(MCAgency_t attr, fipa_acl_message_t* acl)
00114 {
00115
00116
00117
00118 int i;
00119 int err;
00120 mtp_http_t* msg;
00121 dynstring_t* msg_string;
00122 message_p mc_message;
00123
00124 char* host;
00125 int port;
00126 char* target;
00127 MCAgent_t agent;
00128 int num_addresses = 0;
00129
00130 fipa_acl_message_t* tmp;
00131
00132 err = fipa_acl_Compose(&msg_string, acl);
00133 if( err ) {
00134 fprintf(stderr, "ACL Message Compose Error. %s:%d\n", __FILE__, __LINE__);
00135 return err;
00136 }
00137 for(i = 0; i < acl->receiver->num; i++) {
00138
00139
00140
00141 if (acl->receiver->fipa_agent_identifiers[i]->addresses == NULL) {
00142 num_addresses = 0;
00143 } else {
00144 num_addresses = acl->receiver->fipa_agent_identifiers[i]->addresses->num;
00145 }
00146
00147 if (num_addresses == 0) {
00148 agent = MC_FindAgentByName(
00149 attr,
00150 acl->receiver->fipa_agent_identifiers[i]->name );
00151 if (agent == NULL) {
00152 fprintf(stderr, "Could not find local agent:%s. %s:%d\n",
00153 acl->receiver->fipa_agent_identifiers[i]->name,
00154 __FILE__, __LINE__);
00155 continue;
00156 }
00157 tmp = fipa_acl_message_Copy(acl);
00158 MC_AclPost(agent, tmp);
00159 } else {
00160 msg = mtp_http_New();
00161
00162 err = http_to_hostport(
00163 acl->receiver->fipa_agent_identifiers[i]->addresses->urls[0]->str,
00164 &host,
00165 &port,
00166 &target );
00167 if (err) {
00168 fprintf(stderr, "Invalid address. %s:%d\n", __FILE__, __LINE__);
00169 return err;
00170 }
00171 msg->host = strdup(host);
00172 msg->target = strdup(target);
00173 msg->message_parts = 2;
00174 msg->content = (mtp_http_content_t *)malloc(
00175 sizeof(mtp_http_content_t) * 2);
00176
00177
00178 msg->content[0].data = (void*)fipa_envelope_Compose(acl);
00179
00180 msg->content[0].content_type = strdup("application/xml");
00181
00182
00183 msg->content[1].data = (void*)strdup(msg_string->message);
00184 msg->content[1].content_type = strdup("application/text");
00185
00186 mc_message = mtp_http_CreateMessage(
00187 msg,
00188 host,
00189 port );
00190 mc_message->message_type = FIPA_ACL;
00191 mc_message->target = strdup("acc");
00192
00193 message_Send
00194 (
00195 attr->mc_platform,
00196 mc_message,
00197 attr->mc_platform->private_key
00198 );
00199
00200
00201 mtp_http_Destroy(msg);
00202 free(host);
00203 free(target);
00204 }
00205 }
00206 dynstring_Destroy(msg_string);
00207 return 0;
00208 }
00209
00210 EXPORTMC fipa_acl_message_t*
00211 MC_AclWaitRetrieve(MCAgent_t agent)
00212 {
00213 return agent_mailbox_WaitRetrieve(agent->mailbox);
00214 }
00215
00216
00217
00218 EXPORTMC enum fipa_protocol_e MC_AclGetProtocol(
00219 struct fipa_acl_message_s* acl)
00220 {
00221 return (enum fipa_protocol_e)acl->performative;
00222 }
00223
00224 EXPORTMC char* MC_AclGetConversationID(
00225 struct fipa_acl_message_s* acl)
00226 {
00227 return acl->conversation_id->content.string->content;
00228 }
00229
00230 EXPORTMC enum fipa_performative_e MC_AclGetPerformative(
00231 struct fipa_acl_message_s* acl)
00232 {
00233 return acl->performative;
00234 }
00235
00236 EXPORTMC int MC_AclGetSender(
00237 struct fipa_acl_message_s* acl,
00238 char** name,
00239
00240 char** address
00241
00242 )
00243 {
00244 *name = strdup(acl->sender->name);
00245 *address = strdup( acl->sender->addresses->urls[0]->str );
00246 return 0;
00247 }
00248
00249 EXPORTMC const char* MC_AclGetContent(
00250 struct fipa_acl_message_s* acl)
00251 {
00252 return acl->content->content;
00253 }
00254
00255 EXPORTMC int MC_AclSetProtocol(
00256 fipa_acl_message_t* acl,
00257 enum fipa_protocol_e protocol)
00258 {
00259 if(protocol <= FIPA_PROTOCOL_ERROR ||
00260 protocol >= FIPA_PROTOCOL_END)
00261 {
00262 fprintf(stderr,
00263 "AclSetProtocol: Incorrect protocol. %s:%d\n",
00264 __FILE__, __LINE__);
00265 return -1;
00266 }
00267 acl->protocol = protocol;
00268 return 0;
00269 }
00270
00271 EXPORTMC int MC_AclSetConversationID(
00272 fipa_acl_message_t* acl,
00273 char* id)
00274 {
00275
00276 if(!id)
00277 {
00278 fprintf(stderr,
00279 "AclSetConversationID: NULL id string. %s:%d\n",
00280 __FILE__, __LINE__);
00281 return -1;
00282 }
00283 acl->conversation_id = fipa_expression_New();
00284 acl->conversation_id->type = FIPA_EXPR_STRING;
00285 acl->conversation_id->content.string = fipa_string_New();
00286 acl->conversation_id->content.string->content = strdup(id);
00287 return 0;
00288 }
00289
00290 EXPORTMC int MC_AclSetPerformative(
00291 fipa_acl_message_t* acl,
00292 enum fipa_performative_e performative )
00293 {
00294 acl->performative = performative;
00295 return 0;
00296 }
00297
00298 EXPORTMC int MC_AclSetSender(
00299 fipa_acl_message_t* acl,
00300 const char* name,
00301 const char* address )
00302 {
00303 if(acl->sender != NULL) {
00304
00305 fipa_agent_identifier_Destroy(acl->sender);
00306 }
00307 acl->sender = fipa_agent_identifier_New();
00308 acl->sender->name = strdup(name);
00309 if (address != NULL) {
00310 acl->sender->addresses = fipa_url_sequence_New();
00311 acl->sender->addresses->num = 1;
00312 acl->sender->addresses->urls = (struct fipa_url_s**)malloc(
00313 sizeof(struct fipa_url_s*));
00314 acl->sender->addresses->urls[0] = fipa_url_New();
00315 acl->sender->addresses->urls[0]->str = strdup(address);
00316 }
00317
00318 return 0;
00319 }
00320
00321 EXPORTMC int MC_AclAddReceiver(
00322 fipa_acl_message_t* acl,
00323 const char* name,
00324 const char* address )
00325 {
00326 int i;
00327 struct fipa_agent_identifier_s** tmp;
00328 if (acl->receiver == NULL) {
00329 acl->receiver = fipa_agent_identifier_set_New();
00330 }
00331 acl->receiver_num++;
00332
00333 acl->receiver->num++;
00334 tmp = (struct fipa_agent_identifier_s**)malloc(
00335 sizeof(struct fipa_agent_identifier_s*)
00336 * acl->receiver->num);
00337
00338 for(i = 0; i < acl->receiver->num-1; i++) {
00339 tmp[i] = acl->receiver->fipa_agent_identifiers[i];
00340 }
00341
00342 tmp[i] = fipa_agent_identifier_New();
00343 tmp[i]->name = strdup(name);
00344 if(address != NULL) {
00345 tmp[i]->addresses = fipa_url_sequence_New();
00346 tmp[i]->addresses->num = 1;
00347 tmp[i]->addresses->urls = (struct fipa_url_s**)malloc(
00348 sizeof(struct fipa_url_s*));
00349 tmp[i]->addresses->urls[0] = fipa_url_New();
00350 tmp[i]->addresses->urls[0]->str = strdup(address);
00351 }
00352 free(acl->receiver->fipa_agent_identifiers);
00353 acl->receiver->fipa_agent_identifiers = tmp;
00354 return 0;
00355 }
00356
00357 EXPORTMC int MC_AclAddReplyTo(
00358 fipa_acl_message_t* acl,
00359 const char* name,
00360 const char* address)
00361 {
00362 int i;
00363 struct fipa_agent_identifier_s** tmp;
00364 if (acl->reply_to == NULL) {
00365 acl->reply_to = fipa_agent_identifier_set_New();
00366 }
00367
00368 acl->reply_to->num++;
00369 tmp = (struct fipa_agent_identifier_s**)malloc(
00370 sizeof(struct fipa_agent_identifier_s*)
00371 * acl->reply_to->num);
00372
00373 for(i = 0; i < acl->reply_to->num-1; i++) {
00374 tmp[i] = acl->reply_to->fipa_agent_identifiers[i];
00375 }
00376
00377 tmp[i] = fipa_agent_identifier_New();
00378 tmp[i]->name = strdup(name);
00379 if(address != NULL) {
00380 tmp[i]->addresses = fipa_url_sequence_New();
00381 tmp[i]->addresses->num = 1;
00382 tmp[i]->addresses->urls = (struct fipa_url_s**)malloc(
00383 sizeof(struct fipa_url_s*));
00384 tmp[i]->addresses->urls[0] = fipa_url_New();
00385 tmp[i]->addresses->urls[0]->str = strdup(address);
00386 }
00387 free (acl->reply_to->fipa_agent_identifiers);
00388 acl->reply_to->fipa_agent_identifiers = tmp;
00389 return 0;
00390 }
00391
00392 EXPORTMC int MC_AclSetContent(
00393 fipa_acl_message_t* acl,
00394 const char* content )
00395 {
00396 if (acl->content != NULL) {
00397
00398 fipa_string_Destroy(acl->content);
00399 }
00400 acl->content = fipa_string_New();
00401 acl->content->content = strdup(content);
00402
00403 return 0;
00404 }
00405
00406
00407
00408 EXPORTMC int
00409 MC_AddAgent(MCAgency_t attr, MCAgent_t agent)
00410 {
00411 agent->mc_platform = attr->mc_platform;
00412
00413 agent_queue_Add(attr->mc_platform->agent_queue, agent);
00414
00415 MUTEX_LOCK(attr->mc_platform->ams->runflag_lock);
00416 attr->mc_platform->ams->run = 1;
00417 COND_SIGNAL(attr->mc_platform->ams->runflag_cond);
00418 MUTEX_UNLOCK(attr->mc_platform->ams->runflag_lock);
00419 return 0;
00420 }
00421
00422 EXPORTMC int MC_AddStationaryAgent(
00423 MCAgency_t agency,
00424 void* (*agent_thread)(stationary_agent_info_t*),
00425 const char* name,
00426 void* agent_args)
00427 {
00428 #ifndef _WIN32
00429 pthread_attr_t attr;
00430 pthread_attr_init(&attr);
00431 #else
00432 int stack_size = 0;
00433 #endif
00434 stationary_agent_info_t* stationary_agent_info;
00435 stationary_agent_info = (stationary_agent_info_t*)malloc(sizeof(stationary_agent_info_t));
00436 stationary_agent_info->args = agent_args;
00437 stationary_agent_info->agent = agent_NewBinary(agency->mc_platform);
00438 stationary_agent_info->agent->name = strdup(name);
00439 stationary_agent_info->attr = agency;
00440 stationary_agent_info->agency = agency;
00441 agent_queue_Add(agency->mc_platform->agent_queue, stationary_agent_info->agent);
00442 #ifndef _WIN32
00443 THREAD_CREATE(&stationary_agent_info->thread, (void*(*)(void*))agent_thread, stationary_agent_info);
00444 #else
00445 THREAD_CREATE(&stationary_agent_info->thread, (LPTHREAD_START_ROUTINE)agent_thread, stationary_agent_info);
00446 #endif
00447 return 0;
00448 }
00449
00450 EXPORTMC int MC_AddAgentInitCallback(
00451 MCAgency_t agency,
00452 MC_AgentInitCallbackFunc_t function,
00453 void* user_data)
00454 {
00455 agency->agentInitCallback = function;
00456 agency->agentInitUserData = user_data;
00457 return 0;
00458 }
00459
00460 EXPORTMC MCAgency_t MC_AgentInfo_GetAgency(stationary_agent_info_t* stationary_agent_info)
00461 {
00462 return stationary_agent_info->agency;
00463 }
00464
00465 EXPORTMC MCAgent_t MC_AgentInfo_GetAgent(stationary_agent_info_t* stationary_agent_info)
00466 {
00467 return stationary_agent_info->agent;
00468 }
00469
00470 EXPORTMC void* MC_AgentInfo_GetAgentArgs(stationary_agent_info_t* stationary_agent_info)
00471 {
00472 return stationary_agent_info->args;
00473 }
00474
00475 EXPORTMC int MC_AgentAddTask(
00476 MCAgent_t agent,
00477 const char* code,
00478 const char* return_var_name,
00479 const char* server,
00480 int persistent)
00481 {
00482 int new_num_tasks;
00483 int num_code_ids;
00484 int i, j;
00485 agent->datastate->number_of_tasks++;
00486 new_num_tasks = agent->datastate->number_of_tasks;
00487
00488
00489
00490 for(num_code_ids = 0;
00491 agent->datastate->agent_code_ids[num_code_ids] != NULL;
00492 num_code_ids++);
00493
00494 agent->datastate->agent_code_ids = (char**)realloc(
00495 agent->datastate->agent_code_ids,
00496 sizeof(char*)*(num_code_ids + 2));
00497 agent->datastate->agent_code_ids[num_code_ids] = NULL;
00498 agent->datastate->agent_code_ids[num_code_ids+1] = NULL;
00499 if(agent->datastate->agent_code_ids == NULL) {
00500 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
00501 }
00502
00503
00504
00505 for(i = 0; agent->datastate->agent_code_ids[i] != NULL; i++) {
00506 if(strlen(agent->datastate->agent_code_ids[i]) == 0) {
00507 free(agent->datastate->agent_code_ids[i]);
00508 agent->datastate->agent_code_ids[i] = (char*)malloc(sizeof(char)*20);
00509 sprintf(agent->datastate->agent_code_ids[i], "code%d", rand());
00510 for(j = 0; j < agent->datastate->number_of_tasks-1; j++) {
00511 if (agent->datastate->tasks[j]->code_id == NULL) {
00512 agent->datastate->tasks[j]->code_id = strdup(agent->datastate->agent_code_ids[i]);
00513 }
00514 }
00515 break;
00516 }
00517 }
00518
00519
00520 agent->datastate->agent_code_ids[num_code_ids] = (char*)malloc(sizeof(char)*20);
00521 sprintf(agent->datastate->agent_code_ids[num_code_ids], "code%d", rand());
00522
00523
00524 agent->datastate->agent_codes = (char**)realloc(
00525 agent->datastate->agent_codes,
00526 sizeof(char*)*(num_code_ids + 2));
00527 agent->datastate->agent_codes[num_code_ids] = NULL;
00528 agent->datastate->agent_codes[num_code_ids+1] = NULL;
00529 agent->datastate->agent_codes[num_code_ids] = strdup(code);
00530
00531
00532 agent->datastate->tasks = (agent_task_t**)realloc(
00533 agent->datastate->tasks,
00534 sizeof(agent_task_t*) * new_num_tasks );
00535 agent->datastate->tasks[new_num_tasks-1] = agent_task_New();
00536 if(return_var_name == NULL) {
00537 agent->datastate->tasks[new_num_tasks-1]->var_name = strdup("no-return");
00538 } else {
00539 agent->datastate->tasks[new_num_tasks-1]->var_name = strdup(return_var_name);
00540 }
00541 agent->datastate->tasks[new_num_tasks-1]->server_name = strdup(server);
00542 agent->datastate->tasks[new_num_tasks-1]->persistent = persistent;
00543 agent->datastate->tasks[new_num_tasks-1]->code_id =
00544 strdup(agent->datastate->agent_code_ids[num_code_ids]);
00545 return 0;
00546 }
00547
00548 EXPORTMC int MC_AgentAddTaskFromFile(
00549 MCAgent_t agent,
00550 const char* filename,
00551 const char* return_var_name,
00552 const char* server,
00553 int persistent)
00554 {
00555 struct stat buffer;
00556 char *code;
00557 int codesize;
00558 FILE* fptr;
00559 int return_val;
00560 size_t len;
00561 if(stat(filename, &buffer)) {
00562
00563 fprintf(stderr, "MC_AgentAddTaskFromFile failed. File %s does not exist.\n",
00564 filename);
00565 return -1;
00566 }
00567 codesize = buffer.st_size;
00568 code = (char *)malloc((codesize+1)*sizeof(char));
00569 memset(code, 0, codesize+1);
00570 fptr = fopen(filename, "r");
00571 len = fread(code, sizeof(char), codesize, fptr);
00572 fclose(fptr);
00573 if(len <= 0) {return -1;}
00574 return_val = MC_AgentAddTask(
00575 agent,
00576 code,
00577 return_var_name,
00578 server,
00579 persistent );
00580 free(code);
00581 return return_val;
00582 }
00583
00584 EXPORTMC int MC_AgentAttachFile(
00585 MCAgent_t agent,
00586 const char* name,
00587 const char* filepath)
00588 {
00589 int cur_task;
00590 agent_file_data_t* afd;
00591 afd = agent_file_data_InitializeFromFilename(filepath);
00592 if(afd == NULL) {
00593 return -1;
00594 }
00595 free(afd->name);
00596 afd->name = strdup(name);
00597 cur_task = agent->datastate->task_progress;
00598 agent_file_list_Add(
00599 agent->datastate->tasks[cur_task]->agent_file_list,
00600 afd );
00601 return 0;
00602 }
00603
00604 EXPORTMC int MC_AgentListFiles(
00605 MCAgent_t agent,
00606 int task_num,
00607 char*** names ,
00608 int* num_files )
00609 {
00610 int size;
00611 int i;
00612 agent_file_data_t* afd;
00613 if(task_num >= agent->datastate->number_of_tasks) {
00614 return -1;
00615 }
00616 size = agent_file_list_GetSize(
00617 agent->datastate->tasks[task_num]->agent_file_list );
00618 *num_files = size;
00619 *names = (char**)malloc(sizeof(char*)*(size+1));
00620 for( i = 0; i < size; i++) {
00621 afd = agent_file_list_SearchIndex(
00622 agent->datastate->tasks[task_num]->agent_file_list,
00623 i);
00624 if(afd == NULL) { return -1; }
00625 (*names)[i] = strdup(afd->name);
00626 }
00627 names[i] = NULL;
00628 return 0;
00629 }
00630
00631 EXPORTMC int MC_AgentRetrieveFile(
00632 MCAgent_t agent,
00633 int task_num,
00634 const char* name,
00635 const char* save_path)
00636 {
00637 FILE *fp;
00638 agent_file_data_t* agent_file_data;
00639 base64_decodestate decode_state;
00640 void* file_data;
00641 int size;
00642
00643 if (task_num >= agent->datastate->number_of_tasks) {
00644 return -2;
00645 }
00646
00647 agent_file_data = agent_file_list_Search(
00648 agent->datastate->tasks[task_num]->agent_file_list,
00649 name);
00650 if(agent_file_data == NULL) {
00651 return -3;
00652 }
00653
00654
00655 fp = fopen(save_path, "wb");
00656 if (fp == NULL) {
00657 return -1;
00658 }
00659
00660
00661 base64_init_decodestate(&decode_state);
00662 file_data = malloc(strlen(agent_file_data->data));
00663 memset(file_data, 0, strlen(agent_file_data->data));
00664 size = base64_decode_block(
00665 agent_file_data->data,
00666 strlen(agent_file_data->data),
00667 (char*)file_data,
00668 &decode_state);
00669 fwrite(file_data, size, 1, fp);
00670 fclose(fp);
00671 return 0;
00672 }
00673
00674 EXPORTMC int MC_AgentReturnArrayExtent(
00675 MCAgent_t agent,
00676 int task_num,
00677 int index )
00678 {
00679 if (task_num >= agent->datastate->number_of_tasks) {
00680 return -1;
00681 }
00682
00683 if (
00684 agent->datastate->tasks[task_num]->
00685 agent_return_data->data_type == -1
00686 )
00687 {
00688 return -1;
00689 }
00690
00691 if (index >= agent->datastate->tasks[task_num]->agent_return_data->array_dim) {
00692 return -1;
00693 }
00694
00695 return agent->datastate->tasks[task_num]->agent_return_data->array_extent[index];
00696 }
00697
00698 EXPORTMC int MC_AgentReturnArrayDim(
00699 MCAgent_t agent,
00700 int task_num )
00701 {
00702 if (task_num >= agent->datastate->number_of_tasks) {
00703 return -1;
00704 }
00705
00706 if (
00707 agent->datastate->tasks[task_num]->
00708 agent_return_data->data_type == -1
00709 )
00710 {
00711 return -1;
00712 }
00713 return agent->datastate->tasks[task_num]->agent_return_data->array_dim;
00714 }
00715
00716 EXPORTMC int MC_AgentReturnArrayNum(
00717 MCAgent_t agent,
00718 int task_num )
00719 {
00720 int num_elements, i;
00721 if (task_num >= agent->datastate->number_of_tasks) {
00722 return -1;
00723 }
00724
00725 if (
00726 agent->datastate->tasks[task_num]->
00727 agent_return_data->data_type == -1
00728 )
00729 {
00730 return -1;
00731 }
00732
00733 num_elements = 1;
00734 for (
00735 i = 0;
00736 i < agent->datastate->tasks[task_num]->agent_return_data->array_dim;
00737 i++
00738 )
00739 {
00740 num_elements *= agent->datastate->
00741 tasks[task_num]->agent_return_data->array_extent[i];
00742 }
00743 return num_elements;
00744 }
00745
00746 EXPORTMC const void* MC_AgentReturnDataGetSymbolAddr(
00747 MCAgent_t agent,
00748 int task_num )
00749 {
00750 if (task_num >= agent->datastate->number_of_tasks) {
00751 return NULL;
00752 }
00753 if (
00754 agent->datastate->tasks[task_num]->
00755 agent_return_data->data_type == -1
00756 )
00757 {
00758 return NULL;
00759 }
00760 return agent->datastate->tasks[task_num]->agent_return_data->data;
00761 }
00762
00763 EXPORTMC size_t MC_AgentReturnDataSize(
00764 MCAgent_t agent,
00765 int task_num )
00766 {
00767 int size;
00768 if (task_num >= agent->datastate->number_of_tasks) {
00769 return -1;
00770 }
00771
00772 if (
00773 agent->datastate->tasks[task_num]->
00774 agent_return_data->data_type == -1
00775 )
00776 {
00777 return -1;
00778 }
00779
00780 CH_DATATYPE_SIZE(
00781 agent->datastate->tasks[task_num]->agent_return_data->data_type,
00782 size);
00783 return size;
00784 }
00785
00786 EXPORTMC int MC_AgentReturnDataType(
00787 MCAgent_t agent,
00788 int task_num )
00789 {
00790 if (task_num >= agent->datastate->number_of_tasks) {
00791 return -1;
00792 }
00793 return agent->datastate->tasks[task_num]->agent_return_data->data_type;
00794 }
00795
00796 EXPORTMC int MC_AgentReturnIsArray(
00797 MCAgent_t agent,
00798 int task_num )
00799 {
00800 if (task_num >= agent->datastate->number_of_tasks) {
00801 return -1;
00802 }
00803 if (
00804 agent->datastate->tasks[task_num]->
00805 agent_return_data->data_type == -1
00806 )
00807 {
00808 return -1;
00809 }
00810 if(agent->datastate->tasks[task_num]->agent_return_data->array_dim) {
00811 return 1;
00812 } else {
00813 return 0;
00814 }
00815 }
00816
00817 EXPORTMC const void* MC_AgentVariableRetrieve(MCAgent_t agent, const char* var_name, int task_num)
00818 {
00819 interpreter_variable_data_t* interp_var;
00820
00821 if (task_num > agent->datastate->task_progress) {
00822 return NULL;
00823 }
00824
00825 interp_var = agent_variable_list_Search(
00826 agent->datastate->tasks[task_num]->agent_variable_list,
00827 var_name );
00828 if (interp_var == NULL) {
00829 return NULL;
00830 }
00831
00832 return interp_var->data;
00833 }
00834
00835 EXPORTMC int MC_AgentVariableRetrieveInfo(MCAgent_t agent, const char* var_name, int task_num, const void** data, int* dim, const int** extent)
00836 {
00837 interpreter_variable_data_t* interp_var;
00838
00839 if (task_num >= agent->datastate->task_progress) {
00840 return MC_ERR_NOT_FOUND;
00841 }
00842
00843 interp_var = agent_variable_list_Search(
00844 agent->datastate->tasks[task_num]->agent_variable_list,
00845 var_name );
00846 if (interp_var == NULL) {
00847 return MC_ERR_NOT_FOUND;
00848 }
00849 *data = interp_var->data;
00850 *dim = interp_var->array_dim;
00851 *extent = interp_var->array_extent;
00852
00853 return MC_SUCCESS;
00854 }
00855
00856 EXPORTMC int MC_AgentVariableSave(MCAgent_t agent, const char* var_name)
00857 {
00858 int current_task = agent->datastate->task_progress;
00859 const int default_num_vars = 50;
00860 agent_task_p task = agent->datastate->tasks[current_task];
00861
00862 if(task->num_saved_variables == 0) {
00863 task->saved_variables = (char**)malloc(sizeof(char*)*default_num_vars);
00864 memset(task->saved_variables, 0, sizeof(char*)*default_num_vars);
00865 }
00866 task->saved_variables[task->num_saved_variables] = strdup(var_name);
00867 if(task->saved_variables[task->num_saved_variables] == NULL) {
00868 fprintf(stderr, "Memory error. %s:%d\n", __FILE__, __LINE__);
00869 return MC_ERR_MEMORY;
00870 }
00871 task->num_saved_variables++;
00872
00873 return 0;
00874 }
00875
00876 EXPORTMC int
00877 MC_Barrier(MCAgency_t attr, int id)
00878 {
00879 barrier_queue_p list = attr->mc_platform->barrier_queue;
00880 barrier_node_p node;
00881 node = barrier_queue_Get(list, id);
00882 if(node == NULL) {
00883 return MC_ERR_NOT_FOUND;
00884 }
00885
00886 MUTEX_LOCK(node->lock);
00887 node->num_waiting++;
00888 if (node->num_waiting >= node->num_registered) {
00889
00890 COND_BROADCAST(node->cond);
00891 MUTEX_UNLOCK(node->lock);
00892 return MC_SUCCESS;
00893 } else {
00894 while (node->num_waiting < node->num_registered) {
00895 COND_WAIT(node->cond, node->lock);
00896 }
00897 MUTEX_UNLOCK(node->lock);
00898 }
00899 return MC_SUCCESS;
00900 }
00901
00902 EXPORTMC int
00903 MC_BarrierInit(MCAgency_t attr, int id, int num_procs)
00904 {
00905 barrier_node_p node;
00906
00907 node = barrier_queue_Get(attr->mc_platform->barrier_queue, id);
00908 if (node != NULL) {
00909 return MC_ERR;
00910 }
00911 node = barrier_node_Initialize(id, num_procs);
00912 barrier_queue_Add(attr->mc_platform->barrier_queue, node);
00913 return MC_SUCCESS;
00914 }
00915
00916 EXPORTMC int
00917 MC_BarrierDelete(MCAgency_t attr, int id)
00918 {
00919 return barrier_queue_Delete(id, attr->mc_platform->barrier_queue);
00920 }
00921
00922 EXPORTMC int
00923 MC_CallAgentFunc(
00924 MCAgent_t agent,
00925 const char* funcName,
00926 void* returnVal,
00927 int numArgs,
00928 ...)
00929 {
00930 int return_code;
00931 va_list vl;
00932 va_start(vl, numArgs);
00933 MUTEX_LOCK(agent->run_lock);
00934 return_code = Ch_CallFuncByNamev(
00935 *agent->agent_interp,
00936 funcName,
00937 returnVal,
00938 vl );
00939 MUTEX_UNLOCK(agent->run_lock);
00940 return return_code;
00941 }
00942
00943 EXPORTMC int
00944 MC_CallAgentFuncArg(
00945 MCAgent_t agent,
00946 const char* funcName,
00947 void* returnVal,
00948 void* arg)
00949 {
00950 int return_code;
00951
00952 MUTEX_LOCK(agent->run_lock);
00953 return_code = Ch_CallFuncByName(
00954 agent->agent_interp,
00955 funcName,
00956 returnVal,
00957 arg);
00958 MUTEX_UNLOCK(agent->run_lock);
00959 return return_code;
00960 }
00961
00962 EXPORTMC int
00963 MC_CallAgentFuncV(
00964 MCAgent_t agent,
00965 const char* funcName,
00966 void* returnVal,
00967 va_list ap)
00968 {
00969 int return_code;
00970 MUTEX_LOCK(agent->run_lock);
00971 return_code = Ch_CallFuncByNamev
00972 (
00973 agent->agent_interp,
00974 funcName,
00975 returnVal,
00976 ap
00977 );
00978 MUTEX_UNLOCK(agent->run_lock);
00979 return return_code;
00980 }
00981
00982 EXPORTMC int
00983 MC_CallAgentFuncVar(
00984 MCAgent_t agent,
00985 const char* funcName,
00986 void* returnVal,
00987 ChVaList_t varg)
00988 {
00989 int return_code;
00990 MUTEX_LOCK(agent->run_lock);
00991 return_code = Ch_CallFuncByNameVar
00992 (
00993 *agent->agent_interp,
00994 funcName,
00995 returnVal,
00996 varg
00997 );
00998 MUTEX_UNLOCK(agent->run_lock);
00999 return return_code;
01000 }
01001
01002 #ifdef OBS
01003 EXPORTMC int
01004 MC_ChInitializeOptions(MCAgency_t attr, ChOptions_t *options) {
01005 if(attr->mc_platform == NULL) {
01006 fprintf(stderr, "MC_ChInitializeOptions must be called after MC_Start()\n");
01007 fprintf(stderr, "Using default interpretor options...\n");
01008 return 1;
01009 }
01010 else {
01011 if (attr->mc_platform->interp_options == NULL) {
01012 attr->mc_platform->interp_options = (ChOptions_t*)malloc(
01013 sizeof(ChOptions_t) );
01014 }
01015 *attr->mc_platform->interp_options = *options;
01016 attr->mc_platform->interp_options->chhome = strdup(options->chhome);
01017 return 0;
01018 }
01019 }
01020 #endif
01021
01022 EXPORTMC MCAgent_t
01023 MC_ComposeAgent(
01024 const char* name,
01025 const char* home,
01026 const char* owner,
01027 const char* code,
01028 const char* return_var_name,
01029 const char* server,
01030 int persistent
01031 )
01032 {
01033 return MC_ComposeAgentWithWorkgroup(
01034 name,
01035 home,
01036 owner,
01037 code,
01038 return_var_name,
01039 server,
01040 persistent,
01041 NULL
01042 );
01043 }
01044
01045 EXPORTMC MCAgent_t
01046 MC_ComposeAgentS(
01047 const char* name,
01048 const char* home,
01049 const char* owner,
01050 const char* code,
01051 const char* return_var_name,
01052 const char* server,
01053 int persistent,
01054 const char* workgroup_code
01055 )
01056 {
01057 printf("\nThe MC_ComposeAgentS function is now deprecated due to its\n\
01058 misleading name. Please use the MC_ComposeAgentWithWorkgroup() function\n\
01059 instead.\n");
01060 return MC_ComposeAgentWithWorkgroup(
01061 name,
01062 home,
01063 owner,
01064 code,
01065 return_var_name,
01066 server,
01067 persistent,
01068 workgroup_code );
01069 }
01070
01071 EXPORTMC MCAgent_t
01072 MC_ComposeAgentWithWorkgroup(
01073 const char* name,
01074 const char* home,
01075 const char* owner,
01076 const char* code,
01077 const char* return_var_name,
01078 const char* server,
01079 int persistent,
01080 const char* workgroup_code
01081 )
01082 {
01083 agent_p agent;
01084 agent = agent_New();
01085 if (agent == NULL) return NULL;
01086 agent->name = strdup(name);
01087 agent->home = strdup(home);
01088 agent->owner = strdup(owner);
01089
01090 agent->orphan = 1;
01091
01092 agent->agent_type = MC_LOCAL_AGENT;
01093 agent->agent_status = MC_WAIT_MESSGSEND;
01094
01095 agent->datastate = agent_datastate_New();
01096 agent->datastate->number_of_tasks = 1;
01097 agent->datastate->agent_code_ids = (char**)malloc(
01098 sizeof(char*)*2);
01099 if(agent->datastate->agent_code_ids == NULL) {
01100 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01101 }
01102 agent->datastate->agent_code_ids[0] = strdup("");
01103 if(agent->datastate->agent_code_ids[0] == NULL) {
01104 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01105 }
01106 agent->datastate->agent_code_ids[1] = NULL;
01107
01108 agent->datastate->agent_codes = (char**)malloc(
01109 sizeof(char*)*2);
01110 if(agent->datastate->agent_codes == NULL) {
01111 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01112 }
01113 agent->datastate->agent_codes[0] = strdup(code);
01114 if(agent->datastate->agent_codes[0] == NULL) {
01115 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01116 }
01117 agent->datastate->agent_codes[1] = NULL;
01118
01119 agent->datastate->agent_code = agent->datastate->agent_codes[0];
01120
01121 agent->datastate->tasks = (agent_task_t**)malloc(
01122 sizeof(agent_task_t*));
01123 agent->datastate->tasks[0] = agent_task_New();
01124 if(return_var_name == NULL) {
01125 agent->datastate->tasks[0]->var_name = strdup("no-return");
01126 } else {
01127 agent->datastate->tasks[0]->var_name = strdup(return_var_name);
01128 }
01129 if(agent->datastate->tasks[0]->var_name == NULL) {
01130 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01131 }
01132
01133 agent->datastate->tasks[0]->server_name = strdup(server);
01134 if(agent->datastate->tasks[0]->server_name == NULL) {
01135 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01136 }
01137
01138 if(workgroup_code != NULL) {
01139 agent->wg_code = strdup(workgroup_code);
01140 if (agent->wg_code == NULL) {
01141 fprintf(stderr, "Memory Error %s:%d\n", __FILE__, __LINE__);
01142 }
01143 }
01144 agent->datastate->tasks[0]->persistent = persistent;
01145
01146 return agent;
01147 }
01148
01149 EXPORTMC MCAgent_t MC_ComposeAgentFromFile(
01150 const char* name,
01151 const char* home,
01152 const char* owner,
01153 const char* filename,
01154 const char* return_var_name,
01155 const char* server,
01156 int persistent
01157 )
01158 {
01159 return MC_ComposeAgentFromFileWithWorkgroup(
01160 name,
01161 home,
01162 owner,
01163 filename,
01164 return_var_name,
01165 server,
01166 persistent,
01167 NULL
01168 );
01169 }
01170
01171 EXPORTMC MCAgent_t MC_ComposeAgentFromFileS(
01172 const char* name,
01173 const char* home,
01174 const char* owner,
01175 const char* filename,
01176 const char* return_var_name,
01177 const char* server,
01178 int persistent,
01179 const char* workgroup_code
01180 )
01181 {
01182 printf("\nThe MC_ComposeAgentFromFileS() function is deprecated due to \n\
01183 its misleading name. Please use the MC_ComposeAgentFromFileWithWorkgroup\n\
01184 function instead.\n");
01185 return MC_ComposeAgentFromFileWithWorkgroup(
01186 name,
01187 home,
01188 owner,
01189 filename,
01190 return_var_name,
01191 server,
01192 persistent,
01193 workgroup_code);
01194 }
01195
01196 EXPORTMC MCAgent_t MC_ComposeAgentFromFileWithWorkgroup(
01197 const char* name,
01198 const char* home,
01199 const char* owner,
01200 const char* filename,
01201 const char* return_var_name,
01202 const char* server,
01203 int persistent,
01204 const char* workgroup_code
01205 )
01206 {
01207 MCAgent_t agent;
01208 struct stat buffer;
01209 char *code;
01210 int codesize;
01211 FILE* fptr;
01212 size_t len;
01213
01214 if(stat(filename, &buffer)) {
01215
01216 return NULL;
01217 }
01218 codesize = buffer.st_size;
01219 code = (char *)malloc((codesize+1)*sizeof(char));
01220 memset(code, 0, codesize+1);
01221 fptr = fopen(filename, "r");
01222 len = fread(code, sizeof(char), codesize, fptr);
01223 fclose(fptr);
01224 if(len <= 0) {return NULL;}
01225
01226 agent = MC_ComposeAgentWithWorkgroup(
01227 name,
01228 home,
01229 owner,
01230 code,
01231 return_var_name,
01232 server,
01233 persistent,
01234 workgroup_code
01235 );
01236 free(code);
01237
01238 return agent;
01239 }
01240
01241 EXPORTMC int
01242 MC_CondBroadcast(MCAgency_t attr, int id)
01243 {
01244 syncListNode_t *condnode;
01245 condnode = syncListFind(id, attr->mc_platform->syncList);
01246 if (condnode == NULL) {
01247 return MC_ERR_NOT_FOUND;
01248 }
01249 MUTEX_LOCK(condnode->lock);
01250 condnode->signalled=1;
01251 COND_BROADCAST(condnode->cond);
01252 MUTEX_UNLOCK(condnode->lock);
01253 return 0;
01254 }
01255
01256 EXPORTMC int
01257 MC_CondSignal(MCAgency_t attr, int id)
01258 {
01259 syncListNode_t *condnode;
01260 condnode = syncListFind(id, attr->mc_platform->syncList);
01261 if (condnode == NULL) {
01262 return MC_ERR_NOT_FOUND;
01263 }
01264 MUTEX_LOCK(condnode->lock);
01265 condnode->signalled=1;
01266 COND_SIGNAL(condnode->cond);
01267 MUTEX_UNLOCK(condnode->lock);
01268 return 0;
01269 }
01270
01271 EXPORTMC int
01272 MC_CondWait(MCAgency_t attr, int id)
01273 {
01274 syncListNode_t *condnode;
01275 condnode = syncListFind(id, attr->mc_platform->syncList);
01276 if (condnode == NULL) {
01277 return MC_ERR_NOT_FOUND;
01278 }
01279 MUTEX_LOCK(condnode->lock);
01280 if (condnode->signalled) {
01281 MUTEX_UNLOCK(condnode->lock);
01282 return 1;
01283 }
01284
01285 while (condnode->signalled == 0) {
01286 COND_WAIT(condnode->cond, condnode->lock);
01287 }
01288 MUTEX_UNLOCK(condnode->lock);
01289
01290 return 0;
01291 }
01292
01293 EXPORTMC int
01294 MC_CondReset(MCAgency_t attr, int id)
01295 {
01296 syncListNode_t *condnode;
01297 condnode = syncListFind(id, attr->mc_platform->syncList);
01298 if (condnode == NULL) {
01299 return MC_ERR_NOT_FOUND;
01300 }
01301 MUTEX_LOCK(condnode->lock);
01302 if (condnode->signalled) {
01303 condnode->signalled = 0;
01304 MUTEX_UNLOCK(condnode->lock);
01305 return 0;
01306 }
01307 MUTEX_UNLOCK(condnode->lock);
01308 return 1;
01309 }
01310
01311 EXPORTMC int
01312 MC_CopyAgent(MCAgent_t* agent_out, const MCAgent_t agent_in)
01313 {
01314 *agent_out = agent_Copy(agent_in);
01315 return MC_SUCCESS;
01316 }
01317
01318 EXPORTMC int
01319 MC_DeleteAgent(MCAgent_t agent)
01320 {
01321
01322 CHECK_NULL(agent, return MC_ERR_INVALID;);
01323
01324
01325 if ( agent->wg_code != NULL ) {
01326 return MC_ERR_INVALID_ARGS;
01327 }
01328
01329
01330 MC_TerminateAgent(agent);
01331
01332
01333 agent->agent_status = MC_WAIT_FINISHED;
01334
01335 if(agent->mc_platform) {
01336 MUTEX_LOCK( agent->mc_platform->MC_signal_lock);
01337 MUTEX_UNLOCK( agent->mc_platform->MC_signal_lock );
01338 MUTEX_LOCK(agent->mc_platform->ams->runflag_lock);
01339 agent->mc_platform->ams->run = 1;
01340 COND_SIGNAL(agent->mc_platform->ams->runflag_cond);
01341 MUTEX_UNLOCK(agent->mc_platform->ams->runflag_lock);
01342 }
01343
01344 return MC_SUCCESS;
01345 }
01346
01347 EXPORTMC int
01348 MC_DeleteAgentWG(MCAgent_t calling_agent, MCAgent_t agent)
01349 {
01350
01351 CHECK_NULL(agent, return MC_ERR_INVALID;);
01352
01353
01354 if (agent->wg_code != NULL) {
01355 if (calling_agent->wg_code == NULL) {
01356 return MC_ERR_INVALID_ARGS;
01357 } else if (strcmp(calling_agent->wg_code, agent->wg_code)) {
01358 return MC_ERR_INVALID_ARGS;
01359 }
01360 }
01361
01362
01363 MC_TerminateAgentWG(calling_agent, agent);
01364
01365
01366 agent->agent_status = MC_WAIT_FINISHED;
01367
01368 if(agent->mc_platform) {
01369 MUTEX_LOCK( agent->mc_platform->MC_signal_lock);
01370 MUTEX_UNLOCK( agent->mc_platform->MC_signal_lock );
01371 MUTEX_LOCK(agent->mc_platform->ams->runflag_lock);
01372 agent->mc_platform->ams->run = 1;
01373 COND_SIGNAL(agent->mc_platform->ams->runflag_cond);
01374 MUTEX_UNLOCK(agent->mc_platform->ams->runflag_lock);
01375 }
01376
01377 return MC_SUCCESS;
01378 }
01379
01380 EXPORTMC int MC_DestroyServiceSearchResult(
01381 char** agentName,
01382 char** serviceName,
01383 int* agentID,
01384 int numResult)
01385 {
01386 int i;
01387 for(i = 0;i < numResult; i++)
01388 {
01389 free(agentName[i]);
01390 free(serviceName[i]);
01391 }
01392 free(agentName);
01393 free(serviceName);
01394 free(agentID);
01395
01396 return 0;
01397 }
01398
01399 EXPORTMC int
01400 MC_DeregisterService(
01401 MCAgency_t agency,
01402 int agentID,
01403 const char *serviceName)
01404 {
01405 int err_code;
01406
01407 df_request_list_node_t *req_node;
01408 df_deregister_p deregister_data;
01409
01410 req_node = df_request_list_node_New();
01411 req_node->command = (char*)malloc(sizeof(char)*11);
01412
01413 strcpy((char*)req_node->command, "deregister");
01414
01415 deregister_data = (df_deregister_p)malloc(sizeof(df_deregister_t));
01416 deregister_data->agent_id = agentID;
01417 deregister_data->service_name = (char*)serviceName;
01418
01419 req_node->data = deregister_data;
01420
01421 err_code = df_AddRequest(
01422 agency->mc_platform->df,
01423 req_node
01424 );
01425 return err_code;
01426 }
01427
01428 EXPORTMC int
01429 MC_End(MCAgency_t agency)
01430 {
01431 #ifndef _WIN32
01432 int skt;
01433 struct addrinfo hints, *res;
01434 char buf[20];
01435 #else
01436 SOCKET skt;
01437 SOCKADDR_IN sktin;
01438 struct hostent host;
01439 struct hostent* host_result;
01440 #endif
01441
01442
01443
01444
01445
01446 MUTEX_LOCK(agency->mc_platform->quit_lock);
01447 agency->mc_platform->quit = 1;
01448 COND_BROADCAST( agency->mc_platform->quit_cond );
01449 MUTEX_UNLOCK(agency->mc_platform->quit_lock);
01450
01451
01452 #ifndef _WIN32
01453 memset(&hints, 0, sizeof(hints));
01454 hints.ai_family = AF_UNSPEC;
01455 hints.ai_socktype = SOCK_STREAM;
01456 sprintf(buf, "%d", agency->portno);
01457 getaddrinfo("localhost", buf, &hints, &res);
01458 skt = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
01459 connect(skt, res->ai_addr, res->ai_addrlen);
01460 send(skt, "\0", 1, 0);
01461 close(skt);
01462 freeaddrinfo(res);
01463
01464 sleep(1);
01465 #else
01466 sktin.sin_family = PF_INET;
01467 sktin.sin_port = htons(agency->portno);
01468 host_result = gethostbyname("localhost");
01469 host = *host_result;
01470 memcpy(&sktin.sin_addr, host.h_addr, host.h_length);
01471 sktin.sin_addr.s_addr = inet_addr("localhost");
01472 connect(skt, (struct sockaddr *) &sktin, sizeof(sktin));
01473 send(skt, "\0", 1, 0);
01474 closesocket(skt);
01475
01476 Sleep(1000);
01477 #endif
01478
01479
01480 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) {
01481 THREAD_CANCEL( agency->mc_platform->acc->listen_thread );
01482 }
01483
01484
01485 MUTEX_LOCK(agency->mc_platform->connection_queue->lock);
01486 COND_SIGNAL(agency->mc_platform->connection_queue->cond);
01487 MUTEX_UNLOCK(agency->mc_platform->connection_queue->lock);
01488 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) {
01489 THREAD_JOIN(agency->mc_platform->acc->thread);
01490 }
01491
01492
01493 MUTEX_LOCK(agency->mc_platform->ams->runflag_lock);
01494 COND_SIGNAL(agency->mc_platform->ams->runflag_cond);
01495 MUTEX_UNLOCK(agency->mc_platform->ams->runflag_lock);
01496 if( GET_THREAD_MODE( agency->threads, MC_THREAD_AMS)) {
01497 THREAD_JOIN(agency->mc_platform->ams->thread);
01498 }
01499
01500
01501 MUTEX_LOCK(agency->mc_platform->message_queue->lock);
01502 COND_SIGNAL(agency->mc_platform->message_queue->cond);
01503 MUTEX_UNLOCK(agency->mc_platform->message_queue->lock);
01504 if( GET_THREAD_MODE( agency->threads, MC_THREAD_ACC)) {
01505 THREAD_JOIN(agency->mc_platform->acc->message_handler_thread);
01506 }
01507
01508
01509 MUTEX_LOCK(agency->mc_platform->df->request_list->lock);
01510 COND_SIGNAL(agency->mc_platform->df->request_list->cond);
01511 MUTEX_UNLOCK(agency->mc_platform->df->request_list->lock);
01512 if( GET_THREAD_MODE( agency->threads, MC_THREAD_DF)) {
01513 THREAD_JOIN(agency->mc_platform->df->thread);
01514 }
01515
01516
01517 if( GET_THREAD_MODE( agency->threads, MC_THREAD_CP)) {
01518 THREAD_CANCEL( agency->mc_platform->cmd_prompt->thread );
01519 }
01520
01521 mc_platform_Destroy(agency->mc_platform);
01522
01523 if (agency->hostName)
01524 free(agency->hostName);
01525 free(agency);
01526
01527 return 0;
01528 }
01529
01530 EXPORTMC MCAgent_t
01531 MC_FindAgentByName( MCAgency_t attr,
01532 const char *name)
01533 {
01534 extern mc_platform_p g_mc_platform;
01535 if (attr == NULL) {
01536 return agent_queue_SearchName(g_mc_platform->agent_queue, name);
01537 } else {
01538 return agent_queue_SearchName(attr->mc_platform->agent_queue,
01539 name);
01540 }
01541 }
01542
01543 EXPORTMC MCAgent_t
01544 MC_FindAgentByID( MCAgency_t attr,
01545 int ID)
01546 {
01547 extern mc_platform_p g_mc_platform;
01548 if (attr == NULL) {
01549 return agent_queue_Search(g_mc_platform->agent_queue, ID);
01550 } else {
01551 return agent_queue_Search(attr->mc_platform->agent_queue,
01552 ID);
01553 }
01554 }
01555
01556 EXPORTMC
01557 #ifndef _WIN32
01558 time_t
01559 #else
01560 SYSTEMTIME
01561 #endif
01562 MC_GetAgentArrivalTime(MCAgent_t agent)
01563 {
01564 if (agent != NULL) {
01565 return agent->arrival_time;
01566 } else {
01567 #ifndef _WIN32
01568 return (time_t)-1;
01569 #else
01570 SYSTEMTIME oy;
01571 return oy;
01572 #endif
01573 }
01574 }
01575
01576 EXPORTMC int
01577 MC_GetAgentStatus(MCAgent_t agent)
01578 {
01579 int status;
01580 MUTEX_LOCK(agent->lock);
01581 MUTEX_LOCK(agent->agent_status_lock);
01582 status = agent->agent_status;
01583 MUTEX_UNLOCK(agent->agent_status_lock);
01584 MUTEX_UNLOCK(agent->lock);
01585 return status;
01586 }
01587
01588 EXPORTMC char*
01589 MC_GetAgentXMLString(MCAgent_t agent)
01590 {
01591 char *ret;
01592 ret = mxmlSaveAllocString(
01593 agent->datastate->xml_agent_root,
01594 NULL
01595 );
01596 return ret;
01597 }
01598
01599
01600 EXPORTMC void*
01601 MC_GetAgentExecEngine(MCAgent_t agent)
01602 {
01603 return agent->agent_interp;
01604 }
01605
01606 EXPORTMC int
01607 MC_GetAgentID(
01608 MCAgent_t agent
01609 )
01610 {
01611 return agent->id;
01612 }
01613
01614 EXPORTMC char*
01615 MC_GetAgentName(
01616 MCAgent_t agent
01617 )
01618 {
01619 char *name;
01620 MUTEX_LOCK(agent->lock);
01621 name = (char*)malloc(sizeof(char) *
01622 (strlen (agent->name) + 1)
01623 );
01624 strcpy(
01625 name,
01626 agent->name
01627 );
01628 MUTEX_UNLOCK(agent->lock);
01629 return name;
01630 }
01631
01632 EXPORTMC int
01633 MC_GetAgentReturnData(
01634 MCAgent_t agent,
01635 int task_num,
01636 void **data,
01637 int *dim,
01638 int **extent)
01639 {
01640 int num_elements;
01641 int size;
01642 int i;
01643 printf("\nThe function MC_GetAgentReturnData() is deprecated.\n\
01644 Please use the MC_AgentReturn*() series of functions instead.\n");
01645 if (task_num >= agent->datastate->number_of_tasks) {
01646 *data = NULL;
01647 *dim = 0;
01648 *extent = NULL;
01649 return 1;
01650 }
01651 if (
01652 agent->datastate->tasks[task_num]->
01653 agent_return_data->data_type == -1
01654 )
01655 {
01656 return 1;
01657 }
01658 CH_DATATYPE_SIZE(
01659 agent->datastate->tasks[task_num]->agent_return_data->data_type,
01660 size);
01661 num_elements = 1;
01662 for (
01663 i = 0;
01664 i < agent->datastate->tasks[task_num]->agent_return_data->array_dim;
01665 i++
01666 )
01667 {
01668 num_elements *= agent->datastate->
01669 tasks[task_num]->agent_return_data->array_extent[i];
01670 }
01671
01672
01673 *data = malloc(num_elements * size);
01674 memcpy(
01675 *data,
01676 agent->datastate->tasks[task_num]->
01677 agent_return_data->data,
01678 size * num_elements
01679 );
01680 *dim = agent->datastate->tasks[task_num]->agent_return_data->array_dim;
01681 *extent = (int*)malloc(
01682 sizeof(int) *
01683 agent->datastate->tasks[task_num]->agent_return_data->array_dim
01684 );
01685 for (i = 0; i < *dim; i++) {
01686 (*extent)[i] =
01687 agent->datastate->tasks[task_num]->agent_return_data->array_extent[i];
01688 }
01689
01690
01691
01692
01693
01694 return 0;
01695 }
01696
01697 EXPORTMC int
01698 MC_GetAgentNumTasks(MCAgent_t agent)
01699 {
01700 return agent->datastate->number_of_tasks;
01701 }
01702
01703 EXPORTMC enum MC_AgentType_e
01704 MC_GetAgentType(MCAgent_t agent)
01705 {
01706 if (agent != NULL) {
01707 return agent->agent_type;
01708 } else {
01709 return (enum MC_AgentType_e)0;
01710 }
01711 }
01712
01713 EXPORTMC int
01714 MC_GetAllAgents(MCAgency_t attr, MCAgent_t **agents, int* num_agents)
01715 {
01716 int halt;
01717 int index = 0;
01718 MUTEX_LOCK(attr->mc_platform->giant_lock);
01719 halt = (attr->mc_platform->giant == 1) ? 1 : 0;
01720 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01721 if (halt)
01722 MC_HaltAgency(attr);
01723
01724 while (agent_queue_SearchIndex(attr->mc_platform->agent_queue, index) != NULL) {
01725 index++;
01726 }
01727
01728 if (index == 0) {
01729 *agents = NULL;
01730 *num_agents = 0;
01731 return -1;
01732 }
01733
01734 *agents = (MCAgent_t *)malloc(sizeof(MCAgent_t*) * index);
01735 *num_agents = index;
01736
01737 for(index = 0; index < *num_agents; index++) {
01738 (*agents)[index] = agent_queue_SearchIndex
01739 (
01740 attr->mc_platform->agent_queue,
01741 index
01742 );
01743 }
01744 if(halt)
01745 MC_ResumeAgency(attr);
01746 return 0;
01747 }
01748
01749 EXPORTMC int
01750 MC_HaltAgency(MCAgency_t attr)
01751 {
01752 MUTEX_LOCK(attr->mc_platform->giant_lock);
01753 attr->mc_platform->giant=0;
01754 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
01755 return 0;
01756 }
01757
01758 EXPORTMC MCAgency_t
01759 MC_Initialize(
01760 int port,
01761 MCAgencyOptions_t *options)
01762 {
01763 MCAgency_t ret;
01764 int i=0;
01765 int options_malloc = 0;
01766 char privkey[1210];
01767 #ifdef NEW_SECURITY
01768 char buf[5];
01769 FILE* f;
01770 #endif
01771 if(options && options->initialized != MC_INITIALIZED_CODE) {
01772 #ifdef _WIN32
01773
01774 #else
01775 #endif
01776 return NULL;
01777 }
01778
01779 memset(privkey, '\0', 1210);
01780 ret = (MCAgency_t)malloc(sizeof(struct agency_s));
01781 if (ret == NULL) {return NULL;}
01782
01783 ret->hostName = (char*)malloc(HOST_NAME_MAX);
01784 if (ret->hostName == NULL) {return NULL;}
01785 gethostname(ret->hostName, HOST_NAME_MAX);
01786
01787 ret->hostName = (char*)realloc(ret->hostName, sizeof(char)*(strlen(ret->hostName)+1));
01788 if (ret->hostName == NULL) {return NULL;}
01789 ret->portno = port;
01790 ret->server = 1;
01791 ret->client = 0;
01792 ret->default_agentstatus = -1;
01793
01794
01795 if(options==NULL) {
01796 options = (MCAgencyOptions_t*)malloc(sizeof(MCAgencyOptions_t));
01797 MC_InitializeAgencyOptions(options);
01798 options_malloc = 1;
01799 }
01800 ret->threads = options->threads;
01801 ret->default_agentstatus = options->default_agent_status;
01802 for(i = 0; i < MC_THREAD_ALL; i++) {
01803 ret->stack_size[i] = options->stack_size[i];
01804 }
01805 ret->initInterps = options->initInterps;
01806
01807
01808 ret->bluetooth = options->bluetooth;
01809 ret->mc_platform = mc_platform_Initialize(ret, options->ch_options);
01810
01811
01812 #ifdef NEW_SECURITY
01813 if (options->priv_key_filename != NULL) {
01814 ret->priv_key_filename = strdup(options->priv_key_filename);
01815 } else {
01816 ret->priv_key_filename = strdup("rsa_priv");
01817 }
01818 if (options->known_host_filename != NULL) {
01819 ret->known_host_filename = strdup(options->known_host_filename);
01820 } else {
01821 ret->known_host_filename = strdup("known_host");
01822 }
01823
01824 memset(buf,'\0', 4);
01825
01826 if( (f = fopen(ret->priv_key_filename, "r") ) == NULL) {
01827 fprintf(stderr, "rsa_priv_en file not found \n");
01828 fprintf(stderr, "Aborting... at %s:%d\n", __FILE__, __LINE__);
01829 exit(0);
01830 }
01831
01832 fread (buf, 1, 4, f);
01833
01834 if(buf[0]=='N' && buf[1] == ' ' && buf[2]=='=' && buf[3]==' '){
01835 fread(privkey, 1210, 1, f);
01836 fclose(f);
01837 }
01838 else{
01839 fclose(f);
01840
01841 if(options->passphrase[0] == '\0'){
01842 printf("Please enter the passphrase to decrypt private key ");
01843 scanf("%s", options->passphrase);
01844 }
01845
01846 if( read_encrypted_file(ret->priv_key_filename, privkey, options->passphrase) == -1){
01847 printf("Unable to read private key: passphase is wrong or file not exist\n");
01848 printf("Press any key to exit \n");
01849 getchar();
01850 exit(0);
01851 }
01852 }
01853
01854 if (privkey == NULL){
01855 printf("Note: private key is Null \n");
01856 printf("please verify the private key file or generate it again. \n");
01857 printf("Exiting Mobile-C Agency ... \n");
01858 getchar();
01859 exit(0);
01860 }
01861 memset(ret -> mc_platform -> private_key, '\0', 1210);
01862 strcpy(ret -> mc_platform -> private_key, privkey);
01863
01864 #endif
01865
01866 ret->agentInitCallback = NULL;
01867 ret->agentInitUserData = NULL;
01868
01869
01870 g_mc_platform = ret->mc_platform;
01871
01872 if (options_malloc)
01873 free(options);
01874
01875 return ret;
01876 }
01877
01878 EXPORTMC int
01879 MC_InitializeAgencyOptions(struct MCAgencyOptions_s* options)
01880 {
01881 int i;
01882 memset(options, 0, sizeof(struct MCAgencyOptions_s));
01883
01884 options->threads = 0xFFFF;
01885 options->default_agent_status = MC_WAIT_CH;
01886 options->modified = 0;
01887 for(i = 0; i < MC_THREAD_ALL; i++) {
01888 options->stack_size[i] = -1;
01889 }
01890 memset(options->passphrase, '\0', 32);
01891
01892 options->known_host_filename = NULL;
01893 options->priv_key_filename = NULL;
01894 options->bluetooth = 0;
01895
01896 options->initInterps = 4;
01897 options->initialized = MC_INITIALIZED_CODE;
01898 return 0;
01899 }
01900
01901 EXPORTMC int
01902 MC_LoadAgentFromFile(MCAgency_t attr, const char* filename)
01903 {
01904 struct stat filestat;
01905 char *buf;
01906 FILE *fp;
01907 size_t len;
01908 message_p message;
01909 extern mc_platform_p g_mc_platform;
01910 buf = NULL;
01911 filestat.st_size = 0;
01912 stat(filename, &filestat);
01913 if (filestat.st_size != 0 ) {
01914 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
01915 memset(buf, 0, filestat.st_size+1);
01916 } else {
01917 fprintf(stderr, "Error: File %s not found.\n", filename);
01918 return 1;
01919 }
01920
01921 fp = fopen(filename, "r");
01922 len = fread((void*)buf, filestat.st_size, 1, fp);
01923 fclose(fp);
01924 if(len <= 0) {return -1;}
01925
01926 message = message_New();
01927 if (
01928 message_InitializeFromString (
01929 attr->mc_platform,
01930 message,
01931 buf,
01932 "",
01933 5050,
01934 "ams"
01935 )
01936 )
01937 {
01938 message_Destroy(message);
01939 }
01940 free(message->to_address);
01941 message->to_address = NULL;
01942 message->xml_root = mxmlLoadString(
01943 NULL,
01944 buf,
01945 NULL );
01946 if (message->xml_root == NULL) {
01947 fprintf(stderr, "Error loading agent. %s:%d\n", __FILE__, __LINE__);
01948 message_Destroy(message);
01949 return 1;
01950 }
01951 message->xml_payload = mxmlFindElement(
01952 message->xml_root,
01953 message->xml_root,
01954 "MOBILE_AGENT",
01955 NULL,
01956 NULL,
01957 MXML_DESCEND );
01958 if(message->xml_payload == NULL) {
01959 fprintf(stderr, "Error loading agent: <MOBILE_AGENT> tag not found. %s:%d\n",
01960 __FILE__, __LINE__ );
01961 message_Destroy(message);
01962 return 1;
01963 }
01964
01965 message_queue_Add
01966 (
01967 attr->mc_platform->message_queue,
01968 message
01969 );
01970 return 0;
01971 }
01972
01973 EXPORTMC int
01974 MC_MigrateAgent(MCAgent_t agent, const char* hostname, int port)
01975 {
01976
01977
01978 int progress;
01979 progress = agent->datastate->task_progress;
01980
01981
01982 agent->datastate->progress_modifier = -1;
01983
01984
01985 free(agent->datastate->tasks[progress]->server_name);
01986 agent->datastate->tasks[progress]->server_name = (char*)malloc(
01987 sizeof(char)*(strlen(hostname) + 10) );
01988 sprintf(agent->datastate->tasks[progress]->server_name, "%s:%d",
01989 hostname, port);
01990
01991
01992 return 0;
01993 }
01994
01995 EXPORTMC int
01996 MC_MutexLock(MCAgency_t attr, int id)
01997 {
01998 syncListNode_t *syncnode;
01999 syncnode = syncListFind(id, attr->mc_platform->syncList);
02000 if (syncnode == NULL) {
02001 return 1;
02002 }
02003 MUTEX_LOCK(syncnode->lock);
02004 return 0;
02005 }
02006
02007 EXPORTMC int
02008 MC_MutexUnlock(MCAgency_t attr, int id)
02009 {
02010 syncListNode_t *syncnode;
02011 syncnode = syncListFind(id, attr->mc_platform->syncList);
02012 if (syncnode == NULL) {
02013 return 1;
02014 }
02015 MUTEX_UNLOCK(syncnode->lock);
02016 return 0;
02017 }
02018
02019 EXPORTMC int
02020 MC_PrintAgentCode(MCAgent_t agent)
02021 {
02022 int progress;
02023 MUTEX_LOCK(agent->lock);
02024 progress = agent->datastate->task_progress;
02025
02026 if (progress >= agent->datastate->number_of_tasks) {
02027 progress = agent->datastate->number_of_tasks - 1;
02028 }
02029 printf("%s\n",
02030 agent->datastate->agent_code);
02031 MUTEX_UNLOCK(agent->lock);
02032 return 0;
02033 }
02034
02035 EXPORTMC int
02036 MC_RegisterService(
02037 MCAgency_t agency,
02038 MCAgent_t agent,
02039 int agentID,
02040 const char *agentName,
02041 char **serviceNames,
02042 int numServices)
02043 {
02044 df_request_list_node_t *req_node;
02045 df_node_t *new_node;
02046 int i;
02047
02048
02049 if (agent == NULL && agentName == NULL) {
02050 return MC_ERR_INVALID_ARGS;
02051 }
02052
02053 req_node = df_request_list_node_New();
02054 req_node->command = (char*)malloc(sizeof(char)*9);
02055 strcpy((char*)req_node->command, "register");
02056
02057 new_node = (df_node_t*)malloc(sizeof(df_node_t));
02058 CHECK_NULL(new_node, return MC_ERR_MEMORY);
02059
02060
02061 new_node->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
02062 CHECK_NULL(new_node->lock, return MC_ERR_MEMORY);
02063 MUTEX_INIT(new_node->lock);
02064
02065
02066 if (agent==NULL) {
02067 new_node->agent_id = agentID;
02068 } else {
02069 new_node->agent_id = agent->id;
02070 }
02071
02072
02073 if (agent==NULL) {
02074 new_node->agent_name =
02075 (char*)malloc(sizeof(char)*(strlen(agentName)+1));
02076 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;);
02077 strcpy(new_node->agent_name, agentName);
02078 } else {
02079 new_node->agent_name =
02080 (char*)malloc(
02081 sizeof(char) *
02082 (strlen(agent->name)+1)
02083 );
02084 CHECK_NULL(new_node->agent_name, return MC_ERR_MEMORY;);
02085 strcpy(new_node->agent_name, agent->name);
02086 }
02087
02088
02089 new_node->service_names = (char**)malloc(
02090 sizeof(char*) * numServices
02091 );
02092 CHECK_NULL(new_node->service_names, return MC_ERR_MEMORY;);
02093 for (i = 0; i < numServices; i++) {
02094 new_node->service_names[i] = (char*) malloc(
02095 sizeof(char) * (strlen(serviceNames[i]) + 1)
02096 );
02097 CHECK_NULL(new_node->service_names[i], return MC_ERR_MEMORY;);
02098 strcpy(
02099 new_node->service_names[i],
02100 serviceNames[i]
02101 );
02102 }
02103 new_node->num_services = numServices;
02104
02105 req_node->data = (void*)new_node;
02106 req_node->data_size = (sizeof(new_node));
02107
02108 return df_AddRequest(
02109 agency->mc_platform->df,
02110 req_node
02111 );
02112 }
02113
02114 EXPORTMC int
02115 MC_ResumeAgency(MCAgency_t attr)
02116 {
02117 MUTEX_LOCK(attr->mc_platform->giant_lock);
02118 attr->mc_platform->giant = 1;
02119 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
02120 return 0;
02121 }
02122
02123 EXPORTMC MCAgent_t
02124 MC_RetrieveAgent(MCAgency_t attr)
02125
02126
02127
02128 {
02129 int i;
02130 MCAgent_t agent=NULL;
02131 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
02132 for (i = 0; i < attr->mc_platform->agent_queue->size; i++) {
02133 agent = (MCAgent_t)ListSearch(
02134 attr->mc_platform->agent_queue->list, i);
02135 MUTEX_LOCK(agent->agent_status_lock);
02136 if (agent->agent_status == MC_AGENT_NEUTRAL) {
02137 MUTEX_UNLOCK(agent->agent_status_lock);
02138 break;
02139 }
02140 MUTEX_UNLOCK(agent->agent_status_lock);
02141 }
02142 if (agent == NULL) {
02143 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02144 return NULL;
02145 }
02146 MUTEX_LOCK(agent->agent_status_lock);
02147 if (agent->agent_status != MC_AGENT_NEUTRAL) {
02148 MUTEX_UNLOCK(agent->agent_status_lock);
02149 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02150 return NULL;
02151 } else {
02152 MUTEX_UNLOCK(agent->agent_status_lock);
02153 }
02154 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02155 return agent;
02156 }
02157
02158 EXPORTMC char *
02159 MC_RetrieveAgentCode(MCAgent_t agent)
02160 {
02161 char *buf;
02162 int len, progress;
02163 MUTEX_LOCK(agent->lock);
02164 progress = agent->datastate->task_progress;
02165 len = strlen(
02166 agent->datastate->agent_code);
02167 buf = (char*)malloc( (len+1)*sizeof(char));
02168 strcpy(buf,
02169 agent->datastate->agent_code);
02170 MUTEX_UNLOCK(agent->lock);
02171 return buf;
02172 }
02173
02174 EXPORTMC int
02175 MC_ResetSignal(MCAgency_t attr)
02176 {
02177 MUTEX_LOCK(attr->mc_platform->giant_lock);
02178 attr->mc_platform->giant = 1;
02179 attr->mc_platform->MC_signal = MC_NO_SIGNAL;
02180 COND_SIGNAL(attr->mc_platform->giant_cond);
02181 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
02182 return 0;
02183 }
02184
02185 EXPORTMC int
02186 MC_SearchForService(
02187
02188 MCAgency_t attr,
02189 const char *searchString,
02190
02191 char*** agentNames,
02192 char*** serviceNames,
02193 int** agentIDs,
02194 int* numResults)
02195 {
02196 df_request_search_p search;
02197 df_search_results_p results;
02198 df_request_list_node_p request;
02199 search = df_request_search_New();
02200 CHECK_NULL(search, return MC_ERR_MEMORY;);
02201 results = (df_search_results_p)malloc(sizeof(df_search_results_t));
02202 CHECK_NULL(results, return MC_ERR_MEMORY;);
02203 request = df_request_list_node_New();
02204 CHECK_NULL(request, return MC_ERR_MEMORY;);
02205
02206
02207 search->search_results = results;
02208 search->search_string = (char*)searchString;
02209
02210 request->data = (void*)search;
02211 request->command = (char*)malloc(sizeof(char) * 7);
02212 strcpy((char*)request->command, "search");
02213 request->data_size = sizeof(df_request_search_t);
02214
02215 COND_SLEEP_ACTION(
02216 search->cond,
02217 search->lock,
02218
02219 df_AddRequest(attr->mc_platform->df, request);
02220 );
02221
02222 *agentNames = search->search_results->agent_names;
02223 *serviceNames = search->search_results->service_names;
02224 *agentIDs = search->search_results->agent_ids;
02225 *numResults = search->search_results->num_results;
02226
02227
02228 free((void*)request->command);
02229 df_request_list_node_Destroy(request);
02230 df_request_search_Destroy(search);
02231
02232 return MC_SUCCESS;
02233 }
02234
02235 EXPORTMC int
02236 MC_SemaphorePost(MCAgency_t attr, int id)
02237 {
02238 syncListNode_t *syncnode;
02239 syncnode = syncListFind(id, attr->mc_platform->syncList);
02240 if (syncnode == NULL) {
02241 return 1;
02242 }
02243 SEMAPHORE_POST(syncnode->sem);
02244 return 0;
02245 }
02246
02247 EXPORTMC int
02248 MC_SemaphoreWait(MCAgency_t attr, int id)
02249 {
02250 syncListNode_t *syncnode;
02251 syncnode = syncListFind(id, attr->mc_platform->syncList);
02252 if (syncnode == NULL) {
02253 return 1;
02254 }
02255 SEMAPHORE_WAIT(syncnode->sem);
02256 return 0;
02257 }
02258
02259 EXPORTMC int
02260 MC_SendCh(MCAgency_t attr,
02261 const char *filename,
02262 const char *remotehost,
02263 int port)
02264 {
02265 printf("Sorry, not implemented yet.\n");
02266 return -1;
02267 }
02268
02269 EXPORTMC int
02270 MC_SendAgent(MCAgency_t attr,
02271 const char *string)
02272 {
02273 message_p message;
02274 MCAgent_t agent;
02275 extern mc_platform_p g_mc_platform;
02276 mc_platform_p platform;
02277
02278 if (attr == NULL) {
02279 platform = g_mc_platform;
02280 } else {
02281 platform = attr->mc_platform;
02282 }
02283
02284 message = message_New();
02285 if(
02286 message_InitializeFromString
02287 (
02288 attr->mc_platform,
02289 message,
02290 string,
02291 NULL,
02292 0,
02293 "ams"
02294 )
02295 )
02296 {
02297 message_Destroy(message);
02298 return MC_ERR;
02299 } else {
02300
02301
02302 agent = agent_Initialize( platform, message, rand() );
02303 if (agent == NULL) {
02304 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02305 }
02306 MUTEX_LOCK(agent->agent_status_lock);
02307 agent->agent_status = MC_WAIT_MESSGSEND;
02308 COND_BROADCAST(agent->agent_status_cond);
02309 MUTEX_UNLOCK(agent->agent_status_lock);
02310 agent_queue_Add( platform->agent_queue, agent);
02311
02312 MUTEX_LOCK(platform->ams->runflag_lock);
02313 platform->ams->run = 1;
02314 COND_BROADCAST(platform->ams->runflag_cond);
02315 MUTEX_UNLOCK(platform->ams->runflag_lock);
02316 }
02317 return 0;
02318 }
02319
02320 EXPORTMC int
02321 MC_SendAgentFile(MCAgency_t attr,
02322 const char *filename)
02323 {
02324 struct stat filestat;
02325 char *buf;
02326 FILE *fp;
02327 int ret = 0;
02328 size_t len;
02329 message_p message;
02330 agent_t *agent;
02331 extern mc_platform_p g_mc_platform;
02332 mc_platform_p platform;
02333 buf = NULL;
02334 filestat.st_size = 0;
02335 stat(filename, &filestat);
02336 if (filestat.st_size != 0 ) {
02337 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
02338 memset(buf, 0, filestat.st_size+1);
02339 } else {
02340 fprintf(stderr, "Error: File %s not found.\n", filename);
02341 return 1;
02342 }
02343
02344 if (attr == NULL) {
02345 platform = g_mc_platform;
02346 } else {
02347 platform = attr->mc_platform;
02348 }
02349
02350 fp = fopen(filename, "r");
02351 len = fread((void*)buf, filestat.st_size, 1, fp);
02352 fclose(fp);
02353 if(len <= 0) {return -1;}
02354
02355 message = message_New();
02356 if(
02357 message_InitializeFromString
02358 (
02359 platform,
02360 message,
02361 buf,
02362 NULL,
02363 0,
02364 "ams"
02365 )
02366 )
02367 {
02368 message_Destroy(message);
02369 } else {
02370
02371
02372 agent = agent_Initialize( platform, message, rand() );
02373 if (agent == NULL) {
02374 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02375 }
02376 MUTEX_LOCK(agent->agent_status_lock);
02377 agent->agent_status = MC_WAIT_MESSGSEND;
02378 COND_BROADCAST(agent->agent_status_cond);
02379 MUTEX_UNLOCK(agent->agent_status_lock);
02380 agent_queue_Add( platform->agent_queue, agent);
02381
02382 MUTEX_LOCK(platform->ams->runflag_lock);
02383 platform->ams->run = 1;
02384 COND_BROADCAST(platform->ams->runflag_cond);
02385 MUTEX_UNLOCK(platform->ams->runflag_lock);
02386 }
02387 free(buf);
02388 return ret;
02389 }
02390
02391 EXPORTMC int
02392 MC_SendAgentMigrationMessage(MCAgency_t attr,
02393 const char *string,
02394 const char *hostname,
02395 int port)
02396 {
02397
02398 message_p message;
02399 printf("\nThe function MC_SendAgentMigrationMessage() is deprecated.\n\
02400 Please use MC_SendAgent() instead.\n");
02401 message = message_New();
02402 if(
02403 message_InitializeFromString
02404 (
02405 attr->mc_platform,
02406 message,
02407 string,
02408 hostname,
02409 port,
02410 "ams"
02411 )
02412 )
02413 {
02414 message_Destroy(message);
02415 return MC_ERR;
02416 } else {
02417 return message_queue_Add
02418 (
02419 attr->mc_platform->message_queue,
02420 message
02421 );
02422 }
02423 }
02424
02425 EXPORTMC int
02426 MC_SendAgentMigrationMessageFile(MCAgency_t attr,
02427 const char *filename,
02428 const char *hostname,
02429 int port)
02430 {
02431 struct stat filestat;
02432 char *buf;
02433 FILE *fp;
02434 int ret = 0;
02435 message_p message;
02436 agent_t *agent;
02437 extern mc_platform_p g_mc_platform;
02438 mc_platform_p platform;
02439 printf("\nThe function MC_SendAgentMigrationMessage() is deprecated.\n\
02440 Please use MC_SendAgentFile() instead.");
02441 buf = NULL;
02442 filestat.st_size = 0;
02443 stat(filename, &filestat);
02444 if (filestat.st_size != 0 ) {
02445 buf = (char*)malloc( sizeof(char) * (filestat.st_size+1) );
02446 memset(buf, 0, filestat.st_size+1);
02447 } else {
02448 fprintf(stderr, "Error: File %s not found.\n", filename);
02449 return 1;
02450 }
02451
02452 if (attr == NULL) {
02453 platform = g_mc_platform;
02454 } else {
02455 platform = attr->mc_platform;
02456 }
02457
02458 fp = fopen(filename, "r");
02459 fread((void*)buf, filestat.st_size, 1, fp);
02460 fclose(fp);
02461
02462 message = message_New();
02463 if(
02464 message_InitializeFromString
02465 (
02466 platform,
02467 message,
02468 buf,
02469 hostname,
02470 port,
02471 "ams"
02472 )
02473 )
02474 {
02475 message_Destroy(message);
02476 } else {
02477
02478
02479 agent = agent_Initialize( platform, message, rand() );
02480 if (agent == NULL) {
02481 fprintf(stderr, "Error initializing agent. %s:%d", __FILE__, __LINE__);
02482 }
02483 MUTEX_LOCK(agent->agent_status_lock);
02484 agent->agent_status = MC_WAIT_MESSGSEND;
02485 COND_BROADCAST(agent->agent_status_cond);
02486 MUTEX_UNLOCK(agent->agent_status_lock);
02487 agent_queue_Add( platform->agent_queue, agent);
02488
02489 MUTEX_LOCK(platform->ams->runflag_lock);
02490 platform->ams->run = 1;
02491 COND_BROADCAST(platform->ams->runflag_cond);
02492 MUTEX_UNLOCK(platform->ams->runflag_lock);
02493 }
02494 free(buf);
02495 return ret;
02496 }
02497
02498 EXPORTMC int
02499 MC_SendSteerCommand(MCAgency_t attr, enum MC_SteerCommand_e cmd)
02500 {
02501 MUTEX_LOCK(attr->mc_platform->MC_steer_lock);
02502 attr->mc_platform->MC_steer_command = cmd;
02503 COND_BROADCAST(attr->mc_platform->MC_steer_cond);
02504 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock);
02505 return 0;
02506 }
02507
02508 EXPORTMC int
02509 MC_SetAgentStatus(MCAgent_t agent, enum MC_AgentStatus_e status)
02510 {
02511 MUTEX_LOCK(agent->lock);
02512 MUTEX_LOCK(agent->agent_status_lock);
02513 agent->agent_status = status;
02514 COND_BROADCAST(agent->agent_status_cond);
02515 MUTEX_UNLOCK(agent->agent_status_lock);
02516 if (!agent->orphan) {
02517 MUTEX_LOCK(agent->mc_platform->ams->runflag_lock);
02518 agent->mc_platform->ams->run = 1;
02519 COND_SIGNAL(agent->mc_platform->ams->runflag_cond);
02520 MUTEX_UNLOCK(agent->mc_platform->ams->runflag_lock);
02521 }
02522 MUTEX_UNLOCK(agent->lock);
02523 return 0;
02524 }
02525
02526 EXPORTMC int
02527 MC_SetDefaultAgentStatus(
02528 MCAgency_t agency,
02529 enum MC_AgentStatus_e status
02530 )
02531 {
02532 agency->mc_platform->default_agentstatus = status;
02533 return 0;
02534 }
02535
02536 EXPORTMC int
02537 MC_SetThreadOn(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index)
02538 {
02539 SET_THREAD_ON(options->threads, index);
02540 return 0;
02541 }
02542
02543 EXPORTMC int
02544 MC_SetThreadsAllOn(MCAgencyOptions_t* options)
02545 {
02546 int i;
02547 for(i = 0; i < MC_THREAD_ALL; i++) {
02548 SET_THREAD_ON(options->threads, i);
02549 }
02550 return 0;
02551 }
02552
02553 EXPORTMC int
02554 MC_SetThreadOff(MCAgencyOptions_t *options, enum MC_ThreadIndex_e index)
02555 {
02556 SET_THREAD_OFF(options->threads, index);
02557 return 0;
02558 }
02559
02560 EXPORTMC int
02561 MC_SetThreadsAllOff(MCAgencyOptions_t* options)
02562 {
02563 int i;
02564 for(i = 0; i < MC_THREAD_ALL; i++) {
02565 SET_THREAD_OFF(options->threads, i);
02566 }
02567 return 0;
02568 }
02569
02570 EXPORTMC int
02571 MC_Steer(
02572 MCAgency_t attr,
02573 int (*funcptr)(void* data),
02574 void *arg
02575 )
02576 {
02577 MUTEX_LOCK(attr->mc_platform->MC_steer_lock);
02578 do {
02579 attr->mc_platform->MC_steer_command = MC_RUN;
02580 MUTEX_UNLOCK(attr->mc_platform->MC_steer_lock);
02581 (*funcptr)(arg);
02582 } while
02583 (
02584 attr->mc_platform->MC_steer_command == MC_RESTART
02585 );
02586 return 0;
02587 }
02588
02589 EXPORTMC enum MC_SteerCommand_e
02590 MC_SteerControl(void)
02591 {
02592 extern mc_platform_p g_mc_platform;
02593
02594 MUTEX_LOCK(g_mc_platform->MC_steer_lock);
02595 while (g_mc_platform->MC_steer_command == MC_SUSPEND) {
02596 COND_WAIT(
02597 g_mc_platform->MC_steer_cond,
02598 g_mc_platform->MC_steer_lock
02599 );
02600 }
02601 MUTEX_UNLOCK(g_mc_platform->MC_steer_lock);
02602 return g_mc_platform->MC_steer_command;
02603 }
02604
02605 EXPORTMC int
02606 MC_SyncDelete(MCAgency_t attr, int id)
02607 {
02608 syncListNode_t *sync_node;
02609
02610 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock);
02611
02612
02613 sync_node = syncListFind(id, attr->mc_platform->syncList);
02614 if (sync_node == NULL) {
02615 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02616 return MC_ERR_NOT_FOUND;
02617 }
02618 MUTEX_LOCK(sync_node->lock);
02619
02620
02621 if (syncListRemove(id, attr->mc_platform->syncList) == NULL) {
02622 fprintf(stderr, "Fatal error. %s:%d\n",
02623 __FILE__,
02624 __LINE__ );
02625 exit(0);
02626 }
02627
02628
02629 MUTEX_UNLOCK(sync_node->lock);
02630 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02631
02632 return syncListNodeDestroy(sync_node);
02633 }
02634
02635 EXPORTMC int
02636 MC_SyncInit(MCAgency_t attr, int id)
02637 {
02638 syncListNode_t *node;
02639 node = syncListNodeNew();
02640 MUTEX_LOCK(attr->mc_platform->syncList->giant_lock);
02641 if (id == 0) {
02642 id = rand();
02643 }
02644 while (
02645 syncListFind(id, attr->mc_platform->syncList) != NULL
02646 )
02647 {
02648 id = rand();
02649 }
02650
02651 node->id = id;
02652 syncListAddNode(
02653 node,
02654 attr->mc_platform->syncList
02655 );
02656 MUTEX_UNLOCK(attr->mc_platform->syncList->giant_lock);
02657 return id;
02658 }
02659
02660 EXPORTMC int
02661 MC_TerminateAgent(MCAgent_t agent)
02662 {
02663 int status=0;
02664 if(agent->agent_interp != NULL) {
02665 status = Ch_Abort (*agent->agent_interp);
02666 }
02667 return status;
02668 }
02669
02670 EXPORTMC int
02671 MC_TerminateAgentWG(MCAgent_t calling_agent, MCAgent_t agent)
02672 {
02673 int status=0;
02674
02675 if (agent->wg_code != NULL) {
02676 if (calling_agent->wg_code == NULL) {
02677 return MC_ERR_INVALID_ARGS;
02678 } else if (strcmp(calling_agent->wg_code, agent->wg_code)) {
02679 return MC_ERR_INVALID_ARGS;
02680 }
02681 }
02682 if(agent->agent_interp != NULL) {
02683 status = Ch_Abort (*agent->agent_interp);
02684 }
02685 return status;
02686 }
02687
02688 EXPORTMC int
02689 MC_MainLoop(MCAgency_t attr)
02690 {
02691 MUTEX_LOCK( attr->mc_platform->quit_lock );
02692 while( attr->mc_platform->quit != 1 ) {
02693 COND_WAIT( attr->mc_platform->quit_cond, attr->mc_platform->quit_lock );
02694 }
02695 MUTEX_UNLOCK( attr->mc_platform->quit_lock );
02696 return 0;
02697 }
02698
02699 EXPORTMC int
02700 MC_WaitAgent(MCAgency_t attr)
02701 {
02702 int size;
02703 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
02704 while(1) {
02705 size = attr->mc_platform->agent_queue->size;
02706 COND_WAIT(
02707 attr->mc_platform->agent_queue->cond,
02708 attr->mc_platform->agent_queue->lock
02709 );
02710 if (size < attr->mc_platform->agent_queue->size) {
02711 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02712 break;
02713 }
02714 }
02715 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02716 return 0;
02717 }
02718
02719 EXPORTMC MCAgent_t
02720 MC_WaitRetrieveAgent(MCAgency_t attr)
02721 {
02722 int index;
02723 MCAgent_t agent;
02724 MC_WaitSignal(attr, MC_RECV_AGENT);
02725 MUTEX_LOCK(attr->mc_platform->agent_queue->lock);
02726 index = attr->mc_platform->agent_queue->size-1;
02727 agent = (MCAgent_t)ListSearch(
02728 attr->mc_platform->agent_queue->list, index);
02729 MUTEX_UNLOCK(attr->mc_platform->agent_queue->lock);
02730 return agent;
02731 }
02732
02733
02734
02735
02736
02737 EXPORTMC int
02738 MC_WaitSignal(MCAgency_t attr, int signals)
02739 {
02740 MUTEX_LOCK(attr->mc_platform->MC_signal_lock);
02741 while(! (signals & attr->mc_platform->MC_signal)) {
02742 COND_WAIT(
02743 attr->mc_platform->MC_signal_cond,
02744 attr->mc_platform->MC_signal_lock
02745 );
02746 }
02747 MUTEX_UNLOCK(attr->mc_platform->MC_signal_lock);
02748 MUTEX_LOCK(attr->mc_platform->giant_lock);
02749 attr->mc_platform->giant = 0;
02750 MUTEX_UNLOCK(attr->mc_platform->giant_lock);
02751 return 0;
02752 }
02753
02754
02755
02756
02757
02758
02759 EXPORTMC int MC_AclDestroy_chdl(void* varg)
02760 {
02761 int retval;
02762 fipa_acl_message_t* acl_message;
02763 ChInterp_t interp;
02764 ChVaList_t ap;
02765
02766 Ch_VaStart(interp, ap, varg);
02767 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02768 retval = MC_AclDestroy(acl_message);
02769 Ch_VaEnd(interp, ap);
02770 return retval;
02771 }
02772
02773
02774 EXPORTMC void* MC_AclNew_chdl(void* varg)
02775 {
02776 void* retval;
02777 retval = (void*)MC_AclNew();
02778 return retval;
02779 }
02780
02781
02782 EXPORTMC int MC_AclPost_chdl(void* varg)
02783 {
02784 int retval;
02785 agent_p agent;
02786 fipa_acl_message_t* acl_message;
02787 ChInterp_t interp;
02788 ChVaList_t ap;
02789
02790 Ch_VaStart(interp, ap, varg);
02791 agent = Ch_VaArg(interp, ap, agent_p);
02792 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02793 retval = MC_AclPost(agent, acl_message);
02794 Ch_VaEnd(interp, ap);
02795 return retval;
02796 }
02797
02798
02799 EXPORTCH void*
02800 MC_AclReply_chdl(void* varg)
02801 {
02802 void* retval;
02803 fipa_acl_message_t* acl_message;
02804 ChInterp_t interp;
02805 ChVaList_t ap;
02806
02807 Ch_VaStart(interp, ap, varg);
02808 acl_message = Ch_VaArg(interp, ap, fipa_acl_message_t*);
02809 retval = (void*)MC_AclReply(acl_message);
02810 Ch_VaEnd(interp, ap);
02811 return retval;
02812 }
02813
02814
02815 EXPORTCH void*
02816 MC_AclRetrieve_chdl(void* varg)
02817 {
02818 void* retval;
02819 MCAgent_t agent;
02820 ChInterp_t interp;
02821 ChVaList_t ap;
02822
02823 Ch_VaStart(interp, ap, varg);
02824 agent = Ch_VaArg(interp, ap, MCAgent_t);
02825 retval = MC_AclRetrieve(agent);
02826 Ch_VaEnd(interp, ap);
02827 return retval;
02828 }
02829
02830
02831 EXPORTCH int
02832 MC_AclSend_chdl(void* varg)
02833 {
02834 int retval;
02835 fipa_acl_message_t* acl_message;
02836 MCAgency_t temp_attr;
02837 extern mc_platform_p g_mc_platform;
02838
02839 ChInterp_t interp;
02840 ChVaList_t ap;
02841
02842 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
02843 CHECK_NULL(temp_attr, exit(-1));
02844 temp_attr->mc_platform = g_mc_platform;
02845
02846 Ch_VaStart(interp, ap, varg);
02847 acl_message = (fipa_acl_message_t*) Ch_VaArg(interp, ap, void*);
02848 retval = MC_AclSend(temp_attr, acl_message);
02849 Ch_VaEnd(interp, ap);
02850 free(temp_attr);
02851 return retval;
02852 }
02853
02854
02855 EXPORTCH void*
02856 MC_AclWaitRetrieve_chdl(void *varg)
02857 {
02858 void* retval;
02859 MCAgent_t agent;
02860 ChInterp_t interp;
02861 ChVaList_t ap;
02862
02863 Ch_VaStart(interp, ap, varg);
02864 agent = Ch_VaArg(interp, ap, MCAgent_t);
02865 retval = MC_AclWaitRetrieve(agent);
02866 Ch_VaEnd(interp, ap);
02867 return retval;
02868 }
02869
02870
02871
02872
02873 EXPORTCH int
02874 MC_AclGetProtocol_chdl(void* varg)
02875 {
02876 ChInterp_t interp;
02877 ChVaList_t ap;
02878 struct fipa_acl_message_s* acl;
02879 int retval;
02880
02881 Ch_VaStart(interp, ap, varg);
02882 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02883 retval = MC_AclGetProtocol(acl);
02884 Ch_VaEnd(interp, ap);
02885 return retval;
02886 }
02887
02888 EXPORTCH char*
02889 MC_AclGetConversationID_chdl(void* varg)
02890 {
02891 ChInterp_t interp;
02892 ChVaList_t ap;
02893 struct fipa_acl_message_s* acl;
02894 char* retval;
02895
02896 Ch_VaStart(interp, ap, varg);
02897 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02898 retval = MC_AclGetConversationID(acl);
02899 Ch_VaEnd(interp, ap);
02900 return retval;
02901 }
02902
02903 EXPORTCH int
02904 MC_AclGetPerformative_chdl(void* varg)
02905 {
02906 ChInterp_t interp;
02907 ChVaList_t ap;
02908 struct fipa_acl_message_s* acl;
02909 int retval;
02910
02911 Ch_VaStart(interp, ap, varg);
02912 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02913 retval = MC_AclGetPerformative(acl);
02914 Ch_VaEnd(interp, ap);
02915 return retval;
02916 }
02917
02918 EXPORTCH int
02919 MC_AclGetSender_chdl(void* varg)
02920 {
02921 ChInterp_t interp;
02922 ChVaList_t ap;
02923 struct fipa_acl_message_s* acl;
02924 char** name;
02925 char** address;
02926 int retval;
02927
02928 Ch_VaStart(interp, ap, varg);
02929 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02930 name = Ch_VaArg(interp, ap, char**);
02931 address = Ch_VaArg(interp, ap, char**);
02932 retval = MC_AclGetSender(acl, name, address);
02933 Ch_VaEnd(interp, ap);
02934 return retval;
02935 }
02936
02937 EXPORTCH char*
02938 MC_AclGetContent_chdl(void* varg)
02939 {
02940 ChInterp_t interp;
02941 ChVaList_t ap;
02942 struct fipa_acl_message_s* acl;
02943 char* retval;
02944
02945 Ch_VaStart(interp, ap, varg);
02946 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02947 retval = (char*)MC_AclGetContent(acl);
02948 Ch_VaEnd(interp, ap);
02949 return retval;
02950 }
02951
02952 EXPORTCH int
02953 MC_AclSetProtocol_chdl(void* varg)
02954 {
02955 ChInterp_t interp;
02956 ChVaList_t ap;
02957 struct fipa_acl_message_s* acl;
02958 enum fipa_protocol_e protocol;
02959 int retval;
02960
02961 Ch_VaStart(interp, ap, varg);
02962 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02963 protocol = Ch_VaArg(interp, ap, enum fipa_protocol_e);
02964 retval = MC_AclSetProtocol(acl, protocol);
02965 Ch_VaEnd(interp, ap);
02966 return retval;
02967 }
02968
02969
02970 EXPORTCH int
02971 MC_AclSetConversationID_chdl(void* varg)
02972 {
02973 ChInterp_t interp;
02974 ChVaList_t ap;
02975 struct fipa_acl_message_s* acl;
02976 char* id;
02977 int retval;
02978
02979 Ch_VaStart(interp, ap, varg);
02980 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02981 id = Ch_VaArg(interp, ap, char*);
02982 retval = MC_AclSetConversationID(acl, id);
02983 Ch_VaEnd(interp, ap);
02984 return retval;
02985 }
02986
02987
02988 EXPORTCH int
02989 MC_AclSetPerformative_chdl(void* varg)
02990 {
02991 ChInterp_t interp;
02992 ChVaList_t ap;
02993 struct fipa_acl_message_s* acl;
02994 enum fipa_performative_e performative;
02995 int retval;
02996
02997 Ch_VaStart(interp, ap, varg);
02998 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
02999 performative = Ch_VaArg(interp, ap, enum fipa_performative_e);
03000 retval = MC_AclSetPerformative(acl, performative);
03001 Ch_VaEnd(interp, ap);
03002 return retval;
03003 }
03004
03005
03006 EXPORTCH int
03007 MC_AclSetSender_chdl(void* varg)
03008 {
03009 ChInterp_t interp;
03010 ChVaList_t ap;
03011 struct fipa_acl_message_s* acl;
03012 char* name;
03013 char* address;
03014 int retval;
03015
03016 Ch_VaStart(interp, ap, varg);
03017 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
03018 name = Ch_VaArg(interp, ap, char*);
03019 address = Ch_VaArg(interp, ap, char*);
03020 retval = MC_AclSetSender(acl, name, address);
03021 Ch_VaEnd(interp, ap);
03022 return retval;
03023 }
03024
03025
03026 EXPORTCH int
03027 MC_AclAddReceiver_chdl(void* varg)
03028 {
03029 ChInterp_t interp;
03030 ChVaList_t ap;
03031 struct fipa_acl_message_s* acl;
03032 char* name;
03033 char* address;
03034 int retval;
03035
03036 Ch_VaStart(interp, ap, varg);
03037 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
03038 name = Ch_VaArg(interp, ap, char*);
03039 address = Ch_VaArg(interp, ap, char*);
03040 retval = MC_AclAddReceiver(acl, name, address);
03041 Ch_VaEnd(interp, ap);
03042 return retval;
03043 }
03044
03045
03046 EXPORTCH int
03047 MC_AclAddReplyTo_chdl(void* varg)
03048 {
03049 ChInterp_t interp;
03050 ChVaList_t ap;
03051 struct fipa_acl_message_s* acl;
03052 char* name;
03053 char* address;
03054 int retval;
03055
03056 Ch_VaStart(interp, ap, varg);
03057 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
03058 name = Ch_VaArg(interp, ap, char*);
03059 address = Ch_VaArg(interp, ap, char*);
03060 retval = MC_AclAddReplyTo(acl, name, address);
03061 Ch_VaEnd(interp, ap);
03062 return retval;
03063 }
03064
03065
03066 EXPORTCH int
03067 MC_AclSetContent_chdl(void* varg)
03068 {
03069 ChInterp_t interp;
03070 ChVaList_t ap;
03071 struct fipa_acl_message_s* acl;
03072 char* content;
03073 int retval;
03074
03075 Ch_VaStart(interp, ap, varg);
03076 acl = Ch_VaArg(interp, ap, struct fipa_acl_message_s*);
03077 content = Ch_VaArg(interp, ap, char*);
03078 retval = MC_AclSetContent(acl, content);
03079 Ch_VaEnd(interp, ap);
03080 return retval;
03081 }
03082
03083
03084
03085
03086 EXPORTCH int
03087 MC_AddAgent_chdl(void *varg)
03088 {
03089 int retval;
03090 MCAgent_t agent;
03091 MCAgency_t temp_attr;
03092 extern mc_platform_p g_mc_platform;
03093
03094 ChInterp_t interp;
03095 ChVaList_t ap;
03096
03097 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03098 CHECK_NULL(temp_attr, exit(-1));
03099 temp_attr->mc_platform = g_mc_platform;
03100
03101 Ch_VaStart(interp, ap, varg);
03102 agent = (MCAgent_t) Ch_VaArg(interp, ap, void*);
03103 retval = MC_AddAgent(temp_attr, agent);
03104 Ch_VaEnd(interp, ap);
03105 free(temp_attr);
03106 return retval;
03107 }
03108
03109
03110 EXPORTCH int
03111 MC_AgentAddTask_chdl(void *varg)
03112 {
03113 int retval;
03114
03115
03116 MCAgent_t agent;
03117 const char* code;
03118 const char* return_var_name;
03119 const char* server;
03120 int persistent;
03121
03122 ChInterp_t interp;
03123 ChVaList_t ap;
03124
03125 Ch_VaStart(interp, ap, varg);
03126
03127 agent = Ch_VaArg(interp, ap, MCAgent_t);
03128 code = Ch_VaArg(interp, ap, const char*);
03129 return_var_name = Ch_VaArg(interp, ap, const char*);
03130 server = Ch_VaArg(interp, ap, const char*);
03131 persistent = Ch_VaArg(interp, ap, int);
03132
03133 retval= MC_AgentAddTask(
03134 agent,
03135 code,
03136 return_var_name,
03137 server,
03138 persistent);
03139 Ch_VaEnd(interp, ap);
03140 return retval;
03141 }
03142
03143
03144 EXPORTCH int
03145 MC_AgentAttachFile_chdl(void *varg)
03146 {
03147 int retval;
03148 MCAgent_t agent;
03149 const char* name;
03150 const char* filepath;
03151
03152 ChInterp_t interp;
03153 ChVaList_t ap;
03154
03155 Ch_VaStart(interp, ap, varg);
03156
03157 agent = Ch_VaArg(interp, ap, MCAgent_t);
03158 name = Ch_VaArg(interp, ap, const char*);
03159 filepath = Ch_VaArg(interp, ap, const char*);
03160 retval = MC_AgentAttachFile(
03161 agent,
03162 name,
03163 filepath);
03164 Ch_VaEnd(interp, ap);
03165 return retval;
03166 }
03167
03168 EXPORTCH int
03169 MC_AgentListFiles_chdl(void *varg)
03170 {
03171 int retval;
03172 MCAgent_t agent;
03173 int task_num;
03174 char*** names;
03175 int* num_files;
03176
03177 ChInterp_t interp;
03178 ChVaList_t ap;
03179
03180 Ch_VaStart(interp, ap, varg);
03181
03182 agent = Ch_VaArg(interp, ap, MCAgent_t);
03183 task_num = Ch_VaArg(interp, ap, int);
03184 names = Ch_VaArg(interp, ap, char***);
03185 num_files = Ch_VaArg(interp, ap, int*);
03186 retval = MC_AgentListFiles(
03187 agent,
03188 task_num,
03189 names,
03190 num_files);
03191 Ch_VaEnd(interp, ap);
03192 return retval;
03193 }
03194
03195 EXPORTCH int
03196 MC_AgentRetrieveFile_chdl(void *varg)
03197 {
03198 int retval;
03199 MCAgent_t agent;
03200 int task_num;
03201 const char* name;
03202 const char* save_path;
03203
03204 ChInterp_t interp;
03205 ChVaList_t ap;
03206
03207 Ch_VaStart(interp, ap, varg);
03208
03209 agent = Ch_VaArg(interp, ap, MCAgent_t);
03210 task_num = Ch_VaArg(interp, ap, int);
03211 name = Ch_VaArg(interp, ap, const char*);
03212 save_path = Ch_VaArg(interp, ap, const char*);
03213 retval = MC_AgentRetrieveFile(
03214 agent,
03215 task_num,
03216 name,
03217 save_path);
03218 Ch_VaEnd(interp, ap);
03219 return retval;
03220 }
03221
03222
03223 EXPORTCH const void*
03224 MC_AgentVariableRetrieve_chdl(void* varg)
03225 {
03226 const void* retval;
03227 MCAgent_t agent;
03228 const char* var_name;
03229 int task_num;
03230
03231 ChInterp_t interp;
03232 ChVaList_t ap;
03233
03234 Ch_VaStart(interp, ap, varg);
03235
03236 agent = Ch_VaArg(interp, ap, MCAgent_t);
03237 var_name = Ch_VaArg(interp, ap, const char* );
03238 task_num = Ch_VaArg(interp, ap, int);
03239
03240 retval = MC_AgentVariableRetrieve(agent, var_name, task_num);
03241
03242 Ch_VaEnd(interp, ap);
03243 return retval;
03244 }
03245
03246
03247 EXPORTCH int
03248 MC_AgentVariableSave_chdl(void *varg)
03249 {
03250 int retval;
03251 MCAgent_t agent;
03252 const char* var_name;
03253
03254 ChInterp_t interp;
03255 ChVaList_t ap;
03256
03257 Ch_VaStart(interp, ap, varg);
03258
03259 agent = Ch_VaArg(interp, ap, MCAgent_t);
03260 var_name = Ch_VaArg(interp, ap, const char*);
03261
03262 retval = MC_AgentVariableSave(agent, var_name);
03263
03264 Ch_VaEnd(interp, ap);
03265 return retval;
03266 }
03267
03268
03269 EXPORTCH int
03270 MC_CallAgentFunc_chdl(void *varg)
03271 {
03272 int retval;
03273
03274 MCAgent_t agent;
03275 const char* funcName;
03276 void* returnVal;
03277 ChVaList_t args;
03278
03279 ChInterp_t interp;
03280 ChVaList_t ap;
03281
03282 Ch_VaStart(interp, ap, varg);
03283
03284 agent = Ch_VaArg(interp, ap, MCAgent_t);
03285 funcName = Ch_VaArg(interp, ap, const char*);
03286 returnVal = Ch_VaArg(interp, ap, void*);
03287 args = Ch_VaArg(interp, ap, void*);
03288
03289 retval = MC_CallAgentFuncVar(
03290 agent,
03291 funcName,
03292 returnVal,
03293 args);
03294 Ch_VaEnd(interp, ap);
03295 return retval;
03296 }
03297
03298
03299 EXPORTCH int
03300 MC_Barrier_chdl(void *varg)
03301 {
03302 MCAgency_t temp_attr;
03303 extern mc_platform_p g_mc_platform;
03304 int retval;
03305 ChInterp_t interp;
03306 ChVaList_t ap;
03307 int id;
03308
03309 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03310 CHECK_NULL(temp_attr, exit(-1));
03311 temp_attr->mc_platform = g_mc_platform;
03312
03313 Ch_VaStart(interp, ap, varg);
03314 id = Ch_VaArg(interp, ap, int);
03315 retval = MC_Barrier(temp_attr, id);
03316 Ch_VaEnd(interp, ap);
03317 free(temp_attr);
03318 return retval;
03319 }
03320
03321
03322 EXPORTCH int
03323 MC_BarrierDelete_chdl(void *varg)
03324 {
03325 MCAgency_t temp_attr;
03326 extern mc_platform_p g_mc_platform;
03327 int retval;
03328 ChInterp_t interp;
03329 ChVaList_t ap;
03330 int id;
03331
03332 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03333 CHECK_NULL(temp_attr, exit(-1));
03334 temp_attr->mc_platform = g_mc_platform;
03335
03336 Ch_VaStart(interp, ap, varg);
03337 id = Ch_VaArg(interp, ap, int);
03338 retval = MC_BarrierDelete(temp_attr, id);
03339 Ch_VaEnd(interp, ap);
03340 free(temp_attr);
03341 return retval;
03342 }
03343
03344
03345 EXPORTCH int
03346 MC_BarrierInit_chdl(void *varg)
03347 {
03348 MCAgency_t temp_attr;
03349 extern mc_platform_p g_mc_platform;
03350 int retval;
03351 ChInterp_t interp;
03352 ChVaList_t ap;
03353 int id;
03354 int num_procs;
03355
03356 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03357 CHECK_NULL(temp_attr, exit(-1));
03358 temp_attr->mc_platform = g_mc_platform;
03359
03360 Ch_VaStart(interp, ap, varg);
03361 id = Ch_VaArg(interp, ap, int);
03362 num_procs = Ch_VaArg(interp, ap, int);
03363 retval = MC_BarrierInit(temp_attr, id, num_procs);
03364 Ch_VaEnd(interp, ap);
03365 free(temp_attr);
03366 return retval;
03367 }
03368
03369
03370 EXPORTCH int
03371 MC_CondBroadcast_chdl(void *varg)
03372 {
03373 MCAgency_t temp_attr;
03374 extern mc_platform_p g_mc_platform;
03375 int retval;
03376 ChInterp_t interp;
03377 ChVaList_t ap;
03378 int id;
03379
03380 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03381 CHECK_NULL(temp_attr, exit(-1));
03382 temp_attr->mc_platform = g_mc_platform;
03383
03384 Ch_VaStart(interp, ap, varg);
03385 id = Ch_VaArg(interp, ap, int);
03386 retval = MC_CondBroadcast(temp_attr, id);
03387 Ch_VaEnd(interp, ap);
03388 free(temp_attr);
03389 return retval;
03390 }
03391
03392
03393 EXPORTCH MCAgent_t
03394 MC_ComposeAgent_chdl(void *varg)
03395 {
03396 MCAgent_t retval;
03397
03398
03399 const char* name;
03400 const char* home;
03401 const char* owner;
03402 const char* code;
03403 const char* return_var_name;
03404 const char* server;
03405 int persistent;
03406
03407 ChInterp_t interp;
03408 ChVaList_t ap;
03409
03410 Ch_VaStart(interp, ap, varg);
03411
03412 name = Ch_VaArg(interp, ap, const char*);
03413 home = Ch_VaArg(interp, ap, const char*);
03414 owner = Ch_VaArg(interp, ap, const char*);
03415 code = Ch_VaArg(interp, ap, const char*);
03416 return_var_name = Ch_VaArg(interp, ap, const char*);
03417 server = Ch_VaArg(interp, ap, const char*);
03418 persistent = Ch_VaArg(interp, ap, int);
03419
03420 retval= MC_ComposeAgentWithWorkgroup(
03421 name,
03422 home,
03423 owner,
03424 code,
03425 return_var_name,
03426 server,
03427 persistent,
03428 NULL);
03429 Ch_VaEnd(interp, ap);
03430 return retval;
03431 }
03432
03433
03434 EXPORTCH MCAgent_t
03435 MC_ComposeAgentWithWorkgroup_chdl(void *varg)
03436 {
03437 MCAgent_t retval;
03438
03439
03440 const char* name;
03441 const char* home;
03442 const char* owner;
03443 const char* code;
03444 const char* return_var_name;
03445 const char* server;
03446 const char* workgroup_code;
03447 int persistent;
03448
03449 ChInterp_t interp;
03450 ChVaList_t ap;
03451
03452 Ch_VaStart(interp, ap, varg);
03453
03454 name = Ch_VaArg(interp, ap, const char*);
03455 home = Ch_VaArg(interp, ap, const char*);
03456 owner = Ch_VaArg(interp, ap, const char*);
03457 code = Ch_VaArg(interp, ap, const char*);
03458 return_var_name = Ch_VaArg(interp, ap, const char*);
03459 server = Ch_VaArg(interp, ap, const char*);
03460 persistent = Ch_VaArg(interp, ap, int);
03461 workgroup_code = Ch_VaArg(interp, ap, const char*);
03462
03463 retval= MC_ComposeAgentS(
03464 name,
03465 home,
03466 owner,
03467 code,
03468 return_var_name,
03469 server,
03470 persistent,
03471 workgroup_code);
03472 Ch_VaEnd(interp, ap);
03473 return retval;
03474 }
03475
03476
03477 EXPORTCH MCAgent_t
03478 MC_ComposeAgentFromFile_chdl(void *varg)
03479 {
03480 MCAgent_t retval;
03481
03482
03483 const char* name;
03484 const char* home;
03485 const char* owner;
03486 const char* filename;
03487 const char* return_var_name;
03488 const char* server;
03489 int persistent;
03490
03491 ChInterp_t interp;
03492 ChVaList_t ap;
03493
03494 Ch_VaStart(interp, ap, varg);
03495
03496 name = Ch_VaArg(interp, ap, const char*);
03497 home = Ch_VaArg(interp, ap, const char*);
03498 owner = Ch_VaArg(interp, ap, const char*);
03499 filename = Ch_VaArg(interp, ap, const char*);
03500 return_var_name = Ch_VaArg(interp, ap, const char*);
03501 server = Ch_VaArg(interp, ap, const char*);
03502 persistent = Ch_VaArg(interp, ap, int);
03503
03504 retval= MC_ComposeAgentFromFileWithWorkgroup(
03505 name,
03506 home,
03507 owner,
03508 filename,
03509 return_var_name,
03510 server,
03511 persistent,
03512 NULL);
03513 Ch_VaEnd(interp, ap);
03514 return retval;
03515 }
03516
03517
03518 EXPORTCH MCAgent_t
03519 MC_ComposeAgentFromFileWithWorkgroup_chdl(void *varg)
03520 {
03521 MCAgent_t retval;
03522
03523
03524 const char* name;
03525 const char* home;
03526 const char* owner;
03527 const char* filename;
03528 const char* return_var_name;
03529 const char* server;
03530 const char* workgroup;
03531 int persistent;
03532
03533 ChInterp_t interp;
03534 ChVaList_t ap;
03535
03536 Ch_VaStart(interp, ap, varg);
03537
03538 name = Ch_VaArg(interp, ap, const char*);
03539 home = Ch_VaArg(interp, ap, const char*);
03540 owner = Ch_VaArg(interp, ap, const char*);
03541 filename = Ch_VaArg(interp, ap, const char*);
03542 return_var_name = Ch_VaArg(interp, ap, const char*);
03543 server = Ch_VaArg(interp, ap, const char*);
03544 workgroup = Ch_VaArg(interp, ap, const char*);
03545 persistent = Ch_VaArg(interp, ap, int);
03546
03547 retval= MC_ComposeAgentFromFileWithWorkgroup(
03548 name,
03549 home,
03550 owner,
03551 filename,
03552 return_var_name,
03553 server,
03554 persistent,
03555 workgroup);
03556 Ch_VaEnd(interp, ap);
03557 return retval;
03558 }
03559
03560
03561 EXPORTCH int
03562 MC_CondSignal_chdl(void *varg)
03563 {
03564 MCAgency_t temp_attr;
03565 extern mc_platform_p g_mc_platform;
03566 int retval;
03567 ChInterp_t interp;
03568 ChVaList_t ap;
03569 int id;
03570
03571 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03572 CHECK_NULL(temp_attr, exit(-1));
03573 temp_attr->mc_platform = g_mc_platform;
03574
03575 Ch_VaStart(interp, ap, varg);
03576 id = Ch_VaArg(interp, ap, int);
03577 retval = MC_CondSignal(temp_attr, id);
03578 Ch_VaEnd(interp, ap);
03579 free(temp_attr);
03580 return retval;
03581 }
03582
03583
03584 EXPORTCH int
03585 MC_CondReset_chdl(void *varg)
03586 {
03587 MCAgency_t temp_attr;
03588 extern mc_platform_p g_mc_platform;
03589 int retval;
03590 ChInterp_t interp;
03591 ChVaList_t ap;
03592 int id;
03593
03594 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03595 CHECK_NULL(temp_attr, exit(-1));
03596 temp_attr->mc_platform = g_mc_platform;
03597
03598 Ch_VaStart(interp, ap, varg);
03599 id = Ch_VaArg(interp, ap, int);
03600 retval = MC_CondReset(temp_attr, id);
03601 Ch_VaEnd(interp, ap);
03602 free(temp_attr);
03603 return retval;
03604 }
03605
03606
03607 EXPORTCH int
03608 MC_CondWait_chdl(void *varg)
03609 {
03610 MCAgency_t temp_attr;
03611 extern mc_platform_p g_mc_platform;
03612 int retval;
03613 ChInterp_t interp;
03614 ChVaList_t ap;
03615 int id;
03616
03617 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03618 CHECK_NULL(temp_attr, exit(-1));
03619 temp_attr->mc_platform = g_mc_platform;
03620
03621 Ch_VaStart(interp, ap, varg);
03622 id = Ch_VaArg(interp, ap, int);
03623 retval = MC_CondWait(temp_attr, id);
03624 Ch_VaEnd(interp, ap);
03625 free(temp_attr);
03626 return retval;
03627 }
03628
03629 EXPORTCH int
03630 MC_DeleteAgent_chdl(void *varg)
03631 {
03632 ChInterp_t interp;
03633 ChVaList_t ap;
03634 MCAgent_t agent;
03635 const char* agentName;
03636 int retval;
03637
03638 Ch_VaStart(interp, ap, varg);
03639 agentName = Ch_VaArg(interp, ap, const char*);
03640 agent = MC_FindAgentByName(NULL, agentName);
03641 if (agent == NULL) {
03642 return MC_ERR_NOT_FOUND;
03643 }
03644 retval = MC_DeleteAgent(agent);
03645 Ch_VaEnd(interp, ap);
03646 return retval;
03647 }
03648
03649 EXPORTCH int
03650 MC_DeleteAgentWG_chdl(void *varg)
03651 {
03652 ChInterp_t interp;
03653 ChVaList_t ap;
03654 const char* agentName;
03655 MCAgent_t calling_agent;
03656 MCAgent_t agent;
03657 int retval;
03658
03659 Ch_VaStart(interp, ap, varg);
03660 calling_agent = Ch_VaArg(interp, ap, MCAgent_t);
03661 agentName = Ch_VaArg(interp, ap, const char*);
03662 agent = MC_FindAgentByName(NULL, agentName);
03663 if (agent == NULL) {
03664 return MC_ERR_NOT_FOUND;
03665 }
03666 retval = MC_DeleteAgentWG(calling_agent, agent);
03667 Ch_VaEnd(interp, ap);
03668 return retval;
03669 }
03670
03671 EXPORTCH int
03672 MC_DestroyServiceSearchResult_chdl(void* varg)
03673 {
03674 ChInterp_t interp;
03675 ChVaList_t ap;
03676 char** agentName;
03677 char** serviceName;
03678 int* agentID;
03679 int numResult;
03680 int retval;
03681
03682 Ch_VaStart(interp, ap, varg);
03683 agentName = Ch_VaArg(interp, ap, char**);
03684 serviceName = Ch_VaArg(interp, ap, char**);
03685 agentID = Ch_VaArg(interp, ap, int*);
03686 numResult = Ch_VaArg(interp, ap, int);
03687
03688 retval = MC_DestroyServiceSearchResult(
03689 agentName,
03690 serviceName,
03691 agentID,
03692 numResult );
03693 Ch_VaEnd(interp, ap);
03694 return retval;
03695 }
03696
03697
03698 EXPORTCH int
03699 MC_DeregisterService_chdl(void *varg)
03700 {
03701 ChInterp_t interp;
03702 ChVaList_t ap;
03703 MCAgency_t temp_attr;
03704 extern mc_platform_p g_mc_platform;
03705 int agentID;
03706 char *serviceName;
03707 int retval;
03708
03709 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03710 CHECK_NULL(temp_attr, exit(-1));
03711 temp_attr->mc_platform = g_mc_platform;
03712
03713 Ch_VaStart(interp, ap, varg);
03714 agentID = Ch_VaArg(interp, ap, int);
03715 serviceName = (char*)Ch_VaArg(interp, ap, const char*);
03716 retval = MC_DeregisterService(
03717 temp_attr,
03718 agentID,
03719 serviceName );
03720 Ch_VaEnd(interp, ap);
03721 free(temp_attr);
03722 return retval;
03723 }
03724
03725 EXPORTCH int
03726 MC_End_chdl(void *varg)
03727 {
03728 MCAgency_t temp_attr;
03729 extern mc_platform_p g_mc_platform;
03730 int retval;
03731
03732 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03733 CHECK_NULL(temp_attr, exit(-1));
03734 temp_attr->mc_platform = g_mc_platform;
03735
03736 retval = MC_End(temp_attr);
03737
03738 return retval;
03739 }
03740
03741
03742 EXPORTCH MCAgent_t
03743 MC_FindAgentByID_chdl(void *varg)
03744 {
03745 MCAgency_t temp_attr;
03746 extern mc_platform_p g_mc_platform;
03747 MCAgent_t retval;
03748 ChInterp_t interp;
03749 ChVaList_t ap;
03750 int id;
03751
03752 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03753 CHECK_NULL(temp_attr, exit(-1));
03754 temp_attr->mc_platform = g_mc_platform;
03755
03756 Ch_VaStart(interp, ap, varg);
03757 id = Ch_VaArg(interp, ap, int);
03758 retval = MC_FindAgentByID(temp_attr, id);
03759 Ch_VaEnd(interp, ap);
03760 free(temp_attr);
03761 return retval;
03762 }
03763
03764
03765 EXPORTCH MCAgent_t
03766 MC_FindAgentByName_chdl(void *varg)
03767 {
03768 MCAgency_t temp_attr;
03769 extern mc_platform_p g_mc_platform;
03770 MCAgent_t retval;
03771 ChInterp_t interp;
03772 ChVaList_t ap;
03773 const char *name;
03774
03775 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03776 CHECK_NULL(temp_attr, exit(-1));
03777 temp_attr->mc_platform = g_mc_platform;
03778
03779 Ch_VaStart(interp, ap, varg);
03780 name = Ch_VaArg(interp, ap, const char *);
03781 retval = MC_FindAgentByName(temp_attr, name);
03782 Ch_VaEnd(interp, ap);
03783 free(temp_attr);
03784 return retval;
03785 }
03786
03787
03788 #ifndef _WIN32
03789 EXPORTCH time_t
03790 #else
03791 EXPORTCH SYSTEMTIME
03792 #endif
03793 MC_GetAgentArrivalTime_chdl(void *varg)
03794 {
03795 MCAgent_t agent;
03796 ChInterp_t interp;
03797 ChVaList_t ap;
03798 #ifndef _WIN32
03799 time_t arrival_time;
03800 #else
03801 SYSTEMTIME arrival_time;
03802 #endif
03803
03804 Ch_VaStart(interp, ap, varg);
03805 agent = Ch_VaArg(interp, ap, MCAgent_t);
03806 arrival_time = MC_GetAgentArrivalTime(agent);
03807 Ch_VaEnd(interp, ap);
03808 return arrival_time;
03809 }
03810
03811
03812 EXPORTCH int
03813 MC_GetAgentID_chdl(void *varg)
03814 {
03815 MCAgent_t agent;
03816 ChInterp_t interp;
03817 ChVaList_t ap;
03818 int id;
03819
03820 Ch_VaStart(interp, ap, varg);
03821 agent = Ch_VaArg(interp, ap, MCAgent_t);
03822 id = MC_GetAgentID(agent);
03823 Ch_VaEnd(interp, ap);
03824 return id;
03825 }
03826
03827
03828 EXPORTCH char*
03829 MC_GetAgentName_chdl(void *varg)
03830 {
03831 MCAgent_t agent;
03832 ChInterp_t interp;
03833 ChVaList_t ap;
03834 char* name;
03835
03836 Ch_VaStart(interp, ap, varg);
03837 agent = Ch_VaArg(interp, ap, MCAgent_t);
03838 name = MC_GetAgentName(agent);
03839 Ch_VaEnd(interp, ap);
03840 return name;
03841 }
03842
03843
03844 EXPORTCH int
03845 MC_GetAgentNumTasks_chdl(void *varg)
03846 {
03847 MCAgent_t agent;
03848 ChInterp_t interp;
03849 ChVaList_t ap;
03850 int num_tasks;
03851
03852 Ch_VaStart(interp, ap, varg);
03853 agent = Ch_VaArg(interp, ap, MCAgent_t);
03854 num_tasks = MC_GetAgentNumTasks(agent);
03855 Ch_VaEnd(interp, ap);
03856 return num_tasks;
03857 }
03858
03859
03860 EXPORTCH int
03861 MC_GetAgentStatus_chdl(void *varg)
03862 {
03863 MCAgent_t agent;
03864 int status;
03865 ChInterp_t interp;
03866 ChVaList_t ap;
03867
03868 Ch_VaStart(interp, ap, varg);
03869 agent = Ch_VaArg(interp, ap, MCAgent_t);
03870 status = MC_GetAgentStatus(agent);
03871 Ch_VaEnd(interp, ap);
03872 return status;
03873 }
03874
03875
03876 EXPORTCH char *
03877 MC_GetAgentXMLString_chdl(void *varg)
03878 {
03879 ChInterp_t interp;
03880 ChVaList_t ap;
03881 MCAgent_t agent;
03882 char *retval;
03883
03884 Ch_VaStart(interp, ap, varg);
03885 agent = Ch_VaArg(interp, ap, MCAgent_t);
03886 retval = MC_GetAgentXMLString(agent);
03887 Ch_VaEnd(interp, ap);
03888 return retval;
03889 }
03890
03891 #ifndef _WIN32
03892 EXPORTCH int
03893 MC_GetTimeOfDay_chdl(void *varg)
03894 {
03895 ChInterp_t interp;
03896 ChVaList_t ap;
03897 struct timeval *tv;
03898 Ch_VaStart(interp, ap, varg);
03899 tv = Ch_VaArg(interp, ap, struct timeval*);
03900 gettimeofday(tv, NULL);
03901 Ch_VaEnd(interp, ap);
03902 return 0;
03903 }
03904 #endif
03905
03906
03907 EXPORTCH int
03908 MC_HaltAgency_chdl(void *varg)
03909 {
03910 MCAgency_t temp_attr;
03911 int retval;
03912 extern mc_platform_p g_mc_platform;
03913
03914 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03915 CHECK_NULL(temp_attr, exit(-1));
03916 temp_attr->mc_platform = g_mc_platform;
03917
03918 retval = MC_HaltAgency(temp_attr);
03919
03920 free(temp_attr);
03921 return retval;
03922 }
03923
03924 EXPORTCH int
03925 MC_MigrateAgent_chdl(void *varg)
03926 {
03927 MCAgent_t agent;
03928 const char* hostname;
03929 int port;
03930 int retval;
03931 ChInterp_t interp;
03932 ChVaList_t ap;
03933
03934 Ch_VaStart(interp, ap, varg);
03935 agent = Ch_VaArg(interp, ap, MCAgent_t);
03936 hostname = Ch_VaArg(interp, ap, const char*);
03937 port = Ch_VaArg(interp, ap, int);
03938 retval = MC_MigrateAgent(agent, hostname, port);
03939 return retval;
03940 }
03941
03942
03943 EXPORTCH int
03944 MC_MutexLock_chdl(void *varg)
03945 {
03946 MCAgency_t temp_attr;
03947 extern mc_platform_p g_mc_platform;
03948
03949 ChInterp_t interp;
03950 ChVaList_t ap;
03951 int id;
03952 int retval;
03953
03954 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03955 CHECK_NULL(temp_attr, exit(-1));
03956 temp_attr->mc_platform = g_mc_platform;
03957
03958 Ch_VaStart(interp, ap, varg);
03959 id = Ch_VaArg(interp, ap, int );
03960 retval = MC_MutexLock(temp_attr, id);
03961 Ch_VaEnd(interp, ap);
03962 free(temp_attr);
03963 return retval;
03964 }
03965
03966
03967 EXPORTCH int
03968 MC_MutexUnlock_chdl(void *varg)
03969 {
03970 MCAgency_t temp_attr;
03971 extern mc_platform_p g_mc_platform;
03972
03973 ChInterp_t interp;
03974 ChVaList_t ap;
03975 int id;
03976 int retval;
03977
03978 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
03979 CHECK_NULL(temp_attr, exit(-1));
03980 temp_attr->mc_platform = g_mc_platform;
03981
03982 Ch_VaStart(interp, ap, varg);
03983 id = Ch_VaArg(interp, ap, int );
03984 retval = MC_MutexUnlock(temp_attr, id);
03985 Ch_VaEnd(interp, ap);
03986 free(temp_attr);
03987 return retval;
03988 }
03989
03990
03991 EXPORTCH int
03992 MC_PrintAgentCode_chdl(void *varg)
03993 {
03994 ChInterp_t interp;
03995 ChVaList_t ap;
03996 MCAgent_t agent;
03997 int retval;
03998
03999 Ch_VaStart(interp, ap, varg);
04000 agent = Ch_VaArg(interp, ap, MCAgent_t);
04001 retval = MC_PrintAgentCode(agent);
04002 Ch_VaEnd(interp, ap);
04003 return retval;
04004 }
04005
04006
04007 EXPORTCH int
04008 MC_RegisterService_chdl(void *varg)
04009 {
04010 ChInterp_t interp;
04011 ChVaList_t ap;
04012 int retval;
04013 MCAgency_t temp_attr;
04014 extern mc_platform_p g_mc_platform;
04015
04016
04017 MCAgent_t agent;
04018 char **serviceNames;
04019 int numServices;
04020
04021 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04022 CHECK_NULL(temp_attr, exit(-1));
04023 temp_attr->mc_platform = g_mc_platform;
04024
04025 Ch_VaStart(interp, ap, varg);
04026 agent = Ch_VaArg(interp, ap, MCAgent_t);
04027 serviceNames = Ch_VaArg(interp, ap, char **);
04028 numServices = Ch_VaArg(interp, ap, int);
04029
04030 retval = MC_RegisterService(
04031 temp_attr,
04032 agent,
04033 0,
04034 NULL,
04035 serviceNames,
04036 numServices
04037 );
04038 Ch_VaEnd(interp, ap);
04039 free(temp_attr);
04040 return retval;
04041 }
04042
04043
04044 EXPORTCH int
04045 MC_ResumeAgency_chdl(void *varg)
04046 {
04047 MCAgency_t temp_attr;
04048 int retval;
04049 extern mc_platform_p g_mc_platform;
04050
04051 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04052 CHECK_NULL(temp_attr, exit(-1));
04053 temp_attr->mc_platform = g_mc_platform;
04054
04055 retval = MC_ResumeAgency(temp_attr);
04056
04057 free(temp_attr);
04058 return retval;
04059 }
04060
04061
04062 EXPORTCH MCAgent_t
04063 MC_RetrieveAgent_chdl(void *varg)
04064 {
04065 MCAgency_t temp_attr;
04066 extern mc_platform_p g_mc_platform;
04067 MCAgent_t agent;
04068
04069 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04070 CHECK_NULL(temp_attr, exit(-1));
04071 temp_attr->mc_platform = g_mc_platform;
04072
04073 agent = MC_RetrieveAgent(temp_attr);
04074 free(temp_attr);
04075 return agent;
04076 }
04077
04078
04079 EXPORTCH char *
04080 MC_RetrieveAgentCode_chdl(void *varg)
04081 {
04082 ChInterp_t interp;
04083 ChVaList_t ap;
04084 MCAgent_t agent;
04085 char *retval;
04086
04087 Ch_VaStart(interp, ap, varg);
04088 agent = Ch_VaArg(interp, ap, MCAgent_t);
04089 retval = MC_RetrieveAgentCode(agent);
04090 Ch_VaEnd(interp, ap);
04091 return retval;
04092 }
04093
04094
04095 EXPORTCH int
04096 MC_SaveData_chdl(void* varg)
04097 {
04098 ChInterp_t interp;
04099 ChVaList_t ap;
04100 interpreter_variable_data_p interp_var_data;
04101 MCAgent_t agent;
04102 int progress;
04103 const char* name;
04104 int size;
04105 void* data;
04106
04107 Ch_VaStart(interp, ap, varg);
04108 agent = Ch_VaArg(interp, ap, MCAgent_t);
04109 name = Ch_VaArg(interp, ap, char*);
04110 size = Ch_VaArg(interp, ap, int);
04111 data = Ch_VaArg(interp, ap, void*);
04112
04113 progress = agent->datastate->task_progress;
04114
04115 interp_var_data = interpreter_variable_data_New();
04116 interp_var_data->name = strdup(name);
04117 interp_var_data->size = size;
04118 interp_var_data->data_type = CH_VOIDPTRTYPE;
04119 interp_var_data->data = malloc(size);
04120 memcpy(interp_var_data->data, data, size);
04121
04122 agent_variable_list_Add(
04123 agent->datastate->tasks[progress]->agent_variable_list,
04124 interp_var_data );
04125
04126 return 0;
04127 }
04128
04129
04130 EXPORTCH int
04131 MC_SearchForService_chdl(void *varg)
04132 {
04133 ChInterp_t interp;
04134 ChVaList_t ap;
04135 int retval;
04136 MCAgency_t temp_attr;
04137 extern mc_platform_p g_mc_platform;
04138
04139
04140 const char* searchString;
04141 char*** agentNames;
04142 char*** serviceNames;
04143 int** agentIDs;
04144 int* numResults;
04145
04146 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04147 CHECK_NULL(temp_attr, exit(-1));
04148 temp_attr->mc_platform = g_mc_platform;
04149
04150 Ch_VaStart(interp, ap, varg);
04151 searchString = Ch_VaArg(interp, ap, const char*);
04152 agentNames = Ch_VaArg(interp, ap, char***);
04153 serviceNames = Ch_VaArg(interp, ap, char***);
04154 agentIDs = Ch_VaArg(interp, ap, int**);
04155 numResults = Ch_VaArg(interp, ap, int*);
04156
04157 retval = MC_SearchForService(
04158 temp_attr,
04159 searchString,
04160 agentNames,
04161 serviceNames,
04162 agentIDs,
04163 numResults
04164 );
04165 Ch_VaEnd(interp, ap);
04166 free(temp_attr);
04167 return retval;
04168 }
04169
04170
04171 EXPORTCH int
04172 MC_SemaphorePost_chdl(void *varg)
04173 {
04174 MCAgency_t temp_attr;
04175 extern mc_platform_p g_mc_platform;
04176
04177 ChInterp_t interp;
04178 ChVaList_t ap;
04179 int id;
04180 int retval;
04181
04182 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04183 CHECK_NULL(temp_attr, exit(-1));
04184 temp_attr->mc_platform = g_mc_platform;
04185
04186 Ch_VaStart(interp, ap, varg);
04187 id = Ch_VaArg(interp, ap, int );
04188 retval = MC_SemaphorePost(temp_attr, id);
04189 Ch_VaEnd(interp, ap);
04190 free(temp_attr);
04191 return retval;
04192 }
04193
04194
04195 EXPORTCH int
04196 MC_SemaphoreWait_chdl(void *varg)
04197 {
04198 MCAgency_t temp_attr;
04199 extern mc_platform_p g_mc_platform;
04200
04201 ChInterp_t interp;
04202 ChVaList_t ap;
04203 int id;
04204 int retval;
04205
04206 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04207 CHECK_NULL(temp_attr, exit(-1));
04208 temp_attr->mc_platform = g_mc_platform;
04209
04210 Ch_VaStart(interp, ap, varg);
04211 id = Ch_VaArg(interp, ap, int );
04212 retval = MC_SemaphoreWait(temp_attr, id);
04213 Ch_VaEnd(interp, ap);
04214 free(temp_attr);
04215 return retval;
04216 }
04217
04218
04219 EXPORTCH int
04220 MC_SendAgentMigrationMessage_chdl(void *varg)
04221 {
04222 MCAgency_t temp_attr;
04223 extern mc_platform_p g_mc_platform;
04224 const char *message, *hostname;
04225 int port, retval;
04226 ChInterp_t interp;
04227 ChVaList_t ap;
04228
04229 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04230 CHECK_NULL(temp_attr, exit(-1));
04231 temp_attr->mc_platform = g_mc_platform;
04232
04233 Ch_VaStart(interp, ap, varg);
04234 message = Ch_VaArg(interp, ap, char *);
04235 hostname = Ch_VaArg(interp, ap, char *);
04236 port = Ch_VaArg(interp, ap, int);
04237 retval = MC_SendAgentMigrationMessage(temp_attr, message, hostname, port);
04238 Ch_VaEnd(interp, ap);
04239 free(temp_attr);
04240 return retval;
04241 }
04242
04243
04244 EXPORTCH int
04245 MC_SendAgentMigrationMessageFile_chdl(void *varg)
04246 {
04247 MCAgency_t temp_attr;
04248 char *filename, *hostname;
04249 int port, retval;
04250 ChInterp_t interp;
04251 ChVaList_t ap;
04252
04253 temp_attr = NULL;
04254
04255 Ch_VaStart(interp, ap, varg);
04256 filename = Ch_VaArg(interp, ap, char *);
04257 hostname = Ch_VaArg(interp, ap, char *);
04258 port = Ch_VaArg(interp, ap, int);
04259 retval = MC_SendAgentMigrationMessageFile(temp_attr, filename, hostname, port);
04260 Ch_VaEnd(interp, ap);
04261 return retval;
04262 }
04263
04264 EXPORTCH int
04265 MC_SendSteerCommand_chdl(void *varg)
04266 {
04267 MCAgency_t temp_attr;
04268 int retval;
04269 enum MC_SteerCommand_e command;
04270 extern mc_platform_p g_mc_platform;
04271 ChInterp_t interp;
04272 ChVaList_t ap;
04273
04274 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04275 CHECK_NULL(temp_attr, exit(-1));
04276 temp_attr->mc_platform = g_mc_platform;
04277
04278 Ch_VaStart(interp, ap, varg);
04279 command = Ch_VaArg(interp, ap, enum MC_SteerCommand_e );
04280 retval = MC_SendSteerCommand(temp_attr, command);
04281 Ch_VaEnd(interp, ap);
04282 free(temp_attr);
04283 return retval;
04284 }
04285
04286
04287 EXPORTCH int
04288 MC_SetAgentStatus_chdl(void *varg)
04289 {
04290 MCAgent_t agent;
04291 int status;
04292 int ret;
04293 ChInterp_t interp;
04294 ChVaList_t ap;
04295
04296 Ch_VaStart(interp, ap, varg);
04297 agent = Ch_VaArg(interp, ap, MCAgent_t);
04298 status = Ch_VaArg(interp, ap, int);
04299 ret = MC_SetAgentStatus(agent, (enum MC_AgentStatus_e) status);
04300 Ch_VaEnd(interp, ap);
04301 return ret;
04302 }
04303
04304
04305 EXPORTCH int
04306 MC_SetDefaultAgentStatus_chdl(void *varg)
04307 {
04308 MCAgency_t temp_attr;
04309 extern mc_platform_p g_mc_platform;
04310 int status;
04311 int ret;
04312 ChInterp_t interp;
04313 ChVaList_t ap;
04314
04315 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04316 CHECK_NULL(temp_attr, exit(1););
04317 temp_attr->mc_platform = g_mc_platform;
04318
04319 Ch_VaStart(interp, ap, varg);
04320 status = Ch_VaArg(interp, ap, int);
04321 ret = (int)MC_SetDefaultAgentStatus(temp_attr, (enum MC_AgentStatus_e)status);
04322 Ch_VaEnd(interp, ap);
04323 free(temp_attr);
04324 return ret;
04325 }
04326
04327
04328 EXPORTCH int
04329 MC_SyncDelete_chdl(void *varg)
04330 {
04331 MCAgency_t temp_attr;
04332 extern mc_platform_p g_mc_platform;
04333 int retval;
04334 ChInterp_t interp;
04335 ChVaList_t ap;
04336 int id;
04337
04338 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04339 CHECK_NULL(temp_attr, exit(-1));
04340 temp_attr->mc_platform = g_mc_platform;
04341
04342 Ch_VaStart(interp, ap, varg);
04343 id = Ch_VaArg(interp, ap, int);
04344 retval = MC_SyncDelete(temp_attr, id);
04345 Ch_VaEnd(interp, ap);
04346 free(temp_attr);
04347 return retval;
04348 }
04349
04350
04351 EXPORTCH int
04352 MC_SyncInit_chdl(void *varg)
04353 {
04354 MCAgency_t temp_attr;
04355 extern mc_platform_p g_mc_platform;
04356 int retval;
04357 ChInterp_t interp;
04358 ChVaList_t ap;
04359 int id;
04360
04361 temp_attr = (MCAgency_t)malloc(sizeof(struct agency_s));
04362 CHECK_NULL(temp_attr, exit(-1));
04363 temp_attr->mc_platform = g_mc_platform;
04364
04365 Ch_VaStart(interp, ap, varg);
04366 id = Ch_VaArg(interp, ap, int);
04367
04368 retval = MC_SyncInit(temp_attr, id);
04369 Ch_VaEnd(interp, ap);
04370 free(temp_attr);
04371 return retval;
04372 }
04373
04374
04375 EXPORTCH int
04376 MC_TerminateAgent_chdl(void *varg)
04377 {
04378 ChInterp_t interp;
04379 ChVaList_t ap;
04380 const char* agentName;
04381 MCAgent_t agent;
04382 int retval;
04383
04384 Ch_VaStart(interp, ap, varg);
04385 agentName = Ch_VaArg(interp, ap, const char*);
04386 agent = MC_FindAgentByName(NULL, agentName);
04387 if (agent == NULL) {
04388 return MC_ERR_NOT_FOUND;
04389 }
04390 retval = MC_TerminateAgent(agent);
04391 Ch_VaEnd(interp, ap);
04392 return retval;
04393 }
04394
04395
04396 EXPORTCH int
04397 MC_TerminateAgentWG_chdl(void *varg)
04398 {
04399 ChInterp_t interp;
04400 ChVaList_t ap;
04401 const char* agentName;
04402 MCAgent_t calling_agent;
04403 MCAgent_t agent;
04404 int retval;
04405
04406 Ch_VaStart(interp, ap, varg);
04407 calling_agent = Ch_VaArg(interp, ap, MCAgent_t);
04408 agentName = Ch_VaArg(interp, ap, const char*);
04409 agent = MC_FindAgentByName(NULL, agentName);
04410 if (agent == NULL) {
04411 return MC_ERR_NOT_FOUND;
04412 }
04413 retval = MC_TerminateAgentWG(calling_agent, agent);
04414 Ch_VaEnd(interp, ap);
04415 return retval;
04416 }