1 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
2 /*          EXIFPROBE - TIFF/JPEG/EXIF image file probe               */
3 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
4 /* Copyright (C) 2002,2005 by Duane H. Hesser. All rights reserved.   */
5 /*                                                                    */
6 /* See the file LICENSE.EXIFPROBE for terms of use.                   */
7 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
8 
9 #ifndef lint
10 static char *ModuleId = "@(#) $Id: maker_kyocera.c,v 1.5 2005/07/24 22:56:26 alex Exp $";
11 #endif
12 
13 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
14 /* Kyocera camera maker-specific routines                             */
15 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
16 
17 #include <stdio.h>
18 #include <string.h>
19 #include <stdlib.h>
20 #include "defs.h"
21 #include "datadefs.h"
22 #include "maker_datadefs.h"
23 #include "summary.h"
24 #include "maker.h"
25 #include "misc.h"
26 #include "tags.h"
27 #include "maker_extern.h"
28 #include "extern.h"
29 
30 extern struct camera_id kyocera_model_id[];
31 
32 int
kyocera_model_number(char * model,char * software)33 kyocera_model_number(char *model,char *software)
34 {
35     struct camera_id *model_id;
36     int number = NO_MODEL;
37 
38     for(model_id = &kyocera_model_id[0]; model_id && model_id->name; ++model_id)
39     {
40         if(strncasecmp(model,model_id->name,model_id->namelen) == 0)
41         {
42             number = model_id->id;
43             setnoteversion(model_id->noteversion);
44             setnotetagset(model_id->notetagset);    /* info only      */
45             break;
46         }
47     }
48 
49     return(number);
50 }
51 
52 
53 /* Dispatch a print routine for direct values in Kyocera cameras,     */
54 /* based upon model                                                   */
55 
56 void
print_kyocera_makervalue(struct ifd_entry * entry_ptr,int make,int model,char * prefix)57 print_kyocera_makervalue(struct ifd_entry *entry_ptr,int make,int model,
58                     char *prefix)
59 {
60     int noteversion = 0;
61 
62     noteversion = getnoteversion();
63 
64     if(entry_ptr && (PRINT_VALUE))
65     {
66         switch(noteversion)
67         {
68             case 1:
69                 print_kyocera1_makervalue(entry_ptr,make,model,prefix);
70                 break;
71             default:
72                 print_value(entry_ptr,PREFIX);
73                 break;
74         }
75     }
76 }
77 
78 /* Model-specific print routine for Kyocera cameras. This routine is  */
79 /* responsible for picking off any direct entry tags which are        */
80 /* peculiar and will not be handled properly by print_value()         */
81 /* (usually UNDEFINED values which fit in the 4-byte entry value). If */
82 /* there are no such entries, this function simply calls              */
83 /* print_value().                                                     */
84 
85 void
print_kyocera1_makervalue(struct ifd_entry * entry_ptr,int make,int model,char * prefix)86 print_kyocera1_makervalue(struct ifd_entry *entry_ptr,int make,int model,
87                     char *prefix)
88 {
89     if(entry_ptr && (PRINT_VALUE))
90     {
91         switch(entry_ptr->tag)
92         {
93             default:
94                 print_value(entry_ptr,PREFIX);
95                 break;
96         }
97     }
98 }
99 
100 
101 /* Dispatch a routine to decode and print offset values for Kyocera   */
102 /* cameras.                                                           */
103 
104 void
print_kyocera_offset_makervalue(FILE * inptr,unsigned short byteorder,struct ifd_entry * entry_ptr,unsigned long fileoffset_base,struct image_summary * summary_entry,char * parent_name,char * prefix,int indent,int make,int model,int at_offset)105 print_kyocera_offset_makervalue(FILE *inptr,unsigned short byteorder,
106     struct ifd_entry *entry_ptr,unsigned long fileoffset_base,
107     struct image_summary *summary_entry,char *parent_name,char *prefix,
108     int indent,int make,int model,int at_offset)
109 {
110     int noteversion = 0;
111 
112     noteversion = getnoteversion();
113 
114     if(entry_ptr)
115     {
116         switch(noteversion)
117         {
118             case 1:
119                 kyocera1_offset_makervalue(inptr,byteorder,entry_ptr,
120                                             fileoffset_base,summary_entry,
121                                             parent_name,prefix,indent,
122                                             make,model,at_offset);
123                 break;
124             default:
125                 print_generic_offset_makervalue(inptr,byteorder,entry_ptr,fileoffset_base,
126                                                 parent_name,prefix,indent,
127                                                 make,model,at_offset);
128                 break;
129         }
130     }
131 }
132 
133 /* Model-specific routine to print UNDEFINED values found at offsets  */
134 /* in Kyocera makernotes.                                             */
135 
136 void
kyocera1_offset_makervalue(FILE * inptr,unsigned short byteorder,struct ifd_entry * entry_ptr,unsigned long fileoffset_base,struct image_summary * summary_entry,char * parent_name,char * prefix,int indent,int make,int model,int at_offset)137 kyocera1_offset_makervalue(FILE *inptr,unsigned short byteorder,
138     struct ifd_entry *entry_ptr,unsigned long fileoffset_base,
139     struct image_summary *summary_entry,char *parent_name,char *prefix,
140     int indent,int make,int model,int at_offset)
141 {
142     unsigned long value_offset,count;
143     char *nameoftag;
144     char *fulldirname = NULL;
145     int chpr = 0;
146 
147     if(entry_ptr)
148     {
149         nameoftag = maker_tagname(entry_ptr->tag,make,model);
150         fulldirname = splice(parent_name,".",nameoftag);
151         value_offset = fileoffset_base + entry_ptr->value;
152         count = entry_ptr->count;
153 
154         switch(entry_ptr->tag)
155         {
156             case 0x0e00: /* PrintIM (Epson Print Image matching)      */
157                 if(!at_offset && (PRINT_VALUE))
158                 {
159                     if(!(PRINT_OFFSET))
160                     {
161                         chpr += printf("@%lu:%lu",value_offset,count);
162                         chpr = newline(chpr);
163                     }
164                 }
165                 process_pim(inptr,byteorder,entry_ptr->value,fileoffset_base,
166                     count,nameoftag,parent_name,prefix,indent);
167                 break;
168             default:
169                 print_generic_offset_makervalue(inptr,byteorder,entry_ptr,
170                                         fileoffset_base,fulldirname,prefix,
171                                         indent,make,model,at_offset);
172                 break;
173         }
174         if(fulldirname)
175             free(fulldirname);
176     }
177     setcharsprinted(chpr);
178 }
179 
180 
181 /* Kyocera-specific tagnames for makernotes.                          */
182 
183 char *
maker_kyocera_tagname(unsigned short tag,int model)184 maker_kyocera_tagname(unsigned short tag,int model)
185 {
186     char *tagname = CNULL;
187     int noteversion = 0;
188 
189     /* Should have to do this only once, and only for unrecognized    */
190     /* models. If the model is recognized (or the user has forced a   */
191     /* noteversion) noteversion will already be set.                  */
192     if((noteversion = getnoteversion()) == 0)
193     {
194         noteversion = -1;
195         setnoteversion(-1);
196     }
197 
198     if(tagname == NULL)
199     {
200         switch(tag)
201         {
202             case 0x0e00: tagname = "PrintIM"; break;
203             default: break;
204         }
205     }
206     return(tagname);
207 }
208