add filestate status outsync depending on filesize

pull/23/head
JuanJakobo 2021-02-21 19:49:25 +01:00
parent 9816b37ebb
commit ff27551524
6 changed files with 46 additions and 32 deletions

View File

@ -176,7 +176,7 @@ int EventHandler::pointerHandler(const int type, const int par1, const int par2)
} }
else else
{ {
if (_nextcloud.getItems().at(itemID).getState() != FileState::ICLOUD) if (_nextcloud.getItems().at(itemID).getState() == FileState::ISYNCED || _nextcloud.getItems().at(itemID).getState() == FileState::ILOCAL)
{ {
dialogResult = DialogSynchro(ICON_QUESTION, "Action", "What do you want to do?", "Open", "Remove", "Cancel"); dialogResult = DialogSynchro(ICON_QUESTION, "Action", "What do you want to do?", "Open", "Remove", "Cancel");

View File

@ -36,6 +36,10 @@ void ListViewEntry::draw(const Item &item, ifont *entryFont, ifont *entryFontBol
{ {
DrawTextRect(_position.x, _position.y + 3 * fontHeight, _position.w, fontHeight, "Synced", ALIGN_RIGHT); DrawTextRect(_position.x, _position.y + 3 * fontHeight, _position.w, fontHeight, "Synced", ALIGN_RIGHT);
} }
else if(item.getState() == FileState::IOUTSYNCED)
{
DrawTextRect(_position.x, _position.y + 3 * fontHeight, _position.w, fontHeight, "Out of sync", ALIGN_RIGHT);
}
else else
{ {
DrawTextRect(_position.x, _position.y + 3 * fontHeight, _position.w, fontHeight, "Click to Download", ALIGN_RIGHT); DrawTextRect(_position.x, _position.y + 3 * fontHeight, _position.w, fontHeight, "Click to Download", ALIGN_RIGHT);
@ -50,7 +54,7 @@ void ListViewEntry::draw(const Item &item, ifont *entryFont, ifont *entryFontBol
} }
DrawTextRect(_position.x, _position.y + 2 * fontHeight, _position.w, fontHeight, item.getLastEditDate().c_str(), ALIGN_LEFT); DrawTextRect(_position.x, _position.y + 2 * fontHeight, _position.w, fontHeight, item.getLastEditDate().c_str(), ALIGN_LEFT);
DrawTextRect(_position.x, _position.y + 3 * fontHeight, _position.w, fontHeight, item.getSize().c_str(), ALIGN_LEFT); DrawTextRect(_position.x, _position.y + 3 * fontHeight, _position.w, fontHeight, item.getSizeString().c_str(), ALIGN_LEFT);
} }
int line = (_position.y + _position.h) - 1; int line = (_position.y + _position.h) - 1;

View File

@ -31,12 +31,12 @@ Item::Item(const string &xmlItem)
{ {
_type = IFOLDER; _type = IFOLDER;
_title = _title.substr(0, _path.length() - 1); _title = _title.substr(0, _path.length() - 1);
setSize(atof(Util::getXMLAttribute(xmlItem, "d:quota-used-bytes").c_str())); _size = atof(Util::getXMLAttribute(xmlItem, "d:quota-used-bytes").c_str());
} }
else else
{ {
_type = IFILE; _type = IFILE;
setSize(atof(Util::getXMLAttribute(xmlItem, "d:getcontentlength").c_str())); _size = atof(Util::getXMLAttribute(xmlItem, "d:getcontentlength").c_str());
_fileType = Util::getXMLAttribute(xmlItem, "d:getcontenttype"); _fileType = Util::getXMLAttribute(xmlItem, "d:getcontenttype");
//set local path and test if exists //set local path and test if exists
@ -116,24 +116,22 @@ bool Item::removeFile()
return true; return true;
} }
void Item::setSize(double tempSize) string Item::getSizeString() const
{ {
if (tempSize < 1024) if (_size < 1024)
{ return "< 1 KB";
_size = "< 1 KB";
return;
}
double departBy; double departBy;
double tempSize;
string unit; string unit;
if (tempSize < 1048576) if (_size < 1048576)
{ {
departBy = 1024; departBy = 1024;
unit = "KB"; unit = "KB";
} }
else if (tempSize < 1073741824) else if (_size < 1073741824)
{ {
departBy = 1048576; departBy = 1048576;
unit = "MB"; unit = "MB";
@ -145,5 +143,5 @@ 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; return Util::valueToString(tempSize) + " " + unit;
} }

View File

@ -25,6 +25,7 @@ enum FileState
{ {
ICLOUD, ICLOUD,
ISYNCED, ISYNCED,
IOUTSYNCED,
ILOCAL ILOCAL
}; };
@ -71,7 +72,8 @@ public:
string getLastEditDate() const { return _lastEditDate; }; string getLastEditDate() const { return _lastEditDate; };
void setLastEditDate(const string &date) { _lastEditDate = date; }; void setLastEditDate(const string &date) { _lastEditDate = date; };
string getSize() const { return _size; }; double getSize() const { return _size;};
string getSizeString() const;
string getFiletype() const { return _fileType; }; string getFiletype() const { return _fileType; };
@ -82,7 +84,7 @@ private:
FileState _state{FileState::ICLOUD}; FileState _state{FileState::ICLOUD};
string _localPath; string _localPath;
string _lastEditDate{"Error"}; string _lastEditDate{"Error"};
string _size{"Error"}; double _size;
string _fileType; string _fileType;
/** /**

View File

@ -142,6 +142,12 @@ void Nextcloud::logout(bool deleteFiles)
void Nextcloud::downloadItem(vector<Item> &tempItems, int itemID) void Nextcloud::downloadItem(vector<Item> &tempItems, int itemID)
{ {
if(tempItems.at(itemID).getState() == FileState::ISYNCED)
{
Message(ICON_INFORMATION, "INFO", ("The newest version of file " + tempItems.at(itemID).getPath() + " is already downloaded.").c_str(), 2000);
return;
}
if (tempItems.at(itemID).getPath().empty()) if (tempItems.at(itemID).getPath().empty())
{ {
Message(ICON_ERROR, "Error", "Download path is not set, therefore cannot download the file.", 2000); Message(ICON_ERROR, "Error", "Download path is not set, therefore cannot download the file.", 2000);
@ -215,7 +221,6 @@ bool Nextcloud::downloadFolder(vector<Item> &tempItems, int itemID)
} }
else else
{ {
//TODO do only if file is newer --> check status
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());
downloadItem(tempItems, itemID); downloadItem(tempItems, itemID);
} }
@ -327,7 +332,7 @@ vector<Item> Nextcloud::getDataStructure(const string &pathUrl, const string &Us
Log::writeLog("Local structure of " + localPath + " found."); Log::writeLog("Local structure of " + localPath + " found.");
} }
getLocalFileStructure(localPath); getLocalFileStructure(tempItems, localPath);
} }
//update the .structure file acording to items in the folder //update the .structure file acording to items in the folder
@ -445,7 +450,7 @@ vector<Item> Nextcloud::getOfflineStructure(const string &pathUrl)
if (tempItems.empty()) if (tempItems.empty())
return {}; return {};
getLocalFileStructure(this->getLocalPath(pathUrl)); getLocalFileStructure(tempItems, this->getLocalPath(pathUrl));
return tempItems; return tempItems;
} }
else else
@ -464,9 +469,8 @@ vector<Item> Nextcloud::getOfflineStructure(const string &pathUrl)
return {}; return {};
} }
void Nextcloud::getLocalFileStructure(const string &localPath) void Nextcloud::getLocalFileStructure(vector<Item> &tempItems, const string &localPath)
{ {
//TODO also show local folders that are not synced to the cloud yet
//get local files, https://stackoverflow.com/questions/306533/how-do-i-get-a-list-of-files-in-a-directory-in-c //get local files, https://stackoverflow.com/questions/306533/how-do-i-get-a-list-of-files-in-a-directory-in-c
DIR *dir; DIR *dir;
class dirent *ent; class dirent *ent;
@ -475,33 +479,39 @@ void Nextcloud::getLocalFileStructure(const string &localPath)
dir = opendir(localPath.c_str()); dir = opendir(localPath.c_str());
while ((ent = readdir(dir)) != NULL) while ((ent = readdir(dir)) != NULL)
{ {
const string file_name = ent->d_name; const string fileName = ent->d_name;
const string full_file_name = localPath + file_name; const string fullFileName = localPath + fileName;
if (file_name[0] == '.') if (fileName[0] == '.')
continue; continue;
if (stat(full_file_name.c_str(), &st) == -1) if (stat(fullFileName.c_str(), &st) == -1)
continue; continue;
//also include directory const bool isDirectory = (st.st_mode & S_IFDIR) != 0;
const bool is_directory = (st.st_mode & S_IFDIR) != 0; if (isDirectory)
if (is_directory)
continue; continue;
bool found = false; bool found = false;
for (auto i = 0; i < _items.size(); i++) for (auto i = 0; i < tempItems.size(); i++)
{ {
//TODO compare last edit local and in cloud and display to user if (tempItems.at(i).getLocalPath().compare(fullFileName) == 0)
if (_items.at(i).getLocalPath().compare(full_file_name) == 0)
{ {
std::ifstream in(fullFileName, std::ifstream::binary | std::ifstream::ate );
Log::writeLog(Util::valueToString(in.tellg()));
Log::writeLog(Util::valueToString(tempItems.at(i).getSize()));
if(in.tellg() != tempItems.at(i).getSize())
{
tempItems.at(i).setState(FileState::IOUTSYNCED);
}
found = true; found = true;
break; break;
} }
} }
if (!found) if (!found)
{ {
_items.push_back(Item(full_file_name, FileState::ILOCAL)); //TODO push to different items list and then ask if shall be deleted later on? --> just in case of folder sync
tempItems.push_back(Item(fullFileName, FileState::ILOCAL));
} }
} }
closedir(dir); closedir(dir);

View File

@ -90,7 +90,7 @@ public:
static string getLocalPath(string path); static string getLocalPath(string path);
void getLocalFileStructure(const string &localPath); void getLocalFileStructure(vector<Item> &tempItems, const string &localPath);
private: private:
vector<Item> _items; vector<Item> _items;