X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=gtk%2Fchat.c;h=b1da7082227cdb1ba968927c63c4ba81f1602940;hb=58e13184e6afbcbb844a26edda067422c0a3ac32;hp=6a65cd9fc41c250025307cface55afb05d3127df;hpb=ad7114171eceab0116a7568367633c7808c9aa00;p=linphone diff --git a/gtk/chat.c b/gtk/chat.c index 6a65cd9f..b1da7082 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -61,20 +61,25 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { GtkWidget *nb=linphone_gtk_get_widget(main_window,"viewswitch"); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *w=g_object_get_data(G_OBJECT(friendlist),"chatview"); - int idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"idx")); + gchar *from; g_return_if_fail(w!=NULL); - gtk_notebook_remove_page(GTK_NOTEBOOK(nb),idx); - linphone_gtk_create_chat_picture(FALSE); + gtk_notebook_remove_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb),w)); + linphone_gtk_friend_list_update_chat_picture(); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); - g_object_set_data(G_OBJECT(w),"from_message",NULL); + from=g_object_get_data(G_OBJECT(w),"from_message"); + if (from){ + g_object_set_data(G_OBJECT(w),"from_message",NULL); + g_free(from); + } g_object_set_data(G_OBJECT(w),"cr",NULL); g_object_set_data(G_OBJECT(friendlist),"from",NULL); gtk_widget_destroy(w); } const char* get_display_name(const LinphoneAddress *from){ - const char *display=linphone_address_get_display_name(from); + const char *display; + display=linphone_address_get_display_name(from); if (display==NULL || display[0]=='\0') { display=linphone_address_get_username(from); } @@ -92,7 +97,7 @@ GtkWidget *create_tab_chat_header(LinphoneChatRoom *cr,const LinphoneAddress *ur gtk_button_set_relief(GTK_BUTTON(b),GTK_RELIEF_NONE); gtk_widget_set_size_request(b,25,20); g_signal_connect_swapped(G_OBJECT(b),"clicked",G_CALLBACK(linphone_gtk_quit_chatroom),cr); - l=gtk_label_new (get_display_name(uri)); + l=gtk_label_new(get_display_name(uri)); gtk_box_pack_start (GTK_BOX(w),i,FALSE,FALSE,0); gtk_box_pack_start (GTK_BOX(w),l,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(w),b,TRUE,TRUE,0); @@ -128,10 +133,15 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, GtkTextIter iter,begin; int off; char *from_str=linphone_address_as_string_uri_only(from); - char *from_message=(char *)g_object_get_data(G_OBJECT(w),"from_message"); + gchar *from_message=(gchar *)g_object_get_data(G_OBJECT(w),"from_message"); GList *list=g_object_get_data(G_OBJECT(w),"list"); time_t t; - + char buf[80]; + time_t tnow; + struct tm *tm; + int tnow_day; + int tnow_year; + gtk_text_buffer_get_start_iter(buffer,&begin); gtk_text_buffer_get_end_iter(buffer,&iter); off=gtk_text_iter_get_offset(&iter); @@ -143,12 +153,13 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_insert_with_tags_by_name(buffer,&iter," : ",-1,"bold",me ? "bg":NULL,NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); - g_object_set_data(G_OBJECT(w),"from_message",from_str); + g_free(from_message); + g_object_set_data(G_OBJECT(w),"from_message",g_strdup(from_str)); } - gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,linphone_chat_message_get_text(msg),-1,"margin",me ? "bg":NULL,NULL); - gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert(buffer,&iter,"\n",-1);; + gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_insert(buffer,&iter,"\n",-1); gtk_text_buffer_get_end_iter(buffer,&iter); t=linphone_chat_message_get_time(msg); switch (linphone_chat_message_get_state (msg)){ @@ -162,15 +173,22 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, } case LinphoneChatMessageStateDelivered: { - struct tm *tm=localtime(&t); - char buf[80]; + tnow=time(NULL); + tm=localtime(&tnow); + tnow_day=tm->tm_yday; + tnow_year=tm->tm_year; + tm=localtime(&t); + if(tnow_day != tm->tm_yday || (tnow_day == tm->tm_yday && tnow_year != tm->tm_year)) { + strftime(buf,80,"%a %x, %H:%M",tm); + } else { strftime(buf,80,"%H:%M",tm); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,buf,-1, - "right","small","italic","font_grey",me ? "bg":NULL,NULL); - break; + } + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,buf,-1, + "right","small","italic","font_grey",me ? "bg":NULL,NULL); + break; } case LinphoneChatMessageStateNotDelivered: - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Error",-1, + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Message not sent",-1, "right","small","italic","font_grey",me ? "bg":NULL,NULL); break; default : gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Sending ..",-1, @@ -180,6 +198,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_insert(buffer,&iter,"\n",-1); GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); gtk_text_view_scroll_mark_onscreen(text,mark); + ms_free(from_str); } const LinphoneAddress* linphone_gtk_get_used_identity(){ @@ -202,6 +221,7 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag GtkTextIter iter; GtkTextIter end; GtkTextIter start; + gchar *result; gtk_text_buffer_get_iter_at_line(b,&iter, GPOINTER_TO_INT(g_list_nth_data(list,0))); @@ -217,7 +237,6 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag GPOINTER_TO_INT(g_list_nth_data(list,0)),0); gtk_text_buffer_delete(b,&start,&end); gtk_text_buffer_get_iter_at_line(b,&iter,GPOINTER_TO_INT(g_list_nth_data(list,0))); - gchar *result; switch (state) { case LinphoneChatMessageStateInProgress: result="Sending "; @@ -248,9 +267,9 @@ static void on_chat_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageS } void linphone_gtk_send_text(){ - GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); - GtkWidget *w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + GtkWidget *w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); GtkWidget *entry=linphone_gtk_get_widget(w,"text_entry"); const gchar *entered; LinphoneChatRoom *cr=g_object_get_data(G_OBJECT(w),"cr"); @@ -259,17 +278,27 @@ void linphone_gtk_send_text(){ LinphoneChatMessage *msg; msg=linphone_chat_room_create_message(cr,entered); linphone_chat_room_send_message2(cr,msg,on_chat_state_changed,NULL); - linphone_gtk_push_text(w,linphone_gtk_get_used_identity(), + linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), TRUE,cr,msg,FALSE); gtk_entry_set_text(GTK_ENTRY(entry),""); } } +static void linphone_gtk_chat_message_destroy(LinphoneChatMessage *msg){ + linphone_chat_message_destroy(msg); +} + +void linphone_gtk_free_list(MSList *messages){ + ms_list_for_each(messages,(void (*)(void*))linphone_gtk_chat_message_destroy); + ms_list_free(messages); +} + void display_history_message(GtkWidget *chat_view,MSList *messages,const LinphoneAddress *with){ if(messages != NULL){ MSList *it; char *from_str; char *with_str; + gchar *tmp; for(it=messages;it!=NULL;it=it->next){ LinphoneChatMessage *msg=(LinphoneChatMessage *)it->data; from_str=linphone_address_as_string_uri_only(linphone_chat_message_get_from(msg)); @@ -279,12 +308,40 @@ void display_history_message(GtkWidget *chat_view,MSList *messages,const Linphon strcmp(from_str,with_str)==0? FALSE : TRUE, linphone_chat_message_get_chat_room(msg),msg,TRUE); } - g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); + tmp=g_object_get_data(G_OBJECT(chat_view),"from_message"); + if (tmp){ + g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); + g_free(tmp); + } ms_free(from_str); ms_free(with_str); + linphone_gtk_free_list(messages); } } +void linphone_gtk_chat_add_contact(const LinphoneAddress *addr){ + //LinphoneAddress *addr=(LinphoneAddress *)data; + LinphoneFriend *lf=NULL; + char *uri=linphone_address_as_string(addr); + lf=linphone_friend_new_with_addr(uri); + ms_free(uri); + char *fixed_uri=NULL; + gboolean show_presence=FALSE; + + linphone_friend_set_inc_subscribe_policy(lf,LinphoneSPDeny); + linphone_friend_send_subscribe(lf,show_presence); + + linphone_core_interpret_friend_uri(linphone_gtk_get_core(),uri,&fixed_uri); + if (fixed_uri==NULL){ + linphone_gtk_display_something(GTK_MESSAGE_WARNING,_("Invalid sip contact !")); + return ; + } + linphone_friend_set_addr(lf,addr); + linphone_core_add_friend(linphone_gtk_get_core(),lf); + ms_free(fixed_uri); + linphone_gtk_show_friends(); +} + GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *with){ GtkWidget *chat_view=linphone_gtk_create_widget("main","chatroom_frame"); GtkWidget *main_window=linphone_gtk_get_main_window (); @@ -302,21 +359,20 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres color.red = 32512; color.green = 32512; color.blue = 32512; - colorb.red = 56832; colorb.green = 60928; colorb.blue = 61952; - + with_str=linphone_address_as_string_uri_only(with); linphone_chat_room_mark_as_read(cr); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD_CHAR); gtk_text_view_set_editable(GTK_TEXT_VIEW(text),FALSE); + gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text),FALSE); gtk_notebook_append_page(notebook,chat_view,create_tab_chat_header(cr,with)); idx = gtk_notebook_page_num(notebook, chat_view); gtk_notebook_set_current_page(notebook, idx); gtk_widget_show(chat_view); g_object_set_data(G_OBJECT(chat_view),"cr",cr); - g_object_set_data(G_OBJECT(chat_view),"idx",GINT_TO_POINTER(idx)); g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); g_object_set_data(G_OBJECT(chat_view),"list",list); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), @@ -341,6 +397,7 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,NULL); entry = linphone_gtk_get_widget(chat_view,"text_entry"); g_signal_connect_swapped(G_OBJECT(entry),"activate",(GCallback)linphone_gtk_send_text,NULL); + g_signal_connect(G_OBJECT(notebook),"switch_page",(GCallback)linphone_gtk_notebook_tab_select,NULL); ms_free(with_str); return chat_view; } @@ -354,29 +411,32 @@ LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with){ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri,GtkWidget *chat_view){ GtkWidget *main_window=linphone_gtk_get_main_window (); LinphoneChatRoom *cr2=(LinphoneChatRoom *)g_object_get_data(G_OBJECT(chat_view),"cr"); - char *from_str=linphone_address_as_string(linphone_chat_room_get_peer_address (cr2)); + const LinphoneAddress *from=linphone_chat_room_get_peer_address(cr2); + char *from_str=linphone_address_as_string_uri_only(from); char *uri_str=linphone_address_as_string(uri); + char *uri_only=linphone_address_as_string_uri_only(uri); MSList *messages=NULL; - - linphone_chat_room_mark_as_read(cr); - if(g_strcmp0(from_str,uri_str)!=0){ + + if(g_strcmp0(from_str,uri_only)!=0){ GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); GtkTextIter start; GtkTextIter end; GtkTextBuffer *text_buffer; - + + linphone_chat_room_mark_as_read(cr); text_buffer=gtk_text_view_get_buffer(text_view); gtk_text_buffer_get_bounds(text_buffer, &start, &end); gtk_text_buffer_delete (text_buffer, &start, &end); udpate_tab_chat_header(chat_view,uri,cr); g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(main_window,"contact_list")),"chatview",(gpointer)chat_view); - messages = linphone_chat_room_get_history(cr,NB_MSG_HIST); - g_object_set_data(G_OBJECT(chat_view),"from_message",uri_str); + messages=linphone_chat_room_get_history(cr,NB_MSG_HIST); + g_object_set_data(G_OBJECT(chat_view),"from_message",g_strdup(uri_str)); display_history_message(chat_view,messages,uri); } ms_free(from_str); ms_free(uri_str); + ms_free(uri_only); } void linphone_gtk_chat_destroyed(GtkWidget *w){ @@ -390,38 +450,58 @@ void linphone_gtk_chat_close(GtkWidget *button){ } -void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, - LinphoneChatMessage *msg){ +void linphone_gtk_text_received ( LinphoneCore *lc, LinphoneChatRoom *room, + LinphoneChatMessage *msg ) { GtkWidget *main_window=linphone_gtk_get_main_window(); - GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); - GtkWidget *w; - - w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); - if(w!=NULL){ - linphone_gtk_load_chatroom(room,linphone_chat_message_get_from(msg),w); - } else { - w=linphone_gtk_init_chatroom(room,linphone_chat_message_get_from(msg)); - g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); - char *from=linphone_address_as_string(linphone_chat_message_get_from(msg)); - g_object_set_data(G_OBJECT(friendlist),"from",from); - } - get_display_name(linphone_chat_message_get_from(msg)); - #ifdef HAVE_GTK_OSXs + GtkWidget *friendlist=linphone_gtk_get_widget ( main_window,"contact_list" ); + GtkWidget *w; + gboolean send=TRUE; + GtkNotebook *notebook= ( GtkNotebook * ) linphone_gtk_get_widget ( main_window,"viewswitch" ); + char *from=linphone_address_as_string ( linphone_chat_message_get_from ( msg ) ); + + w= ( GtkWidget* ) g_object_get_data ( G_OBJECT ( friendlist ),"chatview" ); + if ( w!=NULL ) { + char *from_chatview= ( char * ) g_object_get_data ( G_OBJECT ( friendlist ),"from" ); + if ( g_strcmp0 ( from,from_chatview ) ==0 ) { + send=TRUE; + } else { + if ( !linphone_gtk_friend_list_is_contact ( linphone_chat_message_get_from ( msg ) ) ) { + linphone_gtk_chat_add_contact ( linphone_chat_message_get_from ( msg ) ); + } + send=FALSE; + } + } else { + send=FALSE; + if ( !linphone_gtk_friend_list_is_contact ( linphone_chat_message_get_from ( msg ) ) ) { + linphone_gtk_chat_add_contact ( linphone_chat_message_get_from ( msg ) ); + } + w=linphone_gtk_init_chatroom ( room,linphone_chat_message_get_from ( msg ) ); + g_object_set_data ( G_OBJECT ( friendlist ),"chatview", ( gpointer ) w ); + g_object_set_data ( G_OBJECT ( friendlist ),"from",from ); + } + +#ifdef HAVE_GTK_OSXs /* Notified when a new message is sent */ - linphone_gtk_status_icon_set_blinking(TRUE); - #else - if(!gtk_window_is_active(GTK_WINDOW(main_window))){ - if(!GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_notified"))){ - linphone_gtk_notify(NULL,linphone_chat_message_get_text(msg)); - g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(TRUE)); + linphone_gtk_status_icon_set_blinking ( TRUE ); +#else + if ( !gtk_window_is_active ( GTK_WINDOW ( main_window ) ) ) { + if ( !GPOINTER_TO_INT ( g_object_get_data ( G_OBJECT ( w ),"is_notified" ) ) ) { + linphone_gtk_notify ( NULL,linphone_chat_message_get_text ( msg ) ); + g_object_set_data ( G_OBJECT ( w ),"is_notified",GINT_TO_POINTER ( TRUE ) ); + } else { + g_object_set_data ( G_OBJECT ( w ),"is_notified",GINT_TO_POINTER ( FALSE ) ); + } + } +#endif + if ( send ) { + if ( gtk_notebook_get_current_page ( notebook ) !=gtk_notebook_page_num ( notebook,w ) ) { + linphone_gtk_show_friends(); } else { - g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(FALSE)); + linphone_chat_room_mark_as_read ( room ); } + linphone_gtk_push_text ( w,linphone_chat_message_get_from ( msg ), + FALSE,room,msg,FALSE ); + } else { + linphone_gtk_show_friends(); } - #endif - linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), - FALSE,room,msg,FALSE); - linphone_gtk_update_chat_picture(); - //gtk_window_present(GTK_WINDOW(w)); - /*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/ }