123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585 |
- //---------------------------------------------------------------------------
- #include "stdafx.h"
- #include "FileZillaApi.h"
- #include "mainthread.h"
- //////////////////////////////////////////////////////////////////////
- // Konstruktion/Destruktion
- //////////////////////////////////////////////////////////////////////
- CFileZillaApi::CFileZillaApi()
- {
- m_nInternalMessageID=0;
- m_pMainThread=0;
- m_bInitialized=FALSE;
- }
- CFileZillaApi::~CFileZillaApi()
- {
- Destroy();
- }
- int CFileZillaApi::Init(TFileZillaIntern * Intern, CFileZillaTools * pTools)
- {
- //Check if call allowed
- if (m_bInitialized)
- return FZ_REPLY_ALREADYINIZIALIZED;
- //Initialize variables
- m_nInternalMessageID=RegisterWindowMessage( L"FileZillaInternalApiMessage{F958620E-040C-4b33-A091-7E04E10AA660}" );
- if (!m_nInternalMessageID)
- return FZ_REPLY_NOTINITIALIZED;
- //Create thread object
- m_pMainThread = CMainThread::Create(THREAD_PRIORITY_BELOW_NORMAL, CREATE_SUSPENDED);
- //Initialize Thread variables
- m_pMainThread->m_nInternalMessageID=m_nInternalMessageID;
- m_pMainThread->m_pTools=pTools;
- m_pMainThread->InitIntern(Intern);
- //Resume Thread
- m_pMainThread->ResumeThread();
- //Initialization OK
- m_bInitialized=TRUE;
- return FZ_REPLY_OK;
- }
- int CFileZillaApi::IsConnected()
- {
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- return m_pMainThread->IsConnected()?FZ_REPLY_OK:FZ_REPLY_NOTCONNECTED;
- }
- int CFileZillaApi::IsBusy()
- {
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- return m_pMainThread->IsBusy()?FZ_REPLY_BUSY:FZ_REPLY_IDLE;
- }
- int CFileZillaApi::Connect(const t_server &server)
- {
- //Check parameters
- if (server.host==L"" || server.port<1 || server.port>65535)
- return FZ_REPLY_INVALIDPARAM;
- #ifndef MPEXT_NO_GSS
- BOOL bUseGSS = FALSE;
- if (GetOptionVal(OPTION_USEGSS))
- {
- USES_CONVERSION;
- CString GssServers = GetOption(OPTION_GSSSERVERS);
- hostent *fullname = gethostbyname(T2CA(server.host));
- CString host;
- if (fullname)
- host = fullname->h_name;
- else
- host = server.host;
- host.MakeLower();
- int i;
- while ((i=GssServers.Find( L";" ))!=-1)
- {
- if ((L"."+GssServers.Left(i))==host.Right(GssServers.Left(i).GetLength()+1) || GssServers.Left(i)==host)
- {
- bUseGSS = TRUE;
- break;
- }
- GssServers = GssServers.Mid(i+1);
- }
- }
- if (!bUseGSS && server.user == L"")
- return FZ_REPLY_INVALIDPARAM;
- #endif
- if (!(server.nServerType&FZ_SERVERTYPE_HIGHMASK))
- return FZ_REPLY_INVALIDPARAM;
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (m_pMainThread->IsBusy())
- return FZ_REPLY_BUSY;
- t_command command;
- command.id=FZ_COMMAND_CONNECT;
- command.server=server;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::List()
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- CServerPath path;
- // seems to be incorrectly skipped when cache is not required
- if (!m_pMainThread->GetWorkingDirPath(path) || path.IsEmpty())
- m_pMainThread->GetCurrentPath(path);
- if (m_pMainThread->IsBusy())
- return FZ_REPLY_BUSY;
- t_command command;
- command.id=FZ_COMMAND_LIST;
- command.path = path;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::Cancel()
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsBusy()!=FZ_REPLY_BUSY)
- return FZ_REPLY_NOTBUSY;
- m_pMainThread->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_CANCEL, 0);
- return FZ_REPLY_WOULDBLOCK;
- }
- void CFileZillaApi::Destroy()
- {
- if (!m_bInitialized)
- return;
- DebugAssert(m_pMainThread);
- HANDLE tmp=m_pMainThread->m_hThread;
- m_pMainThread->Quit();
- //Wait for the main thread to quit
- WaitForSingleObject(tmp, 10000);
- m_pMainThread=0;
- m_bInitialized=FALSE;
- }
- int CFileZillaApi::Disconnect()
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (IsBusy()==FZ_REPLY_BUSY)
- return FZ_REPLY_BUSY;
- m_pMainThread->PostThreadMessage(m_nInternalMessageID,FZAPI_THREADMSG_DISCONNECT,0);
- return FZ_REPLY_WOULDBLOCK;
- }
- int CFileZillaApi::List(const CServerPath& path)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (path.IsEmpty())
- return FZ_REPLY_INVALIDPARAM;
- if (m_pMainThread->IsBusy())
- return FZ_REPLY_BUSY;
- t_command command;
- command.id=FZ_COMMAND_LIST;
- command.path=path;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::ListFile(CString FileName, const CServerPath & path)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (path.IsEmpty())
- return FZ_REPLY_INVALIDPARAM;
- if (FileName=="")
- return FZ_REPLY_INVALIDPARAM;
- if (m_pMainThread->IsBusy())
- return FZ_REPLY_BUSY;
- t_command command;
- command.id=FZ_COMMAND_LISTFILE;
- command.param1=FileName;
- command.path=path;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::FileTransfer(const t_transferfile &TransferFile)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (TransferFile.remotefile==L"" || TransferFile.localfile==L"" || TransferFile.remotepath.IsEmpty())
- return FZ_REPLY_INVALIDPARAM;
- if (IsBusy()==FZ_REPLY_BUSY)
- return FZ_REPLY_BUSY;
- t_command command;
- command.id=FZ_COMMAND_FILETRANSFER;
- command.transferfile=TransferFile;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::GetCurrentServer(t_server &server)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (m_pMainThread->GetCurrentServer(server))
- return FZ_REPLY_OK;
- else
- return FZ_REPLY_NOTCONNECTED;
- }
- int CFileZillaApi::SetCurrentPath(CServerPath path)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- m_pMainThread->SetCurrentPath(path);
- return FZ_REPLY_OK;
- }
- int CFileZillaApi::GetCurrentPath(CServerPath & path)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- return (m_pMainThread->GetCurrentPath(path) ? FZ_REPLY_OK : FZ_REPLY_NOTCONNECTED);
- }
- bool CFileZillaApi::UsingMlsd()
- {
- //Check if call allowed
- if (!m_bInitialized)
- return false;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return false;
- return m_pMainThread->UsingMlsd();
- }
- bool CFileZillaApi::UsingUtf8()
- {
- //Check if call allowed
- if (!m_bInitialized)
- return false;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return false;
- return m_pMainThread->UsingUtf8();
- }
- std::string CFileZillaApi::GetTlsVersionStr()
- {
- //Check if call allowed
- if (!m_bInitialized)
- return std::string();
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return std::string();
- return m_pMainThread->GetTlsVersionStr();
- }
- std::string CFileZillaApi::GetCipherName()
- {
- //Check if call allowed
- if (!m_bInitialized)
- return std::string();
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return std::string();
- return m_pMainThread->GetCipherName();
- }
- int CFileZillaApi::CustomCommand(CString CustomCommand)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (IsBusy()==FZ_REPLY_BUSY)
- return FZ_REPLY_BUSY;
- t_server server;
- int res=GetCurrentServer(server);
- if (res!=FZ_REPLY_OK)
- return res;
- if (CustomCommand==L"")
- return FZ_REPLY_INVALIDPARAM;
- t_command command;
- command.id=FZ_COMMAND_CUSTOMCOMMAND;
- command.param1=CustomCommand;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::Delete(CString FileName, const CServerPath &path /*=CServerPath()*/)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (IsBusy()==FZ_REPLY_BUSY)
- return FZ_REPLY_BUSY;
- if (FileName=="")
- return FZ_REPLY_INVALIDPARAM;
- CServerPath path2=path;
- if (path2.IsEmpty())
- {
- m_pMainThread->GetCurrentPath(path2);
- if (path2.IsEmpty())
- return FZ_REPLY_INVALIDPARAM;
- }
- t_command command;
- command.id=FZ_COMMAND_DELETE;
- command.param1=FileName;
- command.path=path2;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::RemoveDir(CString DirName, const CServerPath &path /*=CServerPath()*/)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (IsBusy()==FZ_REPLY_BUSY)
- return FZ_REPLY_BUSY;
- if (DirName==L"")
- return FZ_REPLY_INVALIDPARAM;
- CServerPath path2=path;
- if (path2.IsEmpty())
- {
- m_pMainThread->GetCurrentPath(path2);
- if (path2.IsEmpty())
- return FZ_REPLY_INVALIDPARAM;
- }
- t_command command;
- command.id=FZ_COMMAND_REMOVEDIR;
- command.param1=DirName;
- command.path=path2;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::MakeDir(const CServerPath &path)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (IsBusy()==FZ_REPLY_BUSY)
- return FZ_REPLY_BUSY;
- if (path.IsEmpty() || !path.HasParent())
- return FZ_REPLY_INVALIDPARAM;
- t_command command;
- command.id=FZ_COMMAND_MAKEDIR;
- command.path=path;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::Rename(CString oldName, CString newName, const CServerPath &path /*=CServerPath()*/, const CServerPath &newPath /*=CServerPath()*/)
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (IsBusy()==FZ_REPLY_BUSY)
- return FZ_REPLY_BUSY;
- if (oldName==L"" || newName==L"")
- return FZ_REPLY_INVALIDPARAM;
- CServerPath path2 = path;
- if (path2.IsEmpty())
- {
- m_pMainThread->GetCurrentPath(path2);
- if (path2.IsEmpty())
- return FZ_REPLY_INVALIDPARAM;
- }
- t_command command;
- command.id = FZ_COMMAND_RENAME;
- command.param1 = oldName;
- command.param2 = newName;
- command.path = path2;
- command.newPath = newPath;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- int CFileZillaApi::SetAsyncRequestResult(int nAction, CAsyncRequestData *pData)
- {
- if (!this || !pData)
- return FZ_REPLY_CRITICALERROR | FZ_REPLY_INVALIDPARAM;
- if (IsBadWritePtr(pData, sizeof(CAsyncRequestData)))
- return FZ_REPLY_CRITICALERROR;
- if (!m_bInitialized)
- {
- delete pData;
- return FZ_REPLY_NOTINITIALIZED;
- }
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- {
- delete pData;
- return FZ_REPLY_NOTCONNECTED;
- }
- switch(pData->nRequestType)
- {
- case FZ_ASYNCREQUEST_OVERWRITE:
- break;
- case FZ_ASYNCREQUEST_VERIFYCERT:
- if (!((CVerifyCertRequestData *)pData)->pCertData)
- {
- delete pData;
- return FZ_REPLY_INVALIDPARAM;
- }
- break;
- case FZ_ASYNCREQUEST_NEEDPASS:
- break;
- #ifndef MPEXT_NO_GSS
- case FZ_ASYNCREQUEST_GSS_AUTHFAILED:
- case FZ_ASYNCREQUEST_GSS_NEEDUSER:
- case FZ_ASYNCREQUEST_GSS_NEEDPASS:
- break;
- #endif
- default:
- delete pData;
- return FZ_REPLY_INVALIDPARAM;
- }
- pData->nRequestResult = nAction;
- if (!m_pMainThread)
- {
- delete pData;
- return FZ_REPLY_NOTINITIALIZED;
- }
- m_pMainThread->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_ASYNCREQUESTREPLY, (LPARAM)pData);
- return FZ_REPLY_OK;
- }
- int CFileZillaApi::Chmod(int nValue, CString FileName, const CServerPath &path /*=CServerPath()*/ )
- {
- //Check if call allowed
- if (!m_bInitialized)
- return FZ_REPLY_NOTINITIALIZED;
- if (IsConnected()==FZ_REPLY_NOTCONNECTED)
- return FZ_REPLY_NOTCONNECTED;
- if (IsBusy()==FZ_REPLY_BUSY)
- return FZ_REPLY_BUSY;
- if (FileName==L"")
- return FZ_REPLY_INVALIDPARAM;
- t_command command;
- command.id=FZ_COMMAND_CHMOD;
- command.param1=FileName;
- command.param4=nValue;
- command.path=path;
- m_pMainThread->Command(command);
- return m_pMainThread->LastOperationSuccessful()?FZ_REPLY_OK:FZ_REPLY_ERROR;
- }
- void CFileZillaApi::SetDebugLevel(int nDebugLevel)
- {
- m_pMainThread->GetIntern()->SetDebugLevel(nDebugLevel);
- }
- //CAsyncRequestData derived classes
- CAsyncRequestData::CAsyncRequestData()
- {
- nRequestType = 0;
- nRequestID = 0;
- nRequestResult = 0;
- }
- CAsyncRequestData::~CAsyncRequestData()
- {
- }
- COverwriteRequestData::COverwriteRequestData()
- {
- size1 = 0;
- size2 = 0;
- nRequestType=FZ_ASYNCREQUEST_OVERWRITE;
- localtime=0;
- remotetime.hasdate = false;
- pTransferFile=0;
- }
- COverwriteRequestData::~COverwriteRequestData()
- {
- delete pTransferFile;
- delete localtime;
- }
- CVerifyCertRequestData::CVerifyCertRequestData()
- {
- nRequestType=FZ_ASYNCREQUEST_VERIFYCERT;
- pCertData=0;
- }
- CVerifyCertRequestData::~CVerifyCertRequestData()
- {
- delete pCertData;
- }
- CNeedPassRequestData::CNeedPassRequestData()
- {
- nRequestType=FZ_ASYNCREQUEST_NEEDPASS;
- nOldOpState=0;
- }
- CNeedPassRequestData::~CNeedPassRequestData()
- {
- }
- #ifndef MPEXT_NO_GSS
- CGssNeedPassRequestData::CGssNeedPassRequestData()
- {
- nRequestType=FZ_ASYNCREQUEST_GSS_NEEDPASS;
- }
- CGssNeedPassRequestData::~CGssNeedPassRequestData()
- {
- }
- CGssNeedUserRequestData::CGssNeedUserRequestData()
- {
- nRequestType = FZ_ASYNCREQUEST_GSS_NEEDUSER;
- }
- CGssNeedUserRequestData::~CGssNeedUserRequestData()
- {
- }
- #endif
|