[Scummvm-cvs-logs] SF.net SVN: scummvm:[42702] tools/branches/gsoc2009-gui/example_tool.cpp
Remere at users.sourceforge.net
Remere at users.sourceforge.net
Fri Jul 24 22:41:37 CEST 2009
Revision: 42702
http://scummvm.svn.sourceforge.net/scummvm/?rev=42702&view=rev
Author: Remere
Date: 2009-07-24 20:41:37 +0000 (Fri, 24 Jul 2009)
Log Message:
-----------
*Added an example tool, which doesn't do much that makes sense but displays the features of the new system.
Added Paths:
-----------
tools/branches/gsoc2009-gui/example_tool.cpp
Added: tools/branches/gsoc2009-gui/example_tool.cpp
===================================================================
--- tools/branches/gsoc2009-gui/example_tool.cpp (rev 0)
+++ tools/branches/gsoc2009-gui/example_tool.cpp 2009-07-24 20:41:37 UTC (rev 42702)
@@ -0,0 +1,187 @@
+/* example_tool - A tool example, for hepling future coders (and current)
+ * Copyright (C) 2009 The ScummVM Team
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/* Example of a compression tool
+ * We require compression.h for the basic functions and utility classes
+ */
+#include "tool.h"
+
+// Some files we need...
+#include <sstream>
+
+// We inherit from Tool, for compression tools, use the 'CompressionTool'
+// Normally this declaration would be in the .h file
+
+class CompressionExample : public Tool {
+public:
+ // We pretty much always need a constructor
+ // It should not require any arguments passed
+ // We have a default value for name
+ CompressionExample(const std::string &name = "compress_example");
+
+ // Members should allows be public if they are set by command line parameters
+ // Since they need to be modified by the GUI / or other external applications
+ // that use us without having to construct a command line.
+ bool _outputFiles;
+
+ // We overload execute, which contains the actual code of the tool
+ virtual void execute();
+
+protected:
+ void parseExtraArguments();
+};
+
+/* Implementation of the contsructor
+ * We pass the name and type of this tool to the base class
+ * Since the name changes if we are run in standalone mode, we pass it along
+ */
+CompressionExample::CompressionExample(const std::string &name) : Tool(name, TOOLTYPE_EXTRACTION) {
+ // Initialize our own
+ _outputFiles = false;
+
+ // If we don't support all formats, we only specify a few here (support for all formats is default)
+ // This makes no sense for an extraction tool, only for to make an example
+ _supportedFormats = AUDIO_MP3;
+
+ // Should be true if we can display progress in an incremental fashion, if we don't progress will be indeterminate
+ // We can show progress, so set it to true!
+ _supportsProgressBar = true;
+
+ // Here, we specify input files we accept
+ // Note that all input files specified here are _mandatory_ as inputs, and are parsed in order
+ // We don't actually need to parse these inputs ourselves, they are filled in automatically by the interface
+ ToolInput input1;
+ input1.format = "*.tx1";
+ input1.description = "The first input example file.";
+ _inputPaths.push_back(input1);
+
+ ToolInput input2;
+ input2.format = "*.tx2";
+ input2.description = "The second input example file.";
+ _inputPaths.push_back(input2);
+
+ // If we output to a directory, we should specify it explicitly
+ _outputToDirectory = true;
+
+ // Text displayed to the user for help when running as CLI
+ // Note that this includes our own name
+ _helptext = "Usage: " + _name + " [compression params] [-o <outputdir>] [-a] <input.ex1> <input.ex2>\n" +
+ "Specify -a to produce actual output files (otherwise it's just simulation)\n";
+}
+
+void CompressionExample::parseExtraArguments() {
+ // Here, we parse our own arguments
+
+ // Arguments are stored in the _arguments member
+ // and the number of arguments already parsed is in _
+ if (_arguments.size() < _arguments_parsed) {
+ if (_arguments[_arguments_parsed] == "-a") {
+ // Set our member
+ _outputFiles = true;
+
+ // We matched one argument, make sure to advance argument counter
+ ++_arguments_parsed;
+ }
+ }
+}
+
+void CompressionExample::execute() {
+ // By now, all arguments have been parsed, all members setup and all input paths setup
+ // If this was a compression tool _format would contain the selected audio format
+ // Note that we almost need no error handling, since exceptions will be thrown if we do
+ // something bad, and all parameters have already been setup
+
+ // This 'tool' doesn't takes two input files
+ // It writes the of each file 100 times into X files, where X is the input file size.
+
+ // _inputPaths[0].path is always valid and contains the correct path, same for 1
+ Filename inpath1(_inputPaths[0].path);
+ Filename inpath2(_inputPaths[1].path);
+
+ // We always need to setup default output path, since there is no obligation to specify it
+ // If you don't do this, the OS will usually default to the working directory, if we output a file
+ // it will fail most likely
+ if(_outputPath.empty())
+ _outputPath = "output/";
+
+ // The File class is very similar to the FILE struct, look in util.h for details
+ File in1(inpath1, "r");
+ File in2(inpath2, "r");
+
+ // Read the complete contents of the files (if they don't contain NUL ofcourse)
+ std::string text1 = in1.readString();
+ std::string text2 = in2.readString();
+
+ // Start the 'extraction'
+ size_t total_files = in1.size() + in2.size();
+
+ // There has to be some roof on this
+ if (total_files > 1000)
+ throw ToolException("Input files are too large!");
+
+ for (size_t i = 0; i < total_files; ++i) {
+ // This updates any progress bar, if there is any
+ // if you don't support progress bars, you should use notifyProgress instead
+ // to make sure progress can be aborted (print calls notifyProgress internally)
+ updateProgress(i, total_files);
+
+ // Convert i to string
+ std::ostringstream outname;
+ outname << i;
+
+ // Open a file for writing
+ if(_outputFiles) {
+ File out(_outputPath.getPath() + outname.str() + ".exo", "w");
+
+ // What we actually do, output some text alot
+ for (size_t j = 0; j < 100; ++j) {
+ if (i < in1.size())
+ out.write(text1.c_str(), 1, text1.size());
+ else
+ out.write(text2.c_str(), 1, text2.size());
+ }
+ } else {
+ // Do nothing for awhile
+ for(int i = 0; i < 1000000; ++i) {
+ int *n = new int;
+ delete n;
+ }
+ }
+
+ // Print can also throw an AbortException
+ // Do NOT use printf or anything else that outputs to standard output, as it will not display in the GUI.
+ print("Outputted file %d of %d\n", i, total_files);
+ }
+
+ // We indicate success by not throwing any exceptions during the execution
+ print("Extraction finished without errors!");
+}
+
+
+
+
+
+
+
+
+
+
Property changes on: tools/branches/gsoc2009-gui/example_tool.cpp
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:keywords
+ Date Rev Author URL Id
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list