source: lliurex-apt/trunk/fuentes/src/Cache.cpp @ 923

Last change on this file since 923 was 923, checked in by mabarracus, 3 years ago

Imported trusty code

File size: 3.1 KB
Line 
1
2#include "Cache.hpp"
3
4#include <iostream>
5
6#include <giomm.h>
7#include <glibmm.h>
8
9using namespace std;
10using namespace net::lliurex::apt;
11
12
13Cache::Cache()
14{
15}
16
17
18Cache::Cache(function<void(int,string)> progress,function<void(void)> ready)
19{
20        this->cb_progress=progress;
21        this->cb_ready=ready;
22}
23
24
25
26Cache::~Cache()
27{
28}
29
30void Cache::OnSignal(const Glib::ustring& sender_name, const Glib::ustring& signal_name, const Glib::VariantContainerBase& parameters)
31{
32
33        //cout<<"-- "<<signal_name<<endl;
34       
35        if(signal_name=="PropertyChanged")
36        {
37       
38                               
39                Glib::Variant<Glib::ustring> prop_name;
40                parameters.get_child(prop_name,0);
41               
42                //cout<<"-- "<<prop_name.get()<<endl;
43               
44                if(prop_name.get()=="StatusDetails")
45                {
46                       
47                        Glib::VariantContainerBase q;
48                        parameters.get_child(q,1);
49                       
50                        Glib::Variant<Glib::ustring> p;
51                        q.get_child(p,0);
52                       
53                        //cout<<"* ["<<p.get()<<"]"<<endl;
54                }
55               
56                if(prop_name.get()=="ProgressDownload")
57                {
58                        Glib::VariantContainerBase q;
59                        parameters.get_child(q,1);
60                       
61                        Glib::VariantContainerBase qq;
62                        q.get_child(qq,0);
63                       
64                        Glib::Variant<Glib::ustring> desc;
65                        qq.get_child(desc,2);
66                       
67                        //cout<<desc.get()<<endl;
68                       
69                        cb_progress(progress,desc.get());
70                       
71                }
72               
73                if(prop_name.get()=="ProgressDetails")
74                {
75                        Glib::VariantContainerBase q;
76                        parameters.get_child(q,1);
77                       
78                        Glib::VariantContainerBase qq;
79                        q.get_child(qq,0);
80                       
81                        Glib::Variant<int> current;
82                        Glib::Variant<int> total;
83
84                        qq.get_child(current,0);
85                        qq.get_child(total,1);
86                       
87                        //cout<<"progress: "<<(float)100.0f * current.get()/total.get()<<endl;
88                       
89                        if(total.get()>0)
90                        {
91                                progress = (int)(100.0f * current.get()/total.get());
92                        }
93                       
94                }
95               
96               
97        }
98       
99        if(signal_name=="Finished")
100        {
101                if(cancel_request==false)
102                        cb_ready();
103                       
104                loop->quit();
105        }
106       
107}
108
109
110
111
112
113void Cache::Update()
114{
115        cancel_request=false;
116        Glib::Thread::create(sigc::mem_fun(*this, &Cache::UpdateThread), true);
117}
118
119void Cache::UpdateThread()
120{
121
122        progress=0;
123
124        connection = Gio::DBus::Connection::get_sync(Gio::DBus::BUS_TYPE_SYSTEM);
125
126       
127        if(!connection)
128        {
129                throw runtime_error("Failed to connect to system bus");
130        }
131       
132        Glib::RefPtr<Gio::DBus::Proxy> proxy;
133       
134        proxy = Gio::DBus::Proxy::create_sync(connection, "org.debian.apt",
135"/org/debian/apt", "org.debian.apt");
136
137        try
138        {
139                const Glib::VariantContainerBase address = proxy->call_sync("UpdateCache");
140                Glib::Variant<Glib::ustring> res;
141                address.get_child(res);
142                cout<<"Address: "<<res.get()<<endl;
143               
144               
145               
146                transaction_proxy=Gio::DBus::Proxy::create_sync(connection, "org.debian.apt",
147res.get(), "org.debian.apt.transaction");
148
149               
150                transaction_proxy->signal_signal().connect(sigc::mem_fun(*this,&Cache::OnSignal));
151                transaction_proxy->call_sync("Run");
152               
153                cout<<"waiting for a train..."<<endl;
154               
155                loop = Glib::MainLoop::create();
156                loop->run();
157               
158               
159               
160        }
161        catch(Gio::DBus::Error e)
162        {
163                //should we really exit from the application?
164                cerr<<"Error: "<<e.code()<<endl;
165                std::exit(1);
166        }
167       
168       
169
170       
171}
172
173void Cache::Cancel()
174{
175        try
176        {
177                cancel_request=true;
178                transaction_proxy->call_sync("Cancel");
179        }
180        catch(Gio::DBus::Error e)
181        {
182                cerr<<"Error: "<<e.code()<<endl;
183                std::exit(1);
184        }
185}
186
Note: See TracBrowser for help on using the repository browser.