QWidget *FileStorage::settingsWidget() { FileStorageSettingsWidget *w = new FileStorageSettingsWidget( QSettings().value(QString("storage.%1.path").arg(systemName())).toString(), this); connect(w, SIGNAL(apply()), SLOT(settingsApplied())); return w; }
bool FileStorage::saveNoteToFile(FileNoteData ¬e, const QString &fileName) { if (note.saveToFile(fileName)) { NoteListItem item(note.uid(), systemName(), note.title(), note.modifyTime()); putToCache(item); return true; } handleFSError(); return false; }
void FileStorage::settingsApplied() { FileStorageSettingsWidget *w = qobject_cast<FileStorageSettingsWidget *>(sender()); QString p = w->path(); if (p.isEmpty()) { /* just to be sure all native file dialogs work the same way */ return; } QFileInfo fi(p); if (!fi.isDir() || !fi.isWritable()) { return; } notesDir = fi.absoluteFilePath(); QSettings().setValue(QString("storage.%1.path").arg(systemName()), notesDir == findStorageDir()? "" : notesDir); cache.clear(); _cacheValid = false; emit invalidated(); }
void HTTPReply ( int nStatus, std::string const& content, Json::Output const& output, beast::Journal j) { JLOG (j.trace()) << "HTTP Reply " << nStatus << " " << content; if (nStatus == 401) { output ("HTTP/1.0 401 Authorization Required\r\n"); output (getHTTPHeaderTimestamp ()); // CHECKME this returns a different version than the replies below. Is // this by design or an accident or should it be using // BuildInfo::getFullVersionString () as well? output ("Server: " + systemName () + "-json-rpc/v1"); output ("\r\n"); // Be careful in modifying this! If you change the contents you MUST // update the Content-Length header as well to indicate the correct // size of the data. output ("WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n" "Content-Type: text/html\r\n" "Content-Length: 296\r\n" "\r\n" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 " "Transitional//EN\"\r\n" "\"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd" "\">\r\n" "<HTML>\r\n" "<HEAD>\r\n" "<TITLE>Error</TITLE>\r\n" "<META HTTP-EQUIV='Content-Type' " "CONTENT='text/html; charset=ISO-8859-1'>\r\n" "</HEAD>\r\n" "<BODY><H1>401 Unauthorized.</H1></BODY>\r\n"); return; } switch (nStatus) { case 200: output ("HTTP/1.1 200 OK\r\n"); break; case 400: output ("HTTP/1.1 400 Bad Request\r\n"); break; case 403: output ("HTTP/1.1 403 Forbidden\r\n"); break; case 404: output ("HTTP/1.1 404 Not Found\r\n"); break; case 500: output ("HTTP/1.1 500 Internal Server Error\r\n"); break; case 503: output ("HTTP/1.1 503 Server is overloaded\r\n"); break; } output (getHTTPHeaderTimestamp ()); output ("Connection: Keep-Alive\r\n" "Content-Length: "); // VFALCO TODO Determine if/when this header should be added //if (context.app.config().RPC_ALLOW_REMOTE) // output ("Access-Control-Allow-Origin: *\r\n"); output (std::to_string(content.size () + 2)); output ("\r\n" "Content-Type: application/json; charset=UTF-8\r\n"); output ("Server: " + systemName () + "-json-rpc/"); output (BuildInfo::getFullVersionString ()); output ("\r\n" "\r\n"); output (content); output ("\r\n"); }
void Config::setup (std::string const& strConf, bool bQuiet) { boost::filesystem::path dataDir; boost::system::error_code ec; std::string strDbPath, strConfFile; // // Determine the config and data directories. // If the config file is found in the current working directory, use the current working directory as the config directory and // that with "db" as the data directory. // QUIET = bQuiet; NODE_SIZE = 0; strDbPath = Helpers::getDatabaseDirName (); strConfFile = strConf.empty () ? Helpers::getConfigFileName () : strConf; VALIDATORS_BASE = Helpers::getValidatorsFileName (); VALIDATORS_URI = boost::str (boost::format ("/%s") % VALIDATORS_BASE); if (!strConf.empty ()) { // --conf=<path> : everything is relative that file. CONFIG_FILE = strConfFile; CONFIG_DIR = boost::filesystem::absolute (CONFIG_FILE); CONFIG_DIR.remove_filename (); dataDir = CONFIG_DIR / strDbPath; } else { CONFIG_DIR = boost::filesystem::current_path (); CONFIG_FILE = CONFIG_DIR / strConfFile; dataDir = CONFIG_DIR / strDbPath; // Construct XDG config and data home. // http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html std::string strHome = getEnvVar ("HOME"); std::string strXdgConfigHome = getEnvVar ("XDG_CONFIG_HOME"); std::string strXdgDataHome = getEnvVar ("XDG_DATA_HOME"); if (boost::filesystem::exists (CONFIG_FILE) // Can we figure out XDG dirs? || (strHome.empty () && (strXdgConfigHome.empty () || strXdgDataHome.empty ()))) { // Current working directory is fine, put dbs in a subdir. } else { if (strXdgConfigHome.empty ()) { // $XDG_CONFIG_HOME was not set, use default based on $HOME. strXdgConfigHome = strHome + "/.config"; } if (strXdgDataHome.empty ()) { // $XDG_DATA_HOME was not set, use default based on $HOME. strXdgDataHome = strHome + "/.local/share"; } CONFIG_DIR = strXdgConfigHome + "/" + systemName (); CONFIG_FILE = CONFIG_DIR / strConfFile; dataDir = strXdgDataHome + "/" + systemName (); boost::filesystem::create_directories (CONFIG_DIR, ec); if (ec) throw std::runtime_error (boost::str (boost::format ("Can not create %s") % CONFIG_DIR)); } } HTTPClient::initializeSSLContext(); // Update default values load (); { // load() may have set a new value for the dataDir std::string const dbPath (legacy ("database_path")); if (!dbPath.empty ()) { dataDir = boost::filesystem::path (dbPath); } } boost::filesystem::create_directories (dataDir, ec); if (ec) throw std::runtime_error ( boost::str (boost::format ("Can not create %s") % dataDir)); legacy ("database_path", boost::filesystem::absolute (dataDir).string ()); }