Example #1
0
		virtual int execute(const string &command, ParameterList &params, unsigned int phase)
		{
			if (command == "-i" || command == "--input") {
				if (params.size()==0) {
					cerr << "Warning: " << command << " needs a file path to follow. Ignoring." << endl;
					return 0;
				} else {
					getInputPath() = params[0];
					params.erase(params.begin());
					return 0;
				}
			} else if (command == "-o" || command == "--output") {
				if (params.size()==0) {
					cerr << "Warning: " << command << " needs a file path to follow. Ignoring." << endl;
					return 0;
				} else {
					getOutputPath() = params[0];
					params.erase(params.begin());
					return 0;
				}
			} else if (command == "-c" || command == "--convert") {
				if (params.size() < 3) {
					cerr << "Fatal: " << command << " needs three arguments:\n"
						 << "\tmesher <...> " << command << " {XMesh|BFXM|Wavefront} (XMesh|BFXM|Wafefront|Ogre) (create|append|optimize)\n"
						 << "\n"
						 << "Do \"mesher --help convert\" for details" << endl;
					return 1;
				} else {
					if (phase == 0) {
						// Do nothing in phase 0.
						return 0;
					} else if (phase == 1) {
						ConversionImplList& registry = getRegistry();
						ConversionImpl::RetCodeEnum rc = ConversionImpl::RC_NOT_IMPLEMENTED;
						for (ConversionImplList::iterator cit=registry.begin(); (rc == ConversionImpl::RC_NOT_IMPLEMENTED)&&(cit!=registry.end()); ++cit) {
							rc = cit->second->convert(params[0],params[1],params[2]);
						}
						if (rc == ConversionImpl::RC_NOT_IMPLEMENTED) {
							cerr << "Error: " << params[2] << " from " << params[0] << " to " << params[1] << " unimplemneted" << endl;
							return ConversionImpl::RC_NOT_IMPLEMENTED;
						} else if (rc == ConversionImpl::RC_OK) {
							params.erase(params.begin(),params.begin()+3);
							return ConversionImpl::RC_OK;
						} else {
							cerr << "Error: ";
							switch (rc) {
							case ConversionImpl::RC_INVALID_PARAMS: 
								cerr << "Invalid parameters specified for " << command; 
								break;
							case ConversionImpl::RC_INVALID_INPUT:  
								cerr << "Invalid input"; 
								break;
							case ConversionImpl::RC_INTERNAL_ERROR: 
								cerr << "Internal error"; 
								break;
							default:                
								cerr << "(see above messages)"; 
								break;
							}
							cerr << endl;
							return rc;
						}
					} else {
						cerr << "Warning: ConvertHandler::execute(): received an unexpected phase. Ignoring." << endl;
						return 0;
					}
				}
			} else if (command.length()>2 && command[0]=='-' && command[1]!='-') {
				string::size_type eq = command.rfind('=');
				string::size_type nn = ((eq==string::npos)?string::npos:eq-1);
				string option = command.substr(1,nn);
				if (mOptions.count(option)) {				
					string value  = ((eq!=string::npos)?command.substr(eq+1):string("1"));
					AliasList::const_iterator ait = mAliases.find(option);
					if (ait != mAliases.end())
						option = ait->second;
					getNamedOption(option) = value;
					return 0;
				} else {
					cerr << "Fatal: Internal error - ConvertHandler::execute() received an unrecognized option" << endl;
					return 1;
				}
			} else {
				cerr << "Fatal: Internal error - ConvertHandler::execute() received an unrecognized command" << endl;
				return 1;
			}
		}