summaryrefslogtreecommitdiff
path: root/samples/source/xmpcommand/XMPCommand.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'samples/source/xmpcommand/XMPCommand.cpp')
-rw-r--r--samples/source/xmpcommand/XMPCommand.cpp213
1 files changed, 213 insertions, 0 deletions
diff --git a/samples/source/xmpcommand/XMPCommand.cpp b/samples/source/xmpcommand/XMPCommand.cpp
new file mode 100644
index 0000000..a89904c
--- /dev/null
+++ b/samples/source/xmpcommand/XMPCommand.cpp
@@ -0,0 +1,213 @@
+// =================================================================================================
+// Copyright 2005 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+/**
+* A command-line tool for performing basic XMP actions such as get, put and dump. Can be used for testing
+* and scripting automation.
+*/
+#ifdef WIN32
+ #pragma warning ( disable : 4267 ) // suppress string conversion warning
+#endif
+
+#include <stdexcept>
+#include <iostream>
+#include <string>
+#include <vector>
+#include <sstream>
+
+//some global constants / sanity checking
+#include "globals.h"
+
+#define EXENAME "xmpcommand"
+
+//XMP related
+#define TXMP_STRING_TYPE std::string
+#define XMP_INCLUDE_XMPFILES 1
+#include "XMP.hpp"
+#include "XMP.incl_cpp" //include in EXACTLY one source file (i.e. main, in Action gets you trouble...)
+
+//QE related
+#include "Actions.h"
+#include "Log.h"
+#include "LargeFileAccess.hpp"
+// -help output
+#include "PrintUsage.h"
+
+
+namespace XMPQE {
+ void InitDependencies()
+ {
+ if ( ! SXMPMeta::Initialize() )
+ Log::error( "XMPMeta::Initialize failed!" );
+
+ XMP_OptionBits options = 0;
+ #if UNIX_ENV
+ options |= kXMPFiles_ServerMode;
+ #endif
+
+ if ( ! SXMPFiles::Initialize ( options ) )
+ Log::error( "XMPFiles::Initialize failed!" );
+ }
+
+ void ShutdownDependencies()
+ {
+ SXMPFiles::Terminate();
+ SXMPMeta::Terminate();
+ }
+} //namespace XMPQE
+
+using namespace XMPQE;
+
+int main ( int argc, const char * argv[] )
+{
+ Actions action; //create Action (to fill up with parameters below...)
+
+ // ============================================================================================
+ // ============================================================================================
+ // ============================================================================================
+ try { // on try for all
+
+ //clean parameters (this is not elegant but might avoid some macPPC-side bus error bugs whatsoever
+ action.outfile="";
+ action.switch_safe=false;
+ action.switch_smart=false;
+ action.switch_scan=false;
+ action.switch_nocheck=false;
+ action.switch_compact=false;
+ action.mediafile="";
+ action.actiontype=Actions::NONE;
+ action.xmpsnippet="";
+
+ ////////////////////////////////////////////
+ // parameter verification
+ if ( argc == 1 ) { //aka no parameters, just command itself.
+ XMPQE::PrintUsageShort(EXENAME);
+ return 0;
+ } else if ( argc == 2 ) //single-paramter-call?
+ {
+ if ( !strcmp("help",argv[1]) || //only "help" and "version" permitted, ...
+ !strcmp("-help",argv[1]) ||
+ !strcmp("--help",argv[1]) ||
+ !strcmp("-h",argv[1]) ||
+ !strcmp("-?",argv[1]) ||
+ !strcmp("/?",argv[1]) ) {
+ XMPQE::PrintUsageLong(EXENAME);
+ return 0;
+ }
+ else if ( !strcmp("-version",argv[1]) || !strcmp("version",argv[1]) )
+ {
+ action.actiontype=Actions::VERSION;
+ }
+ else
+ { //..thus fail anything else
+ Log::error("unknown parameter %s",argv[1]);
+ }
+
+ }
+ else //multi-argument parameters
+ {
+ int i=1; // "for (int i=1;i<argc;i++)" ....
+
+ while (true) {
+ if (argv[i][0] != '-') {
+ break; //apparently done parsing switches
+ }
+ if ( !strcmp("-safe",argv[i])) {
+ action.switch_safe=true;
+ }
+ else if ( !strcmp("-smart",argv[i])) {
+ action.switch_smart=true;
+ }
+ else if ( !strcmp("-nocheck",argv[i])) {
+ action.switch_nocheck=true;
+ }
+ else if ( !strcmp("-compact",argv[i])) {
+ action.switch_compact=true;
+ }
+ else if ( !strcmp("-scan",argv[i])) {
+ action.switch_scan=true;
+ } else if ( !strcmp("-out",argv[i])) {
+ i++; //ok, so gimme that file
+ if (i>=argc) Log::error("missing output parameter, etc.");
+ action.outfile=argv[i];
+ } else
+ Log::error("unknown switch %s",argv[i]);
+ i++;
+ if (i>=argc) Log::error("missing action parameter, etc.");
+ }
+
+ //check mutually exclusive
+ if (action.switch_scan && action.switch_smart)
+ Log::error("use either -smart or -scan");
+
+ if ( !strcmp("info",argv[i])) {
+ action.actiontype= Actions::INFO;
+ } else if ( !strcmp("put",argv[i]) || !strcmp("inject",argv[i]) ) {
+ action.actiontype= Actions::PUT;
+ } else if ( !strcmp("get",argv[i]) || !strcmp("extract",argv[i]) ) {
+ action.actiontype= Actions::GET;
+ } else if ( !strcmp("dump",argv[i])) {
+ action.actiontype= Actions::DUMP;
+ } else
+ Log::error("_unknown action %s",argv[i]);
+ i++;
+
+ //only inject needs an in-file parameter really...
+ if ( action.actiontype== Actions::PUT) {
+ if (i>=argc) Log::error("missing <xmpfile> parameter");
+ action.xmpsnippet=argv[i];
+ i++;
+ }
+
+ //last argument must be mediafile
+ if (i>=argc) Log::error("missing mediafile parameter");
+ action.mediafile=argv[i];
+
+ i++;
+ if (i!=argc) Log::error("too many parameters.");
+ }
+
+ //Init ===========================================================================
+ InitDependencies();
+
+ //Do Action //////////////////
+ Log log(action.outfile.c_str()); //will start logging to file (if filename given) or not ("")
+ action.doAction();
+
+ // Shutdown /////////////////////////////////////////////
+ ShutdownDependencies();
+
+ }
+ catch (XMP_Error& e ) {
+ Log::info("Unexpected XMP_Error %s\n", e.GetErrMsg()); //throw no further, no Log::error.. !
+ return -2;
+ }
+ catch (LOG_Exception& q) {
+ Log::info("LOG_Exception:%s\n",q.what());
+ return -3;
+ }
+ catch (std::runtime_error& p) {
+ Log::info("caught std::runtime_error exception: %s\n",p.what());
+ return -4;
+ }
+ catch (...) {
+ Log::info("unidentified error on action execution\n");
+ return -5;
+ }
+
+ // ============================================================================================
+ // ============================================================================================
+ // ============================================================================================
+
+ if (Log::noErrorsOrWarnings)
+ return 0;
+ //else
+ Log::info("%s finished with warnings",EXENAME);
+ return 10;
+}
+