+/*\r
+ * ApplicationHandler.cxx\r
+ *\r
+ * Copyright 2006,2007 Martin Quinson, Malek Cherier \r
+ * All right reserved. \r
+ *\r
+ * This program is free software; you can redistribute \r
+ * it and/or modify it under the terms of the license \r
+ *(GNU LGPL) which comes with this package. \r
+ *\r
+ */\r
+ \r
+ /* ApplicationHandler member functions implementation.\r
+ */ \r
+\r
+\r
+#include <Object.hpp>\r
#include <ApplicationHandler.hpp>\r
\r
+#include <Process.hpp>\r
+#include <Host.hpp>\r
+\r
+\r
+\r
+\r
+\r
+#include <stdlib.h>\r
+\r
+#include <surf/surfxml_parse.h>\r
+#include <xbt/sysdep.h>\r
+\r
+\r
namespace SimGrid\r
{\r
namespace Msg\r
{\r
\r
- ApplicationHandler::ProcessFactory::processFactory = NULL;\r
+ ApplicationHandler::ProcessFactory* ApplicationHandler::processFactory = NULL;\r
\r
// Desable the default constructor, the copy constructor , the assignement operator\r
// and the destructor of this class. Assume that this class is static.\r
{\r
return *this;\r
}\r
- \r
+ \r
void ApplicationHandler::onStartDocument(void)\r
{\r
// instanciate the factory at the begining of the parsing\r
{\r
// release the handler at the end of the parsing.\r
if(processFactory)\r
- delete processFactroy;\r
+ delete processFactory;\r
}\r
\r
void ApplicationHandler::onBeginProcess(void)\r
\r
ApplicationHandler::ProcessFactory::ProcessFactory() \r
{\r
- this->args = xbt_dynar_new(sizeof(char*),ProcessFactory::freeCstr);\r
+ this->args = xbt_dynar_new(sizeof(char*),ApplicationHandler::ProcessFactory::freeCstr);\r
this->properties = NULL; // TODO instanciate the dictionary\r
this->hostName = NULL;\r
this->function = NULL;\r
- } \r
+ } \r
+\r
+ ApplicationHandler::ProcessFactory::~ProcessFactory()\r
+ {\r
+ xbt_dynar_free(&(this->args));\r
+ }\r
\r
// create the cxx process wrapper.\r
void ApplicationHandler::ProcessFactory::createProcess() \r
+ throw (ClassNotFoundException, HostNotFoundException)\r
{\r
- // dynamic creation of a instance fo the process from its name (which is specified by the element function\r
+ Host host;\r
+ Class* c;\r
+ Process* process;\r
+ \r
+ // try to dynamicaly create an instance fo the process from its name (which is specified by the element function\r
// in the xml application file.\r
- Process* process = (Process*)Class::fromName(this->function);\r
+ // if this static method fails, it throws an exception of the class ClassNotFoundException\r
+ c = Class::fromName(this->function);\r
+ process = reinterpret_cast<Process*>(c->createObject());\r
\r
- // retrieve the host of the process from its name\r
- Host host = Host::getByName(this->hostName);\r
+ // try to retrieve the host of the process from its name\r
+ // if this method fails, it throws an exception of the class HostNotFoundException\r
+ host = Host::getByName(this->hostName); \r
\r
// build the list of the arguments of the newly created process.\r
int argc = xbt_dynar_length(this->args);\r
\r
char** argv = (char**)calloc(argc, sizeof(char*));\r
\r
- for(int i = 0; i < argc; i++)\r
+ for(int i = argc -1; i >= 0; i--)\r
xbt_dynar_pop(this->args, &(argv[i]));\r
\r
// finaly create the process (for more detail on the process creation see Process::create()\r
this->properties = new Properties();*/\r
}\r
\r
- void ApplicationHandler::ProcessFactory::setProcessIdentity(const string& hostName, const string& function) \r
+ void ApplicationHandler::ProcessFactory::setProcessIdentity(const char* hostName, const char* function) \r
{\r
this->hostName = hostName;\r
this->function = function;\r
// callback function used by the dynamic array to cleanup all of its elements.\r
void ApplicationHandler::ProcessFactory::freeCstr(void* cstr)\r
{\r
- free(*(void**)str);\r
+ free(*(void**)cstr);\r
}\r
\r
void ApplicationHandler::ProcessFactory::registerProcessArg(const char* arg) \r
{\r
- char* cstr = strdup(arg);\r
+ char* cstr = _strdup(arg);\r
xbt_dynar_push(this->args, &cstr);\r
}\r
\r
// TODO implement this function; \r
}\r
\r
- const const char* ApplicationHandler::ProcessFactory::getHostName(void)\r
+ const char* ApplicationHandler::ProcessFactory::getHostName(void)\r
{\r
return this->hostName;\r
}\r
\r
} // namespace Msg\r
-} // namespace SimGrid
\ No newline at end of file
+} // namespace SimGrid\r
+\r