[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:43:12 UTC 2017


Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=dc77e08

The following commit has been merged in the master branch:
commit dc77e086707157a7ab8d27b5f0428d653d40569b
Author: Robin Mills <robin at clanmills.com>
Date:   Thu Jul 19 06:46:45 2012 +0000

    Work in progress.  Adding time parser and other plumbing.
---
 samples/geotag.cpp | 358 +++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 303 insertions(+), 55 deletions(-)

diff --git a/samples/geotag.cpp b/samples/geotag.cpp
index 8876027..4609974 100644
--- a/samples/geotag.cpp
+++ b/samples/geotag.cpp
@@ -9,13 +9,19 @@
 #include <iomanip>
 #include <cassert>
 
-#include <sys/types.h>
 #include <stdio.h>
+#include <sys/types.h>
+#include <time.h>
+#include <string.h>
+
 #include "expat.h"
 
 #include <vector>
 #include <string>
 
+//using namespace Exiv2;
+using namespace std;
+
 typedef std::vector<std::string> strings_t ;
 
 #ifndef  lengthof
@@ -40,41 +46,171 @@ enum
 ,	typeImage	  = 2
 ,	typeXML		  = 3
 ,	typeFile      = 4
+,	typeMax		  = 5
+};
+
+enum                   		// keyword indices
+{	kwHELP = 0
+,	kwARGS
+,	kwVERSION
+,   kwNOCR
+,   kwUNSPACE
+,   kwCLOSE
+,	kwOPEN
+,	kwEND1
+,	kwEND2
+,   kwSLEEP
+,   kwT1
+,	kwT2
+, 	kwSPEED
+, 	kwSEND
+, 	kwOUTPUT
+,   kwMAX          			// manages keyword array
+,	kwNEEDVALUE				// bogus keywords for error reporting
+,   kwSYNTAX				// -- ditto --
+,   kwNOVALUE = -kwCLOSE	// keywords <= kwNOVALUE are flags (no value needed)
+};
+
+enum
+{	resultOK=0
+,	resultSyntaxError
+,	resultSelectFailed
+,	resultOpenFailed
+,	resultTimeout
 };
-static const char* types[]  = { "unknown" , "directory" ,  "image" , "xml" ,"file" };
+
+time_t parseTime(const char* arg)
+{
+	time_t result = 0 ;
+	try {
+		//559 rmills at rmills-imac:~/bin $ exiv2 -pa ~/R.jpg | grep -i date
+		//Exif.Image.DateTime                          Ascii      20  2009:08:03 08:58:57
+		//Exif.Photo.DateTimeOriginal                  Ascii      20  2009:08:03 08:58:57
+		//Exif.Photo.DateTimeDigitized                 Ascii      20  2009:08:03 08:58:57
+		//Exif.GPSInfo.GPSDateStamp                    Ascii      21  2009-08-03T15:58:57Z
+
+		// <time>2012-07-14T17:33:16Z</time>
+
+		if ( strstr(arg,":") || strstr(arg,"-") ) {
+			int  YY,MM,DD,HH,mm,SS ;
+			char a,b,c,d,e   ;
+			sscanf(arg,"%d%c%d%c%d%c%d%c%d%c%d",&YY,&a,&MM,&b,&DD,&c,&HH,&d,&mm,&e,&SS);
+			
+			struct tm T;
+	#if 0
+			int tm_sec;     /* seconds (0 - 60) */
+			int tm_min;     /* minutes (0 - 59) */
+			int tm_hour;    /* hours (0 - 23) */
+			int tm_mday;    /* day of month (1 - 31) */
+			int tm_mon;     /* month of year (0 - 11) */
+			int tm_year;    /* year - 1900 */
+			int tm_wday;    /* day of week (Sunday = 0) */
+			int tm_yday;    /* day of year (0 - 365) */
+			int tm_isdst;   /* is summer time in effect? */
+			char *tm_zone;  /* abbreviation of timezone name */
+			long tm_gmtoff; /* offset from UTC in seconds */
+	#endif
+			memset(&T,sizeof(T),0);
+			T.tm_min  = mm  ;
+			T.tm_hour = HH  ;
+			T.tm_sec  = SS  ;
+			T.tm_year = YY -1900 ;
+			T.tm_mon  = MM -1    ;
+			T.tm_mday = DD  ;
+			result = mktime(&T);
+		}
+	} catch ( ... ) {};
+	return result ;
+}
 
 class UserData
 {
 public:
-	         UserData() : indent(0),count(0) {};
+	         UserData() : indent(0),count(0),nTrkpt(0),bTime(false),bEle(false)  {};
 	virtual ~UserData() {} ;
 
 //  public data members
 	int    indent;
 	size_t count ;
+	int    nTrkpt;
+	bool   bTime ;
+	bool   bEle  ;
+	double ele;
+	double lat;
+	double lon;
+	time_t t;
 };
- 	
-static void startElement(void* userData, const char* name, const char** /*atts*/ )
+
+static void startElement(void* userData, const char* name, const char** atts )
 {
 	UserData* me = (UserData*) userData;
-	for ( int i = 0 ; i < me->indent ; i++ ) printf(" ");
-	printf("begin %s
",name);
+	//for ( int i = 0 ; i < me->indent ; i++ ) printf(" ");
+	//printf("begin %s
",name);
+	me->bTime = strcmp(name,"time")==0;
+	me->bEle  = strcmp(name,"ele")==0;
+
+	if ( strcmp(name,"trkpt")==0 ) {
+		me->nTrkpt++;
+		while ( *atts ) {
+			const char* a=atts[0];
+			const char* v=atts[1];
+			if ( !strcmp(a,"lat") ) me->lon = atof(v);
+			if ( !strcmp(a,"lon") ) me->lat = atof(v);
+			atts += 2 ;
+		}
+	}
 	me->count++  ;
 	me->indent++ ;
 }
+
 static void endElement(void* userData, const char* name)
 {
 	UserData* me = (UserData*) userData;
 	me->indent-- ;
-	for ( int i = 0 ; i < me->indent ; i++ ) printf(" ");
-	printf("end %s
",name);
+	if ( strcmp(name,"trkpt")==0 ) {
+		me->nTrkpt--;
+		printf("lat,lon = %f,%f ele = %f time = %ld %s",me->lat,me->lon,me->ele,(long int)me->t,"
"); // asctime(localtime(&me->t)) ) ; 
+	}
+	//for ( int i = 0 ; i < me->indent ; i++ ) printf(" ");
+	//printf("end %s
",name);
 }
 
+void charHandler(void* userData,const char* s,int len)
+{
+	UserData* me = (UserData*) userData;
 
-bool readDir(char* path,strings_t& paths)
+	if ( me->nTrkpt == 1 ) {
+		char buffer[100];
+		int  l_max = 98 ; // lengthof(buffer) -2 ;
+
+		if ( me->bTime && len > 5 ) {
+			if ( len < l_max ) {
+				memcpy(buffer,s,len);
+				buffer[len]=0;
+				char* b = buffer ;
+				while ( *b == ' ' && b < buffer+len ) b++ ;
+				me->t = parseTime(b);
+			}
+			me->bTime=false;
+		}
+		if ( me->bEle && len > 5 ) {
+			if ( len < l_max ) {
+				memcpy(buffer,s,len);
+				buffer[len]=0;
+				char* b = buffer ;
+				while ( *b == ' ' && b < buffer+len ) b++ ;
+				me->ele = atof(b);
+			}
+			me->bEle=false;
+		}
+	}
+}
+
+bool readDir(const char* path,size_t& count)
 {
-	paths.empty();
+	strings_t files;
 	bool bResult = false;
+
 #ifdef _MSC_VER
 	DWORD attrs    =  GetFileAttributes(path);
 	bool  bOKAttrs =  attrs != INVALID_FILE_ATTRIBUTES;
@@ -99,11 +235,11 @@ bool readDir(char* path,strings_t& paths)
 				}
 				else
 				{
-					paths.push_back( std::string(ffd.cFileName));
+					files.push_back( std::string(ffd.cFileName));
 					printf("-> %s
",ffd.cFileName);
 				}
 				bGo = FindNextFile(hFind, &ffd) != 0;
-			} 
+			}
 			CloseHandle(hFind);
 		}
 	}
@@ -118,15 +254,16 @@ bool readDir(char* path,strings_t& paths)
 		while ((ent = readdir (dir)) != NULL)
 		{
 			printf ("%s
", ent->d_name);
-			paths.push_back(std::string(ent->d_name)) ;
+			files.push_back(std::string(ent->d_name)) ;
 		}
 		closedir (dir);
 	}
 #endif
+	count = files.size();
 	return bResult ;
 }
 
-bool readXML(char* path,size_t& count)
+bool readXML(const char* path,size_t& count)
 {
 	FILE*		f		= fopen(path,"r");
 	XML_Parser	parser	= XML_ParserCreate(NULL);
@@ -135,9 +272,10 @@ bool readXML(char* path,size_t& count)
 		char   buffer[8*1024];
 		UserData me ;
 
-		XML_SetUserData(parser, &me);
-		XML_SetElementHandler(parser, startElement, endElement);
-		
+		XML_SetUserData            (parser, &me);
+		XML_SetElementHandler      (parser, startElement, endElement);
+		XML_SetCharacterDataHandler(parser,charHandler);
+
 		// a little sip at the data
 		size_t len = fread(buffer,1,sizeof(buffer),f);
 		const char* lead   = "<?xml" ;
@@ -145,13 +283,13 @@ bool readXML(char* path,size_t& count)
 
 		// swallow it
 		if ( bResult ) {
-			bResult = XML_Parse(parser, buffer,(int)len, len == 0 ) == XML_STATUS_OK; 
+			bResult = XML_Parse(parser, buffer,(int)len, len == 0 ) == XML_STATUS_OK;
 		}
 
 		// drink the rest of the file
 		while ( bResult && !feof(f) ) {
 			len = fread(buffer,1,sizeof(buffer),f);
-			bResult = XML_Parse(parser, buffer,(int)len, len == 0 ) == XML_STATUS_OK; 
+			bResult = XML_Parse(parser, buffer,(int)len, len == 0 ) == XML_STATUS_OK;
 		};
 		count = me.count ;
 	}
@@ -162,7 +300,62 @@ bool readXML(char* path,size_t& count)
 	return bResult ;
 }
 
-bool readFile(char* path,size_t& count)
+bool readImage(const char* path,size_t& count)
+{
+	using namespace Exiv2;
+	bool bResult = false ;
+	count = 0 ;
+
+	try {
+		Image::AutoPtr image = ImageFactory::open(path);
+		if ( image.get() ) {
+			image->readMetadata();
+			ExifData &exifData = image->exifData();
+			if ( !exifData.empty() ) {
+				bResult = true ;
+				count   = exifData.count();
+			}
+
+		}
+	} catch (Exiv2::Error& ) {};
+	return bResult ;
+}
+
+// Exif.Image.DateTime                          Ascii      20  2012:07:15 16:51:01
+// Exif.Photo.DateTimeOriginal                  Ascii      20  2012:07:15 12:57:31
+// Exif.Photo.DateTimeDigitized                 Ascii      20  2012:07:15 12:57:31
+
+time_t readImageTime(const char* path)
+{
+	using namespace Exiv2;
+
+	time_t       result       = 0 ;
+	
+	const char* dateStrings[] = 
+	{ "Exif.Photo.DateTimeOriginal"
+	, "Exif.Photo.DateTimeDigitized" 
+	, "Exif.Image.DateTime"
+	, NULL
+	};
+	const char* ds            = dateStrings[0] ;
+
+	while ( !result && ds++  ) {
+		try {
+			Image::AutoPtr image = ImageFactory::open(path);
+			if ( image.get() ) {
+				image->readMetadata();
+				ExifData &exifData = image->exifData();
+			//	printf("%s => %s
",(ds-1), exifData[ds-1].toString().c_str());
+				result = parseTime(exifData[ds-1].toString().c_str());
+			}
+		} catch ( ... ) {};
+	}
+	return result ;
+}
+
+
+
+bool readFile(const char* path,size_t& count)
 {
 	FILE*		f		= fopen(path,"r");
 	bool bResult		= f ? true : false;
@@ -175,6 +368,15 @@ bool readFile(char* path,size_t& count)
 	return bResult ;
 }
 
+int getFileType(const char* path,size_t& count)
+{
+	return readXML  (path,count) ? typeXML
+		:  readDir  (path,count) ? typeDirectory
+		:  readImage(path,count) ? typeImage
+		:  readFile (path,count) ? typeFile
+		:  typeUnknown
+		;
+}
 
 int main(int argc, char* const argv[])
 {
@@ -182,45 +384,91 @@ int main(int argc, char* const argv[])
         std::cout << "Usage: " << argv[0] << " arg+
";
         return 1;
     }
-	
-	for ( int i = 1 ; i < argc ; i++ ) {
-		char* arg = argv[i];
-		size_t count = 0 ;
-		int fileType = typeUnknown ;
-
-		if ( fileType == typeUnknown ) {
-			if ( readXML(arg,count) ) {
-				if ( count ) fileType = typeXML ;
-			}
-		}
 
-		if ( fileType == typeUnknown ) {
-			strings_t files ;
-			if ( readDir(arg,files) ) {
-				fileType = typeDirectory ;
-				count = files.size();
+#if 0
+	char const* keywords[kwMAX];
+	memset(keywords,0,sizeof(keywords));
+	keywords[kwHELP] 	= "help";
+	keywords[kwVERSION] = "version";
+	keywords[kwARGS]    = "args";
+	keywords[kwNOCR] 	= "nocr";
+	keywords[kwUNSPACE] = "unspace";
+	keywords[kwCLOSE] 	= "close";
+	keywords[kwOPEN] 	= "open";
+	keywords[kwEND1] 	= "end1";
+	keywords[kwEND2] 	= "end2";
+	keywords[kwSLEEP] 	= "sleep";
+	keywords[kwT1]		= "t1";
+	keywords[kwT2]		= "t2";
+	keywords[kwSPEED] 	= "speed";
+	keywords[kwSEND] 	= "send";
+	keywords[kwOUTPUT] 	= "output";
+
+	if ( argc < 2 ) help(program,keywords,kwMAX) ;
+
+	for ( int a = 0 ; !result && a < 2 ; a++ ) { // a = 0 is a dry run
+		options	options ;
+		for ( int i = 1 ; !result && i < argc ; i++ ) {
+			const char* arg   = argv[i++];
+			const char* value = argv[i  ];
+			int        ivalue = atoi(value?value:"0");
+			int         key   = find(arg,keywords,kwMAX);
+			int         needv = key < kwMAX && key > (-kwNOVALUE);
+
+			if (!needv ) i--;
+			if ( needv && !value ) key = kwNEEDVALUE;
+			if ( arg[0] != '-'   ) key = kwSYNTAX;
+
+			switch ( key ) {
+				case kwHELP 	: if ( a ) { /* help(program,keywords,kwMAX)               ; */ } break;
+				case kwARGS 	: if ( a ) { /* args(argv,argc)							   ; */ } break;
+				case kwVERSION 	: if ( a ) { /* version(program)   			               ; */ } break;
+				case kwNOCR 	: if ( a ) { /* options.bNOCR=true	   			           ; */ } break;
+				case kwUNSPACE 	: if ( a ) { /* options.bUnspace=true			           ; */ } break;
+				case kwCLOSE 	: if ( a ) { /* modem_close(options) 	                   ; */ } break;
+				case kwOPEN 	: if ( a ) { /* options.open = value                       ; }*/  break ;
+				case kwEND1 	: if ( a ) { /* options.end1=value	   			           ; */ } break;
+				case kwEND2 	: if ( a ) { /* options.end2=value	   			           ; */ } break;
+				case kwSLEEP	: if ( a ) { /* sleep(ivalue)                              ; }*/  break ;
+				case kwT1 		: if ( a ) { /* options.t1=ivalue 				           ; }*/  break ;
+				case kwT2		: if ( a ) { /* options.t2=ivalue					       ; */ } break;
+				case kwSPEED	: if ( a ) { /* options.speed=ivalue			           ; }*/  break ;
+/*
+				case kwSEND 	: if ( a )
+				{
+					result=modem_send(value,options);
+					if ( result == resultTimeout && options.t2 > 0 )
+						result = modem_send(value,options,true);
+				} break ;
+				case kwOUTPUT 	: if ( a ) { printf("%s",value) ;						; } break ;
+*/
+				case kwNEEDVALUE: fprintf(stderr,"error: %s requires a value
",arg); result = resultSyntaxError ; break ;
+				default 		: fprintf(stderr,"error: illegal syntax %s
",arg)  ; result = resultSyntaxError ; break ;
 			}
+			if ( a ) fflush(stdout);
+			// if ( options.fd < -1 ) result = resultOpenFailed ;
 		}
-		
-		if ( fileType == typeUnknown ) try {
-			Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(arg);
-			if ( image.get() ) {
-				Exiv2::ExifData &exifData = image->exifData();
-				image->readMetadata();
-				if ( !exifData.empty() ) {
-					fileType = typeImage ;
-					count = exifData.count();
-				}
-			} 
-		} catch (Exiv2::Error& ) {};
+	}
+#endif
 
-		if ( fileType == typeUnknown ) {
-			if ( readFile(arg,count) ) {
-				if ( count ) fileType = typeFile ;
-			}
-		} 
+	const char* types[typeMax];
+	types[typeUnknown  ] = "unknown";
+	types[typeDirectory] = "directory";
+	types[typeImage    ] = "image";
+	types[typeXML      ] = "xml";
+	types[typeFile     ] = "file";
 
-		printf("arg:%s type:%s count:%d
",arg,types[fileType],count); ;
+	for ( int i = 1 ; i < argc ; i++ ) {
+		char* arg = argv[i];
+		size_t count = 0   ;
+		time_t t     = 0   ;
+		int   type   = getFileType(arg,count) ;
+		printf("%s %s %d",arg,types[type],count) ;
+		if ( type == typeImage ) {
+			t = readImageTime(arg) ;
+			if ( t ) printf(" %ld ",(long int)t);
+		}
+		puts(t ? asctime(localtime(&t)) : "" );
 	}
 
     return 0;

-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list