| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554 | //---------------------------------------------------------------------------#include "stdafx.h"#include "ServerPath.h"#include "structures.h"#define FTP_MVS_DOUBLE_QUOTA (TCHAR)0xDC//////////////////////////////////////////////////////////////////////// Konstruktion/Destruktion//////////////////////////////////////////////////////////////////////CServerPath::CServerPath(){  m_nServerType = 0;  m_bEmpty = TRUE;}CServerPath::CServerPath(CString path, bool trim){  m_nServerType = FZ_SERVERTYPE_FTP;  if (trim)  {    path.TrimLeft( L" " );    path.TrimRight( L" " );  }  if (path == L"")  {    m_bEmpty = TRUE;    return;  }  else    m_bEmpty = FALSE;  int pos1 = path.Find( L":[" );  if (pos1 != -1 && path.Right(1) == L"]" && pos1 != (path.GetLength()-1))    m_nServerType |= FZ_SERVERTYPE_SUB_FTP_VMS;  else if (path.GetLength() >= 3 && _istalpha(path[0]) && path[1] == L':' && (path[2] == L'\\' || path[2] == L'/'))    m_nServerType |= FZ_SERVERTYPE_SUB_FTP_WINDOWS;  else if (path[0] == FTP_MVS_DOUBLE_QUOTA && path[path.GetLength() - 1] == FTP_MVS_DOUBLE_QUOTA)    m_nServerType |= FZ_SERVERTYPE_SUB_FTP_MVS;  else if (path.GetLength() > 2 && path[0] == L'\'' && path.Right(1) == L"'" && path.Find(L'/') == -1 && path.Find(L'\\') == -1)    m_nServerType |= FZ_SERVERTYPE_SUB_FTP_MVS;  *this = CServerPath(path, m_nServerType, trim);}CServerPath::CServerPath(CString path, int nServerType, bool trim){  m_nServerType = nServerType;  if (trim)  {    path.TrimLeft( L" " );    path.TrimRight( L" " );  }  if (path == L"")  {    m_bEmpty = TRUE;    return;  }  else    m_bEmpty = FALSE;  switch (m_nServerType&FZ_SERVERTYPE_HIGHMASK)  {  case FZ_SERVERTYPE_FTP:    switch(m_nServerType&FZ_SERVERTYPE_SUBMASK)    {    case FZ_SERVERTYPE_SUB_FTP_MVS:    case FZ_SERVERTYPE_SUB_FTP_BS2000:      {        path.TrimLeft(FTP_MVS_DOUBLE_QUOTA);        path.TrimRight(FTP_MVS_DOUBLE_QUOTA);        path.TrimLeft(L'\'');        path.TrimRight(L'\'');        path.TrimLeft(L'.');        while (path.Replace(L"..", L"."));        int pos = path.Find(L".");        while (pos != -1)        {          m_Segments.push_back(path.Left(pos));          path = path.Mid(pos + 1);          pos = path.Find( L"." );        }        if (path != L"")          m_Segments.push_back(path);        else          m_Prefix = L".";      }      break;    case FZ_SERVERTYPE_SUB_FTP_VMS:      {        int pos1 = path.Find( L"[" );        if (pos1 == -1 || path.Right(1) != L"]")        {          DebugFail();          m_bEmpty = TRUE;          return;        }        path.TrimRight( L"]" );        if (pos1)          m_Prefix = path.Left(pos1);        path = path.Mid(pos1 + 1);        int pos = path.Find( L"." );        while (pos != -1)        {          m_Segments.push_back(path.Left(pos));          path = path.Mid(pos+1);          pos = path.Find( L"." );        }        if (path != L"")          m_Segments.push_back(path);      }      break;    default:      path.Replace( L"\\", L"/" );      while (path.Replace( L"//", L"/" ));      path.TrimLeft( L"/" );      path.TrimRight( L"/" );      int pos = path.Find( L"/" );      while (pos != -1)      {        m_Segments.push_back(path.Left(pos));        path = path.Mid(pos+1);        pos = path.Find( L"/" );      }      if (path != L"")        m_Segments.push_back(path);      break;    }    break;  default:    DebugFail();  }}CServerPath::CServerPath(const CServerPath &path){  m_nServerType = path.m_nServerType;  m_Prefix = path.m_Prefix;  m_bEmpty = path.m_bEmpty;  m_Segments = path.m_Segments;}CServerPath::~CServerPath(){}void CServerPath::SetServer(const t_server &server){  m_nServerType=server.nServerType;}BOOL CServerPath::SetPath(CString &newpath, BOOL bIsFile /*=FALSE*/){  CString file;  CString path=newpath;  path.TrimLeft( L" " );  path.TrimRight( L" " );  if (path != L"")    m_bEmpty = FALSE;  else    m_bEmpty = TRUE;  if (!(m_nServerType & FZ_SERVERTYPE_HIGHMASK))    m_nServerType = FZ_SERVERTYPE_FTP;  if (!(m_nServerType&FZ_SERVERTYPE_SUBMASK) && (m_nServerType&FZ_SERVERTYPE_HIGHMASK)==FZ_SERVERTYPE_FTP)  {    int pos1 = path.Find( L":[" );    if (pos1!=-1 && pos1!=(path.GetLength()-2))    {      if (!bIsFile && path.Right(1)==L"]")        m_nServerType|=FZ_SERVERTYPE_SUB_FTP_VMS;      else if (bIsFile && path.ReverseFind(']')>(pos1+1))        m_nServerType|=FZ_SERVERTYPE_SUB_FTP_VMS;    }    if (newpath.GetLength() >= 3 && _istalpha(newpath[0]) && newpath[1] == L':' && (newpath[2] == L'\\' || newpath[2] == L'/'))      m_nServerType |= FZ_SERVERTYPE_SUB_FTP_WINDOWS;    else if (path[0] == FTP_MVS_DOUBLE_QUOTA && path[path.GetLength() - 1] == FTP_MVS_DOUBLE_QUOTA)      m_nServerType |= FZ_SERVERTYPE_SUB_FTP_MVS;  }  m_Segments.clear();  m_Prefix = L"";  switch (m_nServerType&FZ_SERVERTYPE_HIGHMASK)  {    case FZ_SERVERTYPE_FTP:      switch (m_nServerType&FZ_SERVERTYPE_SUBMASK)      {      case FZ_SERVERTYPE_SUB_FTP_MVS:      case FZ_SERVERTYPE_SUB_FTP_BS2000:        {          path.TrimLeft(FTP_MVS_DOUBLE_QUOTA);          path.TrimRight(FTP_MVS_DOUBLE_QUOTA);          path.TrimLeft(L'\'');          path.TrimRight(L'\'');          path.TrimLeft(L'.');          while (path.Replace(L"..", L"."));          int pos = path.Find(L".");          while (pos != -1)          {            m_Segments.push_back(path.Left(pos));            path = path.Mid(pos + 1);            pos = path.Find( L"." );          }          if (path != L"")            m_Segments.push_back(path);          else            m_Prefix = L".";          if (bIsFile)          {            if (m_Segments.empty())              return FALSE;            file = m_Segments.back();            m_Segments.pop_back();            if (file.Right(1) == L".")              return FALSE;            int pos = file.Find(L'(');            int pos2 = file.Find(L')');            if (pos != -1)            {              if (!pos || pos2 != file.GetLength() - 2)                return FALSE;              m_Prefix = L"";              m_Segments.push_back(file.Left(pos));              file = file.Mid(pos + 1, pos2 - pos - 1);            }            else if (pos2 != -1)              return FALSE;          }        }        break;      case FZ_SERVERTYPE_SUB_FTP_VMS:        {          int pos1=path.Find( L"[" );          if (pos1==-1)            return FALSE;          if (bIsFile)          {            int rpos=path.ReverseFind(L']');            if (rpos==-1)              return FALSE;            else if (rpos!=(path.GetLength()-1) )            {              file=path.Mid(rpos+1);              path=path.Left(rpos+1);            }            else              return FALSE;          }          if (path.Right(1)!=L"]")            return FALSE;          path.TrimRight( L"]" );          if (pos1)            m_Prefix=path.Left(pos1);          path=path.Mid(pos1+1);          int pos=path.Find( L"." );          while(pos!=-1)          {            m_Segments.push_back(path.Left(pos));            path=path.Mid(pos+1);            pos=path.Find( L"." );          }          if (path!=L"")            m_Segments.push_back(path);        }        break;      default:        path.Replace( L"\\", L"/" );        while(path.Replace( L"//", L"/" ));        path.TrimLeft( L"/" );        if (bIsFile)        {          if (path.Right(1)!= L"/" )          {            int rpos=path.ReverseFind(L'/');            if (rpos==-1)            {              newpath=path;              m_bEmpty=TRUE;              return TRUE;            }            file=path.Mid(rpos+1);            path=path.Left(rpos);          }          else            return FALSE;        }        path.TrimRight( L"/" );        int pos=path.Find( L"/" );        while(pos!=-1)        {          m_Segments.push_back(path.Left(pos));          path=path.Mid(pos+1);          pos=path.Find( L"/" );        }        if (path!=L"")          m_Segments.push_back(path);        break;      }      break;  }  if (bIsFile)    newpath = file;  return TRUE;}const CString CServerPath::DoGetPath(bool unterminated) const{  if (m_bEmpty)    return L"";  CString path;  tConstIter iter;  switch (m_nServerType&FZ_SERVERTYPE_HIGHMASK)  {  case FZ_SERVERTYPE_FTP:    switch (m_nServerType&FZ_SERVERTYPE_SUBMASK)    {    case FZ_SERVERTYPE_SUB_FTP_MVS:    case FZ_SERVERTYPE_SUB_FTP_BS2000:      path = L"'";      for (iter = m_Segments.begin(); iter != m_Segments.end(); iter++)      {        if (iter != m_Segments.begin())          path += L".";        path += *iter;      }      path += m_Prefix + L"'";      break;    case FZ_SERVERTYPE_SUB_FTP_VMS:      path = m_Prefix + L"[";      for (iter = m_Segments.begin(); iter != m_Segments.end(); iter++)        path += *iter + L".";      path.TrimRight( L"." );      path += L"]";      break;    default:      if (!(m_nServerType & FZ_SERVERTYPE_SUB_FTP_WINDOWS))        path=L"/";      for (iter=m_Segments.begin(); iter!=m_Segments.end(); iter++)        path+=*iter + L"/";      if (unterminated)      {        if (path.GetLength() >= 2)        {          path.Delete(path.GetLength() - 1, 1);        }      }      break;    }    break;  default:    DebugFail();  }  return path;}const CString CServerPath::GetPath() const{  return DoGetPath(false);}const CString CServerPath::GetPathUnterminated() const{  return DoGetPath(true);}CServerPath& CServerPath::operator=(const CServerPath &op){  if (this == &op)    return *this;  m_Segments.clear();  m_nServerType = op.m_nServerType;  m_Prefix = op.m_Prefix;  m_bEmpty = op.m_bEmpty;  m_Segments = op.m_Segments;  return *this;}const bool CServerPath::operator==(const CServerPath &op) const{  if (this == &op)    return true;  if (m_bEmpty != op.m_bEmpty)    return false;  if (m_Prefix != op.m_Prefix)    return false;  // excluding FZ_SERVERTYPE_LAYERMASK from comparison,  // as this part of server type is not set in TFileZillaIntf  const int CompareMask = FZ_SERVERTYPE_HIGHMASK | FZ_SERVERTYPE_SUBMASK;  if ((m_nServerType & CompareMask) != (op.m_nServerType & CompareMask))    return false;  tConstIter iter1 = m_Segments.begin();  tConstIter iter2 = op.m_Segments.begin();  while (iter1 != m_Segments.end())  {    if (iter2 == op.m_Segments.end())      return false;    if (*iter1 != *iter2)      return false;    iter1++;    iter2++;  }  if (iter2 != op.m_Segments.end())    return false;  return true;}const bool CServerPath::operator!=(const CServerPath &op) const{  if (!this)    return false;  if (*this == op)    return false;  else    return true;}CString CServerPath::GetLastSegment() const{  if (!HasParent())    return L"";  if (m_Segments.empty())    return L"";  else    return m_Segments.back();}CServerPath CServerPath::GetParent() const{  DebugAssert(HasParent());  CServerPath path;  path = *this;  path.m_Segments.pop_back();  if (m_nServerType & (FZ_SERVERTYPE_SUB_FTP_MVS | FZ_SERVERTYPE_SUB_FTP_BS2000))    path.m_Prefix = L".";  return path;}BOOL CServerPath::HasParent() const{  if (!m_Segments.empty())    return TRUE;  else    return FALSE;}const BOOL CServerPath::IsEmpty() const{  return m_bEmpty;}BOOL CServerPath::AddSubdir(CString subdir){  subdir.TrimLeft( L" " );  subdir.TrimRight( L" " );  if (subdir == L"")    return FALSE;  if (m_nServerType & (FZ_SERVERTYPE_SUB_FTP_MVS | FZ_SERVERTYPE_SUB_FTP_BS2000) && m_Prefix != L".")    return FALSE;  m_Segments.push_back(subdir);  if (m_nServerType & (FZ_SERVERTYPE_SUB_FTP_MVS | FZ_SERVERTYPE_SUB_FTP_BS2000) && !m_Segments.empty())  {    if (m_Segments.back().Right(1) == L".")    {      m_Segments.back().TrimRight(L'.');      m_Prefix = L".";    }    else      m_Prefix = L"";  }  m_bEmpty = FALSE;  return TRUE;}BOOL CServerPath::SetPath(CString newpath){  return SetPath(newpath, FALSE);}CString CServerPath::FormatFilename(CString fn, bool omitPath /*=false*/) const{  if (m_bEmpty)    return fn;  if (fn == L"")    return L"";  CString path;  tConstIter iter;  switch (m_nServerType&FZ_SERVERTYPE_HIGHMASK)  {  case FZ_SERVERTYPE_FTP:    switch (m_nServerType&FZ_SERVERTYPE_SUBMASK)    {    case FZ_SERVERTYPE_SUB_FTP_MVS:    case FZ_SERVERTYPE_SUB_FTP_BS2000:      if (omitPath && m_Prefix == L".")        return fn;      path = L"'";      for (iter = m_Segments.begin(); iter != m_Segments.end(); iter++)        path += *iter + L".";      if (m_Prefix != L".")      {        path.TrimRight(L'.');        path += L"(" + fn + L")";      }      else        path += fn;      path += L"'";      break;    case FZ_SERVERTYPE_SUB_FTP_VMS:      if (omitPath)        return fn;      path = m_Prefix + L"[";      for (iter = m_Segments.begin(); iter != m_Segments.end(); iter++)        path += *iter + L".";      path.TrimRight( L"." );      path += L"]";      path += fn;      break;    default:      if (omitPath)        return fn;      if (!(m_nServerType & FZ_SERVERTYPE_SUB_FTP_WINDOWS))        path=L"/";      for (iter = m_Segments.begin(); iter != m_Segments.end(); iter++)        path+=*iter + L"/";      path += fn;      break;    }    break;  default:    DebugFail();  }  return path;}
 |