Commit a0d32619 authored by Sergey.Konovalov's avatar Sergey.Konovalov Committed by Alexander Trofimov

Bug 30175 - Ошибка в консоли при переоткрытии презентации с определенной темой.

оишбка в mailmerge

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@64387 954022d7-b5bf-4e40-9824-e11837661b57
parent 9356a5c3
#include "BinaryFileReaderWriter.h" #include "BinaryFileReaderWriter.h"
#include "../../Common/DocxFormat/Source/Base/Nullable.h" #include "../../Common/DocxFormat/Source/Base/Nullable.h"
#include "BinReaderWriterDefines.h" #include "BinReaderWriterDefines.h"
...@@ -123,7 +123,7 @@ namespace NSBinPptxRW ...@@ -123,7 +123,7 @@ namespace NSBinPptxRW
int CImageManager2::IsDisplayedImage(const CString& strInput) int CImageManager2::IsDisplayedImage(const CString& strInput)
{ {
int nRes = 0; int nRes = 0;
// display[N]image.ext //шаблон display[N]image.ext
CString sFind1 = _T("display"); CString sFind1 = _T("display");
int nIndex1 = strInput.Find(sFind1); int nIndex1 = strInput.Find(sFind1);
if(-1 != nIndex1) if(-1 != nIndex1)
...@@ -214,7 +214,7 @@ namespace NSBinPptxRW ...@@ -214,7 +214,7 @@ namespace NSBinPptxRW
if ((_T(".jpg") == strExts) || (_T(".jpeg") == strExts) || (_T(".png") == strExts) || (_T(".emf") == strExts) || (_T(".wmf") == strExts)) if ((_T(".jpg") == strExts) || (_T(".jpeg") == strExts) || (_T(".png") == strExts) || (_T(".emf") == strExts) || (_T(".wmf") == strExts))
{ {
OOX::CPath pathOutput = m_strDstMedia + FILE_SEPARATOR_STR + strImage + strExts; OOX::CPath pathOutput = m_strDstMedia + FILE_SEPARATOR_STR + strImage + strExts;
// // теперь нужно скопировать картинку
if (pathOutput.GetPath() != strInput) if (pathOutput.GetPath() != strInput)
CDirectory::CopyFile(strInput, pathOutput.GetPath(), NULL, NULL); CDirectory::CopyFile(strInput, pathOutput.GetPath(), NULL, NULL);
} }
...@@ -276,7 +276,9 @@ namespace NSBinPptxRW ...@@ -276,7 +276,9 @@ namespace NSBinPptxRW
int n3 = strFile.Find(_T("ftp")); int n3 = strFile.Find(_T("ftp"));
int n4 = strFile.Find(_T("https://")); int n4 = strFile.Find(_T("https://"));
if (((n1 >= 0) && (n1 < 10)) || ((n2 >= 0) && (n2 < 10)) || ((n3 >= 0) && (n3 < 10)) || ((n4 >= 0) && (n4 < 10))) //если nI сранивать не с 0, то будут проблемы
//потому что в инсталяции мы кладем файлы в /var/www...
if (0 == n1 || 0 == n2 || 0 == n3 || 0 == n4)
return true; return true;
return false; return false;
} }
...@@ -1089,7 +1091,7 @@ namespace NSBinPptxRW ...@@ -1089,7 +1091,7 @@ namespace NSBinPptxRW
StartMainRecord(NSBinPptxRW::NSMainTables::FontsEmbedded); StartMainRecord(NSBinPptxRW::NSMainTables::FontsEmbedded);
// // добавим мега шрифт
m_pCommon->m_pNativePicker->m_oEmbeddedFonts.CheckString(_T(".)abcdefghijklmnopqrstuvwxyz")); m_pCommon->m_pNativePicker->m_oEmbeddedFonts.CheckString(_T(".)abcdefghijklmnopqrstuvwxyz"));
m_pCommon->m_pNativePicker->m_oEmbeddedFonts.CheckFont(_T("Wingdings 3"), m_pCommon->m_pNativePicker->m_pFontManager); m_pCommon->m_pNativePicker->m_oEmbeddedFonts.CheckFont(_T("Wingdings 3"), m_pCommon->m_pNativePicker->m_pFontManager);
m_pCommon->m_pNativePicker->m_oEmbeddedFonts.CheckFont(_T("Arial"), m_pCommon->m_pNativePicker->m_pFontManager); m_pCommon->m_pNativePicker->m_oEmbeddedFonts.CheckFont(_T("Arial"), m_pCommon->m_pNativePicker->m_pFontManager);
......
#pragma once #pragma once
#include "math.h" #include "math.h"
#include "CalculatorCRC32.h" #include "CalculatorCRC32.h"
...@@ -268,7 +268,9 @@ namespace NSShapeImageGen ...@@ -268,7 +268,9 @@ namespace NSShapeImageGen
int n3 = strFile.Find(_T("ftp")); int n3 = strFile.Find(_T("ftp"));
int n4 = strFile.Find(_T("https")); int n4 = strFile.Find(_T("https"));
if (((n1 >= 0) && (n1 < 10)) || ((n2 >= 0) && (n2 < 10)) || ((n3 >= 0) && (n3 < 10)) || ((n4 >= 0) && (n4 < 10))) //если nI сранивать не с 0, то будут проблемы
//потому что в инсталяции мы кладем файлы в /var/www...
if (0 == n1 || 0 == n2 || 0 == n3 || 0 == n4)
bIsDownload = true; bIsDownload = true;
if (bIsDownload) if (bIsDownload)
...@@ -388,7 +390,7 @@ namespace NSShapeImageGen ...@@ -388,7 +390,7 @@ namespace NSShapeImageGen
} }
else else
{ {
// - //конвертация неудачная - берем оригинальный файл
OOX::CPath pathOriginal = strFileSrc; OOX::CPath pathOriginal = strFileSrc;
CString strSaveItem = oInfo.GetPathWithoutExtension(); CString strSaveItem = oInfo.GetPathWithoutExtension();
...@@ -462,7 +464,7 @@ namespace NSShapeImageGen ...@@ -462,7 +464,7 @@ namespace NSShapeImageGen
std::map<DWORD, CImageInfo>::iterator pPair = m_mapImageData.find(dwSum); std::map<DWORD, CImageInfo>::iterator pPair = m_mapImageData.find(dwSum);
if (m_mapImageData.end() == pPair) if (m_mapImageData.end() == pPair)
{ {
// // нужно добавить
++m_lNextIDImage; ++m_lNextIDImage;
oInfo.m_lID = m_lNextIDImage; oInfo.m_lID = m_lNextIDImage;
...@@ -536,7 +538,7 @@ namespace NSShapeImageGen ...@@ -536,7 +538,7 @@ namespace NSShapeImageGen
if (metaFileRaster.LoadFromFile(strFileName)) if (metaFileRaster.LoadFromFile(strFileName))
{ {
// wmf/emf //случай растрового wmf/emf
CString strSaveItem = strSaveItemWE + _T(".png"); CString strSaveItem = strSaveItemWE + _T(".png");
metaFileRaster.ConvertToRaster(strSaveItem, 4 /*CXIMAGE_FORMAT_PNG*/, lWidth, lHeight); metaFileRaster.ConvertToRaster(strSaveItem, 4 /*CXIMAGE_FORMAT_PNG*/, lWidth, lHeight);
...@@ -569,7 +571,7 @@ namespace NSShapeImageGen ...@@ -569,7 +571,7 @@ namespace NSShapeImageGen
oBgraFrame.put_Stride(pImage->GetStride()); oBgraFrame.put_Stride(pImage->GetStride());
oBgraFrame.put_Data(pImage->GetData()); oBgraFrame.put_Data(pImage->GetData());
SaveImage(oBgraFrame, oInfo, lWidth, lHeight); SaveImage(oBgraFrame, oInfo, lWidth, lHeight);
// //чтобы в деструкторе не удалялось
oBgraFrame.put_Data(NULL); oBgraFrame.put_Data(NULL);
m_mapImagesFile.insert(std::pair<CString,CImageInfo>(sMapKey, oInfo)); m_mapImagesFile.insert(std::pair<CString,CImageInfo>(sMapKey, oInfo));
......
//#include "./stdafx.h" //#include "./stdafx.h"
#include "FileFactory.h" #include "FileFactory.h"
#include "DocxFormat/File.h" #include "DocxFormat/File.h"
...@@ -86,12 +86,12 @@ namespace PPTX ...@@ -86,12 +86,12 @@ namespace PPTX
return smart_ptr<PPTX::File>(new PPTX::Video(filename)); return smart_ptr<PPTX::File>(new PPTX::Video(filename));
else if (relation.type() == PPTX::FileTypes::Media) // FOR NONE OPTIMIZED PPTX FILES else if (relation.type() == PPTX::FileTypes::Media) // FOR NONE OPTIMIZED PPTX FILES
return smart_ptr<PPTX::File>(new PPTX::HyperLink(filename)); return smart_ptr<PPTX::File>(new PPTX::HyperLink(filename));
else if (relation.type() == PPTX::FileTypes::Data) // filepath else if (relation.type() == PPTX::FileTypes::Data) // нужен только filepath
return smart_ptr<PPTX::File>(new PPTX::Image(filename)); return smart_ptr<PPTX::File>(new PPTX::Image(filename));
else if (relation.type() == PPTX::FileTypes::DrawingDiag) else if (relation.type() == PPTX::FileTypes::DrawingDiag)
return smart_ptr<PPTX::File>(new PPTX::Image(filename)); // filepath return smart_ptr<PPTX::File>(new PPTX::Image(filename)); // нужен только filepath
else if (relation.type() == PPTX::FileTypes::Chart) else if (relation.type() == PPTX::FileTypes::Chart)
return smart_ptr<PPTX::File>(new PPTX::Image(filename)); // filepath return smart_ptr<PPTX::File>(new PPTX::Image(filename)); // нужен только filepath
else if (relation.type() == PPTX::FileTypes::CommentAuthors) else if (relation.type() == PPTX::FileTypes::CommentAuthors)
return smart_ptr<PPTX::File>(new PPTX::Authors(filename, map)); return smart_ptr<PPTX::File>(new PPTX::Authors(filename, map));
else if (relation.type() == PPTX::FileTypes::SlideComments) else if (relation.type() == PPTX::FileTypes::SlideComments)
...@@ -111,7 +111,9 @@ namespace PPTX ...@@ -111,7 +111,9 @@ namespace PPTX
int n3 = strFile.Find(_T("ftp")); int n3 = strFile.Find(_T("ftp"));
int n4 = strFile.Find(_T("https://")); int n4 = strFile.Find(_T("https://"));
if (((n1 >= 0) && (n1 < 10)) || ((n2 >= 0) && (n2 < 10)) || ((n3 >= 0) && (n3 < 10)) || ((n4 >= 0) && (n4 < 10))) //если nI сранивать не с 0, то будут проблемы
//потому что в инсталяции мы кладем файлы в /var/www...
if (0 == n1 || 0 == n2 || 0 == n3 || 0 == n4)
bIsDownload = true; bIsDownload = true;
OOX::CPath filename = path / relation.filename(); OOX::CPath filename = path / relation.filename();
...@@ -140,4 +142,4 @@ namespace PPTX ...@@ -140,4 +142,4 @@ namespace PPTX
return smart_ptr<PPTX::File>(new PPTX::UnknowTypeFile()); return smart_ptr<PPTX::File>(new PPTX::UnknowTypeFile());
} }
} // namespace PPTX } // namespace PPTX
\ No newline at end of file
#pragma once #pragma once
#ifdef _WIN32 #ifdef _WIN32
#include "../../Common/BaseThread.h" #include "../../Common/BaseThread.h"
...@@ -8,21 +8,21 @@ ...@@ -8,21 +8,21 @@
//------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------
// // Константа для максимального числа символов в строке
#define MAX_SIZE 256 #define MAX_SIZE 256
// // Константа для максимального числа загружаемых байт
#define DOWNLOAD_FILE_SIZE 32768 #define DOWNLOAD_FILE_SIZE 32768
#define MAX_SINGLE_DOWNLOAD_FILE_SIZE 524288 #define MAX_SINGLE_DOWNLOAD_FILE_SIZE 524288
// // Константа для получения размера файла
#define CONTENT_RANGE _T("bytes 0-0/") #define CONTENT_RANGE _T("bytes 0-0/")
// CONTENT_RANGE // Константа для колличества символов у CONTENT_RANGE
#define CONTENT_RANGE_SIZE ( 11/*sizeof ( CONTENT_RANGE )*/ - 1 ) #define CONTENT_RANGE_SIZE ( 11/*sizeof ( CONTENT_RANGE )*/ - 1 )
//------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------
// // Класс для закачки файла из сети на локальный диск
//------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------
class CFileDownloader : public CBaseThread class CFileDownloader : public CBaseThread
...@@ -65,7 +65,7 @@ protected : ...@@ -65,7 +65,7 @@ protected :
unsigned int DownloadFile(CString sFileUrl) unsigned int DownloadFile(CString sFileUrl)
{ {
// // Проверяем состояние соединения
if ( FALSE == InternetGetConnectedState ( 0, 0 ) ) if ( FALSE == InternetGetConnectedState ( 0, 0 ) )
return S_FALSE; return S_FALSE;
...@@ -82,132 +82,132 @@ protected : ...@@ -82,132 +82,132 @@ protected :
m_sFilePath = CString( sTempFile ); m_sFilePath = CString( sTempFile );
// // Открываем сессию
HINTERNET hInternetSession = InternetOpen ( _T ("Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 ); HINTERNET hInternetSession = InternetOpen ( _T ("Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
if ( NULL == hInternetSession ) if ( NULL == hInternetSession )
return S_FALSE; return S_FALSE;
// ( 0 ( ) ) // Заголовок запроса ( пока содержит 0 байт ( необходимо для проверки ) )
CString sHTTPHdr = _T ("Range: bytes=0-0"); CString sHTTPHdr = _T ("Range: bytes=0-0");
// , // Открываем ссылку для проверки на ее существование, а также на возможность чтения частями
HINTERNET hInternetOpenURL = InternetOpenUrl ( hInternetSession, sFileUrl, sHTTPHdr, -1, INTERNET_FLAG_RESYNCHRONIZE, 0 ); HINTERNET hInternetOpenURL = InternetOpenUrl ( hInternetSession, sFileUrl, sHTTPHdr, -1, INTERNET_FLAG_RESYNCHRONIZE, 0 );
if ( NULL != hInternetOpenURL ) if ( NULL != hInternetOpenURL )
{ {
// , // Открытие произошло, проверяем ответ
if ( TRUE == QueryStatusCode ( hInternetOpenURL, TRUE ) ) if ( TRUE == QueryStatusCode ( hInternetOpenURL, TRUE ) )
{ {
// , // Запрос прошел удачно, проверяем возможность чтения частями и получаем размер данных
LONGLONG nFileSize = IsAccept_Ranges ( hInternetOpenURL ); LONGLONG nFileSize = IsAccept_Ranges ( hInternetOpenURL );
// // Закрываем хендл
InternetCloseHandle ( hInternetOpenURL ); InternetCloseHandle ( hInternetOpenURL );
if ( -1 == nFileSize ) if ( -1 == nFileSize )
{ {
// // Чтение частями недоступно
// // Закрываем хендл соединения
InternetCloseHandle ( hInternetSession ); InternetCloseHandle ( hInternetSession );
// ( DownloadAll) // Закрываем файл (сделается на DownloadAll)
// // Попробуем записать его целиком
return S_FALSE; return S_FALSE;
} }
else else
{ {
// // Чтение частями доступно
LONGLONG nStartByte = 0; LONGLONG nStartByte = 0;
while ( m_bRunThread ) while ( m_bRunThread )
{ {
// - // Если закачали весь файл - то выходим
if ( nStartByte == nFileSize - 1 ) if ( nStartByte == nFileSize - 1 )
{ {
// // Закрываем хендл соединения
InternetCloseHandle ( hInternetSession ); InternetCloseHandle ( hInternetSession );
return S_OK; return S_OK;
} }
LONGLONG nEndByte = nStartByte + DOWNLOAD_FILE_SIZE; LONGLONG nEndByte = nStartByte + DOWNLOAD_FILE_SIZE;
// , ( 1 , , .. 0 ) // Если файл заканчивается, то загружаем меньшее колличество байт ( на 1 меньше, чем размер, т.к. начинается с 0 )
if ( nEndByte >= nFileSize ) if ( nEndByte >= nFileSize )
nEndByte = nFileSize - 1; nEndByte = nFileSize - 1;
// // Буффер для закачки
BYTE arrBuffer [ DOWNLOAD_FILE_SIZE ] = { 0 }; BYTE arrBuffer [ DOWNLOAD_FILE_SIZE ] = { 0 };
DWORD dwBytesDownload = DownloadFilePath ( hInternetSession, arrBuffer, nStartByte, nEndByte, sFileUrl ); DWORD dwBytesDownload = DownloadFilePath ( hInternetSession, arrBuffer, nStartByte, nEndByte, sFileUrl );
nStartByte = nEndByte; nStartByte = nEndByte;
if ( -1 == dwBytesDownload ) if ( -1 == dwBytesDownload )
{ {
// - !!!! // Ничего не прочиталось - это плохо!!!!
// // Закрываем хендл соединения
InternetCloseHandle ( hInternetSession ); InternetCloseHandle ( hInternetSession );
// ( DownloadAll) // Закрываем файл (сделается на DownloadAll)
// // Попробуем записать его целиком
return S_FALSE; return S_FALSE;
} }
// // Пишем в файл
::fwrite( (BYTE*)arrBuffer, 1, dwBytesDownload, m_pFile ); ::fwrite( (BYTE*)arrBuffer, 1, dwBytesDownload, m_pFile );
::fflush( m_pFile ); ::fflush( m_pFile );
// // Проверка на приостановку
CheckSuspend (); CheckSuspend ();
} }
} }
} }
else else
{ {
// // Закрываем хендл соединения
InternetCloseHandle ( hInternetSession ); InternetCloseHandle ( hInternetSession );
// ( DownloadAll) // Закрываем файл (сделается на DownloadAll)
// // Попробуем записать его целиком
return S_FALSE; return S_FALSE;
} }
} }
else else
{ {
// // Закрываем хендл соединения
InternetCloseHandle ( hInternetSession ); InternetCloseHandle ( hInternetSession );
// ( DownloadAll) // Закрываем файл (сделается на DownloadAll)
// // Попробуем записать его целиком
return S_FALSE; return S_FALSE;
} }
// // Закрываем хендл соединения
InternetCloseHandle ( hInternetSession ); InternetCloseHandle ( hInternetSession );
return S_OK; return S_OK;
} }
DWORD DownloadFilePath ( HINTERNET hInternet, LPBYTE pBuffer, LONGLONG nStartByte, LONGLONG nEndByte, CString sFileURL ) DWORD DownloadFilePath ( HINTERNET hInternet, LPBYTE pBuffer, LONGLONG nStartByte, LONGLONG nEndByte, CString sFileURL )
{ {
// // Неоткрытая сессия
if ( NULL == hInternet ) if ( NULL == hInternet )
return -1; return -1;
// // Пришли непонятные параметры
if ( nStartByte > nEndByte || !pBuffer ) if ( nStartByte > nEndByte || !pBuffer )
return -1; return -1;
// ( nEndByte - nStartByte ) // Заголовок запроса ( содержит nEndByte - nStartByte байт )
CString sHTTPHdr = _T (""); sHTTPHdr.Format ( _T ("Range: bytes=%lld-%lld"), nStartByte, nEndByte ); CString sHTTPHdr = _T (""); sHTTPHdr.Format ( _T ("Range: bytes=%lld-%lld"), nStartByte, nEndByte );
// // Открываем ссылку для закачки
HINTERNET hInternetOpenURL = InternetOpenUrl ( hInternet, sFileURL, sHTTPHdr, -1, INTERNET_FLAG_RESYNCHRONIZE, 0 ); HINTERNET hInternetOpenURL = InternetOpenUrl ( hInternet, sFileURL, sHTTPHdr, -1, INTERNET_FLAG_RESYNCHRONIZE, 0 );
if ( NULL == hInternetOpenURL ) if ( NULL == hInternetOpenURL )
return -1; return -1;
// , // Открытие произошло, проверяем ответ
if ( FALSE == QueryStatusCode ( hInternetOpenURL, TRUE ) ) if ( FALSE == QueryStatusCode ( hInternetOpenURL, TRUE ) )
{ {
// // Закрываем хендл соединения
InternetCloseHandle ( hInternetOpenURL ); InternetCloseHandle ( hInternetOpenURL );
return -1; return -1;
} }
// // Какое колличество байт прочитано
DWORD dwBytesRead = 0; DWORD dwBytesRead = 0;
// // Читаем файл
if ( FALSE == InternetReadFile ( hInternetOpenURL, pBuffer, DOWNLOAD_FILE_SIZE, &dwBytesRead ) ) if ( FALSE == InternetReadFile ( hInternetOpenURL, pBuffer, DOWNLOAD_FILE_SIZE, &dwBytesRead ) )
{ {
// // Закрываем хендл соединения
InternetCloseHandle ( hInternetOpenURL ); InternetCloseHandle ( hInternetOpenURL );
return -1; return -1;
} }
// // Закрываем хендл соединения
InternetCloseHandle ( hInternetOpenURL ); InternetCloseHandle ( hInternetOpenURL );
return dwBytesRead; return dwBytesRead;
...@@ -239,93 +239,93 @@ protected : ...@@ -239,93 +239,93 @@ protected :
BOOL QueryStatusCode ( HINTERNET hInternet, BOOL bIsRanges ) BOOL QueryStatusCode ( HINTERNET hInternet, BOOL bIsRanges )
{ {
// - // Зачем проверять у неоткрытой сессии что-то
if ( NULL == hInternet ) if ( NULL == hInternet )
return FALSE; return FALSE;
// // Результат ответа
INT nResult = 0; INT nResult = 0;
// ( = 4 ) // Размер данных ответа ( должно быть = 4 )
DWORD dwLengthDataSize = 4; DWORD dwLengthDataSize = 4;
// , - FALSE // Делаем запрос, если не проходит - то возвращаем FALSE
if ( FALSE == HttpQueryInfo ( hInternet, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &nResult, &dwLengthDataSize, NULL ) ) if ( FALSE == HttpQueryInfo ( hInternet, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &nResult, &dwLengthDataSize, NULL ) )
return FALSE; return FALSE;
// , // Запрос прошел, теперь проверяем код ответа
if ( HTTP_STATUS_NOT_FOUND == nResult ) if ( HTTP_STATUS_NOT_FOUND == nResult )
{ {
// , - // Объект не найден, плохая ссылка или что-то еще
return FALSE; return FALSE;
} }
else if ( ( HTTP_STATUS_OK != nResult && FALSE == bIsRanges ) || ( HTTP_STATUS_PARTIAL_CONTENT != nResult && TRUE == bIsRanges ) ) else if ( ( HTTP_STATUS_OK != nResult && FALSE == bIsRanges ) || ( HTTP_STATUS_PARTIAL_CONTENT != nResult && TRUE == bIsRanges ) )
{ {
// - // Запрос не прошел по какой-то причине
return FALSE; return FALSE;
} }
// , // Все отлично, запрос прошел
return TRUE; return TRUE;
} }
// , -1 , // Проверяет, доступно ли для ресурса чтение частями и возвращает -1 если не доступно и размер данных, если доступно
LONGLONG IsAccept_Ranges ( HINTERNET hInternet ) LONGLONG IsAccept_Ranges ( HINTERNET hInternet )
{ {
// - // Зачем проверять у неоткрытой сессии что-то
if ( NULL == hInternet ) if ( NULL == hInternet )
return -1; return -1;
// // Результат ответа
char arrResult [ MAX_SIZE ] = { 0 }; char arrResult [ MAX_SIZE ] = { 0 };
// // Размер данных ответа
DWORD dwLengthDataSize = sizeof ( arrResult ); DWORD dwLengthDataSize = sizeof ( arrResult );
// , - FALSE // Делаем запрос, если не проходит - то возвращаем FALSE
if ( FALSE == HttpQueryInfoA ( hInternet, HTTP_QUERY_CONTENT_RANGE, &arrResult, &dwLengthDataSize, NULL ) ) if ( FALSE == HttpQueryInfoA ( hInternet, HTTP_QUERY_CONTENT_RANGE, &arrResult, &dwLengthDataSize, NULL ) )
{ {
// // Получаем последнюю ошибку
DWORD dwLastError = GetLastError (); DWORD dwLastError = GetLastError ();
if ( dwLastError == ERROR_HTTP_HEADER_NOT_FOUND ) if ( dwLastError == ERROR_HTTP_HEADER_NOT_FOUND )
{ {
// , // Не пришел заголовок, значит ресурс не поддерживает чтение частями
return -1; return -1;
} }
// - - FALSE // Возникла какая-то другая ошибка - возвращаем FALSE
return -1; return -1;
} }
// 0, // Если размер 0, то заголовка нет
if ( 0 >= dwLengthDataSize ) if ( 0 >= dwLengthDataSize )
return -1; return -1;
// CString // Приведем к CString
CString strResult ( arrResult ); CString strResult ( arrResult );
// // Содержит размер данных
LONGLONG nFileSize = 0; LONGLONG nFileSize = 0;
try try
{ {
// // Ищем индекс размера данных в строке
INT nStartIndex = strResult.Find ( CONTENT_RANGE ); INT nStartIndex = strResult.Find ( CONTENT_RANGE );
if ( -1 == nStartIndex ) if ( -1 == nStartIndex )
return -1; return -1;
// // Оставляем в строке только размер данных
strResult = strResult.Mid ( nStartIndex + CONTENT_RANGE_SIZE ); strResult = strResult.Mid ( nStartIndex + CONTENT_RANGE_SIZE );
// , LONGLONG // Теперь получим размер данных, переводя стринг в LONGLONG
nFileSize = _wtoi64 ( strResult.GetBuffer () ); nFileSize = _wtoi64 ( strResult.GetBuffer () );
// .. 0 ( 1 ) // Т.к. реально нумерация с 0 ( поэтому добавляем еще 1 байт )
if ( 0 < nFileSize ) if ( 0 < nFileSize )
nFileSize += 1; nFileSize += 1;
} }
catch ( ... ) catch ( ... )
{ {
// // не нашли возвращаем ошибку
return -1; return -1;
} }
// , , // Все отлично, ресурс поддерживает чтение частями, возвращаем размер
return nFileSize; return nFileSize;
} }
...@@ -336,7 +336,7 @@ protected : ...@@ -336,7 +336,7 @@ protected :
::fclose( m_pFile ); ::fclose( m_pFile );
m_pFile = NULL; m_pFile = NULL;
} }
// // Скачиваем файл
return URLDownloadToFile (NULL, sFileURL, strFileOutput, NULL, NULL); return URLDownloadToFile (NULL, sFileURL, strFileOutput, NULL, NULL);
} }
...@@ -348,19 +348,21 @@ public: ...@@ -348,19 +348,21 @@ public:
int n3 = FilePath.Find(_T("ftp://")); int n3 = FilePath.Find(_T("ftp://"));
int n4 = FilePath.Find(_T("https://")); int n4 = FilePath.Find(_T("https://"));
if (((n1 >= 0) && (n1 < 10)) || ((n2 >= 0) && (n2 < 10)) || ((n3 >= 0) && (n3 < 10)) || ((n4 >= 0) && (n4 < 10))) //если nI сранивать не с 0, то будут проблемы
//потому что в инсталяции мы кладем файлы в /var/www...
if (0 == n1 || 0 == n2 || 0 == n3 || 0 == n4)
return true; return true;
return false; return false;
} }
protected : protected :
FILE *m_pFile; // FILE *m_pFile; // Хэндл на временный файл
CString m_sFilePath; // CString m_sFilePath; // Путь к сохраненному файлу на диске
CString m_sFileUrl; // CString m_sFileUrl; // Ссылка на скачивание файла
bool m_bComplete; // bool m_bComplete; // Закачался файл или нет
bool m_bDelete; // bool m_bDelete; // Удалять ли файл в деструкторе
}; };
#else #else
...@@ -432,7 +434,7 @@ public : ...@@ -432,7 +434,7 @@ public :
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
#if defined(__linux__) #if defined(__linux__)
// linux , //в linux нет встроенных в систему корневых сертификатов, поэтому отключаем проверку
//http://curl.haxx.se/docs/sslcerts.html //http://curl.haxx.se/docs/sslcerts.html
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
#endif #endif
...@@ -492,17 +494,19 @@ public: ...@@ -492,17 +494,19 @@ public:
int n3 = FilePath.Find(_T("ftp://")); int n3 = FilePath.Find(_T("ftp://"));
int n4 = FilePath.Find(_T("https://")); int n4 = FilePath.Find(_T("https://"));
if (((n1 >= 0) && (n1 < 10)) || ((n2 >= 0) && (n2 < 10)) || ((n3 >= 0) && (n3 < 10)) || ((n4 >= 0) && (n4 < 10))) //если nI сранивать не с 0, то будут проблемы
//потому что в инсталяции мы кладем файлы в /var/www...
if (0 == n1 || 0 == n2 || 0 == n3 || 0 == n4)
return true; return true;
return false; return false;
} }
protected : protected :
CString m_sFilePath; // CString m_sFilePath; // Путь к сохраненному файлу на диске
CString m_sFileUrl; // CString m_sFileUrl; // Ссылка на скачивание файла
bool m_bComplete; // bool m_bComplete; // Закачался файл или нет
bool m_bDelete; // bool m_bDelete; // Удалять ли файл в деструкторе
}; };
......
...@@ -16,12 +16,16 @@ namespace NSSystemPath ...@@ -16,12 +16,16 @@ namespace NSSystemPath
static std::wstring GetDirectoryName(const std::wstring& strFileName) static std::wstring GetDirectoryName(const std::wstring& strFileName)
{ {
std::wstring sRes; std::wstring sRes;
//_wsplitpath return directory path, including trailing slash.
//dirname() returns the string up to, but not including, the final '/',
#if defined(_WIN32) || defined (_WIN64) #if defined(_WIN32) || defined (_WIN64)
wchar_t tDrive[256]; wchar_t tDrive[256];
wchar_t tFolder[256]; wchar_t tFolder[256];
_wsplitpath( strFileName.c_str(), tDrive, tFolder, NULL, NULL ); _wsplitpath( strFileName.c_str(), tDrive, tFolder, NULL, NULL );
sRes.append(tDrive); sRes.append(tDrive);
sRes.append(tFolder); sRes.append(tFolder);
if(sRes.length() > 0)
sRes.erase(sRes.length()-1);
#elif __linux__ || MAC #elif __linux__ || MAC
BYTE* pUtf8 = NULL; BYTE* pUtf8 = NULL;
LONG lLen = 0; LONG lLen = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment