From 79721d04e0bee1370337a9c4815ca714fc67e4b6 Mon Sep 17 00:00:00 2001 From: Andreas Huggel Date: Wed, 29 Sep 2004 13:48:55 +0000 Subject: [PATCH] Move ExifKey to component tags, moved IptcKey to component datasets --- doc/exiv2.dot | 13 ++-- doc/exiv2.gif | Bin 25003 -> 24342 bytes doc/getting-started.html | 2 +- src/datasets.cpp | 79 +++++++++++++++++-- src/datasets.hpp | 86 ++++++++++++++++++++- src/exif.cpp | 156 +------------------------------------ src/exif.hpp | 97 +---------------------- src/iptc.cpp | 75 +----------------- src/iptc.hpp | 83 +------------------- src/tags.cpp | 161 +++++++++++++++++++++++++++++++++++++-- src/tags.hpp | 102 ++++++++++++++++++++++++- 11 files changed, 428 insertions(+), 426 deletions(-) diff --git a/doc/exiv2.dot b/doc/exiv2.dot index fb509c78..6ba98d53 100644 --- a/doc/exiv2.dot +++ b/doc/exiv2.dot @@ -3,7 +3,7 @@ # Brief Dot file for a graph showing the component dependencies # of the Exiv2 library. Run the following command to get the image: # $ dot -Tgif -oexiv2.gif exiv2.dot -# Version $Name: $ $Revision: 1.4 $ +# Version $Name: $ $Revision: 1.5 $ # Author Andreas Huggel (ahu) # ahuggel@gmx.net # Date 18-Feb-04, ahu: created @@ -15,8 +15,9 @@ L1 [shape=plaintext] ; L2 [shape=plaintext] ; L3 [shape=plaintext] ; L4 [shape=plaintext] ; +L5 [shape=plaintext] ; -"L4" -> "L3" -> "L2" -> "L1" [style=invis] ; +"L5" -> "L4" -> "L3" -> "L2" -> "L1" [style=invis] ; "exif" [shape=box] ; "iptc" [shape=box] ; @@ -30,11 +31,9 @@ L4 [shape=plaintext] ; "error" [shape=box] ; "makernote" [shape=box] ; -"exif" -> "metadatum" ; "exif" -> "tags" ; "exif" -> "makernote" ; "exif" -> "image" ; -"iptc" -> "metadatum" ; "iptc" -> "datasets" ; "iptc" -> "image" ; "metadatum" -> "value" ; @@ -44,10 +43,8 @@ L4 [shape=plaintext] ; "ifd" -> "error" ; "ifd" -> "types" ; "image" -> "types" ; -"tags" -> "error" ; -"tags" -> "value" ; -"datasets" -> "error" ; -"datasets" -> "value" ; +"tags" -> "metadatum"; +"datasets" -> "metadatum" ; "value" -> "types" ; { rank=same; L1 error types } diff --git a/doc/exiv2.gif b/doc/exiv2.gif index 7701ad402586dc2290dcaaee11a9f1807edfc1e5..3b604a116127049562c8134872a6d1122a4e83e3 100644 GIT binary patch literal 24342 zcmdsf4SZ8ow(m}wh9so*kVZ&Ly(ZE^3q?Z9M=RWCk|KoiVW%ic2e4JKVq_>FBGehv zHpH(E6RbDCRnx+Dp%pKX-Rl4H8y5vTMD^J=t(ZmlY`H z=Ct+*Goy;4l*IhDY_!rOW!D|0<~i8=x2cw|TDF>m4IkdK?E^!#%l_g-hc1B|VS}D- zjk*bK-?a+E#BD@>`mpwZEkT_`r^n&4pBpWPnaB1(exPB9S^R7d9a=8^vL!=TH&n0K z`kPffm%``g2ksa1KaQi77L;V^bvBRP5pYh{INOZ)vsCfOqHP=Kl;)XiFG`PjQc1n! zA^z|b&rLYo%2SX@|~RM15~|NBIo{Bw<#WUi+LX*kE8 zlkK?~#tHV>gm~cVHvHKHRHe*Z57(uKWCV=A@Di9oemOA|SA*+lGULZvwx0j<*7G|W zC3y4T9b(y3v!%slp%lNP2O(afF;KTOjQgyST{8>m5A3?s)(oePWRON3>Z`M|tEIaW zKl$gIdz#>pmokJuPB|ABbAJf~XX&h(L2Y|Gh`yymYoxAO`ZN@+pfa5ebAblc*j519HF1$E4CCj~xYf zbzkm~Jg`B|D{(J6(#rpNq4vLIh>&B`f&Y?o{5hv6|3|Yb*aVO&eUEzvk~4I4@fqIt z*9AZGu1dGMF!)sPEDZO+ej{^X>K?w){Pyyk!`GSY=r>j8`H$KSIvU<;XmG)_k$v=R zk3{rf5$fAv8fzEH`y~3&D91oQI*EUDgyNC^QER80in{-YWRZFHo3`c#Hq|*%Q@xdi z9n~p3;k1t1F>F+ppT*)B+af_Oi%of#~x_#JeXaD-d_F9^O&W#$Ua9+lQ z=W4ao*RPEF#2FTrdy15mZe5sanw8LJqnG>XH9Y$-?AbvHvXah#AB*~MRKU6MJ@#;{ z&x2=E`6Qa6Cj2IQmI*gXw(u;Wj}4DfL~rKZd~t$Esnrr{3A>`?zMZ+RZEEVo3YL3| zA?DBk7-b_R%rUk^O^jMtPZROe$NGv0E-#YZ%p6 zx`(3Hf}3b_Vj`j2=*vwSn8^V;k^N4dF0PIe6E)94Sy1Is#U|mz*|&qg;L##xf61`W zX|T}CJU^a4AH8)@F5{KQ=SF{C^P`V%i+cP~zS7fiD?O`A6oMI{3g%;8a@EBPJq3hL zP32;zAEbC6lcOk;l9gPS*-8;i@gN&80UoXcnal9sNqpwh;^nA;-9L*Nr~ORBg7zIb zhj!$=%=N!h&7|4aG0yX^yW0xRHO!i}YSy%|qIijRRcHVKt*(TPms8kYa1OtGXos*w zUNI>Cu0L#)JZhfzrp|9KsK76;5(57uZrVARU@*%+6k5<;K)-DEa~Be)O?j3PJSsatMW46q6%f!MmzWX@R4XiJ)={wEJ|NbS2622I z9$?b!!{Ge)^WlQ-BIRc^rm!KHj(e&L8TBOhVM$PA#LCKzQlwF!eejh}z?B=B9UO23LJPo(Wccq0VWX1@4bE66n2C5yJ)6R5$s;r(y*$Y!h{PDT&>hHtXeKx1=c*rX%Fl4vXiSgLPp=kZ;0 zqW|FDp2F2L%TVfrrzh- z2GviGc2Hdc+Ro+DK7~vKGhHBt$Yc$*8!t5big3KoW zUNjMtr>S|W@C^Vwy&-%$+lyk4bL0IBF4P(*^(jdb&dkcf=)9yW&Me!|94Vd6Y;{@} z0AX2t2d2r?oha&Qq5H5GCMYG+Lru*cVs}8TBHZK%>IxNy!hky_wA_Cw^(iR{0CQ`( zV&+hPm`eBt!z2jYgBi6vYfE$F7O|lKksH8`@dR~UxpDQ74VQYb*w?gB>`=f7leup@ z0M-UJO}IE{R#==q6qmYgL!|WOD9xnvsnp3=R?RJipc)ak5fkJxOTVJXI#NMo-1f1& z+bcGf^jf6!$ZNv8bFh`Jr5)CCr@EF4!t!fjC#=~lL>{gF`XH#E#XJg%`nac?rf-7H zGbgsnV`>=&YDwf9u*G+BI?F$YwC6t9BsXuKopKq0Z32M}5?d8aIh8-N-tB7|K1t{` z+WNDTz{cFFjlCnHLeiS#$9V8b3$%3anq5pinb_io84y(p(vE;I`ai{Ei2H-m30&e6 zYd0qb!4m6ruqPj}AbJxKhS^W&h5!2pH51=PV+9HcmM|$~WFZ0Mspo=vLq8({O<@vl zSNX+i6pY9!lK|qFTvQ?!9yhm)rvhx)Ja9Y|L#mp$%YBr9`A)WIAvO$j7%%zS8gKm9 z+}k6^%9=JcT092-MyUgGFTlwNS<#wGz3=e5eN9P`QgF->TK$}<&-H{d_Q8X<6}eVS zOwhVY^80z6C0QT%=@%-;`dvyC!wB4LL^f4cC|M_dB|9n0|h13H(D)S(n3FeUgU<{Rk17Oe4S7~Pw- z8iPA%cMr_f8CqQ0P7N9rpLN&ws0iSpD{ym!Ts z2nlCTLV_Tuf z?VyYX_%M5XbySj5Wk#R55|on^Ic72ec-BfRq_WKPxyzn8&~X@CzJzm@g8??6>&+Vf*JKvrY$Z{sF*0K5SEY=s63lT+Cu|cPe@w zABYpI^LqJy*m_IHl%$e<_6kk;#tFQ3)^hK`4o?r!LYizIbp13RiA&E5qq|_ z4F9xh8v@#VX0W>>rM_t*IMKl_KNjNlEYF#<9bRc_&Y?yKsM6(xaW6k2deU@eAlM8DW0t7e znY!X6xari)RM3_xK?p4 zrYaTTX`U1*fEYvp#gZo0&-Bo zWz+0md);l4XKw;VrR=cpW#6?T?5+JS>32sb9NZO{@@?IKw;YeL<@C zA$|o8no5Zk(en4A>g7rKe5~I(9_r#)4Mkp9Plv(0ar3tF%AC)emRq9GnA`c!0(Ia; zLNkBU=cczF#spnSSg;TxdqdjRae+@{q3Z1XPv-~9Cjbn3i1_{I#?)y|wlxwL9i zDI;fk@S+a#b>Ad0@*D#Lz~bl4@brtH<=@mC(oCcS?848qU!38-^tEl(_=UoQXx8xsfY?dRXyhv}D$IyhNIGg=W zD7G&YanI2PFnWG_pyl;B$4A7~bjqCPeo%VejE!B~<1-3Bt^y1r4m0pB;c7{J5~isH zy#)sFr%)s*W{yq6jDHs90)m^O{7w=H_vz?}GB2GX7=UCAhi@sfXqhcs${aN)Q2t9F zF1twH7cGOuKqHfdPnjJZ3{?KinqbRFA-iuoX~P~|1arDdbW>WCN4IycQp|F?o>xzi zQD2}KRftE()7ST6M0J5aKc7p}{!Wyn@<#!p_Lk43nKDv`&K88JkAHUOf%2{xJV?oX zPD>ZJ(%HxeB{uZn32;(Xm-_AFyC#W2r}(r3_P_~81%QvRjRkS zORRO6A1g(b?9}ghVOlNjlYNA-v@Cwh$)jGg*&$ZKoz?@2>Z#W>DRbIe&gXQW?My7{ zm!~K+X?m3N=3~eWgU$1mCLY34D@3Uu*%LG+=t{8g=76gaxfM(k_r!yX$}q1dX|$3j z6dmfI?zx|tb8mgN0_xI6h~iCt3s|rS_DJ{8aYS>MgV)>w3|B;M*J1?S7kLt-04 zTrzP$Q`GIyH$^RsSG2IM7KDUec5de&oO`C3+v~C@wS|<=pAM@LJCnvsmFg245CwP! zIeogof?F25R4nJeeQS5pOz!6D=2r7~rl~6gN(8zrZ+sH(U%V#`(j7 zQ-*0TpR3jlKP`j)V3$L-%Y{~#sih+tB&CD5R_>1RWnG`q#O$?}uTpg44clKsmVi;zL3`8|Y zjsZ}!D$&)Seq1+U5`0{IZFJ%8r&^VIXwmJwEZDieysIZObj(igVF2nuiqrX~Nfa$z z>G*iOXM1GFD?Ii;77S%pUuIH+_jlT0QU&j1pA6)Nt2da5*W^edS~FP<2w}ga_u6eQ zhE^Pa-)eghe}iPvGy-3dlx-|F1EA*uQ1V~Vqa;a(<^ z8G^qwdNMYRgev_;X{96$%+wVY`x8ltC3S;@^Cp&Lrv{{N03f=e(Yi{K+#77U9*u-= z7=TRYr(fA<^(31$eoLDnkr?eZ2XT5xrcP%xy$xgN=C{Mr-~)iV!M}TXynjo-@OwKe$8 zbI_l`i9$sv6cbq5hRoiS0+}ANGu4=VJ9oTwwUIS+3mWnQsWqdWW_a1*x9a@_Z7!Eh zMw_4^0WIi{+}#Q~#Rg(~aW<7bvG^?~frKEPH6{e?31DFGfdOWzj7|Y)pA3VBxnb9K zfgaQ&*O%O~0an`4kUc&hfpU5lKm@_>^i2zwVlo1v$Es@3Fgken8SyU3;` zE^TFv#vd-@)K0Ptz}GlUg^kp<}(*33XCl;I>hlpHX6Mc9SB(u%IMAncFo)vs|e$XpKB_STQQl&WiLR*T&@ ziC<}?|IkYXXBsZh4NBE_by_+NopnV^^5H#KrKUPaK<-oW!>+4R(>I7^U8|Z#0!DSM zc6S_Bl&ZouS0{#}@Y1vz`5I092)wme-7r5q)M~yjaHwm32}gRqriRzvQ?P<8vhhCM z4TTJF#*I|YHxh?EIftxCIdVZU2?1_%u#pqwUNslU6x3s2+AgIIqx}tq`@ulOsoXK- zQV=nRw}bkMG7OiRE!yY|klo0uIkSfn+;Ta-XXm^=I*8K8XM>dTK{(5ibL|Fkbh$s3 z=Vb@!6!d79jYK ztOA87N;%O;Mg}4jpU7~&T3)5jWmHmzlPXk^n8ovXnD;PeRmB%ig{e?Q7?RMzEioFb z2L>A#cn00CajNI@n9V7zvLL8RQLL6|@-Ogac_U*KpNQ!7yblIiaL7pqiQ$yyui${< zEIx=h!@Qsj`zq#}5NSWEd-ouIUxlB~y4KM`M-3VWipO zbd_iio=XKJ{1BV9psq2a=RgwlsM&e1y9A!&0|@_1CgM1@HdiC*o(3pvZU6IjqxY>N~tp=8V4+8R_ul(61MVaYVV*vsWMp`5qD<6{2<#fTzj zV_Cv8kXyo{_jJpXQW;hDCUz+F*e~Oo9BxogqN173={;-$K(F9kgmwJ4zRSLaL*VJg_?||D$pKB{!lKiTD>i z)^tuIq_~;=>>$1+U^2dqDU@eb+Y~)S!)Fico%98^MW+g2qdG=qDKvuTrVav%l5&`8 zYAYMMdnvR#V|?YS0?%A>G(1uOe|z+Ml?;1$rP=~xgYac6N_t$ubA2cKiVAH;!aK!s zbZYc7j1YxBLm%_QA6>%N94({=rJPo!?Rmu|{9g_r|MVkN#x6m$yx{_aD`??$p7gR5 z;+r3p(N8&me0f8<)+KCer?#6+(Dpo+C2z2Cm$troLRKdG_redB zFs9?0jxpuZVM;%6WP2*ogc;u*f0o8v=iAXUqvye^pU)7!mQtTa&;$*e0_)HvH8>EFrqKa^ z*2LXZx-*$EK!E2%2@?Yg)yen|WS2E)Cub$3+YS;&Ja$cyk$DVUV&wWI0(TZzXWGVj zCck?!BI1B;QqtkdQ#0EFl8Iyo+$Da%+&#ph0{~ki-rTgWR7nK8laWJX@;Z5V8=TOi z*r=(e*tT|D7O8iQ%_8YGbG}380yeP=&uIf&8yWg{!h?tj`s=mE0_txgAZ~NFHe`fT zVJ2;6NK*)B(*gc2)7gmq6iGq!?UveRH8HpWU9NSti`Qbm)ZYwHJA%dVSIr#&Q3CL2 zcV>{ub`rpmWid3dB9ciax`@j{V+>_XZqu!F5xdb3Z&D~1z&ekgG`Q~f!s^bOBWj#n zM4{mlXf@FA^nMr!0~9kS78eP79i&*RAwdF|H6|;t*orO9Q?F-Gw%=kPfTt@aJII}t zPRt;O<mnM!`?euG60*l+hQ^)H8UL9%Mi)KwV(#b?<|%0mC944dxi7Z~cX z0}M=nhFsk0a+o2Fn?-Uz$Hl?{20YC%@Im;sNuzOk{0XZi=+AUKms!2E!< zi48d*z7}MYKL*CMrs9qR;0Lf>Ye1_d#A+EoD{N1&AxcchGHVCZNpzVfJFT~|BKO{B z^fw66foq~yJ}@e(a=!+nv!XGH19*QBoV)8@I)h>YX9U(l32~g$D==gBDaA`*Np9tt zOGQDU<*8(T*9H<=>0KL)M=bjMjJB)PF?fI~i>G0?L-pZIMR9dhb^-r@-KxQgU_nQq z)Io)R%1%+!$R`7pD<+5fnqR1bHxP;QC!AxZq?!Nz$12ZP{t49gTI1Qh7GoP5V| zRE0Q4*(GpU!2*s?v@banF6hBkP8p^9w+jxRa;X?Ujt?o3lz$F_0Zu!@TRgE%A$A&_ zb5izqe$PgM!xHpu z1t8O706TJG`dN4pnnE)>y}i4W4g;(OOgG`cQXHi`W5N`Xv;VJPOSj&IK~4$MZ^ZG4 zXa7n}>^OXxl06iJ;Jf%|=Zj~7KG{i&Tm}7BS=N*wI$@`n1Mo7tr&3`k;89E+3EDd% zo?Rlt!wBeRD?28}MZ-aLov1HY0hzKKvImiuo{c+7zA05W$fVZJsv`w4ee|b$2Ms}!)FC$5qph& zDBi#uQn#^2imH#pV(;t)emUp2vG%HZUPjz{a*p||nGZuV@-F7A4zfcKN+1-z>~>D+ z+YRTaH?vK&$$_mHI3$8;lDP6v#ybyhU`6my=vR(r*3OzPm%5Pu$)#ICPmiM?W6c)U zG!i{@yh!C7=f&gg4kDz|yBp##(04mV^J5MQ=!Y$%ps)u84&{d&X0N}A&32HPqOKp! z#Pc$@bJyKa9+mrS(4i2#g+sc*IbXCK~g=0$4VCAU5to)V~`XlN6M z5Cw+Xr$XSWwo7hUSW{u(H!%!iW2_Q@>)W63!G{Q3Q{*OKnW-LkJH?38JO)7JWI@tx zw{p;T$SxJCWPQ0+XS4ZBrR=4|0)E>Ayu&EITUCrwyfY2nLB|L0?Czc{0Ns4x6f)C~v;4AnV4*;gbJQa+EU;V{Gnj>J*zGG-LV7O0`Qg>5qm}F)r{_SM z)J^wcrZ_1Y-&C@=6`S5wd;#9!$q)|sHC|~Db%7@wB~aomUR|(T&_~b5Ui67a4x-ZA z_5u#QP!uZayd6E7p!f?J?-@NVe5SaPO&wmOHWhGg{{Ph+f6gh&;0S*TIsTk;{5hv6 zU#+T%72RM>2`@dOxWXAUzV;Ta&f)YBiF&;2odf_ULMa;=szjM$x7t_^xXB3FN>j7a zyqJwgDcKP^ycu_KGFByUoI*V)$e70d08K@&IOO}((~1a!oR3p9a$awR2w?PQe3X4A zT&yR+IeSLdkQLT;OcePc(5ZACE06F84vJZqqfks#rkxyW@CnT zY?cmS!htZC^GY7PfOcz?L>6u--c7y6O2>Pa;Fzz0e@gJ=eRVaFEC#qE64M!pp0{nH zbd&R=tJ^{@e>LECb|Bj6b>Tq2LOTrMV~Mm37tvgKjEUA26Duhq86Yk=md`E|0NfAN z#w4|{x9yD1LI^Nc!}vdNV*;9pa*5n}+Ifohsht0Au3qKxR=a}sS%zF)c4m5J0FHUb zP2Ri@?hXK6tJEI=GUvI5&9g-fvxG{&sDxb)%Ci|Enqup+p@@CiH?&!T^%kUpg19>0g(+@1%l4;E?H|YGm z%y`m&pBL_Cpa~W~d(15VLckOD0^W(dVKUh%5lbD56T+Gc{>iDs`#v?U3;|K&^_a}L z=ag@p4KR9*l{Qp^{EhvQgt-f|$BZ$y>1y+coEseD4g4HqTE?!XxRT5{L}L zlW?5yq~IpO%mRe8ne^{ErR4_*;Ex^UPPLeYxuR zx4+p}{>|#?BVPD$_P1;P`siDy=6%;N^Ys(oEdKZPC%R=#LSheN&!p>mrCk4_{U$Q% F{{WOhC=CDr literal 25003 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 Old;v+Nq4HrwEqi#*@|EQ diff --git a/doc/getting-started.html b/doc/getting-started.html index d1c8abd5..dd59bc1c 100644 --- a/doc/getting-started.html +++ b/doc/getting-started.html @@ -86,7 +86,7 @@ own header and source files.

Exiv2 Components Diagram

-

Exiv2 components diagram

+

Exiv2 components diagram

 

diff --git a/src/datasets.cpp b/src/datasets.cpp index f8d0e32f..62f32a12 100644 --- a/src/datasets.cpp +++ b/src/datasets.cpp @@ -20,13 +20,13 @@ */ /* File: datasets.cpp - Version: $Name: $ $Revision: 1.6 $ + Version: $Name: $ $Revision: 1.7 $ Author(s): Brad Schick (brad) History: 24-Jul-04, brad: created */ // ***************************************************************************** #include "rcsid.hpp" -EXIV2_RCSID("@(#) $Name: $ $Revision: 1.6 $ $RCSfile: datasets.cpp,v $"); +EXIV2_RCSID("@(#) $Name: $ $Revision: 1.7 $ $RCSfile: datasets.cpp,v $"); // ***************************************************************************** // included header files @@ -34,14 +34,12 @@ EXIV2_RCSID("@(#) $Name: $ $Revision: 1.6 $ $RCSfile: datasets.cpp,v $"); #include "error.hpp" #include "types.hpp" #include "value.hpp" +#include "metadatum.hpp" #include #include #include -// Todo: remove circular dependency -#include "iptc.hpp" // for DataSet operator<< - // ***************************************************************************** // class member definitions namespace Exiv2 { @@ -291,6 +289,77 @@ namespace Exiv2 { } } // IptcDataSets::dataSetList + const char* IptcKey::familyName_ = "Iptc"; + + IptcKey::IptcKey(const std::string& key) + : key_(key) + { + decomposeKey(); + } + + IptcKey::IptcKey(uint16_t tag, uint16_t record) + : tag_(tag), record_(record) + { + makeKey(); + } + + IptcKey::IptcKey(const IptcKey& rhs) + : tag_(rhs.tag_), record_(rhs.record_), key_(rhs.key_) + { + } + + IptcKey& IptcKey::operator=(const IptcKey& rhs) + { + if (this == &rhs) return *this; + Key::operator=(rhs); + tag_ = rhs.tag_; + record_ = rhs.record_; + key_ = rhs.key_; + return *this; + } + + IptcKey* IptcKey::clone() const + { + return new IptcKey(*this); + } + + void IptcKey::decomposeKey() + { + // Get the family name, record name and dataSet name parts of the key + std::string::size_type pos1 = key_.find('.'); + if (pos1 == std::string::npos) throw Error("Invalid key"); + std::string familyName = key_.substr(0, pos1); + if (familyName != std::string(familyName_)) { + throw Error("Invalid key"); + } + std::string::size_type pos0 = pos1 + 1; + pos1 = key_.find('.', pos0); + if (pos1 == std::string::npos) throw Error("Invalid key"); + std::string recordName = key_.substr(pos0, pos1 - pos0); + if (recordName == "") throw Error("Invalid key"); + std::string dataSetName = key_.substr(pos1 + 1); + if (dataSetName == "") throw Error("Invalid key"); + + // Use the parts of the key to find dataSet and recordId + uint16_t recId = IptcDataSets::recordId(recordName); + uint16_t dataSet = IptcDataSets::dataSet(dataSetName, recId); + + // Possibly translate hex name parts (0xabcd) to real names + recordName = IptcDataSets::recordName(recId); + dataSetName = IptcDataSets::dataSetName(dataSet, recId); + + tag_ = dataSet; + record_ = recId; + key_ = familyName + "." + recordName + "." + dataSetName; + } // IptcKey::decomposeKey + + void IptcKey::makeKey() + { + key_ = std::string(familyName_) + + "." + IptcDataSets::recordName(record_) + + "." + IptcDataSets::dataSetName(tag_, record_); + } + // ************************************************************************* // free functions diff --git a/src/datasets.hpp b/src/datasets.hpp index 199b3e86..83b854e3 100644 --- a/src/datasets.hpp +++ b/src/datasets.hpp @@ -21,7 +21,7 @@ /*! @file datasets.hpp @brief Iptc dataSet and type information - @version $Name: $ $Revision: 1.5 $ + @version $Name: $ $Revision: 1.6 $ @author Brad Schick (brad) @date 24-Jul-04, brad: created */ @@ -31,6 +31,7 @@ // ***************************************************************************** // included header files #include "types.hpp" +#include "metadatum.hpp" // + standard includes #include @@ -256,6 +257,89 @@ namespace Exiv2 { }; // class IptcDataSets + /*! + @brief Concrete keys for Iptc metadata. + */ + class IptcKey : public Key { + public: + //! @name Creators + //@{ + /*! + @brief Constructor to create an Iptc key from a key string. + + @param key The key string. + @throw Error ("Invalid key") if the first part of the key is not + 'Iptc' or the remaining parts of the key cannot be parsed and + converted to a record name and a dataset name. + */ + explicit IptcKey(const std::string& key); + /*! + @brief Constructor to create an Iptc key from dataset and record ids. + @param tag Dataset id + @param record Record id + */ + IptcKey(uint16_t tag, uint16_t record); + //! Copy constructor + IptcKey(const IptcKey& rhs); + //@} + + //! @name Manipulators + //@{ + /*! + @brief Assignment operator. + */ + IptcKey& operator=(const IptcKey& rhs); + //@} + + //! @name Accessors + //@{ + virtual std::string key() const { return key_; } + virtual const char* familyName() const { return familyName_; } + /*! + @brief Return the name of the group (the second part of the key). + For Iptc keys, the group name is the record name. + */ + virtual std::string groupName() const { return recordName(); } + virtual std::string tagName() const + { return IptcDataSets::dataSetName(tag_, record_); } + virtual uint16_t tag() const { return tag_; } + virtual IptcKey* clone() const; + + //! Return the name of the record + std::string recordName() const + { return IptcDataSets::recordName(record_); } + //! Return the record id + uint16_t record() const { return record_; } + //@} + + protected: + //! @name Manipulators + //@{ + /*! + @brief Set the key corresponding to the dataset and record id. + The key is of the form 'Iptc.recordName.dataSetName'. + */ + void makeKey(); + /*! + @brief Parse and convert the key string into dataset and record id. + Updates data members if the string can be decomposed, or throws + Error ("Invalid key"). + + @throw Error ("Invalid key") if the key cannot be decomposed. + */ + void decomposeKey(); + //@} + + private: + // DATA + static const char* familyName_; + + uint16_t tag_; //!< Tag value + uint16_t record_; //!< Record value + std::string key_; //!< Key + + }; // class IptcKey + // ***************************************************************************** // free functions diff --git a/src/exif.cpp b/src/exif.cpp index 2c01c62d..1e0f41e2 100644 --- a/src/exif.cpp +++ b/src/exif.cpp @@ -20,14 +20,14 @@ */ /* File: exif.cpp - Version: $Name: $ $Revision: 1.62 $ + Version: $Name: $ $Revision: 1.63 $ Author(s): Andreas Huggel (ahu) History: 26-Jan-04, ahu: created 11-Feb-04, ahu: isolated as a component */ // ***************************************************************************** #include "rcsid.hpp" -EXIV2_RCSID("@(#) $Name: $ $Revision: 1.62 $ $RCSfile: exif.cpp,v $"); +EXIV2_RCSID("@(#) $Name: $ $Revision: 1.63 $ $RCSfile: exif.cpp,v $"); // Define DEBUG_MAKERNOTE to output debug information to std::cerr #undef DEBUG_MAKERNOTE @@ -73,158 +73,6 @@ namespace { // class member definitions namespace Exiv2 { - const char* ExifKey::familyName_ = "Exif"; - - ExifKey::ExifKey(const std::string& key) - : tag_(0), ifdId_(ifdIdNotSet), ifdItem_(""), - idx_(0), pMakerNote_(0), key_(key) - { - decomposeKey(); - } - - ExifKey::ExifKey(uint16_t tag, const std::string& ifdItem) - : tag_(0), ifdId_(ifdIdNotSet), ifdItem_(""), - idx_(0), pMakerNote_(0), key_("") - { - IfdId ifdId = ExifTags::ifdIdByIfdItem(ifdItem); - if (ifdId == makerIfdId) throw Error("Invalid key"); - MakerNote* pMakerNote = 0; - if (ifdId == ifdIdNotSet) { - pMakerNote = MakerNoteFactory::instance().create(ifdItem); - if (pMakerNote) ifdId = makerIfdId; - else throw Error("Invalid key"); - } - tag_ = tag; - ifdId_ = ifdId; - ifdItem_ = ifdItem; - pMakerNote_ = pMakerNote; - makeKey(); - } - - ExifKey::ExifKey(const Entry& e) - : tag_(e.tag()), ifdId_(e.ifdId()), ifdItem_(""), - idx_(e.idx()), pMakerNote_(0), key_("") - { - if (ifdId_ == makerIfdId) { - if (e.makerNote()) { - ifdItem_ = e.makerNote()->ifdItem(); - pMakerNote_ = e.makerNote()->clone(); - } - else throw Error("Invalid Key"); - } - else { - ifdItem_ = ExifTags::ifdItem(ifdId_); - } - makeKey(); - } - - ExifKey::ExifKey(const ExifKey& rhs) - : tag_(rhs.tag_), ifdId_(rhs.ifdId_), ifdItem_(rhs.ifdItem_), - idx_(rhs.idx_), - pMakerNote_(rhs.pMakerNote_ ? rhs.pMakerNote_->clone() : 0), - key_(rhs.key_) - { - } - - ExifKey::~ExifKey() - { - delete pMakerNote_; - } - - ExifKey& ExifKey::operator=(const ExifKey& rhs) - { - if (this == &rhs) return *this; - Key::operator=(rhs); - tag_ = rhs.tag_; - ifdId_ = rhs.ifdId_; - ifdItem_ = rhs.ifdItem_; - idx_ = rhs.idx_; - pMakerNote_ = rhs.pMakerNote_ ? rhs.pMakerNote_->clone() : 0; - key_ = rhs.key_; - return *this; - } - - std::string ExifKey::tagName() const - { - if (ifdId_ == makerIfdId) { - assert(pMakerNote_); - return pMakerNote_->tagName(tag_); - } - return ExifTags::tagName(tag_, ifdId_); - } - - ExifKey* ExifKey::clone() const - { - return new ExifKey(*this); - } - - std::string ExifKey::sectionName() const - { - if (ifdId_ == makerIfdId) { - assert(pMakerNote_); - return pMakerNote_->ifdItem(); - } - return ExifTags::sectionName(tag(), ifdId()); - } - - void ExifKey::decomposeKey() - { - // Get the family name, IFD name and tag name parts of the key - std::string::size_type pos1 = key_.find('.'); - if (pos1 == std::string::npos) throw Error("Invalid key"); - std::string familyName = key_.substr(0, pos1); - if (familyName != std::string(familyName_)) { - throw Error("Invalid key"); - } - std::string::size_type pos0 = pos1 + 1; - pos1 = key_.find('.', pos0); - if (pos1 == std::string::npos) throw Error("Invalid key"); - std::string ifdItem = key_.substr(pos0, pos1 - pos0); - if (ifdItem == "") throw Error("Invalid key"); - std::string tagName = key_.substr(pos1 + 1); - if (tagName == "") throw Error("Invalid key"); - - // Find IfdId - IfdId ifdId = ExifTags::ifdIdByIfdItem(ifdItem); - if (ifdId == makerIfdId) throw Error("Invalid key"); - MakerNote* pMakerNote = 0; - if (ifdId == ifdIdNotSet) { - pMakerNote = MakerNoteFactory::instance().create(ifdItem); - if (pMakerNote) ifdId = makerIfdId; - else throw Error("Invalid key"); - } - - // Convert tag - uint16_t tag = pMakerNote ? - pMakerNote->tag(tagName) : ExifTags::tag(tagName, ifdId); - // Translate hex tag name (0xabcd) to a real tag name if there is one - tagName = pMakerNote ? - pMakerNote->tagName(tag) : ExifTags::tagName(tag, ifdId); - - tag_ = tag; - ifdId_ = ifdId; - ifdItem_ = ifdItem; - pMakerNote_ = pMakerNote; - key_ = familyName + "." + ifdItem + "." + tagName; - } - - void ExifKey::makeKey() - { - key_ = std::string(familyName_) - + "." + ifdItem_ - + "." + (pMakerNote_ ? - pMakerNote_->tagName(tag_) : ExifTags::tagName(tag_, ifdId_)); - } - - std::ostream& ExifKey::printTag(std::ostream& os, const Value& value) const - { - if (ifdId_ == makerIfdId) { - assert(pMakerNote_); - return pMakerNote_->printTag(os, tag(), value); - } - return ExifTags::printTag(os, tag(), ifdId(), value); - } - Exifdatum::Exifdatum(const Entry& e, ByteOrder byteOrder) : pKey_(new ExifKey(e)), pValue_(0) { diff --git a/src/exif.hpp b/src/exif.hpp index 265ab7ef..7e8e30f2 100644 --- a/src/exif.hpp +++ b/src/exif.hpp @@ -21,7 +21,7 @@ /*! @file exif.hpp @brief Encoding and decoding of Exif data - @version $Name: $ $Revision: 1.54 $ + @version $Name: $ $Revision: 1.55 $ @author Andreas Huggel (ahu) ahuggel@gmx.net @date 09-Jan-04, ahu: created @@ -60,101 +60,6 @@ namespace Exiv2 { // ***************************************************************************** // class definitions - //! Concrete keys for Exif metadata. - class ExifKey : public Key { - public: - //! @name Creators - //@{ - /*! - @brief Constructor to create an Exif key from a key string. - - @param key The key string. - @throw Error ("Invalid key") if the key cannot be parsed into three - parts or the first part of the key is not 'Exif'. - */ - explicit ExifKey(const std::string& key); - /*! - @brief Constructor to create an Exif key from a tag and IFD item - string. - @param tag The tag value - @param ifdItem The IFD string. For MakerNote tags, this must be the - IFD item of the specific MakerNote. "MakerNote" is not allowed. - @throw Error ("Invalid key") if the key cannot be constructed from - the tag and IFD item parameters. - */ - ExifKey(uint16_t tag, const std::string& ifdItem); - //! Constructor to build an ExifKey from an IFD entry. - explicit ExifKey(const Entry& e); - //! Copy constructor - ExifKey(const ExifKey& rhs); - virtual ~ExifKey(); - //@} - - //! @name Manipulators - //@{ - /*! - @brief Assignment operator. - */ - ExifKey& operator=(const ExifKey& rhs); - //@} - - //! @name Accessors - //@{ - virtual std::string key() const { return key_; } - virtual const char* familyName() const { return familyName_; } - /*! - @brief Return the name of the group (the second part of the key). - For Exif keys, the group name is the IFD item. - */ - virtual std::string groupName() const { return ifdItem(); } - virtual std::string tagName() const; - virtual uint16_t tag() const { return tag_; } - virtual ExifKey* clone() const; - - //! Interpret and print the value of an Exif tag - std::ostream& printTag(std::ostream& os, const Value& value) const; - //! Return the IFD id - IfdId ifdId() const { return ifdId_; } - //! Return the name of the IFD - const char* ifdName() const { return ExifTags::ifdName(ifdId()); } - //! Return the related image item - std::string ifdItem() const { return ifdItem_; } - //! Return the name of the Exif section (deprecated) - std::string sectionName() const; - //! Return the index (unique id of this key within the original IFD) - int idx() const { return idx_; } - //@} - - protected: - //! @name Manipulators - //@{ - /*! - @brief Set the key corresponding to the tag and IFD id. - The key is of the form 'Exif.ifdItem.tagName'. - */ - void makeKey(); - /*! - @brief Parse and convert the key string into tag and IFD Id. - Updates data members if the string can be decomposed, - or throws Error ("Invalid key"). - - @throw Error ("Invalid key") if the key cannot be decomposed. - */ - void decomposeKey(); - //@} - - private: - // DATA - static const char* familyName_; - - uint16_t tag_; //!< Tag value - IfdId ifdId_; //!< The IFD associated with this tag - std::string ifdItem_; //!< The IFD item - int idx_; //!< Unique id of an entry within one IFD - MakerNote* pMakerNote_; //!< Pointer to the associated MakerNote - std::string key_; //!< Key - }; // class ExifKey - /*! @brief Information related to one Exif tag. */ diff --git a/src/iptc.cpp b/src/iptc.cpp index 78ce4516..e68a0c91 100644 --- a/src/iptc.cpp +++ b/src/iptc.cpp @@ -20,13 +20,13 @@ */ /* File: iptc.cpp - Version: $Name: $ $Revision: 1.5 $ + Version: $Name: $ $Revision: 1.6 $ Author(s): Brad Schick (brad) History: 31-July-04, brad: created */ // ***************************************************************************** #include "rcsid.hpp" -EXIV2_RCSID("@(#) $Name: $ $Revision: 1.5 $ $RCSfile: iptc.cpp,v $"); +EXIV2_RCSID("@(#) $Name: $ $Revision: 1.6 $ $RCSfile: iptc.cpp,v $"); // Define DEBUG_MAKERNOTE to output debug information to std::cerr #undef DEBUG_MAKERNOTE @@ -48,77 +48,6 @@ EXIV2_RCSID("@(#) $Name: $ $Revision: 1.5 $ $RCSfile: iptc.cpp,v $"); // class member definitions namespace Exiv2 { - const char* IptcKey::familyName_ = "Iptc"; - - IptcKey::IptcKey(const std::string& key) - : key_(key) - { - decomposeKey(); - } - - IptcKey::IptcKey(uint16_t tag, uint16_t record) - : tag_(tag), record_(record) - { - makeKey(); - } - - IptcKey::IptcKey(const IptcKey& rhs) - : tag_(rhs.tag_), record_(rhs.record_), key_(rhs.key_) - { - } - - IptcKey& IptcKey::operator=(const IptcKey& rhs) - { - if (this == &rhs) return *this; - Key::operator=(rhs); - tag_ = rhs.tag_; - record_ = rhs.record_; - key_ = rhs.key_; - return *this; - } - - IptcKey* IptcKey::clone() const - { - return new IptcKey(*this); - } - - void IptcKey::decomposeKey() - { - // Get the family name, record name and dataSet name parts of the key - std::string::size_type pos1 = key_.find('.'); - if (pos1 == std::string::npos) throw Error("Invalid key"); - std::string familyName = key_.substr(0, pos1); - if (familyName != std::string(familyName_)) { - throw Error("Invalid key"); - } - std::string::size_type pos0 = pos1 + 1; - pos1 = key_.find('.', pos0); - if (pos1 == std::string::npos) throw Error("Invalid key"); - std::string recordName = key_.substr(pos0, pos1 - pos0); - if (recordName == "") throw Error("Invalid key"); - std::string dataSetName = key_.substr(pos1 + 1); - if (dataSetName == "") throw Error("Invalid key"); - - // Use the parts of the key to find dataSet and recordId - uint16_t recId = IptcDataSets::recordId(recordName); - uint16_t dataSet = IptcDataSets::dataSet(dataSetName, recId); - - // Possibly translate hex name parts (0xabcd) to real names - recordName = IptcDataSets::recordName(recId); - dataSetName = IptcDataSets::dataSetName(dataSet, recId); - - tag_ = dataSet; - record_ = recId; - key_ = familyName + "." + recordName + "." + dataSetName; - } // IptcKey::decomposeKey - - void IptcKey::makeKey() - { - key_ = std::string(familyName_) - + "." + IptcDataSets::recordName(record_) - + "." + IptcDataSets::dataSetName(tag_, record_); - } - Iptcdatum::Iptcdatum(const IptcKey& key, const Value* value) : pKey_(key.clone()), pValue_(0), modified_(false) diff --git a/src/iptc.hpp b/src/iptc.hpp index d613c1a2..5249e7c2 100644 --- a/src/iptc.hpp +++ b/src/iptc.hpp @@ -21,7 +21,7 @@ /*! @file iptc.hpp @brief Encoding and decoding of Iptc data - @version $Name: $ $Revision: 1.6 $ + @version $Name: $ $Revision: 1.7 $ @author Brad Schick (brad) schick@robotbattle.com @date 31-Jul-04, brad: created @@ -48,87 +48,6 @@ namespace Exiv2 { // ***************************************************************************** // class definitions - //! Concrete keys for Iptc metadata. - class IptcKey : public Key { - public: - //! @name Creators - //@{ - /*! - @brief Constructor to create an Iptc key from a key string. - - @param key The key string. - @throw Error ("Invalid key") if the first part of the key is not - 'Iptc' or the remaining parts of the key cannot be parsed and - converted to a record name and a dataset name. - */ - explicit IptcKey(const std::string& key); - /*! - @brief Constructor to create an Iptc key from dataset and record ids. - @param tag Dataset id - @param record Record id - */ - IptcKey(uint16_t tag, uint16_t record); - //! Copy constructor - IptcKey(const IptcKey& rhs); - //@} - - //! @name Manipulators - //@{ - /*! - @brief Assignment operator. - */ - IptcKey& operator=(const IptcKey& rhs); - //@} - - //! @name Accessors - //@{ - virtual std::string key() const { return key_; } - virtual const char* familyName() const { return familyName_; } - /*! - @brief Return the name of the group (the second part of the key). - For Iptc keys, the group name is the record name. - */ - virtual std::string groupName() const { return recordName(); } - virtual std::string tagName() const - { return IptcDataSets::dataSetName(tag_, record_); } - virtual uint16_t tag() const { return tag_; } - virtual IptcKey* clone() const; - - //! Return the name of the record - std::string recordName() const - { return IptcDataSets::recordName(record_); } - //! Return the record id - uint16_t record() const { return record_; } - //@} - - protected: - //! @name Manipulators - //@{ - /*! - @brief Set the key corresponding to the dataset and record id. - The key is of the form 'Iptc.recordName.dataSetName'. - */ - void makeKey(); - /*! - @brief Parse and convert the key string into dataset and record id. - Updates data members if the string can be decomposed, or throws - Error ("Invalid key"). - - @throw Error ("Invalid key") if the key cannot be decomposed. - */ - void decomposeKey(); - //@} - - private: - // DATA - static const char* familyName_; - - uint16_t tag_; //!< Tag value - uint16_t record_; //!< Record value - std::string key_; //!< Key - - }; // class IptcKey - /*! @brief Information related to one Iptc dataset. */ diff --git a/src/tags.cpp b/src/tags.cpp index 4d750671..7d79ca5b 100644 --- a/src/tags.cpp +++ b/src/tags.cpp @@ -20,23 +20,22 @@ */ /* File: tags.cpp - Version: $Name: $ $Revision: 1.36 $ + Version: $Name: $ $Revision: 1.37 $ Author(s): Andreas Huggel (ahu) History: 15-Jan-04, ahu: created */ // ***************************************************************************** #include "rcsid.hpp" -EXIV2_RCSID("@(#) $Name: $ $Revision: 1.36 $ $RCSfile: tags.cpp,v $"); +EXIV2_RCSID("@(#) $Name: $ $Revision: 1.37 $ $RCSfile: tags.cpp,v $"); // ***************************************************************************** // included header files #include "tags.hpp" #include "error.hpp" #include "types.hpp" +#include "ifd.hpp" #include "value.hpp" - -// Todo: remove circular dependency -#include "exif.hpp" // for TagInfo operator<< +#include "makernote.hpp" #include #include @@ -392,6 +391,158 @@ namespace Exiv2 { os << gpsTagInfo[i] << "\n"; } } // ExifTags::taglist + + const char* ExifKey::familyName_ = "Exif"; + + ExifKey::ExifKey(const std::string& key) + : tag_(0), ifdId_(ifdIdNotSet), ifdItem_(""), + idx_(0), pMakerNote_(0), key_(key) + { + decomposeKey(); + } + + ExifKey::ExifKey(uint16_t tag, const std::string& ifdItem) + : tag_(0), ifdId_(ifdIdNotSet), ifdItem_(""), + idx_(0), pMakerNote_(0), key_("") + { + IfdId ifdId = ExifTags::ifdIdByIfdItem(ifdItem); + if (ifdId == makerIfdId) throw Error("Invalid key"); + MakerNote* pMakerNote = 0; + if (ifdId == ifdIdNotSet) { + pMakerNote = MakerNoteFactory::instance().create(ifdItem); + if (pMakerNote) ifdId = makerIfdId; + else throw Error("Invalid key"); + } + tag_ = tag; + ifdId_ = ifdId; + ifdItem_ = ifdItem; + pMakerNote_ = pMakerNote; + makeKey(); + } + + ExifKey::ExifKey(const Entry& e) + : tag_(e.tag()), ifdId_(e.ifdId()), ifdItem_(""), + idx_(e.idx()), pMakerNote_(0), key_("") + { + if (ifdId_ == makerIfdId) { + if (e.makerNote()) { + ifdItem_ = e.makerNote()->ifdItem(); + pMakerNote_ = e.makerNote()->clone(); + } + else throw Error("Invalid Key"); + } + else { + ifdItem_ = ExifTags::ifdItem(ifdId_); + } + makeKey(); + } + + ExifKey::ExifKey(const ExifKey& rhs) + : tag_(rhs.tag_), ifdId_(rhs.ifdId_), ifdItem_(rhs.ifdItem_), + idx_(rhs.idx_), + pMakerNote_(rhs.pMakerNote_ ? rhs.pMakerNote_->clone() : 0), + key_(rhs.key_) + { + } + + ExifKey::~ExifKey() + { + delete pMakerNote_; + } + + ExifKey& ExifKey::operator=(const ExifKey& rhs) + { + if (this == &rhs) return *this; + Key::operator=(rhs); + tag_ = rhs.tag_; + ifdId_ = rhs.ifdId_; + ifdItem_ = rhs.ifdItem_; + idx_ = rhs.idx_; + pMakerNote_ = rhs.pMakerNote_ ? rhs.pMakerNote_->clone() : 0; + key_ = rhs.key_; + return *this; + } + + std::string ExifKey::tagName() const + { + if (ifdId_ == makerIfdId) { + assert(pMakerNote_); + return pMakerNote_->tagName(tag_); + } + return ExifTags::tagName(tag_, ifdId_); + } + + ExifKey* ExifKey::clone() const + { + return new ExifKey(*this); + } + + std::string ExifKey::sectionName() const + { + if (ifdId_ == makerIfdId) { + assert(pMakerNote_); + return pMakerNote_->ifdItem(); + } + return ExifTags::sectionName(tag(), ifdId()); + } + + void ExifKey::decomposeKey() + { + // Get the family name, IFD name and tag name parts of the key + std::string::size_type pos1 = key_.find('.'); + if (pos1 == std::string::npos) throw Error("Invalid key"); + std::string familyName = key_.substr(0, pos1); + if (familyName != std::string(familyName_)) { + throw Error("Invalid key"); + } + std::string::size_type pos0 = pos1 + 1; + pos1 = key_.find('.', pos0); + if (pos1 == std::string::npos) throw Error("Invalid key"); + std::string ifdItem = key_.substr(pos0, pos1 - pos0); + if (ifdItem == "") throw Error("Invalid key"); + std::string tagName = key_.substr(pos1 + 1); + if (tagName == "") throw Error("Invalid key"); + + // Find IfdId + IfdId ifdId = ExifTags::ifdIdByIfdItem(ifdItem); + if (ifdId == makerIfdId) throw Error("Invalid key"); + MakerNote* pMakerNote = 0; + if (ifdId == ifdIdNotSet) { + pMakerNote = MakerNoteFactory::instance().create(ifdItem); + if (pMakerNote) ifdId = makerIfdId; + else throw Error("Invalid key"); + } + + // Convert tag + uint16_t tag = pMakerNote ? + pMakerNote->tag(tagName) : ExifTags::tag(tagName, ifdId); + // Translate hex tag name (0xabcd) to a real tag name if there is one + tagName = pMakerNote ? + pMakerNote->tagName(tag) : ExifTags::tagName(tag, ifdId); + + tag_ = tag; + ifdId_ = ifdId; + ifdItem_ = ifdItem; + pMakerNote_ = pMakerNote; + key_ = familyName + "." + ifdItem + "." + tagName; + } + + void ExifKey::makeKey() + { + key_ = std::string(familyName_) + + "." + ifdItem_ + + "." + (pMakerNote_ ? + pMakerNote_->tagName(tag_) : ExifTags::tagName(tag_, ifdId_)); + } + + std::ostream& ExifKey::printTag(std::ostream& os, const Value& value) const + { + if (ifdId_ == makerIfdId) { + assert(pMakerNote_); + return pMakerNote_->printTag(os, tag(), value); + } + return ExifTags::printTag(os, tag(), ifdId(), value); + } // ************************************************************************* // free functions diff --git a/src/tags.hpp b/src/tags.hpp index 400f10bf..ca6fb2ab 100644 --- a/src/tags.hpp +++ b/src/tags.hpp @@ -21,7 +21,7 @@ /*! @file tags.hpp @brief Exif tag and type information - @version $Name: $ $Revision: 1.27 $ + @version $Name: $ $Revision: 1.28 $ @author Andreas Huggel (ahu) ahuggel@gmx.net @date 15-Jan-04, ahu: created
@@ -32,6 +32,7 @@ // ***************************************************************************** // included header files +#include "metadatum.hpp" #include "types.hpp" // + standard includes @@ -46,6 +47,8 @@ namespace Exiv2 { // ***************************************************************************** // class declarations class Value; + class Entry; + class MakerNote; // ***************************************************************************** // type definitions @@ -192,6 +195,103 @@ namespace Exiv2 { }; // class ExifTags + /*! + @brief Concrete keys for Exif metadata. + */ + class ExifKey : public Key { + public: + //! @name Creators + //@{ + /*! + @brief Constructor to create an Exif key from a key string. + + @param key The key string. + @throw Error ("Invalid key") if the key cannot be parsed into three + parts or the first part of the key is not 'Exif'. + */ + explicit ExifKey(const std::string& key); + /*! + @brief Constructor to create an Exif key from a tag and IFD item + string. + @param tag The tag value + @param ifdItem The IFD string. For MakerNote tags, this must be the + IFD item of the specific MakerNote. "MakerNote" is not allowed. + @throw Error ("Invalid key") if the key cannot be constructed from + the tag and IFD item parameters. + */ + ExifKey(uint16_t tag, const std::string& ifdItem); + //! Constructor to build an ExifKey from an IFD entry. + explicit ExifKey(const Entry& e); + //! Copy constructor + ExifKey(const ExifKey& rhs); + virtual ~ExifKey(); + //@} + + //! @name Manipulators + //@{ + /*! + @brief Assignment operator. + */ + ExifKey& operator=(const ExifKey& rhs); + //@} + + //! @name Accessors + //@{ + virtual std::string key() const { return key_; } + virtual const char* familyName() const { return familyName_; } + /*! + @brief Return the name of the group (the second part of the key). + For Exif keys, the group name is the IFD item. + */ + virtual std::string groupName() const { return ifdItem(); } + virtual std::string tagName() const; + virtual uint16_t tag() const { return tag_; } + virtual ExifKey* clone() const; + + //! Interpret and print the value of an Exif tag + std::ostream& printTag(std::ostream& os, const Value& value) const; + //! Return the IFD id + IfdId ifdId() const { return ifdId_; } + //! Return the name of the IFD + const char* ifdName() const { return ExifTags::ifdName(ifdId()); } + //! Return the related image item + std::string ifdItem() const { return ifdItem_; } + //! Return the name of the Exif section (deprecated) + std::string sectionName() const; + //! Return the index (unique id of this key within the original IFD) + int idx() const { return idx_; } + //@} + + protected: + //! @name Manipulators + //@{ + /*! + @brief Set the key corresponding to the tag and IFD id. + The key is of the form 'Exif.ifdItem.tagName'. + */ + void makeKey(); + /*! + @brief Parse and convert the key string into tag and IFD Id. + Updates data members if the string can be decomposed, + or throws Error ("Invalid key"). + + @throw Error ("Invalid key") if the key cannot be decomposed. + */ + void decomposeKey(); + //@} + + private: + // DATA + static const char* familyName_; + + uint16_t tag_; //!< Tag value + IfdId ifdId_; //!< The IFD associated with this tag + std::string ifdItem_; //!< The IFD item + int idx_; //!< Unique id of an entry within one IFD + MakerNote* pMakerNote_; //!< Pointer to the associated MakerNote + std::string key_; //!< Key + }; // class ExifKey + // ***************************************************************************** // free functions