+++ /dev/null
-// AbstractRepository.cxx -- abstract API for TerraSync remote
-//
-// Copyright (C) 2016 James Turner <zakalawe@mac.com>
-//
-// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-#include "AbstractRepository.hxx"
-
-namespace simgear
-{
-
-AbstractRepository::~AbstractRepository()
-{
-
-}
-
-size_t AbstractRepository::bytesStillToDownload() const
-{
- return 0;
-}
-
-} // of namespace simgear
+++ /dev/null
-// AbstractRepository.hxx - API for terrasyc to access remote server
-//
-// Copyright (C) 2016 James Turner <zakalawe@mac.com>
-//
-// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-#ifndef SG_IO_ABSTRACT_REPOSITORY_HXX
-#define SG_IO_ABSTRACT_REPOSITORY_HXX
-
-#include <string>
-
-#include <simgear/misc/sg_path.hxx>
-
-namespace simgear {
-
- namespace HTTP {
- class Client;
- }
-
-class AbstractRepository
-{
-public:
-
- virtual ~AbstractRepository();
-
- virtual SGPath fsBase() const = 0;
-
- virtual void setBaseUrl(const std::string& url) =0;
- virtual std::string baseUrl() const = 0;;
-
- virtual HTTP::Client* http() const = 0;
-
- virtual void update() = 0;
-
- virtual bool isDoingSync() const = 0;
-
- virtual size_t bytesStillToDownload() const;
-
- enum ResultCode {
- REPO_NO_ERROR = 0,
- REPO_ERROR_NOT_FOUND,
- REPO_ERROR_SOCKET,
- SVN_ERROR_XML,
- SVN_ERROR_TXDELTA,
- REPO_ERROR_IO,
- REPO_ERROR_CHECKSUM,
- REPO_ERROR_FILE_NOT_FOUND,
- REPO_ERROR_HTTP,
- REPO_PARTIAL_UPDATE
- };
-
- virtual ResultCode failure() const = 0;
- protected:
-
-};
-
-} // of namespace simgear
-
-#endif // of SG_IO_ABSTRACT_REPOSITORY_HXX
HTTPFileRequest.hxx
HTTPMemoryRequest.hxx
HTTPRequest.hxx
- AbstractRepository.hxx
HTTPRepository.hxx
)
HTTPFileRequest.cxx
HTTPMemoryRequest.cxx
HTTPRequest.cxx
- AbstractRepository.cxx
HTTPRepository.cxx
)
struct Failure
{
SGPath path;
- AbstractRepository::ResultCode error;
+ HTTPRepository::ResultCode error;
};
typedef std::vector<Failure> FailureList;
hashCacheDirty(false),
p(parent),
isUpdating(false),
- status(AbstractRepository::REPO_NO_ERROR),
+ status(HTTPRepository::REPO_NO_ERROR),
totalDownloaded(0)
{ ; }
std::string baseUrl;
SGPath basePath;
bool isUpdating;
- AbstractRepository::ResultCode status;
+ HTTPRepository::ResultCode status;
HTTPDirectory* rootDir;
size_t totalDownloaded;
std::string computeHashForPath(const SGPath& p);
void writeHashCache();
- void failedToGetRootIndex(AbstractRepository::ResultCode st);
+ void failedToGetRootIndex(HTTPRepository::ResultCode st);
void failedToUpdateChild(const SGPath& relativePath,
- AbstractRepository::ResultCode fileStatus);
+ HTTPRepository::ResultCode fileStatus);
typedef std::vector<RepoRequestPtr> RequestVector;
RequestVector queuedRequests,
std::sort(children.begin(), children.end());
}
- void failedToUpdate(AbstractRepository::ResultCode status)
+ void failedToUpdate(HTTPRepository::ResultCode status)
{
if (_relativePath.isNull()) {
// root dir failed
fpath.append(file);
if (it->hash != hash) {
- _repository->failedToUpdateChild(_relativePath, AbstractRepository::REPO_ERROR_CHECKSUM);
+ _repository->failedToUpdateChild(_relativePath, HTTPRepository::REPO_ERROR_CHECKSUM);
} else {
_repository->updatedFileContents(fpath, hash);
_repository->totalDownloaded += sz;
}
void didFailToUpdateFile(const std::string& file,
- AbstractRepository::ResultCode status)
+ HTTPRepository::ResultCode status)
{
SGPath fpath(_relativePath);
fpath.append(file);
return result;
}
-AbstractRepository::ResultCode
+HTTPRepository::ResultCode
HTTPRepository::failure() const
{
if ((_d->status == REPO_NO_ERROR) && !_d->failures.empty()) {
SG_LOG(SG_TERRASYNC, SG_DEBUG, "got file " << fileName << " in " << _directory->absolutePath());
} else if (responseCode() == 404) {
SG_LOG(SG_TERRASYNC, SG_WARN, "terrasync file not found on server: " << fileName << " for " << _directory->absolutePath());
- _directory->didFailToUpdateFile(fileName, AbstractRepository::REPO_ERROR_FILE_NOT_FOUND);
+ _directory->didFailToUpdateFile(fileName, HTTPRepository::REPO_ERROR_FILE_NOT_FOUND);
} else {
SG_LOG(SG_TERRASYNC, SG_WARN, "terrasync file download error on server: " << fileName << " for " << _directory->absolutePath() << ": " << responseCode() );
- _directory->didFailToUpdateFile(fileName, AbstractRepository::REPO_ERROR_HTTP);
+ _directory->didFailToUpdateFile(fileName, HTTPRepository::REPO_ERROR_HTTP);
}
_directory->repository()->finishedRequest(this);
}
if (_directory) {
- _directory->didFailToUpdateFile(fileName, AbstractRepository::REPO_ERROR_SOCKET);
+ _directory->didFailToUpdateFile(fileName, HTTPRepository::REPO_ERROR_SOCKET);
_directory->repository()->finishedRequest(this);
}
}
if (responseCode() == 200) {
std::string hash = strutils::encodeHex(sha1_result(&hashContext), HASH_LENGTH);
if (!_targetHash.empty() && (hash != _targetHash)) {
- _directory->failedToUpdate(AbstractRepository::REPO_ERROR_CHECKSUM);
+ _directory->failedToUpdate(HTTPRepository::REPO_ERROR_CHECKSUM);
_directory->repository()->finishedRequest(this);
return;
}
_directory->updateChildrenBasedOnHash();
SG_LOG(SG_TERRASYNC, SG_INFO, "after update of:" << _directory->absolutePath() << " child update took:" << st.elapsedMSec());
} catch (sg_exception& ) {
- _directory->failedToUpdate(AbstractRepository::REPO_ERROR_IO);
+ _directory->failedToUpdate(HTTPRepository::REPO_ERROR_IO);
}
} else if (responseCode() == 404) {
- _directory->failedToUpdate(AbstractRepository::REPO_ERROR_FILE_NOT_FOUND);
+ _directory->failedToUpdate(HTTPRepository::REPO_ERROR_FILE_NOT_FOUND);
} else {
- _directory->failedToUpdate(AbstractRepository::REPO_ERROR_HTTP);
+ _directory->failedToUpdate(HTTPRepository::REPO_ERROR_HTTP);
}
_directory->repository()->finishedRequest(this);
virtual void onFail()
{
if (_directory) {
- _directory->failedToUpdate(AbstractRepository::REPO_ERROR_SOCKET);
+ _directory->failedToUpdate(HTTPRepository::REPO_ERROR_SOCKET);
_directory->repository()->finishedRequest(this);
}
}
}
}
- void HTTPRepoPrivate::failedToGetRootIndex(AbstractRepository::ResultCode st)
+ void HTTPRepoPrivate::failedToGetRootIndex(HTTPRepository::ResultCode st)
{
SG_LOG(SG_TERRASYNC, SG_WARN, "Failed to get root of repo:" << baseUrl);
status = st;
}
void HTTPRepoPrivate::failedToUpdateChild(const SGPath& relativePath,
- AbstractRepository::ResultCode fileStatus)
+ HTTPRepository::ResultCode fileStatus)
{
Failure f;
f.path = relativePath;
#ifndef SG_IO_HTTP_REPOSITORY_HXX
#define SG_IO_HTTP_REPOSITORY_HXX
-#include <simgear/io/AbstractRepository.hxx>
#include <memory>
+#include <simgear/misc/sg_path.hxx>
+#include <simgear/io/HTTPClient.hxx>
+
namespace simgear {
class HTTPRepoPrivate;
-class HTTPRepository : public AbstractRepository
+class HTTPRepository
{
public:
+ enum ResultCode {
+ REPO_NO_ERROR = 0,
+ REPO_ERROR_NOT_FOUND,
+ REPO_ERROR_SOCKET,
+ SVN_ERROR_XML,
+ SVN_ERROR_TXDELTA,
+ REPO_ERROR_IO,
+ REPO_ERROR_CHECKSUM,
+ REPO_ERROR_FILE_NOT_FOUND,
+ REPO_ERROR_HTTP,
+ REPO_PARTIAL_UPDATE
+ };
HTTPRepository(const SGPath& root, HTTP::Client* cl);
virtual ~HTTPRepository();
SGTimeStamp::sleepForMSec(100);
}
- if (repo->failure() != AbstractRepository::REPO_NO_ERROR) {
+ if (repo->failure() != HTTPRepository::REPO_NO_ERROR) {
cerr << "got response:" << repo->failure() << endl;
return EXIT_FAILURE;
}
repo->setBaseUrl("http://localhost:2000/repo");
repo->update();
waitForUpdateComplete(cl, repo.get());
- if (repo->failure() != AbstractRepository::REPO_PARTIAL_UPDATE) {
+ if (repo->failure() != HTTPRepository::REPO_PARTIAL_UPDATE) {
throw sg_exception("Bad result from missing files test");
}
repo->setBaseUrl("http://localhost:2000/repo");
repo->update();
waitForUpdateComplete(cl, repo.get());
- if (repo->failure() != AbstractRepository::REPO_PARTIAL_UPDATE) {
+ if (repo->failure() != HTTPRepository::REPO_PARTIAL_UPDATE) {
throw sg_exception("Bad result from corrupt files test");
}
SyncItem currentItem;
bool isNewDirectory;
std::queue<SyncItem> queue;
- std::auto_ptr<AbstractRepository> repository;
+ std::auto_ptr<HTTPRepository> repository;
SGTimeStamp stamp;
bool busy; ///< is the slot working or idle
}
// check result
- AbstractRepository::ResultCode res = slot.repository->failure();
- if (res == AbstractRepository::REPO_ERROR_NOT_FOUND) {
+ HTTPRepository::ResultCode res = slot.repository->failure();
+ if (res == HTTPRepository::REPO_ERROR_NOT_FOUND) {
notFound(slot.currentItem);
- } else if (res != AbstractRepository::REPO_NO_ERROR) {
+ } else if (res != HTTPRepository::REPO_NO_ERROR) {
fail(slot.currentItem);
} else {
updated(slot.currentItem, slot.isNewDirectory);