mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 07:23:34 +08:00
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62634 954022d7-b5bf-4e40-9824-e11837661b57
285 lines
9.5 KiB
C++
285 lines
9.5 KiB
C++
// X__CacheFile.h: interface for the X__CacheFile class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(AFX_X__CACHEFILE_H__9056C787_C29B_4E79_A6CD_29768C0CEBA7__INCLUDED_)
|
|
#define AFX_X__CACHEFILE_H__9056C787_C29B_4E79_A6CD_29768C0CEBA7__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include <vector>
|
|
|
|
#define defMAX_X__CacheFile_Size (64*1024*1024)
|
|
|
|
BOOL xx_Get_RGBA_from_file(LPCWSTR szwFilename, DWORD *pdwWidth, DWORD *pdwHeight, void **ppBuff);
|
|
|
|
class X__CacheFile
|
|
{
|
|
public:
|
|
X__CacheFile();
|
|
virtual ~X__CacheFile();
|
|
|
|
LPVOID GetCreateItemBuff(LPCWSTR szwFilename, DWORD *pdwRetWidth, DWORD *pdwRetHeight);
|
|
LPVOID GetCreateCopy(LPVOID pSourceBuff, DWORD dwWidth, DWORD dwHeight);
|
|
|
|
void Release(LPVOID pBuff);
|
|
bool EnsureFreeSpace(DWORD dwSize);
|
|
|
|
inline DWORD GetCount() const { return((DWORD)m_cache_items.size()); }
|
|
inline DWORD GetBuffSize() const { return(m_dwBuffSizeTotal); }
|
|
inline DWORD GetMaxBuffSize() const { return(defMAX_X__CacheFile_Size); }
|
|
protected:
|
|
DWORD m_dwBuffSizeTotal;
|
|
|
|
struct CKey
|
|
{
|
|
DWORD m_dwFileSizeHigh, m_dwFileSizeLow;
|
|
FILETIME m_ftCreationTime, m_ftLastWriteTime;
|
|
};
|
|
struct CItem
|
|
{
|
|
WCHAR m_wcFilename[MAX_PATH];
|
|
CKey m_Key;
|
|
|
|
LPVOID m_pBuff;
|
|
|
|
//internals
|
|
int m_nUsage;
|
|
DWORD m_dwBuffSize;
|
|
FILETIME m_ftLastRequested;
|
|
|
|
DWORD m_dwWidth, m_dwHeight;
|
|
};
|
|
|
|
/*
|
|
class CChain
|
|
{
|
|
public:
|
|
CChain() : m_pPrev(NULL), m_pNext(NULL), nCount(0), m_pData(NULL) { }
|
|
~CChain()
|
|
{
|
|
if(m_pPrev) { delete(m_pPrev); }
|
|
}
|
|
|
|
void Add(void *pData)
|
|
{
|
|
CChain *m_pNew=new CChain;
|
|
m_pNew->m_pData=pData;
|
|
m_pNew->m_pNext=this;
|
|
m_pNew->m_pPrev=m_pPrev;
|
|
if(m_pPrev) m_pPrev->m_pNext=m_pNew;
|
|
m_pPrev=m_pNew;
|
|
nCount++;
|
|
}
|
|
void Remove(CChain *pDel)
|
|
{
|
|
pDel->get_out_from_chain();
|
|
nCount--;
|
|
delete(pDel);
|
|
}
|
|
inline CChain *GetPrev() const { return m_pPrev; }
|
|
inline void *GetData() const { return(m_pData); }
|
|
inline int GetSize() const { return(nCount); }
|
|
protected:
|
|
void get_out_from_chain()
|
|
{
|
|
if(m_pPrev) { m_pPrev->m_pNext=m_pNext; }
|
|
if(m_pNext) { m_pNext->m_pPrev=m_pPrev; }
|
|
m_pPrev=m_pNext=NULL;
|
|
}
|
|
int nCount;
|
|
CChain *m_pPrev, *m_pNext;
|
|
void *m_pData;
|
|
};
|
|
CChain m_cache_items;
|
|
*/
|
|
|
|
std::vector<void *> m_cache_items;
|
|
};
|
|
|
|
enum ImageTypes
|
|
{
|
|
_CXIMAGE_FORMAT_UNKNOWN = 0,
|
|
_CXIMAGE_FORMAT_BMP = 1,
|
|
_CXIMAGE_FORMAT_GIF = 2,
|
|
_CXIMAGE_FORMAT_JPG = 3,
|
|
_CXIMAGE_FORMAT_PNG = 4,
|
|
_CXIMAGE_FORMAT_ICO = 5,
|
|
_CXIMAGE_FORMAT_TIF = 6,
|
|
_CXIMAGE_FORMAT_TGA = 7,
|
|
_CXIMAGE_FORMAT_PCX = 8,
|
|
_CXIMAGE_FORMAT_WBMP = 9,
|
|
_CXIMAGE_FORMAT_WMF = 10,
|
|
_CXIMAGE_FORMAT_JP2 = 11,
|
|
_CXIMAGE_FORMAT_JPC = 12,
|
|
_CXIMAGE_FORMAT_PGX = 13,
|
|
_CXIMAGE_FORMAT_PNM = 14,
|
|
_CXIMAGE_FORMAT_RAS = 15,
|
|
_CXIMAGE_FORMAT_JBG = 16,
|
|
_CXIMAGE_FORMAT_MNG = 17,
|
|
_CXIMAGE_FORMAT_SKA = 18,
|
|
_CXIMAGE_FORMAT_RAW = 19
|
|
};
|
|
|
|
static DWORD GetImageFileType(const CString &sFilePath, BOOL& bError)
|
|
{
|
|
bError = FALSE;
|
|
BYTE pBuffer[ 44 ];
|
|
DWORD dwBytesRead;
|
|
HANDLE hFile;
|
|
|
|
hFile = ::CreateFile(sFilePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
|
if (INVALID_HANDLE_VALUE == hFile)
|
|
{
|
|
bError = TRUE;
|
|
return FALSE;
|
|
}
|
|
::ReadFile(hFile, pBuffer, 44, &dwBytesRead, NULL);
|
|
::CloseHandle(hFile);
|
|
|
|
//jpeg
|
|
// Hex: FF D8 FF
|
|
if ( (3 <= dwBytesRead) && (0xFF == pBuffer[0]) && (0xD8 == pBuffer[1]) && (0xFF == pBuffer[2]) )
|
|
{
|
|
return _CXIMAGE_FORMAT_JPG;
|
|
}
|
|
|
|
//bmp ( http://ru.wikipedia.org/wiki/BMP )
|
|
//Hex: 42 4D
|
|
//ASCII: BM
|
|
//Hex (position 6) : 00 00
|
|
//Hex (position 26): 01 00
|
|
//Hex (position 28): 00 || 01 || 04 || 08 || 10 || 18 || 20
|
|
//Hex (position 29): 00
|
|
//Hex (position 30): 00 || 01 || 02 || 03 || 04 || 05
|
|
//Hex (position 31): 00 00 00
|
|
if ( (34 <= dwBytesRead) && (0x42 == pBuffer[0]) && (0x4D == pBuffer[1]) &&
|
|
(0x00 == pBuffer[6]) && (0x00 == pBuffer[7]) && (0x01 == pBuffer[26]) && (0x00 == pBuffer[27]) &&
|
|
( (0x00 == pBuffer[28]) || (0x01 == pBuffer[28]) || (0x04 == pBuffer[28]) || (0x08 == pBuffer[28]) ||
|
|
(0x10 == pBuffer[28]) || (0x18 == pBuffer[28]) || (0x20 == pBuffer[28]) ) && (0x00 == pBuffer[29]) &&
|
|
( (0x00 == pBuffer[30]) || (0x01 == pBuffer[30]) || (0x02 == pBuffer[30]) || (0x03 == pBuffer[30]) ||
|
|
(0x04 == pBuffer[30]) || (0x05 == pBuffer[30]) ) && (0x00 == pBuffer[31]) && (0x00 == pBuffer[32]) && (0x00 == pBuffer[33]) )
|
|
{
|
|
return _CXIMAGE_FORMAT_BMP;
|
|
}
|
|
|
|
//gif
|
|
//Hex: 47 49 46 38
|
|
//ASCII: GIF8
|
|
//or for GIF87a...
|
|
//Hex: 47 49 46 38 37 61
|
|
//ASCII: GIF87a
|
|
//or for GIF89a...
|
|
//Hex: 47 49 46 38 39 61
|
|
//ASCII: GIF89a
|
|
if ( (4 <= dwBytesRead) && (0 == strncmp( (char *)pBuffer, "GIF8", 4)))
|
|
return _CXIMAGE_FORMAT_GIF;
|
|
if ( (6 <= dwBytesRead) && ( (0 == strncmp( (char *)pBuffer, "GIF87a", 6)) || (0 == strncmp((char *)pBuffer, "GIF89a", 6)) ) )
|
|
return _CXIMAGE_FORMAT_GIF;
|
|
|
|
//png
|
|
//Hex: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
|
|
//ASCII: .PNG........IHDR
|
|
if ( (16 <= dwBytesRead) && (0x89 == pBuffer[0]) && (0x50 == pBuffer[1]) && (0x4E == pBuffer[2]) && (0x47 == pBuffer[3])
|
|
&& (0x0D == pBuffer[4]) && (0x0A == pBuffer[5]) && (0x1A == pBuffer[6]) && (0x0A == pBuffer[7])
|
|
&& (0x00 == pBuffer[8]) && (0x00 == pBuffer[9]) && (0x00 == pBuffer[10]) && (0x0D == pBuffer[11])
|
|
&& (0x49 == pBuffer[12]) && (0x48 == pBuffer[13]) && (0x44 == pBuffer[14]) && (0x52 == pBuffer[15]))
|
|
{
|
|
return _CXIMAGE_FORMAT_PNG;
|
|
}
|
|
|
|
//CR2
|
|
//Hex: 49 49 2A 00 10 00 00 00 43 52
|
|
//ASCII: II*.....CR
|
|
if ( (10 <= dwBytesRead ) && (0x49 == pBuffer[0]) && (0x49 == pBuffer[1]) && (0x2A == pBuffer[2])
|
|
&& (0x00 == pBuffer[3]) && (0x10 == pBuffer[4]) && (0x00 == pBuffer[5]) && (0x00 == pBuffer[6])
|
|
&& (0x00 == pBuffer[7]) && (0x43 == pBuffer[8]) && (0x52 == pBuffer[9]) )
|
|
return TRUE;
|
|
|
|
//tiff
|
|
//Hex: 49 49 2A 00
|
|
//ASCII:
|
|
//or for big endian
|
|
//Hex: 4D 4D 00 2A
|
|
//ASCII: MM.*
|
|
//or for little endian
|
|
//Hex: 49 49 2A 00
|
|
//ASCII: II*
|
|
if ( 4 <= dwBytesRead )
|
|
{
|
|
if ( ( (0x49 == pBuffer[0]) && (0x49 == pBuffer[1]) && (0x2A == pBuffer[2]) && (0x00 == pBuffer[3]) ) ||
|
|
( (0x4D == pBuffer[0]) && (0x4D == pBuffer[1]) && (0x00 == pBuffer[2]) && (0x2A == pBuffer[3]) ) ||
|
|
( (0x49 == pBuffer[0]) && (0x49 == pBuffer[1]) && (0x2A == pBuffer[2]) && (0x00 == pBuffer[3]) ))
|
|
return _CXIMAGE_FORMAT_TIF;
|
|
}
|
|
|
|
//wmf
|
|
//Hex: D7 CD C6 9A 00 00
|
|
//or for Windows 3.x
|
|
//Hex: 01 00 09 00 00 03
|
|
if ( 6 <= dwBytesRead )
|
|
{
|
|
if ( ((0xD7 == pBuffer[0]) && (0xCD == pBuffer[1]) && (0xC6 == pBuffer[2]) && (0x9A == pBuffer[3])&& (0x00 == pBuffer[4]) && (0x00 == pBuffer[5]) ) ||
|
|
((0x01 == pBuffer[0]) && (0x00 == pBuffer[1]) && (0x09 == pBuffer[2]) && (0x00 == pBuffer[3]) && (0x00 == pBuffer[4]) && (0x03 == pBuffer[5]) ))
|
|
return TRUE;
|
|
}
|
|
|
|
//emf ( http://wvware.sourceforge.net/caolan/ora-wmf.html )
|
|
//Hex: 01 00 00 00
|
|
//Hex (position 40): 20 45 4D 46
|
|
if ( (44 <= dwBytesRead) && (0x01 == pBuffer[0]) && (0x00 == pBuffer[1]) && (0x00 == pBuffer[2]) && (0x00 == pBuffer[3]) &&
|
|
(0x20 == pBuffer[40]) && (0x45 == pBuffer[41]) && (0x4D == pBuffer[42]) && (0x46 == pBuffer[43]) )
|
|
return TRUE;
|
|
|
|
//pcx ( http://www.fileformat.info/format/pcx/corion.htm )
|
|
//Hex (position 0): 0A
|
|
//Hex (position 1): 00 || 01 || 02 || 03 || 04 || 05
|
|
//Hex (position 3): 01 || 02 || 04 || 08 ( Bytes per pixel )
|
|
if ( (4 <= dwBytesRead) && (0x0A == pBuffer[0]) && (0x00 == pBuffer[1] || 0x01 == pBuffer[1] ||
|
|
0x02 == pBuffer[1] || 0x03 == pBuffer[1] || 0x04 == pBuffer[1] || 0x05 == pBuffer[1] ) &&
|
|
( 0x01 == pBuffer[3] || 0x02 == pBuffer[3] || 0x04 == pBuffer[3] || 0x08 == pBuffer[3] ))
|
|
return _CXIMAGE_FORMAT_PCX;
|
|
|
|
//tga ( http://www.fileformat.info/format/tga/corion.htm )
|
|
//DATA TYPE 1-COLOR-MAPPED IMAGES : Hex (position 1) : 01 01
|
|
//DATA TYPE 2-TRUE-COLOR IMAGES : Hex (position 1) : 00 02
|
|
//DATA TYPE 3-BLACK AND WHITE(UNMAPPED) IMAGES : Hex (position 1) : 00 03
|
|
//DATA TYPE 9-RUN-LENGTH ENCODED(RLE),COLOR-MAPPED IMAGES : Hex (position 1) : 01 09
|
|
//DATA TYPE 10-RUN-LENGTH ENCODED(RLE),TRUE-COLOR IMAGES : Hex (position 1) : 00 0A
|
|
//DATA TYPE 11-RUN-LENGTH ENCODED(RLE),BLACK AND WHITE IMAGES : Hex (position 1) : 00 0B
|
|
// + Bytes per pixel : Hex (position 16): 0x08 || 0x10 || 0x18 || 0x20
|
|
if ( (17 <= dwBytesRead) && ( (0x01 == pBuffer[1] && 0x01 == pBuffer[2]) || (0x00 == pBuffer[1] && 0x02 == pBuffer[2]) ||
|
|
(0x00 == pBuffer[1] && 0x03 == pBuffer[2]) || (0x01 == pBuffer[1] && 0x09 == pBuffer[2]) ||
|
|
(0x00 == pBuffer[1] && 0x0A == pBuffer[2]) || (0x00 == pBuffer[1] && 0x0B == pBuffer[2]) )
|
|
&& ( 0x08 == pBuffer[16] || 0x10 == pBuffer[16] || 0x18 == pBuffer[16] || 0x20 == pBuffer[16] ))
|
|
return _CXIMAGE_FORMAT_TGA;
|
|
|
|
//ras
|
|
//Hex: 59 A6 6A 95
|
|
//ASCII: Y
|
|
if ( (4 <= dwBytesRead ) && (0x59 == pBuffer[0]) && (0xA6 == pBuffer[1]) && (0x6A == pBuffer[2])&& (0x95 == pBuffer[3]))
|
|
return _CXIMAGE_FORMAT_RAS;
|
|
|
|
//ipod
|
|
//(None or Unknown)
|
|
|
|
//psd
|
|
//Hex: 38 42 50 53 00 01 00 00 00 00 00 00 00
|
|
//ASCII: 8BPS
|
|
if ( (13 <= dwBytesRead ) && (0x38 == pBuffer[0]) && (0x42 == pBuffer[1]) && (0x50 == pBuffer[2])
|
|
&& (0x53 == pBuffer[3]) && (0x00 == pBuffer[4]) && (0x01 == pBuffer[5]) && (0x00 == pBuffer[6])
|
|
&& (0x00 == pBuffer[7]) && (0x00 == pBuffer[8]) && (0x00 == pBuffer[9]) && (0x00 == pBuffer[10])
|
|
&& (0x00 == pBuffer[11]) && (0x00 == pBuffer[12]))
|
|
return 0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
extern X__CacheFile Z__CacheFile;
|
|
|
|
|
|
#endif // !defined(AFX_X__CACHEFILE_H__9056C787_C29B_4E79_A6CD_29768C0CEBA7__INCLUDED_)
|