//This file is part of HTTPServer a Miranda IM plugin //Copyright (C)2002 Kennet Nielsen // //This program is free software; you can redistribute it and/or //modify it under the terms of the GNU General Public License //as published by the Free Software Foundation; either //version 2 of the License, or (at your option) any later version. // //This program is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //GNU General Public License for more details. // //You should have received a copy of the GNU General Public License //along with this program; if not, write to the Free Software //Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "Glob.h" static const char szXmlHeader1[] = "\r\n" "\r\n" "\r\n"; static const char szXmlTail[] = ""; static void ReplaceSign(TCHAR *pszSrc, int MaxLength, const TCHAR pszReplace, const TCHAR *pszNew) { static TCHAR szBuffer[1024]; TCHAR *pszSign = _tcschr(pszSrc, pszReplace); if (pszSign) { _tcscpy(szBuffer, pszSrc); do { _tcscpy(szBuffer + (pszSign - pszSrc), pszNew); _tcscpy(szBuffer + (pszSign - pszSrc) + _tcslen(pszNew), pszSign + 1); *pszSign = ' '; } while (pszSign = _tcschr(pszSrc, pszReplace)); _tcsncpy(pszSrc, szBuffer, MaxLength); pszSrc[MaxLength-1] = '\0'; } } ///////////////////////////////////////////////////////////////////// // Member Function : bCreateIndexXML // Type : Global // Parameters : pszRealPath - ? // Returns : // Description : // // References : - // Remarks : - // Created : 050821, 05 august 2005 // Developer : Houdini ///////////////////////////////////////////////////////////////////// bool bCreateIndexXML(const TCHAR *pszRealPath, const TCHAR *pszIndexPath, const TCHAR *pszSrvPath, DWORD dwRemoteIP) { TCHAR szMask[MAX_PATH+1]; _tcscpy(szMask, pszRealPath); _tcscat(szMask, _T("*")); WIN32_FIND_DATA fdFindFileData; HANDLE hFind = FindFirstFile(szMask, &fdFindFileData); if (hFind == INVALID_HANDLE_VALUE) return FALSE; HANDLE hFile = CreateFile(pszIndexPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL); if (hFile == INVALID_HANDLE_VALUE) { FindClose(hFind); return FALSE; } const int BUFFER_SIZE = 1000; TCHAR szBuffer[BUFFER_SIZE+1]; TCHAR *pszBuffer = szBuffer; TCHAR szFileName[MAX_PATH+1] = _T(""); TCHAR* pszExt; DWORD dwBytesWritten = 0; // Generate Dirname _tcscpy(szBuffer, pszSrvPath); TCHAR *pszTemp = _tcsrchr(szBuffer, '/'); if (pszTemp) *pszTemp = '\0'; pszTemp = _tcsrchr(szBuffer, '/'); if (pszTemp) _tcscpy(szFileName, pszTemp + 1); // Write Header WriteFile(hFile, szXmlHeader1, sizeof(szXmlHeader1) - 1, &dwBytesWritten, NULL); // check if a index.xsl exists in the same directory otherwise use the global _tcscpy(szMask, pszRealPath); _tcscat(szMask, _T("index.xsl")); HANDLE hFileExists = CreateFile(szMask, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFileExists == INVALID_HANDLE_VALUE) { _tcscpy(szBuffer, _T("/index.xsl")); } else { CloseHandle(hFileExists); _tcscpy(szBuffer, _T("index.xsl")); } WriteFile(hFile, szBuffer, (DWORD)_tcslen(szBuffer), &dwBytesWritten, NULL); WriteFile(hFile, szXmlHeader2, sizeof(szXmlHeader2) - 1, &dwBytesWritten, NULL); // Write dirname ReplaceSign(szFileName, MAX_PATH, '&', _T("&")); pszBuffer += mir_sntprintf(pszBuffer, BUFFER_SIZE - (pszBuffer - szBuffer), _T(" %s\r\n"), szFileName); WriteFile(hFile, szBuffer, pszBuffer - szBuffer, &dwBytesWritten, NULL); // Find files and directories do { if (_tcscmp(fdFindFileData.cFileName, _T(".")) && _tcsncmp(fdFindFileData.cFileName, _T("@"), _tcslen(_T("@"))) && (_tcscmp(fdFindFileData.cFileName, _T("..")) || _tcscmp(pszSrvPath, _T("/")))) { // hide .. in root pszBuffer = szBuffer; _tcscpy(szFileName, fdFindFileData.cFileName); ReplaceSign(szFileName, MAX_PATH, '&', _T("&")); if (fdFindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { pszBuffer += mir_sntprintf(pszBuffer, BUFFER_SIZE - (pszBuffer - szBuffer), _T(" \r\n"), szFileName); } else { pszExt = _tcsrchr(szFileName, '.'); if (pszExt != NULL) { *pszExt = '\0'; pszExt++; } pszBuffer += mir_sntprintf(pszBuffer, BUFFER_SIZE - (pszBuffer - szBuffer), _T(" \r\n")); } if (!WriteFile(hFile, szBuffer, pszBuffer - szBuffer, &dwBytesWritten, NULL)) break; } } while (FindNextFile(hFind, &fdFindFileData)); if (hFind != 0) FindClose(hFind); // Add other shared files & directories for (CLFileShareNode * pclCur = pclFirstNode; pclCur ; pclCur = pclCur->pclNext) { if (!((pclCur->st.dwAllowedIP ^ dwRemoteIP) & pclCur->st.dwAllowedMask) && // hide inaccessible shares (size_t)(pclCur->nGetSrvPathLen()) > _tcslen(pszSrvPath) && !_tcsstr(pclCur->st.pszRealPath, _T("\\@")) && !_tcsncmp(pclCur->st.pszSrvPath, pszSrvPath, _tcslen(pszSrvPath))) { pszBuffer = szBuffer; _tcscpy(szFileName, &pclCur->st.pszSrvPath[_tcslen(pszSrvPath)]); ReplaceSign(szFileName, MAX_PATH, '&', _T("&")); if (pclCur->bIsDirectory()) { szFileName[_tcslen(szFileName)-1] = '\0'; if (!_tcschr(szFileName, '/')) { // only one level deeper pszBuffer += mir_sntprintf(pszBuffer, BUFFER_SIZE - (pszBuffer - szBuffer), _T(" \r\n"), szFileName); if (!WriteFile(hFile, szBuffer, pszBuffer - szBuffer, &dwBytesWritten, NULL)) break; } } else { if (!_tcschr(szFileName, '/') && // only one level deeper _tcsncmp(pszRealPath, pclCur->st.pszRealPath, _tcslen(pszRealPath))) { // no duplicates pszExt = _tcsrchr(szFileName, '.'); if (pszExt != NULL) { *pszExt = '\0'; pszExt++; } DWORD dwFileSize = 0; FILETIME ftFileCreateTime; FILETIME ftFileAccessTime; FILETIME ftFileModifyTime; HANDLE hFileS = CreateFile(pclCur->st.pszRealPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFileS != INVALID_HANDLE_VALUE) { dwFileSize = GetFileSize(hFileS, NULL); GetFileTime(hFileS, &ftFileCreateTime, &ftFileAccessTime, &ftFileModifyTime); CloseHandle(hFileS); } pszBuffer += mir_sntprintf(pszBuffer, BUFFER_SIZE - (pszBuffer - szBuffer), _T(" \r\n")); if (!WriteFile(hFile, szBuffer, pszBuffer - szBuffer, &dwBytesWritten, NULL)) break; } } } } WriteFile(hFile, szXmlTail, sizeof(szXmlTail) - 1, &dwBytesWritten, NULL); SetEndOfFile(hFile); CloseHandle(hFile); return TRUE; }