Gajim does bookmarks and private storage [needs better UI-side] CONGRATS and thanks to delmonico
This commit is contained in:
parent
0c79775f5a
commit
fba0185e89
|
@ -118,13 +118,14 @@ class Connection:
|
||||||
'AGENT_INFO_INFO': [], 'QUIT': [], 'ACC_OK': [], 'MYVCARD': [],
|
'AGENT_INFO_INFO': [], 'QUIT': [], 'ACC_OK': [], 'MYVCARD': [],
|
||||||
'OS_INFO': [], 'VCARD': [], 'GC_MSG': [], 'GC_SUBJECT': [],
|
'OS_INFO': [], 'VCARD': [], 'GC_MSG': [], 'GC_SUBJECT': [],
|
||||||
'GC_CONFIG': [], 'BAD_PASSPHRASE': [], 'ROSTER_INFO': [],
|
'GC_CONFIG': [], 'BAD_PASSPHRASE': [], 'ROSTER_INFO': [],
|
||||||
'ERROR_ANSWER': []}
|
'ERROR_ANSWER': [], 'JOIN_GC': [],}
|
||||||
self.name = name
|
self.name = name
|
||||||
self.connected = 0 # offline
|
self.connected = 0 # offline
|
||||||
self.connection = None # xmpppy instance
|
self.connection = None # xmpppy instance
|
||||||
self.gpg = None
|
self.gpg = None
|
||||||
self.status = ''
|
self.status = ''
|
||||||
self.myVCardID = []
|
self.myVCardID = []
|
||||||
|
self.bookmarks = []
|
||||||
self.on_purpose = False
|
self.on_purpose = False
|
||||||
self.password = gajim.config.get_per('accounts', name, 'password')
|
self.password = gajim.config.get_per('accounts', name, 'password')
|
||||||
if USE_GPG:
|
if USE_GPG:
|
||||||
|
@ -542,6 +543,43 @@ class Connection:
|
||||||
del roster[name + '@' + hostname]
|
del roster[name + '@' + hostname]
|
||||||
self.dispatch('ROSTER', roster)
|
self.dispatch('ROSTER', roster)
|
||||||
|
|
||||||
|
def _PrivateCB(self, con, iq_obj):
|
||||||
|
"""
|
||||||
|
Private Data (JEP 048 and 049)
|
||||||
|
"""
|
||||||
|
gajim.log.debug("PrivateCB")
|
||||||
|
storage = iq_obj.getTag("query").getTag("storage")
|
||||||
|
try:
|
||||||
|
ns = storage.getNamespace()
|
||||||
|
except AttributeError:
|
||||||
|
#Its a result for a 'set' Iq, so we don't do anything here
|
||||||
|
return
|
||||||
|
|
||||||
|
if ns=="storage:bookmarks":
|
||||||
|
#Bookmarked URLs and Conferences
|
||||||
|
#http://www.jabber.org/jeps/jep-0048.html
|
||||||
|
confs = storage.getTags("conference")
|
||||||
|
urls = storage.getTags("url")
|
||||||
|
for conf in confs:
|
||||||
|
bm = { 'name':conf.getAttr('name'),
|
||||||
|
'jid':conf.getAttr('jid'),
|
||||||
|
'autojoin':conf.getAttr('autojoin'),
|
||||||
|
'password':conf.getTagData('password'),
|
||||||
|
'nick':conf.getTagData('nick') }
|
||||||
|
|
||||||
|
if bm['autojoin']=="1":
|
||||||
|
jid = common.xmpp.protocol.JID(conf.getAttr("jid"))
|
||||||
|
server = jid.getDomain()
|
||||||
|
room = jid.getNode()
|
||||||
|
gc = self.join_gc(bm['nick'], room, server, bm['password'])
|
||||||
|
self.dispatch("JOIN_GC", [jid.getStripped(), bm['nick']])
|
||||||
|
self.bookmarks.append(bm)
|
||||||
|
elif ns=="gajim:prefs":
|
||||||
|
#Preferences data
|
||||||
|
#http://www.jabber.org/jeps/jep-0049.html
|
||||||
|
#TODO: implement this
|
||||||
|
pass
|
||||||
|
|
||||||
def _ErrorCB(self, con, iq_obj):
|
def _ErrorCB(self, con, iq_obj):
|
||||||
errmsg = iq_obj.getError()
|
errmsg = iq_obj.getError()
|
||||||
errcode = iq_obj.getErrorCode()
|
errcode = iq_obj.getErrorCode()
|
||||||
|
@ -613,6 +651,8 @@ class Connection:
|
||||||
common.xmpp.NS_MUC_OWNER)
|
common.xmpp.NS_MUC_OWNER)
|
||||||
con.RegisterHandler('iq', self._getRosterCB, 'result',
|
con.RegisterHandler('iq', self._getRosterCB, 'result',
|
||||||
common.xmpp.NS_ROSTER)
|
common.xmpp.NS_ROSTER)
|
||||||
|
con.RegisterHandler('iq', self._PrivateCB, 'result',
|
||||||
|
common.xmpp.NS_PRIVATE)
|
||||||
con.RegisterHandler('iq', self._ErrorCB, 'error')
|
con.RegisterHandler('iq', self._ErrorCB, 'error')
|
||||||
|
|
||||||
gajim.log.debug('Connected to server')
|
gajim.log.debug('Connected to server')
|
||||||
|
@ -635,7 +675,7 @@ class Connection:
|
||||||
self.connected = 0
|
self.connected = 0
|
||||||
self.dispatch('STATUS', 'offline')
|
self.dispatch('STATUS', 'offline')
|
||||||
self.dispatch('ERROR', (_('Authentication failed with "%s"' % name),
|
self.dispatch('ERROR', (_('Authentication failed with "%s"' % name),
|
||||||
_('Please check your login and password for correctness.')))
|
('Please check your login and password for correctness.')))
|
||||||
return None
|
return None
|
||||||
# END connect
|
# END connect
|
||||||
|
|
||||||
|
@ -699,6 +739,10 @@ class Connection:
|
||||||
#ask our VCard
|
#ask our VCard
|
||||||
iq = self.request_vcard(None)
|
iq = self.request_vcard(None)
|
||||||
self.myVCardID.append(iq.getID())
|
self.myVCardID.append(iq.getID())
|
||||||
|
|
||||||
|
#Get bookmarks from private namespace
|
||||||
|
self.get_bookmarks()
|
||||||
|
|
||||||
elif show == 'offline' and self.connected:
|
elif show == 'offline' and self.connected:
|
||||||
self.connected = 0
|
self.connected = 0
|
||||||
if self.connection:
|
if self.connection:
|
||||||
|
@ -897,7 +941,6 @@ class Connection:
|
||||||
iq.setTag(common.xmpp.NS_VCARD + ' vCard')
|
iq.setTag(common.xmpp.NS_VCARD + ' vCard')
|
||||||
self.connection.send(iq)
|
self.connection.send(iq)
|
||||||
return iq
|
return iq
|
||||||
|
|
||||||
#('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...})
|
#('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...})
|
||||||
|
|
||||||
def send_vcard(self, vcard):
|
def send_vcard(self, vcard):
|
||||||
|
@ -921,6 +964,39 @@ class Connection:
|
||||||
iq2.addChild(i).setData(vcard[i])
|
iq2.addChild(i).setData(vcard[i])
|
||||||
self.connection.send(iq)
|
self.connection.send(iq)
|
||||||
|
|
||||||
|
def get_settings(self):
|
||||||
|
''' Get Gajim settings as described in JEP 0049 '''
|
||||||
|
if not self.connection:
|
||||||
|
return
|
||||||
|
iq = common.xmpp.Iq(typ='get')
|
||||||
|
iq2 = iq.addChild(name='query', namespace='jabber:iq:private')
|
||||||
|
iq3 = iq2.addChild(name='gajim', namespace='gajim:prefs')
|
||||||
|
self.connection.send(iq)
|
||||||
|
|
||||||
|
def get_bookmarks(self):
|
||||||
|
''' Get Bookmarks from storage as described in JEP 0048 '''
|
||||||
|
if not self.connection:
|
||||||
|
return
|
||||||
|
iq = common.xmpp.Iq(typ='get')
|
||||||
|
iq2 = iq.addChild(name="query", namespace="jabber:iq:private")
|
||||||
|
iq3 = iq2.addChild(name="storage", namespace="storage:bookmarks")
|
||||||
|
self.connection.send(iq)
|
||||||
|
|
||||||
|
def store_bookmarks(self):
|
||||||
|
''' Send bookmarks to the storage namespace '''
|
||||||
|
iq = common.xmpp.Iq(typ='set')
|
||||||
|
iq2 = iq.addChild(name="query", namespace="jabber:iq:private")
|
||||||
|
iq3 = iq2.addChild(name="storage", namespace="storage:bookmarks")
|
||||||
|
for bm in self.bookmarks:
|
||||||
|
iq4 = iq3.addChild(name="conference")
|
||||||
|
iq4.setAttr('jid',bm['jid'])
|
||||||
|
iq4.setAttr('autojoin',bm['autojoin'])
|
||||||
|
iq4.setAttr('name',bm['name'])
|
||||||
|
iq5 = iq4.setTagData('nick',bm['nick'])
|
||||||
|
iq5 = iq4.setTagData('password',bm['password'])
|
||||||
|
self.connection.send(iq)
|
||||||
|
|
||||||
|
|
||||||
def send_agent_status(self, agent, ptype):
|
def send_agent_status(self, agent, ptype):
|
||||||
if not self.connection:
|
if not self.connection:
|
||||||
return
|
return
|
||||||
|
|
|
@ -570,6 +570,14 @@ class Interface:
|
||||||
user.groups = array[4]
|
user.groups = array[4]
|
||||||
self.roster.draw_contact(jid, account)
|
self.roster.draw_contact(jid, account)
|
||||||
|
|
||||||
|
def handle_event_join_gc(self, account, array):
|
||||||
|
#('JOIN_GC', account, (jid, nick))
|
||||||
|
jid = array[0]
|
||||||
|
nickname = array[1]
|
||||||
|
self.roster.new_room(jid, nickname, account)
|
||||||
|
self.windows[account]['gc'][jid].set_active_tab(jid)
|
||||||
|
self.windows[account]['gc'][jid].window.present()
|
||||||
|
|
||||||
def read_sleepy(self):
|
def read_sleepy(self):
|
||||||
'''Check if we are idle'''
|
'''Check if we are idle'''
|
||||||
if not self.sleeper.poll():
|
if not self.sleeper.poll():
|
||||||
|
@ -732,6 +740,7 @@ class Interface:
|
||||||
conn.register_handler('GC_CONFIG', self.handle_event_gc_config)
|
conn.register_handler('GC_CONFIG', self.handle_event_gc_config)
|
||||||
conn.register_handler('BAD_PASSPHRASE', self.handle_event_bad_passphrase)
|
conn.register_handler('BAD_PASSPHRASE', self.handle_event_bad_passphrase)
|
||||||
conn.register_handler('ROSTER_INFO', self.handle_event_roster_info)
|
conn.register_handler('ROSTER_INFO', self.handle_event_roster_info)
|
||||||
|
conn.register_handler('JOIN_GC', self.handle_event_join_gc)
|
||||||
|
|
||||||
def process_connections(self):
|
def process_connections(self):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -62,6 +62,8 @@ class Groupchat_window(chat.Chat):
|
||||||
self.on_change_subject_menuitem_activate)
|
self.on_change_subject_menuitem_activate)
|
||||||
self.xml.signal_connect('on_configure_room_menuitem_activate',
|
self.xml.signal_connect('on_configure_room_menuitem_activate',
|
||||||
self.on_configure_room_menuitem_activate)
|
self.on_configure_room_menuitem_activate)
|
||||||
|
self.xml.signal_connect('on_add_bookmark_menuitem_activate',
|
||||||
|
self.on_add_bookmark_menuitem_activate)
|
||||||
self.xml.signal_connect('on_close_window_activate',
|
self.xml.signal_connect('on_close_window_activate',
|
||||||
self.on_close_window_activate)
|
self.on_close_window_activate)
|
||||||
self.window.show_all()
|
self.window.show_all()
|
||||||
|
@ -290,6 +292,28 @@ class Groupchat_window(chat.Chat):
|
||||||
room_jid = self.get_active_jid()
|
room_jid = self.get_active_jid()
|
||||||
gajim.connections[self.account].request_gc_config(room_jid)
|
gajim.connections[self.account].request_gc_config(room_jid)
|
||||||
|
|
||||||
|
def on_add_bookmark_menuitem_activate(self, widget):
|
||||||
|
room_jid = self.get_active_jid()
|
||||||
|
bm = { 'name':"",
|
||||||
|
'jid':self.get_active_jid(),
|
||||||
|
'autojoin':"1",
|
||||||
|
'password':"",
|
||||||
|
'nick':self.nicks[self.get_active_jid()]
|
||||||
|
}
|
||||||
|
|
||||||
|
gajim.connections[self.account].bookmarks.append(bm)
|
||||||
|
gajim.connections[self.account].store_bookmarks()
|
||||||
|
|
||||||
|
#FIXME: add code to add to Bookmarks group (should be account-specific)
|
||||||
|
|
||||||
|
#FIXME: use join_gc_window [where user can put password] and change the
|
||||||
|
#name of the boookmark [default: fill with room's 'name']
|
||||||
|
dialogs.Information_dialog(
|
||||||
|
_('Bookmark has been added successfully'),
|
||||||
|
_('You can find the bookmark for room "%s" in your roster.') % \
|
||||||
|
room_jid.split('@')[0]).get_response()
|
||||||
|
|
||||||
|
|
||||||
def on_message_textview_key_press_event(self, widget, event):
|
def on_message_textview_key_press_event(self, widget, event):
|
||||||
"""When a key is pressed:
|
"""When a key is pressed:
|
||||||
if enter is pressed without the shit key, message (if not empty) is sent
|
if enter is pressed without the shit key, message (if not empty) is sent
|
||||||
|
|
|
@ -8674,7 +8674,7 @@ Custom</property>
|
||||||
<signal name="activate" handler="on_change_subject_menuitem_activate" last_modification_time="Sat, 14 May 2005 00:15:15 GMT"/>
|
<signal name="activate" handler="on_change_subject_menuitem_activate" last_modification_time="Sat, 14 May 2005 00:15:15 GMT"/>
|
||||||
|
|
||||||
<child internal-child="image">
|
<child internal-child="image">
|
||||||
<widget class="GtkImage" id="image525">
|
<widget class="GtkImage" id="image607">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="stock">gtk-edit</property>
|
<property name="stock">gtk-edit</property>
|
||||||
<property name="icon_size">1</property>
|
<property name="icon_size">1</property>
|
||||||
|
@ -8696,7 +8696,7 @@ Custom</property>
|
||||||
<signal name="activate" handler="on_configure_room_menuitem_activate" last_modification_time="Fri, 13 May 2005 22:47:03 GMT"/>
|
<signal name="activate" handler="on_configure_room_menuitem_activate" last_modification_time="Fri, 13 May 2005 22:47:03 GMT"/>
|
||||||
|
|
||||||
<child internal-child="image">
|
<child internal-child="image">
|
||||||
<widget class="GtkImage" id="image526">
|
<widget class="GtkImage" id="image608">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="stock">gtk-preferences</property>
|
<property name="stock">gtk-preferences</property>
|
||||||
<property name="icon_size">1</property>
|
<property name="icon_size">1</property>
|
||||||
|
@ -8709,6 +8709,27 @@ Custom</property>
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkImageMenuItem" id="add_bookmark_menuitem">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label" translatable="yes">Add _Bookmark</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<signal name="activate" handler="on_add_bookmark_menuitem_activate" last_modification_time="Tue, 07 Jun 2005 15:11:32 GMT"/>
|
||||||
|
|
||||||
|
<child internal-child="image">
|
||||||
|
<widget class="GtkImage" id="image609">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="stock">gtk-add</property>
|
||||||
|
<property name="icon_size">1</property>
|
||||||
|
<property name="xalign">0.5</property>
|
||||||
|
<property name="yalign">0.5</property>
|
||||||
|
<property name="xpad">0</property>
|
||||||
|
<property name="ypad">0</property>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkSeparatorMenuItem" id="separator6">
|
<widget class="GtkSeparatorMenuItem" id="separator6">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -8723,7 +8744,7 @@ Custom</property>
|
||||||
<signal name="activate" handler="on_close_window_activate" last_modification_time="Sat, 14 May 2005 01:19:18 GMT"/>
|
<signal name="activate" handler="on_close_window_activate" last_modification_time="Sat, 14 May 2005 01:19:18 GMT"/>
|
||||||
|
|
||||||
<child internal-child="image">
|
<child internal-child="image">
|
||||||
<widget class="GtkImage" id="image527">
|
<widget class="GtkImage" id="image610">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="stock">gtk-close</property>
|
<property name="stock">gtk-close</property>
|
||||||
<property name="icon_size">1</property>
|
<property name="icon_size">1</property>
|
||||||
|
|
Loading…
Reference in New Issue