Gajim does bookmarks and private storage [needs better UI-side] CONGRATS and thanks to delmonico

This commit is contained in:
Nikos Kouremenos 2005-06-07 18:21:36 +00:00
parent 0c79775f5a
commit fba0185e89
4 changed files with 136 additions and 6 deletions

View File

@ -118,13 +118,14 @@ class Connection:
'AGENT_INFO_INFO': [], 'QUIT': [], 'ACC_OK': [], 'MYVCARD': [],
'OS_INFO': [], 'VCARD': [], 'GC_MSG': [], 'GC_SUBJECT': [],
'GC_CONFIG': [], 'BAD_PASSPHRASE': [], 'ROSTER_INFO': [],
'ERROR_ANSWER': []}
'ERROR_ANSWER': [], 'JOIN_GC': [],}
self.name = name
self.connected = 0 # offline
self.connection = None # xmpppy instance
self.gpg = None
self.status = ''
self.myVCardID = []
self.bookmarks = []
self.on_purpose = False
self.password = gajim.config.get_per('accounts', name, 'password')
if USE_GPG:
@ -542,6 +543,43 @@ class Connection:
del roster[name + '@' + hostname]
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):
errmsg = iq_obj.getError()
errcode = iq_obj.getErrorCode()
@ -613,6 +651,8 @@ class Connection:
common.xmpp.NS_MUC_OWNER)
con.RegisterHandler('iq', self._getRosterCB, 'result',
common.xmpp.NS_ROSTER)
con.RegisterHandler('iq', self._PrivateCB, 'result',
common.xmpp.NS_PRIVATE)
con.RegisterHandler('iq', self._ErrorCB, 'error')
gajim.log.debug('Connected to server')
@ -635,7 +675,7 @@ class Connection:
self.connected = 0
self.dispatch('STATUS', 'offline')
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
# END connect
@ -699,6 +739,10 @@ class Connection:
#ask our VCard
iq = self.request_vcard(None)
self.myVCardID.append(iq.getID())
#Get bookmarks from private namespace
self.get_bookmarks()
elif show == 'offline' and self.connected:
self.connected = 0
if self.connection:
@ -897,7 +941,6 @@ class Connection:
iq.setTag(common.xmpp.NS_VCARD + ' vCard')
self.connection.send(iq)
return iq
#('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...})
def send_vcard(self, vcard):
@ -921,6 +964,39 @@ class Connection:
iq2.addChild(i).setData(vcard[i])
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):
if not self.connection:
return

View File

@ -570,6 +570,14 @@ class Interface:
user.groups = array[4]
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):
'''Check if we are idle'''
if not self.sleeper.poll():
@ -732,6 +740,7 @@ class Interface:
conn.register_handler('GC_CONFIG', self.handle_event_gc_config)
conn.register_handler('BAD_PASSPHRASE', self.handle_event_bad_passphrase)
conn.register_handler('ROSTER_INFO', self.handle_event_roster_info)
conn.register_handler('JOIN_GC', self.handle_event_join_gc)
def process_connections(self):
try:

View File

@ -62,6 +62,8 @@ class Groupchat_window(chat.Chat):
self.on_change_subject_menuitem_activate)
self.xml.signal_connect('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.on_close_window_activate)
self.window.show_all()
@ -290,6 +292,28 @@ class Groupchat_window(chat.Chat):
room_jid = self.get_active_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):
"""When a key is pressed:
if enter is pressed without the shit key, message (if not empty) is sent

View File

@ -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"/>
<child internal-child="image">
<widget class="GtkImage" id="image525">
<widget class="GtkImage" id="image607">
<property name="visible">True</property>
<property name="stock">gtk-edit</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"/>
<child internal-child="image">
<widget class="GtkImage" id="image526">
<widget class="GtkImage" id="image608">
<property name="visible">True</property>
<property name="stock">gtk-preferences</property>
<property name="icon_size">1</property>
@ -8709,6 +8709,27 @@ Custom</property>
</widget>
</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>
<widget class="GtkSeparatorMenuItem" id="separator6">
<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"/>
<child internal-child="image">
<widget class="GtkImage" id="image527">
<widget class="GtkImage" id="image610">
<property name="visible">True</property>
<property name="stock">gtk-close</property>
<property name="icon_size">1</property>