WIP show local files in online modus
parent
3f0d9b8982
commit
af31a68210
|
@ -150,17 +150,8 @@ int EventHandler::pointerHandler(const int type, const int par1, const int par2)
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
OpenProgressbar(1, "Downloading...", "Check network connection", 0, EventHandler::DialogHandlerStatic);
|
OpenProgressbar(1, "Downloading...", "Check network connection", 0, EventHandler::DialogHandlerStatic);
|
||||||
|
_nextcloud.downloadItem(itemID);
|
||||||
if (!_nextcloud.downloadItem(itemID))
|
CloseProgressbar();
|
||||||
{
|
|
||||||
CloseProgressbar();
|
|
||||||
if (!_nextcloud.isWorkOffline())
|
|
||||||
Message(ICON_WARNING, "Warning", "Could not download the file, please try again.", 600);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CloseProgressbar();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
if (!_nextcloud.removeFile(itemID))
|
if (!_nextcloud.removeFile(itemID))
|
||||||
|
|
|
@ -53,6 +53,14 @@ Item::Item(const string &xmlItem)
|
||||||
Util::decodeUrl(_title);
|
Util::decodeUrl(_title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Item::Item(const string &localPath, bool downloaded) : _localPath(localPath), _downloaded(downloaded)
|
||||||
|
{
|
||||||
|
_title = _localPath;
|
||||||
|
_title = _title.substr(_title.find_last_of("/") + 1, _title.length());
|
||||||
|
Util::decodeUrl(_title);
|
||||||
|
_fileType = IFILE;
|
||||||
|
}
|
||||||
|
|
||||||
void Item::open() const
|
void Item::open() const
|
||||||
{
|
{
|
||||||
if (_fileType.find("application/epub+zip") != string::npos ||
|
if (_fileType.find("application/epub+zip") != string::npos ||
|
||||||
|
@ -93,7 +101,7 @@ void Item::setSize(double tempSize)
|
||||||
|
|
||||||
double departBy;
|
double departBy;
|
||||||
string unit;
|
string unit;
|
||||||
|
|
||||||
if (tempSize < 1048576)
|
if (tempSize < 1048576)
|
||||||
{
|
{
|
||||||
departBy = 1024;
|
departBy = 1024;
|
||||||
|
@ -112,6 +120,4 @@ void Item::setSize(double tempSize)
|
||||||
|
|
||||||
tempSize = round((tempSize / departBy) * 10.0) / 10.0;
|
tempSize = round((tempSize / departBy) * 10.0) / 10.0;
|
||||||
_size = Util::valueToString(tempSize) + " " + unit;
|
_size = Util::valueToString(tempSize) + " " + unit;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -26,6 +26,8 @@ class Item
|
||||||
public:
|
public:
|
||||||
Item(const string &xmlItem);
|
Item(const string &xmlItem);
|
||||||
|
|
||||||
|
Item(const string &localPath, bool downloaded);
|
||||||
|
|
||||||
void setPath(const string &path) { _path = path; };
|
void setPath(const string &path) { _path = path; };
|
||||||
string getPath() const { return _path; };
|
string getPath() const { return _path; };
|
||||||
|
|
||||||
|
@ -54,10 +56,10 @@ private:
|
||||||
string _path;
|
string _path;
|
||||||
Itemtype _type;
|
Itemtype _type;
|
||||||
string _title;
|
string _title;
|
||||||
bool _downloaded;
|
bool _downloaded{false};
|
||||||
string _localPath;
|
string _localPath;
|
||||||
string _lastEditDate;
|
string _lastEditDate{"Error"};
|
||||||
string _size;
|
string _size{"Error"};
|
||||||
string _fileType;
|
string _fileType;
|
||||||
|
|
||||||
void setSize(double tempSize);
|
void setSize(double tempSize);
|
||||||
|
|
|
@ -101,25 +101,28 @@ void Nextcloud::logout(bool deleteFiles)
|
||||||
_loggedIn = false;
|
_loggedIn = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Nextcloud::downloadItem(int itemID)
|
void Nextcloud::downloadItem(int itemID)
|
||||||
{
|
{
|
||||||
Log::writeLog("started download of " + _items->at(itemID).getPath() + " to " + _items->at(itemID).getLocalPath());
|
Log::writeLog("started download of " + _items->at(itemID).getPath() + " to " + _items->at(itemID).getLocalPath());
|
||||||
|
|
||||||
if (_workOffline)
|
if (_workOffline)
|
||||||
{
|
{
|
||||||
int dialogResult = DialogSynchro(ICON_QUESTION, "Action", "You are in offline modus. Go back online?", "Yes", "No", "Cancel");
|
int dialogResult = DialogSynchro(ICON_QUESTION, "Action", "You are in offline modus. Go back online?", "Yes", "No", "Cancel");
|
||||||
|
|
||||||
if (dialogResult == 2 || dialogResult == 3)
|
if (dialogResult == 2 || dialogResult == 3)
|
||||||
return false;
|
return;
|
||||||
|
_workOffline = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Util::connectToNetwork())
|
if (!Util::connectToNetwork())
|
||||||
{
|
{
|
||||||
Message(3, "Warning", "Can not connect to the Internet. Switching to offline modus.", 200);
|
Message(3, "Warning", "Can not connect to the Internet. Switching to offline modus.", 600);
|
||||||
_workOffline = true;
|
_workOffline = true;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_items->at(itemID).getPath().empty()){
|
||||||
|
Message(3, "Warning", "Download path is not set, therefore cannot download the file.", 600);
|
||||||
|
return;
|
||||||
|
}
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
CURL *curl = curl_easy_init();
|
CURL *curl = curl_easy_init();
|
||||||
|
|
||||||
|
@ -152,7 +155,7 @@ bool Nextcloud::downloadItem(int itemID)
|
||||||
case 200:
|
case 200:
|
||||||
Log::writeLog("finished download of " + _items->at(itemID).getPath() + " to " + _items->at(itemID).getLocalPath());
|
Log::writeLog("finished download of " + _items->at(itemID).getPath() + " to " + _items->at(itemID).getLocalPath());
|
||||||
_items->at(itemID).setDownloaded(true);
|
_items->at(itemID).setDownloaded(true);
|
||||||
return true;
|
break;
|
||||||
case 401:
|
case 401:
|
||||||
Message(ICON_ERROR, "Error", "Username/password incorrect.", 1200);
|
Message(ICON_ERROR, "Error", "Username/password incorrect.", 1200);
|
||||||
break;
|
break;
|
||||||
|
@ -162,7 +165,6 @@ bool Nextcloud::downloadItem(int itemID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Nextcloud::removeFile(int itemID)
|
bool Nextcloud::removeFile(int itemID)
|
||||||
|
@ -229,30 +231,69 @@ bool Nextcloud::getDataStructure(const string &pathUrl, const string &Username,
|
||||||
{
|
{
|
||||||
case 207:
|
case 207:
|
||||||
{
|
{
|
||||||
|
string localPath = this->getLocalPath(pathUrl);
|
||||||
|
|
||||||
|
//create items_
|
||||||
if (!readInXML(readBuffer))
|
if (!readInXML(readBuffer))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
string localPath = this->getLocalPath(pathUrl);
|
|
||||||
|
|
||||||
//create neccesary subfolders
|
|
||||||
if (iv_access(localPath.c_str(), W_OK) != 0)
|
if (iv_access(localPath.c_str(), W_OK) != 0)
|
||||||
iv_buildpath(localPath.c_str());
|
|
||||||
|
|
||||||
localPath = localPath + NEXTCLOUD_STRUCTURE_EXTENSION;
|
|
||||||
|
|
||||||
//check for difference local and server
|
|
||||||
if (iv_access(localPath.c_str(), R_OK) != 0)
|
|
||||||
{
|
{
|
||||||
Log::writeLog("Local structure of " + localPath + " found.");
|
//if the current folder does not exist locally, create it
|
||||||
|
iv_buildpath(localPath.c_str());
|
||||||
//TODO get items from local path
|
|
||||||
//compare local and online, if online no longer availaible delete
|
|
||||||
//if is in old .structure --> delete from pocketbook and check for last edit date
|
|
||||||
//delete old structure file
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO if local file is newer than of old structure --> upload
|
else
|
||||||
//if is not in old file and not in new, ask if should be uploaded
|
{
|
||||||
|
//get items from local path
|
||||||
|
if (iv_access(localPath.c_str(), R_OK) != 0)
|
||||||
|
{
|
||||||
|
Log::writeLog("Local structure of " + localPath + " found.");
|
||||||
|
//TODO if has files that are not online, add to _items
|
||||||
|
}
|
||||||
|
|
||||||
|
//get local files, https://stackoverflow.com/questions/306533/how-do-i-get-a-list-of-files-in-a-directory-in-c
|
||||||
|
DIR *dir;
|
||||||
|
class dirent *ent;
|
||||||
|
class stat st;
|
||||||
|
|
||||||
|
dir = opendir(localPath.c_str());
|
||||||
|
while ((ent = readdir(dir)) != NULL)
|
||||||
|
{
|
||||||
|
const string file_name = ent->d_name;
|
||||||
|
const string full_file_name = localPath + file_name;
|
||||||
|
|
||||||
|
if (file_name[0] == '.')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (stat(full_file_name.c_str(), &st) == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const bool is_directory = (st.st_mode & S_IFDIR) != 0;
|
||||||
|
|
||||||
|
if (is_directory)
|
||||||
|
continue;
|
||||||
|
bool found = false;
|
||||||
|
for (auto i = 0; i < _items->size(); i++)
|
||||||
|
{
|
||||||
|
//TODO compare last edit local and in cloud and display to user
|
||||||
|
if (_items->at(i).getLocalPath().compare(full_file_name) == 0)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
_items->push_back(Item(full_file_name, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO structure as CSV?
|
||||||
|
//update the .structure file acording to items in the folder
|
||||||
|
localPath = localPath + NEXTCLOUD_STRUCTURE_EXTENSION;
|
||||||
|
|
||||||
//save xml to make the structure available offline
|
//save xml to make the structure available offline
|
||||||
ofstream outFile(localPath);
|
ofstream outFile(localPath);
|
||||||
|
@ -267,14 +308,14 @@ bool Nextcloud::getDataStructure(const string &pathUrl, const string &Username,
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case 401:
|
case 401:
|
||||||
Message(ICON_ERROR, "Error", "Username/password incorrect.", 1200);
|
Message(ICON_ERROR, "Error", "Username/password incorrect.", 1200);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Message(ICON_ERROR, "Error", ("An unknown error occured. (Curl Response Code " + Util::valueToString(response_code) + ")").c_str(), 1200);
|
Message(ICON_ERROR, "Error", ("An unknown error occured. Switching to offline modus. To work online turn on online modus in the menu. (Curl Response Code " + Util::valueToString(response_code) + ")").c_str(), 1200);
|
||||||
break;
|
_workOffline = true;
|
||||||
|
return getOfflineStructure(pathUrl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -324,16 +365,12 @@ bool Nextcloud::readInXML(string xml)
|
||||||
string endItem = "</d:response>";
|
string endItem = "</d:response>";
|
||||||
vector<Item> tempItems;
|
vector<Item> tempItems;
|
||||||
|
|
||||||
if (_items)
|
|
||||||
_items->clear();
|
|
||||||
|
|
||||||
begin = xml.find(beginItem);
|
begin = xml.find(beginItem);
|
||||||
|
|
||||||
while (begin != std::string::npos)
|
while (begin != std::string::npos)
|
||||||
{
|
{
|
||||||
end = xml.find(endItem);
|
end = xml.find(endItem);
|
||||||
|
|
||||||
//TODO copy array and here only temp
|
|
||||||
tempItems.push_back(Item(xml.substr(begin, end)));
|
tempItems.push_back(Item(xml.substr(begin, end)));
|
||||||
|
|
||||||
xml = xml.substr(end + endItem.length());
|
xml = xml.substr(end + endItem.length());
|
||||||
|
@ -341,6 +378,8 @@ bool Nextcloud::readInXML(string xml)
|
||||||
begin = xml.find(beginItem);
|
begin = xml.find(beginItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_items)
|
||||||
|
_items->clear();
|
||||||
_items = std::make_shared<vector<Item>>(std::move(tempItems));
|
_items = std::make_shared<vector<Item>>(std::move(tempItems));
|
||||||
|
|
||||||
if (_items->size() < 1)
|
if (_items->size() < 1)
|
||||||
|
@ -376,15 +415,17 @@ bool Nextcloud::getOfflineStructure(const string &pathUrl)
|
||||||
ifstream inFile(localPath);
|
ifstream inFile(localPath);
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << inFile.rdbuf();
|
buffer << inFile.rdbuf();
|
||||||
|
//TODO also show in offline modus all files!
|
||||||
|
|
||||||
if (!readInXML(buffer.str()))
|
if (!readInXML(buffer.str()))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (localPath.find(NEXTCLOUD_ROOT_PATH) != string::npos)
|
if (pathUrl.compare(NEXTCLOUD_ROOT_PATH + getUsername() + "/") == 0)
|
||||||
{
|
{
|
||||||
Message(ICON_ERROR, "Error", "The root structure is not available offline. To try again to connect turn on online modus in the menu.", 1200);
|
Message(ICON_ERROR, "Error", "The root structure is not available offline. Please try again to login.", 1200);
|
||||||
|
logout();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -393,5 +434,5 @@ bool Nextcloud::getOfflineStructure(const string &pathUrl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
|
|
||||||
void logout(bool deleteFiles = false);
|
void logout(bool deleteFiles = false);
|
||||||
|
|
||||||
bool downloadItem(int itemID);
|
void downloadItem(int itemID);
|
||||||
|
|
||||||
bool removeFile(int itemID);
|
bool removeFile(int itemID);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue