Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

187 lines
7.4 KiB

/*++
Copyright (C) 1999- Microsoft Corporation
Module Name:
camera.h
Abstract:
This module declares CPTPCamera class
Author:
William Hsieh (williamh) created
Revision History:
--*/
#ifndef CAMERA__H_
#define CAMERA__H_
//
// Reserve 8KB of memory as a re-usable transaction buffer
//
const UINT TRANSFER_BUFFER_SIZE = 0x2000;
//
// Hack models
//
typedef enum tagHackModel
{
HACK_MODEL_NONE = 0,
HACK_MODEL_DC4800,
HACK_MODEL_NIKON_E2500,
//
// Right now, Sony cameras do not provide model in DeviceInfo. m_HackVersion is used to
// differentiate newer and older firmware of Sony cameras
//
HACK_MODEL_SONY
} HACK_MODEL;
//
// Camera is always in one of these phases. Constants are fixed and documented in DDK, see ptpusd.h
//
typedef enum tagCameraPhase
{
CAMERA_PHASE_NOTREADY,
CAMERA_PHASE_IDLE,
CAMERA_PHASE_CMD,
CAMERA_PHASE_DATAIN,
CAMERA_PHASE_DATAOUT,
CAMERA_PHASE_RESPONSE
}CAMERA_PHASE, *PCAMERA_PHASE;
//
// Definition for function to call when event occurs
//
typedef HRESULT (*PTPEventCallback)(LPVOID pCallbackParam, PPTP_EVENT pEvent);
//
// Definition for function to call while data is transferred
//
typedef HRESULT (*PTPDataCallback)(LPVOID pCallbackParam, LONG lPercentComplete,
LONG lOffset, LONG lLength, BYTE **ppBuffer, LONG *plBufferSize);
//
// CPTPCamera - generic PTP camera
//
class CPTPCamera
{
public:
CPTPCamera();
virtual ~CPTPCamera();
virtual HRESULT Open(LPWSTR DevicePortName, PTPEventCallback pPTPEventCB,
PTPDataCallback pPTPDataCB, LPVOID pEventParam, BOOL bEnableEvents = TRUE);
virtual HRESULT Close();
HRESULT GetDeviceInfo(CPtpDeviceInfo *pDeviceInfo);
HRESULT OpenSession(DWORD SessionId);
HRESULT CloseSession();
HRESULT GetStorageIDs(CArray32 *pStorageIds);
HRESULT GetStorageInfo(DWORD StorageId, CPtpStorageInfo *pStorageInfo);
HRESULT GetNumObjects(DWORD StorageId, WORD FormatCode,
DWORD ParentObjectHandle, UINT *pNumObjects);
HRESULT GetObjectHandles(DWORD StorageId, WORD FormatCode,
DWORD ParentObjectHandle, CArray32 *pObjectHandles);
HRESULT GetObjectInfo(DWORD ObjectHandle, CPtpObjectInfo *pObjectInfo);
HRESULT GetObjectData(DWORD ObjectHandle, BYTE *pBuffer, UINT *pBufferLen, LPVOID pCallbackParam);
HRESULT GetThumb(DWORD ObjectHandle, BYTE *pBuffer, UINT *pBufferLen);
HRESULT DeleteObject(DWORD ObjectHandle, WORD FormatCode);
HRESULT SendObjectInfo(DWORD StorageId, DWORD ParentObjectHandle, CPtpObjectInfo *pObjectInfo,
DWORD *pResultStorageId, DWORD *pResultParentObjectHandle, DWORD *pResultObjectHandle);
HRESULT SendObjectData(BYTE *pBuffer, UINT BufferLen);
HRESULT InitiateCapture(DWORD StorageId, WORD FormatCode);
HRESULT FormatStore(DWORD StorageId, WORD FilesystemFormat);
HRESULT ResetDevice();
HRESULT SelfTest(WORD SelfTestType);
HRESULT SetObjectProtection(DWORD ObjectHandle, WORD ProtectionStatus);
HRESULT PowerDown();
HRESULT GetDevicePropDesc(WORD PropCode, CPtpPropDesc *pPropDesc);
HRESULT GetDevicePropValue(WORD PropCode, CPtpPropDesc *pPropDesc);
HRESULT SetDevicePropValue(WORD PropCode, CPtpPropDesc *pPropDesc);
HRESULT ResetDevicePropValue(WORD PropCode);
HRESULT TerminateCapture(DWORD TransactionId);
HRESULT MoveObject(DWORD ObjectHandle, DWORD StorageId, DWORD ParentObjectHandle);
HRESULT CopyObject(DWORD ObjectHandle, DWORD StorageId, DWORD ParentObjectHandle, DWORD *pResultObjectHandle);
HRESULT GetPartialObject(DWORD ObjectHandle, UINT Offset, UINT *pLength, BYTE *pBuffer,
UINT *pResultLength, LPVOID pCallbackParam);
HRESULT InitiateOpenCapture(DWORD StorageId, WORD FormatCode);
HRESULT VendorCommand(PTP_COMMAND *pCommand, PTP_RESPONSE *pResponse,
UINT *pReadDataSize, BYTE *pReadData,
UINT WriteDataSize, BYTE *pWriteData,
UINT NumCommandParams, int NextPhase);
//
// Camera state functions
//
BOOL IsCameraOpen() { return m_Phase != CAMERA_PHASE_NOTREADY; }
BOOL IsCameraSessionOpen() { return m_SessionId != PTP_SESSIONID_NOSESSION; }
PBOOL CameraWasReset() { return &m_bCameraWasReset; }
//
// Model identification for model-specific handling
//
HRESULT SetupHackInfo(CPtpDeviceInfo *pDeviceInfo);
HACK_MODEL GetHackModel() { return m_HackModel; }
double GetHackVersion() { return m_HackVersion; }
//
// Member access functions (for the event thread)
//
PPTP_EVENT GetEventBuffer() { return &m_EventBuffer; }
PTPEventCallback GetPTPEventCallback() { return m_pPTPEventCB; }
LPVOID GetEventCallbackParam() { return m_pEventCallbackParam; }
//
// This function must be overriden by a transport-specific subclass
//
virtual HRESULT ReadEvent(PTP_EVENT *pEvent) = 0;
virtual HRESULT RecoverFromError() = 0;
protected:
//
// These functions must be overriden by a transport-specific subclass
//
virtual HRESULT SendCommand(PTP_COMMAND *pCommand, UINT NumParams) = 0;
virtual HRESULT ReadData(BYTE *pData, UINT *pBufferSize) = 0;
virtual HRESULT SendData(BYTE *pData, UINT BufferSize) = 0;
virtual HRESULT ReadResponse(PTP_RESPONSE *pResponse) = 0;
virtual HRESULT AbortTransfer() = 0;
virtual HRESULT SendResetDevice() = 0;
//
// Member variables
//
HANDLE m_hEventThread; // Event thread handle
DWORD m_SessionId; // Current session ID
CAMERA_PHASE m_Phase; // Current camera phase
DWORD m_NextTransactionId; // Next transaction ID
PTPEventCallback m_pPTPEventCB; // Event callback function pointer
PTPDataCallback m_pPTPDataCB; // Data callback function pointer
LPVOID m_pEventCallbackParam; // Pointer to pass to event callback functions
LPVOID m_pDataCallbackParam; // Pointer to pass to data callback functions
BOOL m_bEventsEnabled; // GetDeviceInfo is used to query camera for its name. We don't want to start up entire eventing just for this.
BOOL m_bCameraWasReset; // Device was successfully reset, WIA server was not notified about that yet
HACK_MODEL m_HackModel; // Indicator for model-specific hacks
double m_HackVersion; // Indicator for model and version specific hacks
private:
HRESULT ExecuteCommand(BYTE *pReadData, UINT *pReadDataSize, BYTE *pWriteData, UINT WriteDataSize,
UINT NumCommandParams, CAMERA_PHASE NextPhase);
DWORD GetNextTransactionId();
BYTE *m_pTransferBuffer; // Re-usable buffer for small transfers
PTP_COMMAND m_CommandBuffer; // Re-usable buffer for commands
PTP_RESPONSE m_ResponseBuffer; // Re-usable buffer for responses
PTP_EVENT m_EventBuffer; // Re-usable buffer for events
};
#endif // CAMERA__H_