Folgende Warnungen sind aufgetreten:
Warning [2] Undefined property: MyLanguage::$archive_pages - Line: 2 - File: printthread.php(287) : eval()'d code PHP 8.2.17 (Linux)
File Line Function
/inc/class_error.php 153 errorHandler->error
/printthread.php(287) : eval()'d code 2 errorHandler->error_callback
/printthread.php 287 eval
/printthread.php 117 printthread_multipage



Pidgin Forum
Informationen des ausgewählten Users. - Druckversion

+- Pidgin Forum (https://forum.pidgin-im.de)
+-- Forum: Hilfe-Bereich (https://forum.pidgin-im.de/forumdisplay.php?fid=4)
+--- Forum: Development (https://forum.pidgin-im.de/forumdisplay.php?fid=16)
+---- Forum: Plugins (https://forum.pidgin-im.de/forumdisplay.php?fid=18)
+---- Thema: Informationen des ausgewählten Users. (/showthread.php?tid=1674)

Seiten: 1 2 3 4 5 6


RE: Informationen des ausgewählten Users. - jamesv1994 - 01.10.2013

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


RE: Informationen des ausgewählten Users. - jamesv1994 - 01.10.2013

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


RE: Informationen des ausgewählten Users. - jamesv1994 - 01.10.2013

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


RE: Informationen des ausgewählten Users. - Freakazoid - 02.10.2013

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?


RE: Informationen des ausgewählten Users. - jamesv1994 - 02.10.2013

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.


RE: Informationen des ausgewählten Users. - Freakazoid - 02.10.2013

Na dann kompiliere wenigstens mal neu. Die Reihenfolge deiner Debug-Ausgaben stimmt doch nicht mit der (neuen) Reihenfolge in deinem Quellcode überein...


RE: Informationen des ausgewählten Users. - jamesv1994 - 02.10.2013

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



RE: Informationen des ausgewählten Users. - jamesv1994 - 02.10.2013

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



RE: Informationen des ausgewählten Users. - Freakazoid - 02.10.2013

Cool. Das liegt wohl daran, dass wir verschiedene Compiler benutzen. Vielleicht versteht er es, wenn du [c]e = (PurpleNotifyUserInfoEntry *)l->data;[/c] schreibst?


RE: Informationen des ausgewählten Users. - jamesv1994 - 08.10.2013

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?