gnetvibes 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/gnetvibes +1 -0
- data/lib/gnetvibes/api.rb +52 -6
- data/lib/gnetvibes/callback.rb +36 -15
- data/lib/gnetvibes/config.rb +10 -3
- data/lib/gnetvibes/gui.rb +52 -25
- metadata +6 -6
data/bin/gnetvibes
CHANGED
@@ -10,6 +10,7 @@ require 'gnetvibes/config'
|
|
10
10
|
require 'gnetvibes/gui'
|
11
11
|
|
12
12
|
FileUtils.mkdir_p(GNetvibes::CACHE) if not File.exists?(GNetvibes::CACHE)
|
13
|
+
FileUtils.mkdir_p(GNetvibes::DATA) if not File.exists?(GNetvibes::DATA)
|
13
14
|
|
14
15
|
gui = GNetvibes::GUI.new
|
15
16
|
gui.login_dialog.show_all
|
data/lib/gnetvibes/api.rb
CHANGED
@@ -20,12 +20,16 @@ class API
|
|
20
20
|
@active_session_id = nil
|
21
21
|
@data = nil
|
22
22
|
@key = nil
|
23
|
+
@email = nil
|
23
24
|
end
|
24
25
|
|
25
26
|
def login(email, password)
|
26
|
-
|
27
|
+
email.strip!
|
28
|
+
password.strip!
|
29
|
+
res = Net::HTTP.post_form(URL[:login], {'email'=> email, 'password' => password})
|
27
30
|
if res.body.strip == 'success'
|
28
31
|
@key = Digest::SHA1.new(email + password).hexdigest
|
32
|
+
@email = email
|
29
33
|
cookies = CGI::Cookie::parse(res['set-cookie'])
|
30
34
|
@active_user_id = cookies['activeUserID'].value
|
31
35
|
@active_session_id = cookies['activeSessionID'].value
|
@@ -36,10 +40,27 @@ class API
|
|
36
40
|
end
|
37
41
|
end
|
38
42
|
|
39
|
-
|
40
|
-
|
41
|
-
|
43
|
+
|
44
|
+
def save(id, options)
|
45
|
+
mod = @modules[id]
|
46
|
+
case mod['name']
|
47
|
+
when 'PostIt'
|
48
|
+
mod['title'] = options[:title]
|
49
|
+
mod['data']['text'] = options[:text]
|
42
50
|
else
|
51
|
+
raise 'Not implemented'
|
52
|
+
end
|
53
|
+
Net::HTTP.start(URL[:data].host, URL[:data].port) do |http|
|
54
|
+
headers = {'Cookie' => "activeUserID=#{@active_user_id}; activeSessionID=#{@active_session_id}"}
|
55
|
+
post = Net::HTTP::Post.new(URL[:save].path, headers)
|
56
|
+
post.set_form_data(module2post(mod))
|
57
|
+
http.request(post)
|
58
|
+
end
|
59
|
+
dump
|
60
|
+
end
|
61
|
+
|
62
|
+
def refresh(force = false)
|
63
|
+
if force or not load
|
43
64
|
res = Net::HTTP.start(URL[:data].host, URL[:data].port) do |http|
|
44
65
|
headers = {'Cookie' => "activeUserID=#{@active_user_id}; activeSessionID=#{@active_session_id}"}
|
45
66
|
http.request(Net::HTTP::Get.new(URL[:data].path, headers))
|
@@ -74,11 +95,21 @@ class API
|
|
74
95
|
end
|
75
96
|
|
76
97
|
def dump
|
77
|
-
File.open(DATA, 'w') do |fd|
|
98
|
+
File.open(File.join(DATA, @email), 'w') do |fd|
|
78
99
|
fd.write crypt(@data.inspect, @key)
|
79
100
|
end
|
80
101
|
end
|
81
102
|
|
103
|
+
def load
|
104
|
+
file = File.join(DATA, @email)
|
105
|
+
if File.exists?(file) and File.mtime(file) > Time.now - EXPIRE
|
106
|
+
@data = eval(crypt(File.read(file), @key))
|
107
|
+
true
|
108
|
+
else
|
109
|
+
false
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
82
113
|
def download(uri)
|
83
114
|
if uri =~ /^\//
|
84
115
|
url = URL[:base] + uri
|
@@ -103,7 +134,7 @@ class API
|
|
103
134
|
end
|
104
135
|
|
105
136
|
def json2ruby(s)
|
106
|
-
eval(s.gsub(/":/, '"=>'))
|
137
|
+
eval(s.gsub(/:null/, ':nil').gsub(/":/, '"=>'))
|
107
138
|
end
|
108
139
|
|
109
140
|
def crypt(buf, key)
|
@@ -113,5 +144,20 @@ class API
|
|
113
144
|
buf.zip(key).collect{|c1,c2| c1^c2}.pack("c*")
|
114
145
|
end
|
115
146
|
|
147
|
+
def module2post(mod)
|
148
|
+
post = {}
|
149
|
+
mod.each do |k,v|
|
150
|
+
if v.is_a? Hash
|
151
|
+
v.each do |subk, subv|
|
152
|
+
post["arr#{k.capitalize}[#{subk}]"] = subv
|
153
|
+
end
|
154
|
+
else
|
155
|
+
post[k] = v
|
156
|
+
end
|
157
|
+
end
|
158
|
+
post['mode'] = 'module'
|
159
|
+
post
|
160
|
+
end
|
161
|
+
|
116
162
|
end
|
117
163
|
end
|
data/lib/gnetvibes/callback.rb
CHANGED
@@ -5,19 +5,29 @@ module GNetvibes
|
|
5
5
|
class GUI
|
6
6
|
|
7
7
|
def edit(obj, mod)
|
8
|
+
@edit_current = mod.to_i
|
8
9
|
mod = @api.modules[mod.to_i]
|
9
|
-
@
|
10
|
-
|
10
|
+
@buf.text = ''
|
11
|
+
iter = @buf.get_iter_at_offset(0)
|
12
|
+
@buf.insert(iter, mod['title'] + "\n", @tag_title)
|
13
|
+
@buf.insert(iter, mod['data']['text'].strip + "\n", @tag_normal)
|
11
14
|
@txt.grab_focus
|
12
15
|
@edit_dialog.show_all
|
13
16
|
@edit_dialog.run
|
14
17
|
end
|
15
18
|
|
19
|
+
def update_tag(*args)
|
20
|
+
@buf.apply_tag(@tag_title, @buf.get_iter_at_line(0), @buf.get_iter_at_line(1))
|
21
|
+
@buf.apply_tag(@tag_normal, @buf.get_iter_at_line(1), @buf.get_iter_at_line(2))
|
22
|
+
end
|
23
|
+
|
16
24
|
def save(obj, ev)
|
17
25
|
if ev == Gtk::Dialog::RESPONSE_ACCEPT
|
18
|
-
|
26
|
+
@api.save(@edit_current, :title => @buf.text[/^[^\n]*/], :text => @buf.text[/\n.*$/m].strip)
|
19
27
|
end
|
28
|
+
@edit_current = nil
|
20
29
|
@edit_dialog.hide_on_delete
|
30
|
+
refresh
|
21
31
|
end
|
22
32
|
|
23
33
|
def login(obj, ev)
|
@@ -36,36 +46,47 @@ class GUI
|
|
36
46
|
end
|
37
47
|
end
|
38
48
|
|
39
|
-
def refresh
|
49
|
+
def refresh(*args)
|
40
50
|
@tray.tooltip = "#{GNetvibes::NAME} refreshing...";
|
51
|
+
gui_menu
|
52
|
+
if args.empty?
|
53
|
+
@api.refresh
|
54
|
+
elsif args.last == true
|
55
|
+
@api.refresh(true)
|
56
|
+
end
|
41
57
|
|
42
58
|
@api.tabs.each do |id, tab|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
59
|
+
submenutitle = Gtk::ImageMenuItem.new(tab['title'])
|
60
|
+
|
61
|
+
if not tab['icon'].strip.empty?
|
62
|
+
icon = File.join(CACHE, Digest::SHA1.new(tab['icon']).hexdigest)
|
63
|
+
if not File.exists?(icon)
|
64
|
+
File.open(icon, 'w') do |fd|
|
65
|
+
fd.puts @api.download(tab['icon'])
|
66
|
+
end
|
47
67
|
end
|
68
|
+
submenutitle.image = Gtk::Image.new(icon)
|
48
69
|
end
|
49
70
|
|
50
|
-
submenutitle = Gtk::ImageMenuItem.new(tab['title'])
|
51
|
-
submenutitle.image = Gtk::Image.new(icon)
|
52
|
-
|
53
71
|
submenu = Gtk::Menu.new
|
54
72
|
@api.each_modules_in_tab(id) do |mod|
|
55
73
|
case mod['name']
|
56
74
|
when 'PostIt'
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
submenu.append(
|
75
|
+
@menu_items << Gtk::ImageMenuItem.new(mod['title'])
|
76
|
+
@menu_items.last.image = Gtk::Image.new(@icon_webnote)
|
77
|
+
@menu_items.last.signal_connect("activate", mod['id'], &method(:edit))
|
78
|
+
submenu.append(@menu_items.last)
|
61
79
|
end
|
62
80
|
end
|
63
81
|
submenutitle.submenu = submenu
|
82
|
+
@menu_items << submenu
|
83
|
+
@menu_items << submenutitle
|
64
84
|
@menu.prepend(submenutitle)
|
65
85
|
end
|
66
86
|
|
67
87
|
@menu.show_all
|
68
88
|
@tray.tooltip = GNetvibes::NAME;
|
89
|
+
GC.start
|
69
90
|
end
|
70
91
|
|
71
92
|
end
|
data/lib/gnetvibes/config.rb
CHANGED
@@ -1,14 +1,21 @@
|
|
1
1
|
module GNetvibes
|
2
2
|
NAME = 'gNetvibes'
|
3
|
-
VERSION = '0.
|
3
|
+
VERSION = '0.2'
|
4
4
|
COPYRIGHT = 'Copyright (C) 2007 Florent Solt'
|
5
5
|
DESC = 'Netvibes integration with the Gnome Desktop'
|
6
6
|
AUTHOR = 'Florent Solt'
|
7
7
|
EMAIL = 'florent@solt.biz'
|
8
8
|
HOMEPAGE = 'http://rubyforge.org/projects/gnetvibes/'
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
if RUBY_PLATFORM =~ /win32/
|
11
|
+
HOME = File.join(ENV['APPDATA'], GNetvibes::NAME)
|
12
|
+
else
|
13
|
+
HOME = File.join(ENV['HOME'], ".#{GNetvibes::NAME.downcase}")
|
14
|
+
end
|
15
|
+
|
16
|
+
CACHE = File.join(HOME, "cache")
|
17
|
+
DATA = File.join(HOME, "data")
|
18
|
+
|
12
19
|
EXPIRE = 5 * 60
|
13
20
|
end
|
14
21
|
|
data/lib/gnetvibes/gui.rb
CHANGED
@@ -13,6 +13,14 @@ class GUI
|
|
13
13
|
@icon = Gdk::Pixbuf.new(File.join(File.dirname(__FILE__), "ico.png"))
|
14
14
|
@icon_webnote = Gdk::Pixbuf.new(File.join(File.dirname(__FILE__), "webnote.gif"))
|
15
15
|
|
16
|
+
gui_login
|
17
|
+
gui_edit
|
18
|
+
gui_tray
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def gui_login
|
16
24
|
# Login Dialog
|
17
25
|
@login_dialog = Gtk::Dialog.new("#{GNetvibes::NAME} Authentification", nil, Gtk::Dialog::MODAL,
|
18
26
|
[Gtk::Stock::OK, Gtk::Dialog::RESPONSE_ACCEPT],
|
@@ -33,65 +41,86 @@ class GUI
|
|
33
41
|
|
34
42
|
table.attach_defaults(Gtk::Label.new("Password:"), 1, 2, 1, 2)
|
35
43
|
@password.visibility = false
|
36
|
-
@password.invisible_char = 0
|
37
44
|
table.attach_defaults(@password, 2, 3, 1, 2)
|
38
45
|
@login_dialog.vbox.pack_start(table)
|
39
46
|
@password.signal_connect("key_release_event", &method(:login))
|
40
47
|
|
41
48
|
if not ARGV.empty?
|
42
49
|
@login.editable = false
|
43
|
-
@login.text = ARGV.
|
50
|
+
@login.text = ARGV.shift
|
51
|
+
@password.text = ARGV.shift if not ARGV.empty?
|
44
52
|
@password.grab_focus
|
45
53
|
else
|
46
54
|
@login.grab_focus
|
47
55
|
end
|
48
56
|
|
49
57
|
@login_dialog.signal_connect('response', &method(:login))
|
58
|
+
end
|
50
59
|
|
60
|
+
def gui_tray
|
51
61
|
# Status Tray Icon
|
52
62
|
@tray = Gtk::StatusIcon.new
|
53
63
|
@tray.pixbuf = @icon
|
54
64
|
|
65
|
+
@tray.signal_connect('popup-menu') do |w, button, time|
|
66
|
+
unless @menu.nil?
|
67
|
+
@menu.popup(nil, nil, button, time) do
|
68
|
+
@tray.position_menu(@menu)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def gui_menu
|
75
|
+
if @menu
|
76
|
+
@menu_items.to_a.each {|i| i.destroy}
|
77
|
+
@menu.destroy
|
78
|
+
end
|
79
|
+
@menu_items = []
|
55
80
|
@menu = Gtk::Menu.new
|
56
|
-
@
|
81
|
+
@menu_items << Gtk::SeparatorMenuItem.new
|
82
|
+
@menu.append(@menu_items.last)
|
57
83
|
|
58
|
-
|
59
|
-
|
60
|
-
@menu.append(
|
84
|
+
@menu_items << Gtk::ImageMenuItem.new(Gtk::Stock::REFRESH)
|
85
|
+
@menu_items.last.signal_connect("activate", true, &method(:refresh))
|
86
|
+
@menu.append(@menu_items.last)
|
61
87
|
|
62
|
-
|
63
|
-
|
88
|
+
@menu_items << Gtk::ImageMenuItem.new(Gtk::Stock::QUIT)
|
89
|
+
@menu_items.last.signal_connect("activate") do
|
64
90
|
Gtk.main_quit
|
65
91
|
end
|
66
|
-
@menu.append(
|
92
|
+
@menu.append(@menu_items.last)
|
67
93
|
@menu.show_all
|
94
|
+
end
|
68
95
|
|
69
|
-
|
70
|
-
@menu.popup(nil, nil, button, time) do
|
71
|
-
@tray.position_menu(@menu)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
# Text
|
76
|
-
@buf = Gtk::TextBuffer.new
|
77
|
-
@txt = Gtk::TextView.new(@buf)
|
78
|
-
|
79
|
-
@title = Gtk::Entry.new
|
80
|
-
|
96
|
+
def gui_edit
|
81
97
|
# Edit Dialog
|
82
98
|
@edit_dialog = Gtk::Dialog.new(GNetvibes::NAME, nil, Gtk::Dialog::MODAL,
|
83
99
|
[Gtk::Stock::OK, Gtk::Dialog::RESPONSE_ACCEPT],
|
84
100
|
[Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_REJECT])
|
85
101
|
|
102
|
+
# Text
|
103
|
+
@buf = Gtk::TextBuffer.new
|
104
|
+
@buf.signal_connect("changed", &method(:update_tag))
|
105
|
+
@txt = Gtk::TextView.new(@buf)
|
106
|
+
@txt.wrap_mode = Gtk::TextTag::WRAP_WORD
|
107
|
+
@txt.accepts_tab = false
|
108
|
+
@tag_title = @buf.create_tag('title', :font => "Sans Bold 13",
|
109
|
+
:pixels_below_lines => 10, :pixels_above_lines => 10,
|
110
|
+
:left_margin => 5)
|
111
|
+
@tag_normal = @buf.create_tag('normal', :font => "Sans 10",
|
112
|
+
:pixels_below_lines => 2, :pixels_above_lines => 0,
|
113
|
+
:left_margin => 10)
|
114
|
+
|
86
115
|
scroll = Gtk::ScrolledWindow.new
|
87
116
|
scroll.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC)
|
88
117
|
scroll.add(@txt)
|
89
118
|
scroll.border_width = 1
|
90
|
-
|
91
119
|
frame = Gtk::Frame.new
|
92
120
|
frame.add(scroll)
|
121
|
+
@edit_dialog.vbox.pack_start(frame, true, true, 10)
|
93
122
|
|
94
|
-
@edit_dialog.set_default_size(
|
123
|
+
@edit_dialog.set_default_size(600, 400)
|
95
124
|
@edit_dialog.signal_connect("delete-event") do
|
96
125
|
@edit_dialog.hide_on_delete
|
97
126
|
end
|
@@ -100,8 +129,6 @@ class GUI
|
|
100
129
|
@edit_dialog.modal = true
|
101
130
|
@edit_dialog.border_width = 10
|
102
131
|
@edit_dialog.icon = @icon
|
103
|
-
@edit_dialog.vbox.pack_start(@title, false, false)
|
104
|
-
@edit_dialog.vbox.pack_start(frame, true, true, 10)
|
105
132
|
@edit_dialog.signal_connect('response', &method(:save))
|
106
133
|
end
|
107
134
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: gnetvibes
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "0.
|
7
|
-
date: 2007-03-
|
6
|
+
version: "0.2"
|
7
|
+
date: 2007-03-19 00:00:00 +01:00
|
8
8
|
summary: Netvibes integration with the Gnome Desktop
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -29,12 +29,12 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Florent Solt
|
31
31
|
files:
|
32
|
-
- lib/gnetvibes/callback.rb
|
33
|
-
- lib/gnetvibes/api.rb
|
34
|
-
- lib/gnetvibes/config.rb
|
35
32
|
- lib/gnetvibes/gui.rb
|
36
|
-
- lib/gnetvibes/
|
33
|
+
- lib/gnetvibes/config.rb
|
37
34
|
- lib/gnetvibes/webnote.gif
|
35
|
+
- lib/gnetvibes/api.rb
|
36
|
+
- lib/gnetvibes/ico.png
|
37
|
+
- lib/gnetvibes/callback.rb
|
38
38
|
test_files: []
|
39
39
|
|
40
40
|
rdoc_options: []
|