|
|
/**************************************************************************
* * (C) COPYRIGHT MICROSOFT CORP., 2001 * * TITLE: FScam.h * * VERSION: 1.0 * * DATE: 15 Nov, 2000 * * DESCRIPTION: * File System Device object library * ***************************************************************************/ //
// Macro for getting size of array
//
#ifndef ARRAYSIZE
#define ARRAYSIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
#ifndef _CAMAPI_H
#define _CAMAPI_H
//
// GetItemData state bit masks
//
const LONG STATE_NEXT = 0x00; const LONG STATE_FIRST = 0x01; const LONG STATE_LAST = 0x02; const LONG STATE_CANCEL = 0x04;
//
// Constants and structures for supporting a generic camera
//
typedef LONG FORMAT_CODE; /*
const FORMAT_CODE TYPE_UNKNOWN = 0x00; const FORMAT_CODE TYPE_FOLDER = 0x01; const FORMAT_CODE TYPE_TXT = 0x02; const FORMAT_CODE TYPE_HTML = 0x03; const FORMAT_CODE TYPE_RTF = 0x04; const FORMAT_CODE TYPE_DPOF = 0x05; const FORMAT_CODE TYPE_AIFF = 0x06; const FORMAT_CODE TYPE_WAV = 0x07; const FORMAT_CODE TYPE_MP3 = 0x08; const FORMAT_CODE TYPE_AVI = 0x09; const FORMAT_CODE TYPE_MPEG = 0x0a;
const FORMAT_CODE TYPE_UNKNOWNIMG = 0x10; const FORMAT_CODE TYPE_JPEG = 0x11; const FORMAT_CODE TYPE_TIFF = 0x12; const FORMAT_CODE TYPE_FLASHPIX = 0x13; const FORMAT_CODE TYPE_BMP = 0x14; const FORMAT_CODE TYPE_DIB = 0x15; const FORMAT_CODE TYPE_GIF = 0x16; const FORMAT_CODE TYPE_JPEG2000 = 0x17;
const FORMAT_CODE TYPE_IMAGEMASK = 0x10; */
typedef struct _DEVICE_INFO { BOOL bSyncNeeded; // Should be set if the driver can get out-of-sync with the camera (i.e. for serial cameras)
BSTR FirmwareVersion; // String allocated and freed by camera library
LONG PicturesTaken; // Number of pictures stored on the camera
LONG PicturesRemaining; // Space available on the camera, in pictures at the current resolution
LONG TotalItems; // Total number of items on the camera, including folders, images, audio, etc.
SYSTEMTIME Time; // Current time on the device
LONG ExposureMode; // See WIA_DPC_EXPOSURE_MODE
LONG ExposureComp; // See WIA_DPC_EXPOSURE_COMP
} DEVICE_INFO, *PDEVICE_INFO;
typedef struct _ITEM_INFO { struct _ITEM_INFO *Parent; // Pointer to this item's parent, equal to ROOT_ITEM if this is a top level item
BSTR pName; // String allocated and freed by camera library
SYSTEMTIME Time; // Last modified time of the item
FORMAT_CODE Format; // Index to g_FormatInfo[] array.
BOOL bHasAttachments; // Indicates whether an image has attachments
LONG Width; // Width of the image in pixels, zero for non-images
LONG Height; // Height of the image in pixels, zero for non-images
LONG Depth; // Pixel depth in pixels (e.g. 8, 16, 24)
LONG Channels; // Number of color channels per pixel (e.g. 1, 3)
LONG BitsPerChannel; // Number of bits per color channel, normally 8
LONG Size; // Size of the image in bytes
LONG SequenceNum; // If image is part of a sequence, the sequence number
// FORMAT_CODE ThumbFormat; // Indicates the format of the thumbnail
LONG ThumbWidth; // Width of thumbnail (can be set to zero until thumbnail is read by app)
LONG ThumbHeight; // Height of thumbnail (can be set to zero until thumbnail is read by app)
BOOL bReadOnly; // Indicates if item can or cannot be deleted by app
BOOL bCanSetReadOnly; // Indicates if the app can change the read-only status on and off
BOOL bIsFolder; // Indicates if the item is a folder
} ITEM_INFO, *PITEM_INFO;
typedef ITEM_INFO *ITEM_HANDLE; const ITEM_HANDLE ROOT_ITEM_HANDLE = NULL;
typedef CWiaArray<ITEM_HANDLE> ITEM_HANDLE_ARRAY;
#define FFD_ALLOCATION_INCREMENT 64 // this must be a power of 2 !!!
typedef struct _FSUSD_FILE_DATA { DWORD dwFileAttributes; FILETIME ftFileTime; DWORD dwFileSize; TCHAR cFileName[MAX_PATH]; DWORD dwProcessed; } FSUSD_FILE_DATA, *PFSUSD_FILE_DATA;
#ifndef FORMAT_INFO_STRUCTURE
#define FORMAT_INFO_STRUCTURE
#define MAXEXTENSIONSTRINGLENGTH 8
typedef struct _FORMAT_INFO { GUID FormatGuid; // WIA format GUID
WCHAR ExtensionString[MAXEXTENSIONSTRINGLENGTH]; // File extension
LONG ItemType; // WIA item type
} FORMAT_INFO, *PFORMAT_INFO; #endif
//
// Generic camera class definition
//
class FakeCamera { public: //
// Methods for accessing the camera
//
FakeCamera(); ~FakeCamera();
HRESULT Open(LPWSTR pPortName); HRESULT Close(); HRESULT GetDeviceInfo(DEVICE_INFO *pDeviceInfo); VOID FreeDeviceInfo(DEVICE_INFO *pDeviceInfo); HRESULT GetItemList(ITEM_HANDLE *pItemArray); HRESULT SearchDirEx(ITEM_HANDLE_ARRAY *pItemArray, ITEM_HANDLE ParentHandle, LPOLESTR Path); HRESULT SearchForAttachments(ITEM_HANDLE_ARRAY *pItemArray, ITEM_HANDLE ParentHandle, LPOLESTR Path, FSUSD_FILE_DATA *pFFD, DWORD dwNumFiles); HRESULT CreateFolderEx(ITEM_HANDLE ParentHandle, FSUSD_FILE_DATA *pFindData, ITEM_HANDLE *pFolderHandle); HRESULT CreateItemEx(ITEM_HANDLE ParentHandle, FSUSD_FILE_DATA *pFileData, ITEM_HANDLE *pImageHandle, UINT nFormatCode); VOID ConstructFullName(WCHAR *pFullName, ITEM_INFO *pItemInfo, BOOL bAddExt = TRUE);
VOID FreeItemInfo(ITEM_INFO *pItemInfo); HRESULT GetNativeThumbnail(ITEM_HANDLE ItemHandle, int *pThumbSize, BYTE **ppThumb); HRESULT CreateThumbnail(ITEM_HANDLE ItemHandle, int *pThumbSize, BYTE **ppThumb, BMP_IMAGE_INFO *pBmpInfo); HRESULT CreateVideoThumbnail(ITEM_HANDLE ItemHandle, int *pThumbSize, BYTE **ppThumb, BMP_IMAGE_INFO *pBmpInfo); VOID FreeThumbnail(BYTE *pThumb); HRESULT GetItemData(ITEM_HANDLE ItemHandle, LONG lState, BYTE *pBuf, DWORD lLength); HRESULT DeleteItem(ITEM_HANDLE ItemHandle); HRESULT TakePicture(ITEM_HANDLE *pItemHandle); HRESULT Status(); HRESULT Reset(); ULONG GetImageTypeFromFilename(WCHAR *pFilename, UINT *pFormatCode); void SetWiaLog(IWiaLog **ppILog) { m_pIWiaLog = *ppILog; };
private: WCHAR m_RootPath[MAX_PATH]; ITEM_HANDLE_ARRAY m_ItemHandles; int m_NumImages; int m_NumItems; HANDLE m_hFile; IWiaLog *m_pIWiaLog;
public: FORMAT_INFO *m_FormatInfo; UINT m_NumFormatInfo; };
//
// Constants for reading Exif files
//
const WORD TIFF_XRESOLUTION = 0x11a; const WORD TIFF_YRESOLUTION = 0x11b; const WORD TIFF_JPEG_DATA = 0x201; const WORD TIFF_JPEG_LEN = 0x202;
const int APP1_OFFSET = 6; // Offset between the start of the APP1 segment and the start of the TIFF tags
//
// Structures for reading Exif files
//
typedef struct _DIR_ENTRY { WORD Tag; WORD Type; DWORD Count; DWORD Offset; } DIR_ENTRY, *PDIR_ENTRY;
typedef struct _IFD { DWORD Offset; WORD Count; DIR_ENTRY *pEntries; DWORD NextIfdOffset; } IFD, *PIFD;
//
// Functions for reading Exif files
//
HRESULT ReadDimFromJpeg(LPOLESTR FullName, WORD *pWidth, WORD *pHeight); HRESULT ReadJpegHdr(LPOLESTR FileName, BYTE **ppBuf); HRESULT ReadExifJpeg(BYTE *pBuf, IFD *pImageIfd, IFD *pThumbIfd, BOOL *pbSwap); HRESULT ReadTiff(BYTE *pBuf, IFD *pImageIfd, IFD *pThumbIfd, BOOL *pbSwap); HRESULT ReadIfd(BYTE *pBuf, IFD *pIfd, BOOL bSwap); VOID FreeIfd(IFD *pIfd); WORD ByteSwapWord(WORD w); DWORD ByteSwapDword(DWORD dw); WORD GetWord(BYTE *pBuf, BOOL bSwap); DWORD GetDword(BYTE *pBuf, BOOL bSwap); DWORD GetRational(BYTE *pBuf, BOOL bSwap);
#endif // #ifndef _CAMAPI_H
|