| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 | //---------------------------------------------------------------------------#ifndef StdAfxH#define StdAfxH//---------------------------------------------------------------------------#define _int64 __int64//---------------------------------------------------------------------------#define MPEXT_NO_ZLIB#define MPEXT_NO_GSS#define _AFX_ENABLE_INLINES#define _AFX_NOFORCE_LIBS//---------------------------------------------------------------------------#define LENOF(x) ( (sizeof((x))) / (sizeof(*(x))))//---------------------------------------------------------------------------#include <afx.h>#include "wtypes.h"// STL includes#include <list>#include <map>#include <vector>#include <deque>#include <set>#include <algorithm>//---------------------------------------------------------------------------class CFileFix;#define CFile CFileFix//---------------------------------------------------------------------------#pragma hdrstop//---------------------------------------------------------------------------#include <Global.h>// these create conflict with afxwin.h#undef BEGIN_MESSAGE_MAP#undef END_MESSAGE_MAP//---------------------------------------------------------------------------#include "MFC64bitFix.h"#include <ApiLog.h>#include <TextsFileZilla.h>//---------------------------------------------------------------------------#include <oleauto.h>#include <afxconv.h>//---------------------------------------------------------------------------#define _strlwr strlwr//---------------------------------------------------------------------------const int FILEEXISTS_OVERWRITE = 0;const int FILEEXISTS_RESUME = 1;const int FILEEXISTS_RENAME = 2;const int FILEEXISTS_SKIP = 3;const int FILEEXISTS_COMPLETE = 4;//---------------------------------------------------------------------------class t_ffam_statusmessage{public:  CString status;  int type;  BOOL post;};//---------------------------------------------------------------------------typedef struct{  __int64 bytes;  __int64 transfersize;  BOOL bFileTransfer;} t_ffam_transferstatus;//---------------------------------------------------------------------------#undef CFile//---------------------------------------------------------------------------class CFileFix : public CFile{public:  // MFC CFile::Read does not include file name into error message  UINT Read(void * lpBuf, UINT nCount)  {    ASSERT_VALID(this);    DebugAssert(m_hFile != (UINT)hFileNull);    if (nCount == 0)    {      return 0;   // avoid Win32 "null-read"    }    DebugAssert(lpBuf != NULL);    DebugAssert(AfxIsValidAddress(lpBuf, nCount));    DWORD dwRead;    if (!::ReadFile((HANDLE)m_hFile, lpBuf, nCount, &dwRead, NULL))    {      // The only change from MFC CFile::Read is m_strFileName      CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);    }    return (UINT)dwRead;  }  // MFC allocates CObject (ancestor of CFile) with new, but deallocates with free,  // what codeguard dislikes, this is fix, not sure if it is necessary for  // release version, but probably causes no harm  void PASCAL operator delete(void * p)  {    delete p;  }};//---------------------------------------------------------------------------#define CFile CFileFix//---------------------------------------------------------------------------struct CStringDataA{  long nRefs;             // reference count  int nDataLength;        // length of data (including terminator)  int nAllocLength;       // length of allocation  // char data[nAllocLength];  CHAR * data()           // CHAR* to managed data  {    return (CHAR *)(this+1);  }};//---------------------------------------------------------------------------extern LPCSTR _afxPchNilA;extern CStringDataA* _afxDataNilA;#define afxEmptyStringA ((CStringA&)*(CStringA*)&_afxPchNilA)//---------------------------------------------------------------------------class CStringA{public:  CStringA()  {    m_pchData = afxEmptyStringA.m_pchData;  }  CStringA(const CStringA& stringSrc)  {    DebugAssert(stringSrc.GetData()->nRefs != 0);    if (stringSrc.GetData()->nRefs >= 0)    {      DebugAssert(stringSrc.GetData() != _afxDataNilA);      m_pchData = stringSrc.m_pchData;      InterlockedIncrement(&GetData()->nRefs);    }    else    {      Init();      *this = stringSrc.m_pchData;    }  }  CStringA(LPCSTR lpsz)  {    Init();    if (lpsz != NULL && HIWORD(lpsz) == NULL)    {      DebugFail();    }    else    {      int nLen = SafeStrlen(lpsz);      if (nLen != 0)      {        AllocBuffer(nLen);        memcpy(m_pchData, lpsz, nLen*sizeof(char));      }    }  }  ~CStringA()  {    if (GetData() != _afxDataNilA)    {      if (InterlockedDecrement(&GetData()->nRefs) <= 0)      {        FreeData(GetData());      }    }  }  int GetLength() const  {    return GetData()->nDataLength;  }  char operator[](int nIndex) const  {    // same as GetAt    DebugAssert(nIndex >= 0);    DebugAssert(nIndex < GetData()->nDataLength);    return m_pchData[nIndex];  }  // ref-counted copy from another CString  CStringA& operator=(const CStringA& stringSrc)  {    if (m_pchData != stringSrc.m_pchData)    {      if ((GetData()->nRefs < 0 && GetData() != _afxDataNilA) ||          stringSrc.GetData()->nRefs < 0)      {        // actual copy necessary since one of the strings is locked        AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);      }      else      {        // can just copy references around        Release();        DebugAssert(stringSrc.GetData() != _afxDataNilA);        m_pchData = stringSrc.m_pchData;        InterlockedIncrement(&GetData()->nRefs);      }    }    return *this;  }  const CStringA & operator=(LPCSTR lpsz)  {    DebugAssert(lpsz == NULL || AfxIsValidString(lpsz));    AssignCopy(SafeStrlen(lpsz), lpsz);    return *this;  }  const CStringA & operator+=(char ch)  {    ConcatInPlace(1, &ch);    return *this;  }  friend CStringA AFXAPI operator+(const CStringA & string, char ch);  operator LPCSTR() const  {    return m_pchData;  }  int Compare(LPCSTR lpsz) const  {    DebugAssert(AfxIsValidString(lpsz));    return strcmp(m_pchData, lpsz);  }  CStringA Mid(int nFirst, int nCount) const  {    // out-of-bounds requests return sensible things    if (nFirst < 0)    {      nFirst = 0;    }    if (nCount < 0)    {      nCount = 0;    }    if (nFirst + nCount > GetData()->nDataLength)    {      nCount = GetData()->nDataLength - nFirst;    }    if (nFirst > GetData()->nDataLength)    {      nCount = 0;    }    DebugAssert(nFirst >= 0);    DebugAssert(nFirst + nCount <= GetData()->nDataLength);    // optimize case of returning entire string    if (nFirst == 0 && nFirst + nCount == GetData()->nDataLength)    {      return *this;    }    CStringA dest;    AllocCopy(dest, nCount, nFirst, 0);    return dest;  }  CStringA Left(int nCount) const  {    if (nCount < 0)    {      nCount = 0;    }    if (nCount >= GetData()->nDataLength)    {      return *this;    }    CStringA dest;    AllocCopy(dest, nCount, 0, 0);    return dest;  }  int Find(char ch) const  {    return Find(ch, 0);  }  int Find(char ch, int nStart) const  {    int nLength = GetData()->nDataLength;    if (nStart >= nLength)    {      return -1;    }    // find first single character    LPSTR lpsz = strchr(m_pchData + nStart, (unsigned char)ch);    // return -1 if not found and index otherwise    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);  }  // find a sub-string (like strstr)  int Find(LPCSTR lpszSub) const  {    return Find(lpszSub, 0);  }  int Find(LPCSTR lpszSub, int nStart) const  {    DebugAssert(AfxIsValidString(lpszSub));    int nLength = GetData()->nDataLength;    if (nStart > nLength)    {      return -1;    }    // find first matching substring    LPSTR lpsz = strstr(m_pchData + nStart, lpszSub);    // return -1 for not found, distance from beginning otherwise    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);  }  void MakeUpper()  {    CopyBeforeWrite();    strupr(m_pchData);  }protected:  LPSTR m_pchData;   // pointer to ref counted string data  CStringDataA * GetData() const  {    DebugAssert(m_pchData != NULL); return ((CStringDataA*)m_pchData)-1;  }  void Init()  {    m_pchData = afxEmptyStringA.m_pchData;  }  void AllocCopy(CStringA & dest, int nCopyLen, int nCopyIndex, int nExtraLen) const  {    // will clone the data attached to this string    // allocating 'nExtraLen' characters    // Places results in uninitialized string 'dest'    // Will copy the part or all of original data to start of new string    int nNewLen = nCopyLen + nExtraLen;    if (nNewLen == 0)    {      dest.Init();    }    else    {      dest.AllocBuffer(nNewLen);      memcpy(dest.m_pchData, m_pchData+nCopyIndex, nCopyLen*sizeof(char));    }  }  void AllocBuffer(int nLen)  // always allocate one extra character for '\0' termination  // assumes [optimistically] that data length will equal allocation length  {    DebugAssert(nLen >= 0);    DebugAssert(nLen <= INT_MAX-1);    // max size (enough room for 1 extra)    if (nLen == 0)    {      Init();    }    else    {      CStringDataA* pData;      {        pData = (CStringDataA*)          new BYTE[sizeof(CStringDataA) + (nLen+1)*sizeof(char)];        pData->nAllocLength = nLen;      }      pData->nRefs = 1;      pData->data()[nLen] = '\0';      pData->nDataLength = nLen;      m_pchData = pData->data();    }  }  void AssignCopy(int nSrcLen, LPCSTR lpszSrcData)  {    AllocBeforeWrite(nSrcLen);    memcpy(m_pchData, lpszSrcData, nSrcLen*sizeof(char));    GetData()->nDataLength = nSrcLen;    m_pchData[nSrcLen] = '\0';  }  void FASTCALL FreeData(CStringDataA * pData)  {    delete[] (BYTE*)pData;  }  void PASCAL Release(CStringDataA * pData)  {    if (pData != _afxDataNilA)    {      DebugAssert(pData->nRefs != 0);      if (InterlockedDecrement(&pData->nRefs) <= 0)      {        FreeData(pData);      }    }  }  void Release()  {    if (GetData() != _afxDataNilA)    {      DebugAssert(GetData()->nRefs != 0);      if (InterlockedDecrement(&GetData()->nRefs) <= 0)      {        FreeData(GetData());      }      Init();    }  }  void ConcatCopy(int nSrc1Len, LPCSTR lpszSrc1Data, int nSrc2Len, LPCSTR lpszSrc2Data)  {    // -- master concatenation routine    // Concatenate two sources    // -- assume that 'this' is a new CString object    int nNewLen = nSrc1Len + nSrc2Len;    if (nNewLen != 0)    {      AllocBuffer(nNewLen);      memcpy(m_pchData, lpszSrc1Data, nSrc1Len*sizeof(char));      memcpy(m_pchData+nSrc1Len, lpszSrc2Data, nSrc2Len*sizeof(char));    }  }  void ConcatInPlace(int nSrcLen, LPCSTR lpszSrcData)  {    //  -- the main routine for += operators    // concatenating an empty string is a no-op!    if (nSrcLen == 0)    {      return;    }    // if the buffer is too small, or we have a width mis-match, just    //   allocate a new buffer (slow but sure)    if (GetData()->nRefs > 1 || GetData()->nDataLength + nSrcLen > GetData()->nAllocLength)    {      // we have to grow the buffer, use the ConcatCopy routine      CStringDataA* pOldData = GetData();      ConcatCopy(GetData()->nDataLength, m_pchData, nSrcLen, lpszSrcData);      DebugAssert(pOldData != NULL);      CStringA::Release(pOldData);    }    else    {      // fast concatenation when buffer big enough      memcpy(m_pchData+GetData()->nDataLength, lpszSrcData, nSrcLen*sizeof(char));      GetData()->nDataLength += nSrcLen;      DebugAssert(GetData()->nDataLength <= GetData()->nAllocLength);      m_pchData[GetData()->nDataLength] = '\0';    }  }  void CopyBeforeWrite()  {    if (GetData()->nRefs > 1)    {      CStringDataA* pData = GetData();      Release();      AllocBuffer(pData->nDataLength);      memcpy(m_pchData, pData->data(), (pData->nDataLength+1)*sizeof(char));    }    DebugAssert(GetData()->nRefs <= 1);  }  void AllocBeforeWrite(int nLen)  {    if (GetData()->nRefs > 1 || nLen > GetData()->nAllocLength)    {      Release();      AllocBuffer(nLen);    }    DebugAssert(GetData()->nRefs <= 1);  }  static int PASCAL SafeStrlen(LPCSTR lpsz)  {    return (lpsz == NULL) ? 0 : strlen(lpsz);  }};//---------------------------------------------------------------------------inline bool AFXAPI operator==(const CStringA & s1, LPCSTR s2){  return s1.Compare(s2) == 0;}//---------------------------------------------------------------------------inline bool AFXAPI operator!=(const CStringA & s1, LPCSTR s2){  return s1.Compare(s2) != 0;}//---------------------------------------------------------------------------inline CStringA AFXAPI operator+(const CStringA & string1, char ch){  CStringA s;  s.ConcatCopy(string1.GetData()->nDataLength, string1.m_pchData, 1, &ch);  return s;}//---------------------------------------------------------------------------#include <FileZillaApi.h>#include <FileZillaOpt.h>//---------------------------------------------------------------------------#endif
 |