#include "StdAfx.h" #include ".\pasteimageashtmlimage.h" #include "../../shared/TextConvert.h" CString g_csDIBImagePath = _T(""); int g_nDIBImageName = 1; CPasteImageAsHtmlImage::CPasteImageAsHtmlImage(void) { } CPasteImageAsHtmlImage::~CPasteImageAsHtmlImage(void) { } bool CPasteImageAsHtmlImage::ConvertPathToHtmlImageTag(const CDittoInfo &DittoInfo, IClip *pClip) { bool bRet = false; IClipFormats *pFormats = pClip->Clips(); if(pFormats) { if(g_csDIBImagePath.IsEmpty()) { CreateLocalPath(true); } CString csIMG = _T(""); IClipFormat *pCF_DIB = pFormats->FindFormatEx(CF_DIB); if(pCF_DIB != NULL) { CString csFile; csFile.Format(_T("%s\\%d.bmp"), g_csDIBImagePath, g_nDIBImageName); g_nDIBImageName++; LPVOID pvData = GlobalLock(pCF_DIB->Data()); ULONG size = (ULONG)GlobalSize(pCF_DIB->Data()); if(WriteDataToFile(csFile, pvData, size)) { GlobalUnlock(pCF_DIB->Data()); csIMG.Format(_T(""), csFile); } else { GlobalUnlock(pCF_DIB->Data()); } } else { IClipFormat *pHDrop = pFormats->FindFormatEx(CF_HDROP); if(pHDrop) { HDROP drop = (HDROP)GlobalLock((HDROP)pHDrop->Data()); int nNumFiles = DragQueryFile(drop, -1, NULL, 0); TCHAR file[MAX_PATH]; for(int nFile = 0; nFile < nNumFiles; nFile++) { if(DragQueryFile(drop, nFile, file, sizeof(file)) > 0) { CString csOrigfile(file); CString csFile(file); csFile = csFile.MakeLower(); if(csFile.Find(_T(".bmp")) != -1 || csFile.Find(_T(".dib")) != -1 || csFile.Find(_T(".jpg")) != -1 || csFile.Find(_T(".jpeg")) != -1 || csFile.Find(_T(".jpe")) != -1 || csFile.Find(_T(".jfif")) != -1 || csFile.Find(_T(".gif")) != -1 || csFile.Find(_T(".tif")) != -1 || csFile.Find(_T(".tiff")) != -1 || csFile.Find(_T(".png")) != -1) { CString csFormat; csFormat.Format(_T(""), csOrigfile); if(nFile < nNumFiles-1) { csFormat += _T("
"); } csIMG += csFormat; } } } GlobalUnlock(pHDrop->Data()); } } if(csIMG.IsEmpty() == FALSE) { pFormats->DeleteAll(); CStringA utf8 = CTextConvert::UnicodeToUTF8(csIMG); pFormats->AddNew(DittoAddinHelpers::GetFormatID(_T("HTML Format")), DittoAddinHelpers::NewGlobalP(utf8.GetBuffer(), utf8.GetLength())); bRet = true; } } return bRet; } bool CPasteImageAsHtmlImage::WriteDataToFile(CString csPath, LPVOID data, ULONG size) { bool bRet = false; CFile file; CFileException ex; if(file.Open(csPath, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary, &ex)) { BITMAPINFO *lpBI = (BITMAPINFO *)data; int nPaletteEntries = 1 << lpBI->bmiHeader.biBitCount; if(lpBI->bmiHeader.biBitCount > 8) nPaletteEntries = 0; else if( lpBI->bmiHeader.biClrUsed != 0 ) nPaletteEntries = lpBI->bmiHeader.biClrUsed; BITMAPFILEHEADER BFH; memset(&BFH, 0, sizeof( BITMAPFILEHEADER)); BFH.bfType = 'MB'; BFH.bfSize = sizeof(BITMAPFILEHEADER) + size; BFH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nPaletteEntries * sizeof(RGBQUAD); file.Write(&BFH, sizeof(BITMAPFILEHEADER)); file.Write(data, size); file.Close(); bRet = true; } else { CString csError; TCHAR exError[250]; ex.GetErrorMessage(exError, sizeof(exError)); csError.Format(_T("OutLookExpress Addin - Failed to write CF_DIB to file: %s, Error: %s"), csPath, exError); OutputDebugString(csPath); } return bRet; } bool CPasteImageAsHtmlImage::CleanupPastedImages() { bool bRet = false; if(g_csDIBImagePath.IsEmpty()) { CreateLocalPath(false); } CFileFind find; BOOL bCont = find.FindFile(g_csDIBImagePath + _T("\\*")); while(bCont) { bCont = find.FindNextFile(); DeleteFile(find.GetFilePath()); } find.Close(); bRet = RemoveDirectory(g_csDIBImagePath) == TRUE; return false;; } void CPasteImageAsHtmlImage::CreateLocalPath(bool bCreateDir) { g_csDIBImagePath = _wgetenv(_T("TMP"));; g_csDIBImagePath += _T("\\ditto"); if(bCreateDir) { CreateDirectory(g_csDIBImagePath, NULL); } }