withFormatDict :()

in src/ios/CDVJpegHeaderWriter.m [205:286]


                     withFormatDict : (NSDictionary*) formatdict
                             isIFD0 : (BOOL) ifd0flag
                  currentDataOffset : (int*) dataoffset {
    NSArray * datakeys = [datadict allKeys]; // all known data keys
    NSArray * knownkeys = [formatdict  allKeys]; // only keys in knowkeys are considered for entry in this IFD
    NSMutableArray * ifdblock = [[NSMutableArray alloc] initWithCapacity: [datadict count]]; // all ifd entries
    NSMutableArray * ifddatablock = [[NSMutableArray alloc] initWithCapacity: [datadict count]]; // data block entries
 //   ifd0flag = NO; // ifd0 requires a special flag and has offset to next ifd appended to end
    
    // iterate through known provided data keys
    for (int i = 0; i < [datakeys count]; i++) {
        NSString * key = [datakeys objectAtIndex:i];
        // don't muck about with unknown keys
        if ([knownkeys indexOfObject: key] != NSNotFound) {
            // create new IFD entry
            NSString * entry = [self  createIFDElement: key
                                            withFormat: [formatdict objectForKey:key]
                                      withElementData: [datadict objectForKey:key]];
            // create the IFD entry's data block
            NSString * data = [self createIFDElementDataWithFormat: [formatdict objectForKey:key]
                                                   withData: [datadict objectForKey:key]];
            if (entry) {
                [ifdblock addObject:entry];
                if(!data) {
                    [ifdblock addObject:@""];
                } else {
                    [ifddatablock addObject:data];
                }
            }
        }
    }
    
    NSMutableString * exifstr = [[NSMutableString alloc] initWithCapacity: [ifdblock count] * 24];
    NSMutableString * dbstr = [[NSMutableString alloc] initWithCapacity: 100];
    
    int addr=*dataoffset; // current offset/address in datablock
    if (ifd0flag) {
        // calculate offset to datablock based on ifd file entry count
        addr += 14+(12*([ifddatablock count]+1)); // +1 for tag 0x8769, exifsubifd offset
    } else {
        // current offset + numSubIFDs (2-bytes) + 12*numSubIFDs + endMarker (4-bytes)
        addr += 2+(12*[ifddatablock count])+4;
    }
    
    for (int i = 0; i < [ifdblock count]; i++) {
        NSString * entry = [ifdblock objectAtIndex:i];
        NSString * data = [ifddatablock objectAtIndex:i];
        
        // check if the data fits into 4 bytes
        if( [data length] <= 8) {
            // concatenate the entry and the (4byte) data entry into the final IFD entry and append to exif ifd string
            [exifstr appendFormat : @"%@%@", entry, data];
        } else {
            [exifstr appendFormat : @"%@%08x", entry, addr];
            [dbstr appendFormat: @"%@", data];
            addr+= [data length] / 2;
            /*
            NSLog(@"=====data-length[%i]=======",[data length]);
            NSLog(@"addr-offset[%i]",addr);
            NSLog(@"entry[%@]",entry);
            NSLog(@"data[%@]",data);
             */
        }
    }
    
    // calculate IFD0 terminal offset tags, currently ExifSubIFD
    unsigned int entrycount = (unsigned int)[ifdblock count];
    if (ifd0flag) {
        // 18 accounts for 8769's width + offset to next ifd, 8 accounts for start of header
        NSNumber * offset = [NSNumber numberWithUnsignedInteger:[exifstr length] / 2 + [dbstr length] / 2 + 18+8];
        
        [self appendExifOffsetTagTo: exifstr
                        withOffset : offset];
        entrycount++;
    }
    *dataoffset = addr;
    return [[NSString alloc] initWithFormat: @"%04x%@%@%@",
            entrycount,
            exifstr,
            @"00000000", // offset to next IFD, 0 since there is none
            dbstr]; // lastly, the datablock
}