File: WorkspaceHelper.cpp

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (109 lines) | stat: -rw-r--r-- 4,029 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "WorkspaceHelper.hpp"

#include "cl_standard_paths.h"
#include "file_logger.h"
#include "fileutils.h"
#include "macros.h"

#include <wx/filename.h>

#if USE_SFTP
#include "clSFTPManager.hpp"
#endif

thread_local wxStringMap_t REMOTE_FILES_CACHE;

WorkspaceHelper::WorkspaceHelper() {}

WorkspaceHelper::~WorkspaceHelper() {}

bool WorkspaceHelper::ReadPrivateFile(IWorkspace* workspace, const wxString& filename, wxString* content) const
{
    if(workspace) {
        if(workspace->IsRemote()) {
            // Check the cache first
            wxFileName filepath = workspace->GetFileName();
            filepath.AppendDir(".codelite");
            filepath.SetFullName(filename);

            wxString remote_file_path = filepath.GetFullPath(wxPATH_UNIX);
            remote_file_path.Replace("\\", "/");
            wxString file_content;
            if(REMOTE_FILES_CACHE.count(remote_file_path) == 0) {
                // a lengthy operation
                wxBusyCursor bc;
                wxMemoryBuffer memory_buffer;
#if USE_SFTP
                if(!clSFTPManager::Get().AwaitReadFile(remote_file_path, workspace->GetSshAccount(), &memory_buffer)) {
                    clDEBUG() << "Failed to read file:" << remote_file_path << endl;
                    return false;
                }
#endif
                wxString text((const unsigned char*)memory_buffer.GetData(), wxConvUTF8, memory_buffer.GetDataLen());
                REMOTE_FILES_CACHE.insert({ remote_file_path, text });
            }

            // the file should exist in the cache
            if(REMOTE_FILES_CACHE.count(remote_file_path) == 0) {
                return false;
            }
            *content = REMOTE_FILES_CACHE.find(remote_file_path)->second;
            return true;
        } else {
            // local workspace
            wxFileName filepath = workspace->GetFileName();
            filepath.AppendDir(".codelite");
            filepath.SetFullName(filename);
            return FileUtils::ReadFileContent(filepath, *content);
        }
    } else {
        // no workspace is opened, use the global path
        wxFileName filepath{ clStandardPaths::Get().GetUserDataDir(), filename };
        filepath.AppendDir("config");
        filepath.SetFullName(filename);
        return FileUtils::ReadFileContent(filepath, *content);
    }
}

bool WorkspaceHelper::WritePrivateFile(IWorkspace* workspace, const wxString& filename, const wxString& content) const
{
    if(workspace) {
        if(workspace->IsRemote()) {
            // Check the cache first
            wxFileName filepath = workspace->GetFileName();
            filepath.AppendDir(".codelite");
            filepath.SetFullName(filename);

            wxString remote_file_path = filepath.GetFullPath(wxPATH_UNIX);
            remote_file_path.Replace("\\", "/");
            wxString file_content;

            clDEBUG() << "Writing file:" << remote_file_path << endl;
            // write the file to the file system
            // a lengthy operation
            wxBusyCursor bc;
#if USE_SFTP
            if(!clSFTPManager::Get().AwaitWriteFile(content, remote_file_path, workspace->GetSshAccount())) {
                clDEBUG() << "Failed to write file:" << remote_file_path << endl;
                return false;
            }
#endif
            // update the cache
            REMOTE_FILES_CACHE.erase(remote_file_path);
            REMOTE_FILES_CACHE.insert({ remote_file_path, content });

            return true;
        } else {
            // local workspace
            wxFileName filepath = workspace->GetFileName();
            filepath.AppendDir(".codelite");
            filepath.SetFullName(filename);
            return FileUtils::WriteFileContent(filepath, content);
        }
    } else {
        // no workspace is opened, use the global path
        wxFileName filepath{ clStandardPaths::Get().GetUserDataDir(), filename };
        filepath.AppendDir("config");
        return FileUtils::WriteFileContent(filepath, content);
    }
}