//--------------------------------------------------------------------
// Copyright (C)1998 Microsoft Corporation, All Rights Reserved.
//
// bftp.h
//
// Constants and Types for the Binary File Transfer Protocol
// (bFTP). This is the file transfer protocol for IrTran-P V1.0.
//
// NOTE: That IrTran-P is a big-endian protocol when on the net.
//
// NOTE: That the protocol data structures below assume that the
//       compiler generates structures with natural alignment by
//       field type.
//
// Author:
//
//   Edward Reus (edwardr)     02-26-98   Initial coding.
//
//--------------------------------------------------------------------


#ifndef _BFTP_H_
#define _BFTP_H_

//--------------------------------------------------------------------
//  Constants:
//--------------------------------------------------------------------

#define  BFTP_NAME_SIZE              4

#define  ATTR_TYPE_BINARY         0x00
#define  ATTR_TYPE_CHAR           0x01
#define  ATTR_TYPE_TIME           0x06

#define  ATTR_FLAG_DEFAULT        0x00

// These are the attribute names, converted from character strings
// to values (see: FTP_ATTRIBUTE_MAP_ENTRY field dwWhichAttr):
#define  FIL0                        0
#define  LFL0                        1
#define  TIM0                        2
#define  TYP0                        3
#define  TMB0                        4
#define  BDY0                        5
#define  CMD0                        6
#define  WHT0                        7
#define  ERR0                        8
#define  RPL0                        9

#define  RIMG                      100  // Convert WHT0 values as well.
#define  RINF                      101
#define  RCMD                      102

#define  CMD0_ATTR_VALUE    0x40001000  // Byte swapped: 0x00010040.
#define  INVALID_ATTR       0xffffffff

// bFTP Operations:
#define  BFTP_QUERY         0x00000001
#define  BFTP_QUERY_RIMG    0x00000011
#define  BFTP_QUERY_RINF    0x00000021
#define  BFTP_QUERY_RCMD    0x00000031
#define  BFTP_PUT           0x00000100
#define  BFTP_ERROR         0x00000200
#define  BFTP_UNKNOWN       0xffffffff

#define  BFTP_QUERY_MASK    0x00000001

// bFTP WHT0 subtypes:
#define  WHT0_ATTRIB_SIZE            4
#define  SZ_RINF                 "RINF"
#define  SZ_RCMD                 "RCMD"
#define  SZ_RIMG                 "RIMG"


// UPF File Constants:
#define  UPF_HEADER_SIZE           240
#define  UPF_ENTRY_SIZE             36

#define  UPF_TOTAL_HEADER_SIZE     384

//--------------------------------------------------------------------
//  Macro functions
//--------------------------------------------------------------------

#define  Match4( pName1, pName2 )    \
             (  ((pName1)[0] == (pName2)[0]) \
             && ((pName1)[1] == (pName2)[1]) \
             && ((pName1)[2] == (pName2)[2]) \
             && ((pName1)[3] == (pName2)[3]) )

#define  IsBftpQuery(dwBftpOp)       \
             (((dwBftpOp)&BFTP_QUERY_MASK) != 0)

#define  IsBftpPut(dwBftpOp)         \
             ((dwBftpOp) == BFTP_PUT)

#define  IsBftpError(dwBftpOp)       \
             ((dwBftpOp) == BFTP_ERROR)

#define  BftpValueLength(length)     \
              ((length) - 2)
//            Note: that the Length field in the BFTP_ATTRIBUE is
//            two bytes longer than the actual value length.

//--------------------------------------------------------------------
//  bFTP Protocol Headers:
//--------------------------------------------------------------------

// There can (optionally) be a bFTP attribute for the picture
// create/modify date/time. If there then it will be exactly
// this size:
//
#define  BFTP_DATE_TIME_SIZE    14

// Turn off warning for zero-sized array...
#pragma warning(disable:4200)
#pragma pack(1)

typedef struct _BFTP_ATTRIBUTE
   {
   UCHAR  Name[BFTP_NAME_SIZE]; // Attribute Name.
   DWORD  Length;               // Attribute Length.
   UCHAR  Type;                 // Attribute Type (see ATTR_TYPE_xxx).
   UCHAR  Flag;                 // Attribute Flag.
   UCHAR  Value[];              // Attribute Data.
   } BFTP_ATTRIBUTE;

typedef struct _BFTP_ATTRIBUTE_MAP_ENTRY
   {
   DWORD  dwWhichAttr;
   CHAR  *pName;
   UCHAR  Type;
   } BFTP_ATTRIBUTE_MAP_ENTRY;

//--------------------------------------------------------------------
//  Internal parts of a .UPF file:
//--------------------------------------------------------------------

typedef struct _UPF_HEADER
   {
   UCHAR  UpfDeclaration[8];   // "SSS V100", no trailing zero.
   UCHAR  FileDeclaration[8];  // "UPF V100", no trailing zero.
   USHORT FileId;              // Should be 0x0100
   USHORT FileVersion;         // Should be 0x0100
   UCHAR  CreateDate[8];       // See "Date Format" note below.
   UCHAR  EditDate[8];         // See "Date Format" note below.
   UCHAR  MarkerModelCode[4];  // 
   UCHAR  EditMarkerModelCode[4];
   UCHAR  Reserve[16];
   UCHAR  NumDataEntries;
   UCHAR  NumTables;
   UCHAR  Reserve1;
   UCHAR  CharSetCode;         // See "Character Set Codes" below.
   UCHAR  Title[128];
   UCHAR  Reserve2[48];
   } UPF_HEADER;               // 240 Bytes

// NOTE: Date format for the UPF header:
//
// Date/time are held in an 8-byte binary block:
//
//   Field          Size       Meaning
//   -----------    ----       -------
//   Time Offset       1       Difference from UTC (in 15 minute
//                             units). 0x80 implies N/A.
//
//   Year              2       4-digit year (0xFFFF == N/A).
//   Month             1       Month        (0xFF == N/A).
//   Day               1       Day of month (0xFF == N/A).
//   Hour              1       Hour 0-23    (0xFF == N/A).
//   Minute            1       Minute 0-59  (0xFF == N/A).
//   Second            1       Second 0-59  (0xFF == N/A).
//
// So, below are the char[] array offsets for each of the date/time
// fields:
#define  UPF_GMT_OFFSET       0
#define  UPF_YEAR             1
#define  UPF_MONTH            3
#define  UPF_DAY              4
#define  UPF_HOUR             5
#define  UPF_MINUTE           6
#define  UPF_SECOND           7

//
// Character Set Codes:
//
#define  UPF_CCODE_ASCII      0x00
#define  UPF_CCODE_ISO_8859_1 0x01
#define  UPF_CCODE_SHIFT_JIS  0x02
#define  UPF_CCODE_NONE       0xFF

//
// There are usually two of these, one for a thumbnail and one for 
// the image itself. Note that the UPF_ENTRY for the thumbnail will
// usually be present event if there isn't a thumbnail. There is 
// space for four of these in the UPF header area.
//
typedef struct _UPF_ENTRY
   {
   DWORD  dwStartAddress;
   DWORD  dwDataSize;
   UCHAR  DataTypeId;
   UCHAR  Reserve;
   UCHAR  InformationData[26];
   } UPF_ENTRY;                // 36 Bytes.

typedef struct _PICTURE_INFORMATION_DATA
   {
   USHORT ImageWidth;
   USHORT ImageHieght;
   UCHAR  PixelConfiguration;
   UCHAR  RotationSet;      // Amount to rotate image (counter-clockwise).
   UCHAR  Reserved1;
   UCHAR  CompressionRatio;
   UCHAR  WhiteLevel;
   UCHAR  InputDevice;
   UCHAR  Reserved2[3];
   UCHAR  DummyData;        // This is like a border.
   USHORT XBegin;           // This is the inset of the picture.
   USHORT YBegin;
   USHORT XSize;            // Embedded size of the picture.
   USHORT YSize;
   UCHAR  NonCompressionId;
   UCHAR  Reserved3[3];
   } PICTURE_INFORMATION_DATA;  // 26 Bytes.


// Image Rotation Flags. This is the amount to rotate the image in
// a counter clockwise direction. Note that most cameras don't know
// the camera orientation, so ROTATE_0 means upright or unknown
// orientation:
//
#define ROTATE_0           0x00
#define ROTATE_90          0x01
#define ROTATE_180         0x02
#define ROTATE_270         0x03


typedef struct _CAMERA_INFORMATION_TABLE
   {
   UCHAR  TableID;    // 0x24
   UCHAR  NextTableOffset;
   USHORT ShutterSpeed;     // In 1/100ths APEX units (0x8000=Undefined).
   USHORT Aperture;         // In 1/100ths APEX units (0x8000=Undefined).
   USHORT Brightness;       // In 1/100ths APEX units (0x8000=Undefined).
   USHORT Exposurebias;     // In 1/100ths APEX units (0x8000=Undefined).
   USHORT MaxApertureRatio; // In 1/100ths APEX units (0x8000=Undefined).
   USHORT FocalLength;      // In 1/10th mm (0xFFFF=Undefined)
   USHORT SubjectDistance;  // In 1/10th m  (0xFFFE=Infinite,0xFFFF=Undefined)
   UCHAR  MeteringMode;
   UCHAR  LightSource;
   UCHAR  FlashMode;
   UCHAR  Reserved1;
   USHORT IntervalInformation;
   UCHAR  Reserved2[2];
   } CAMERA_INFORMATION_TABLE;  // 24 Bytes.

// APEX Units:
//
// ShutterSpeed to Exposure Time (seconds)
//
//  APEX          -5   -4   -3   -2   -1    0    1    2     3      4
//  Exposure Time 30   15    8    4    2    1   1/2  1/4   1/8    1/16
//
//  APEX           5     6     7      8      9      10     11
//  Exposure Time 1/30  1/60  1/125  1/250  1/500  1/1000 1/2000
//
// Aperture to F-Number
//
//   APEX        0    1    2    3    4    5    6    7    8    9    10
//   F-Number    1   1.4   2   2.8   5   5.6   8   11   16   22    32
// 
// Brightness to Foot Lambert
//
//   APEX         -2   -1    0    1    2    3    4    5
//   Foot Lambert 1/4  1/2   1    2    4    8   15   30
//


// MeteringMode:
#define  METERING_AVERAGED         0x00
#define  METERING_CENTER_WEIGHTED  0x01
#define  METERING_SPOT             0x02
#define  METERING_MULTI_SPOT       0x03

// LightSource:
#define  LIGHT_SOURCE_DAYLIGHT     0x00
#define  LIGHT_SOURCE_FLUORESCENT  0x01
#define  LIGHT_SOURCE_TUNGSTEN     0x03
#define  LIGHT_SOURCE_STANDARD_A   0x10
#define  LIGHT_SOURCE_STANDARD_B   0x11
#define  LIGHT_SOURCE_STANDARD_C   0x12
#define  LIGHT_SOURCE_D55          0x20
#define  LIGHT_SOURCE_D65          0x21
#define  LIGHT_SOURCE_D75          0x22
#define  LIGHT_SOURCE_UNDEFINED    0xFF

// FlashMode:
#define  FLASH_NO_FLASH            0x00
#define  FLASH_FLASH               0x01
#define  FLASH_UNKNOWN             0xFF

#pragma warning(default:4200)
#pragma pack()

#endif //_BFTP_H_

