Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Informationen des ausgewählten Users.
#31
Hallo,
Vielen Dank für deine Hilfe! Smile
Hier mal der aktuelle Code:
[c]
#ifndef PURPLE_PLUGINS
#define PURPLE_PLUGINS
#endif

#include "internal.h"
#include "tapi.h"
#include "gtkplugin.h"

#include <plugin.h>
#include <version.h>

#include <gtkdebug.h>
#include <gtkutils.h>
#include <request.h>

//Für Debug-Ausgaben. Kann entfernt werden später.
#include <debug.h>

#ifndef _WIN32
static GdkAtom _Cardinal = GDK_NONE;
static GdkAtom _PurpleUnseenCount = GDK_NONE;
#endif

//static guint scan_buddies_timeout_handle;
//static void *(*notify_userinfo_ori)(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info);
//static PurpleBuddy *current_scanned_buddy;

static void *(*notify_userinfo_ori)(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info);
//static void *(*birthday_reminder_notify_userinfo)(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info);

/**
* Diese Methode testet den <b>Anruf</b>.
* Es wird eine Debug-Ausgabe getätigt.
*/
static void test() {
/*
* Die folgende Zeile setzt den Anruf ab. Die anzurufende Telefon-Nummer muss nur noch
* dynamisch ermittelt werden, je nach ausgewähltem User.(TODOSmile
*
*/
// tapiRequestMakeCall("01769974796*", NULL, NULL, NULL);
//Diese Zeile blendet die Buddy-List aus.
purple_blist_set_visible(false);
purple_debug_info("plugin-call-a-buddy", "User wird angerufen.\n");
}

static void *call_a_buddy_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) {
purple_debug_warning("plugin-call-a-buddy", "In der Funktion ..._notify_userinfo");

/* Info-Fenster unterdrücken */
return NULL;
}

/**
* Hier werden die User-Informationen extrahiert und mit der dadurch gewonnenen
* Telefon-Nummer ein Anruf durchgeführt.
*/
static void call_user(PurpleBlistNode *node) {

PurpleAccount *acc = NULL;
PurpleConnection *gc = NULL;
PurplePlugin *prpl = NULL;
PurplePluginProtocolInfo *prpl_info = NULL;
PurpleNotifyUiOps *ops;

purple_debug_warning("plugin-call-a-buddy", "Variablen wurden initialisiert.\n");

const char *name = NULL;

PurpleBuddy *buddy = (PurpleBuddy*) node;
acc = purple_buddy_get_account(buddy);

purple_debug_warning("plugin-call-a-buddy", "Node Konvertiert und Acc geholt.\n");

gc = acc->gc;
purple_debug_warning("plugin-call-a-buddy", "GC wird geholt.\n");
if(!gc) {
return;
}

prpl = purple_connection_get_prpl(gc);
purple_debug_warning("plugin-call-a-buddy", "Hole Protocol.\n");

if(!prpl) {
return;
}

prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
purple_debug_warning("plugin-call-a-buddy", "Plugin_Protocol_INFO wird geholt. \n");

if(!prpl_info || !prpl_info->get_info) {
return;
}

prpl_info->get_info(gc, name);
purple_debug_warning("plugin-call-a-buddy", "Entsprechende Infos werden ermittelt \n");

ops = purple_notify_get_ui_ops();
purple_debug_warning("plugin-call-a-buddy", "Notify_Get_UI_Ops \n");

notify_userinfo_ori = ops->notify_userinfo;
// purple_debug_warning("plugin-call-a-buddy", (char*)*notify_userinfo_ori);

//Erstellt Funktionszeiger.
ops->notify_userinfo = call_a_buddy_notify_userinfo;
// purple_debug_warning("plugin-call-a-buddy", "Birthday_Reminder_Notify_Userinfo \n");

if(!PURPLE_BLIST_NODE_IS_BUDDY(node)) {
purple_debug_fatal("plugin-call-a-buddy", "Es wird versucht einen Nicht-User anzurufen.\n");
return;
}
test();
}

static void extend_buddy_context_menu(PurpleBlistNode *node, GList **menu) {
PurpleMenuAction *action = NULL;
GList *submenu = NULL;

action = purple_menu_action_new(_("User anrufen."), PURPLE_CALLBACK(call_user), NULL, NULL);
*menu = g_list_append(*menu, action);
}
static gboolean plugin_load(PurplePlugin *plugin) {
purple_signal_connect(purple_blist_get_handle(), "blist-node-extended-menu", plugin, PURPLE_CALLBACK(extend_buddy_context_menu), NULL);
purple_debug_warning("plugin-call-a-buddy", "Plugin_Load\n");
return TRUE;
}

static PurplePluginInfo info = {
PURPLE_PLUGIN_MAGIC, /**<- Magic */
PURPLE_MAJOR_VERSION, /**<- Major Version */
PURPLE_MINOR_VERSION, /**<- Minor Version */
PURPLE_PLUGIN_STANDARD, /**<- Type */
PIDGIN_PLUGIN_TYPE, /**<- UI_Requirements */
0, /**<- Flags */
NULL, /**<- Dependencies */
PURPLE_PRIORITY_DEFAULT, /**<- Priority */

"plugin-call-a-buddy", /**<- ID */
"Call a Buddy", /**<- Name */
"0.1", /**<- Version */
"Call a Buddy via Context-Menu", /**<- Summary */

"Call a Buddy via Context-Menu", /**<- Description */
"James Vornhagen <james.vornhagen@staufenbiel.de", /**<- Author */
"", /**<- Homepage */

plugin_load, /**<- load */
NULL, /**<- unload */
NULL, /**<- destroy */

NULL, /**<- ui_info */
NULL, /**<- extra_info */
NULL, /**<- prefs_info */
NULL, /**<- actions */

NULL, /**<- Reserved for next Versions */
NULL, /**<- Reserved for next Versions */
NULL, /**<- Reserved for next Versions */
NULL /**<- Reserved for next Versions */
};

static void init_plugin(PurplePlugin *plugin) {
purple_debug_warning("plugin-call-a-buddy", "Plugin initialisiert.");
}

PURPLE_INIT_PLUGIN(call_a_buddy, init_plugin, info);
[/c]

Wenn du möchtest, kann ich ihn dir auch als Anhang senden Smile
Zitieren
#32
Also, ich habe mal weiter gemacht. Ich bekomme nun folgende Ausgabe:


Zitat:(15:06:40) plugin-call-a-buddy: Notify_Get_UI_Ops
(15:06:44) plugin-call-a-buddy: In der Funktion ..._notify_userinfo
(15:06:44) plugin-call-a-buddy: test.user@test.net
t(15:06:44) plugin-call-a-buddy: In der Funktion ..._notify_userinfo
(15:06:44) plugin-call-a-buddy: test.user@test.net
(15:06:57) plugin-call-a-buddy: In der Funktion ..._notify_userinfo
(15:06:57) plugin-call-a-buddy: test.user@test.net
(15:06:57) plugin-call-a-buddy: In der Funktion ..._notify_userinfo
(15:06:57) plugin-call-a-buddy: test.user@test.net
Das heißt, die Funktion notify_userinfo wird nur aufgerufen, wenn ich in Pidgin auf "Info abrufen" klicke. Das ist aber ja nicht Sinn der Sache... Big Grin Da ich die Infos ja brauche, wenn meine Plugin-Auswahl gewählt wurde.

LG
Zitieren
#33
Ich meinte das hier:
[c]
purple_signal_connect(purple_notify_get_handle(), "displaying-userinfo", plugin, PURPLE_CALLBACK(displaying_userinfo_cb), NULL);
[/c]
Damit erstelle ich ein Callback für den Aufruf der User-Infos. Das unterdrückt dann aber auch gleichzeitig, das aufpoppen des Festers. Das haben zumindest meine Tests ergeben Big Grin
Zitieren
#34
Ich sehe nicht, wo es abstürzt, aber auf jeden Fall musst du [c]prpl_info->get_info(gc, name);[/c] aufrufen, nachdem du den Zeiger auf deine Funktion umgebogen hast (bzw. nachdem du dich auf das Signal verbunden hast). Vermutlich wird es dann schon bei der ersten Ausführung abstürzen, weil, dann deine Funktion schon beim ersten Mal verwendet wird. Wink

Kann man denn mit dem Visual Studio debuggen?
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#35
Hey,
also ich habe folgende Funktion:
[c]
static void call_user(PurpleBlistNode *node) {
PurpleAccount *acc = NULL;
PurpleConnection *gc = NULL;
PurplePlugin *prpl = NULL;
PurplePluginProtocolInfo *prpl_info = NULL;
PurpleNotifyUiOps *ops;

purple_debug_warning("plugin-call-a-buddy", "Variablen wurden initialisiert.\n");

const char *name = NULL;

PurpleBuddy *buddy = (PurpleBuddy*) node;
acc = purple_buddy_get_account(buddy);

purple_debug_warning("plugin-call-a-buddy", "Node Konvertiert und Acc geholt.\n");

gc = acc->gc;
purple_debug_warning("plugin-call-a-buddy", "GC wird geholt.\n");
if(!gc) {
return;
}

prpl = purple_connection_get_prpl(gc);
purple_debug_warning("plugin-call-a-buddy", "Hole Protocol.\n");

if(!prpl) {
return;
}

prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
purple_debug_warning("plugin-call-a-buddy", "Plugin_Protocol_INFO wird geholt. \n");

if(!prpl_info || !prpl_info->get_info) {
return;
}

ops = purple_notify_get_ui_ops();
purple_debug_warning("plugin-call-a-buddy", "Notify_Get_UI_Ops \n");

notify_userinfo_ori = ops->notify_userinfo;
// purple_debug_warning("plugin-call-a-buddy", (char*)*notify_userinfo_ori);

/*
* ops = purple_notify_get_ui_ops();
* notify_userinfo_ori = ops->notify_userinfo;
* ops->notify_userinfo = birthday_reminder_notify_userinfo;
*/

//Erstellt Funktionszeiger.
ops->notify_userinfo = call_a_buddy_notify_userinfo;
// purple_debug_warning("plugin-call-a-buddy", "Birthday_Reminder_Notify_Userinfo \n");

prpl_info->get_info(gc, name);
purple_debug_warning("plugin-call-a-buddy", "Entsprechende Infos werden ermittelt \n");

if(!PURPLE_BLIST_NODE_IS_BUDDY(node)) {
purple_debug_fatal("plugin-call-a-buddy", "Es wird versucht einen Nicht-User anzurufen.\n");
return;
}
test();
}
[/c]
In dieser wird der Zeiger umgebogen und auch die get_info aufgerufen.

Das hier ist die Funktion, die aufgerufen wird anstelle von displaying_userinfo..
[c]
static void *call_a_buddy_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) {
purple_debug_warning("plugin-call-a-buddy", "In der Funktion ..._notify_userinfo");
purple_debug_warning("plugin-call-a-buddy", who);
/* Info-Fenster unterdrücken */
return NULL;
}
[/c]

Wenn ich nun in Pidgin auf meinen Menü-Punkt klicke, bekomme ich folgende Ausgabe:
Zitat:(12:06:30) plugin-call-a-buddy: Node Konvertiert und Acc geholt.
(12:06:30) plugin-call-a-buddy: GC wird geholt.
(12:06:30) plugin-call-a-buddy: Hole Protocol.
(12:06:30) plugin-call-a-buddy: Plugin_Protocol_INFO wird geholt.
(12:06:30) plugin-call-a-buddy: Entsprechende Infos werden ermittelt
(12:06:30) plugin-call-a-buddy: Notify_Get_UI_Ops
Wenn ich nun aber auf Info abrufen klicke, bekomme ich die Ausgabe, die in der Funktion generiert wird.

Das Plugin stürzt auch nicht mehr ab auch bei mehrfachem Aufruf. Big Grin

Zitat:Kann man denn mit dem Visual Studio debuggen?
Soweit ich weiß leider nicht.
Zitieren
#36
Na dann kompiliere wenigstens mal neu. Die Reihenfolge deiner Debug-Ausgaben stimmt doch nicht mit der (neuen) Reihenfolge in deinem Quellcode überein...
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#37
Frisch kompiliert und das Plugin ersetzt:
Zitat:(13:12:54) plugin-call-a-buddy: Variablen wurden initialisiert.
(13:12:54) plugin-call-a-buddy: Node Konvertiert und Acc geholt.
(13:12:54) plugin-call-a-buddy: GC wird geholt.
(13:12:54) plugin-call-a-buddy: Hole Protocol.
(13:12:54) plugin-call-a-buddy: Plugin_Protocol_INFO wird geholt.
(13:12:54) plugin-call-a-buddy: Notify_Get_UI_Ops
(13:12:54) plugin-call-a-buddy: Entsprechende Infos werden ermittelt
Zitieren
#38
Ich habe mal ungeachtet von irgendwelchem Fehlverhalten weiter gemacht.
Da ist mir folgendes aufgefallen:
Du verwendest in deinem Code folgendes:
[c]
static void displaying_userinfo_cb(PurpleAccount *account, const char *who, PurpleNotifyUserInfo *user_info, PurpleBuddy *_buddy){
PurpleNotifyUserInfoEntry *e;
PurpleBlistNode *node;
PurpleBuddy *buddy;

GList *l;
GDate *date;

if(!account) return;
if(!who) return;

buddy = purple_find_buddy(account, who);
if(!buddy) return;
node = (PurpleBlistNode *)buddy;

purple_blist_node_set_bool(node, "birthday_scanned", TRUE);

//Diese Zeilen.
l=purple_notify_user_info_get_entries(user_info);
while(l) {
//Insbesondere diese!
e = l->data;

if(purple_utf8_strcasecmp(purple_notify_user_info_entry_get_label(e), dgettext("pidgin", "Birthday"))==0) {
date = g_date_new();
g_date_set_parse(date, purple_notify_user_info_entry_get_value(e));

if(g_date_valid(date)) {
purple_blist_node_set_int(node, "birthday_julian", g_date_get_julian(date));
automatic_export();
check_birthdays(NULL, buddy);
}

g_date_free(date);

return;
}

l = l->next;
}
}
[/c]

Wenn ich dies aber bei mir einbinden erhalte ich folgenden Fehler:
Zitat:Error 1 error C2440: 'initializing' : cannot convert from 'gpointer' to 'PurpleNotifyUserInfoEntry *' C:\local\dev\Lokale_Entwicklungen\james\trunc\Pidgin-Plugin\Test-Plugin\test.cpp 56 1 Test-Plugin
Zitieren
#39
Cool. Das liegt wohl daran, dass wir verschiedene Compiler benutzen. Vielleicht versteht er es, wenn du [c]e = (PurpleNotifyUserInfoEntry *)l->data;[/c] schreibst?
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#40
Hey,
entschuldige bitte, dass ich so lange gebraucht habe, um mich zurückzumelden. Habe keine E-Mail-Notification bekommen, dass du geantwortet hast.

Ich habe nun folgenden Code eingebaut:
[c]
static void *call_a_buddy_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) {
purple_debug_warning("plugin-call-a-buddy", "In der Funktion ..._notify_userinfo");
purple_debug_warning("plugin-call-a-buddy", who);

GList *list = purple_notify_user_info_get_entries(user_info);

GList *l=purple_notify_user_info_get_entries(user_info);
PurpleNotifyUserInfoEntry *f;
while(l) {
f = (PurpleNotifyUserInfoEntry *)l->data;;

//purple_debug_warning("plugin-call-a-buddy", purple_notify_user_info_entry_get_label(f));

f = (PurpleNotifyUserInfoEntry *)l->data;
}

//- purple_debug_warning("plugin-call-a-buddy", (char*)list);

/* Info-Fenster unterdrücken */
return NULL;
}
[/c]

Wenn ich nun zuerst auf meinen Eintrag klicke und dadurch mein Code ausgeführt wird(der Funktionszeiger wird umgelenkt), und dann auf Info abrufen klicke, stürzt Pidgin ab....

Siehst du vielleicht den Fehler?
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste