git-svn-id: svn+ssh://svn.dolda2000.com/srv/svn/repos/src/doldaconnect@437
959494ce-11ee-0310-bf91-
de5d638817bd
CBCHAININIT(new, fnetnode_chat);
CBCHAININIT(new, fnetnode_unlink);
CBCHAININIT(new, fnetnode_destroy);
CBCHAININIT(new, fnetnode_chat);
CBCHAININIT(new, fnetnode_unlink);
CBCHAININIT(new, fnetnode_destroy);
+ CBCHAININIT(new, fnetpeer_new);
+ CBCHAININIT(new, fnetpeer_del);
+ CBCHAININIT(new, fnetpeer_chdi);
new->next = NULL;
new->prev = NULL;
numfnetnodes++;
new->next = NULL;
new->prev = NULL;
numfnetnodes++;
CBCHAINFREE(fn, fnetnode_chat);
CBCHAINFREE(fn, fnetnode_unlink);
CBCHAINFREE(fn, fnetnode_destroy);
CBCHAINFREE(fn, fnetnode_chat);
CBCHAINFREE(fn, fnetnode_unlink);
CBCHAINFREE(fn, fnetnode_destroy);
+ CBCHAINFREE(fn, fnetpeer_new);
+ CBCHAINFREE(fn, fnetpeer_del);
+ CBCHAINFREE(fn, fnetpeer_chdi);
if(fn->fnet->destroy != NULL)
fn->fnet->destroy(fn);
while(fn->peers != NULL)
if(fn->fnet->destroy != NULL)
fn->fnet->destroy(fn);
while(fn->peers != NULL)
-static struct fnetpeerdi *difindoradd(struct fnetpeer *peer, struct fnetpeerdatum *datum)
+static struct fnetpeerdi *difindoradd(struct fnetpeer *peer, struct fnetpeerdatum *datum, int *isnew)
memset(&peer->peerdi[peer->dinum], 0, sizeof(struct fnetpeerdi));
peer->peerdi[peer->dinum].datum = datum;
datum->refcount++;
memset(&peer->peerdi[peer->dinum], 0, sizeof(struct fnetpeerdi));
peer->peerdi[peer->dinum].datum = datum;
datum->refcount++;
+ if(isnew != NULL)
+ *isnew = 1;
return(&peer->peerdi[peer->dinum++]);
} else {
return(&peer->peerdi[peer->dinum++]);
} else {
+ if(isnew != NULL)
+ *isnew = 0;
return(&peer->peerdi[i]);
}
}
return(&peer->peerdi[i]);
}
}
{
struct fnetpeerdatum *datum;
struct fnetpeerdi *di;
{
struct fnetpeerdatum *datum;
struct fnetpeerdi *di;
if((datum = finddatum(peer->fn, id)) == NULL)
datum = adddatum(peer->fn, id, FNPD_STR);
if((datum = finddatum(peer->fn, id)) == NULL)
datum = adddatum(peer->fn, id, FNPD_STR);
- di = difindoradd(peer, datum);
- if(di->data.str != NULL)
+ di = difindoradd(peer, datum, &changed);
+ if(di->data.str != NULL) {
+ changed = (changed || !wcscmp(value, di->data.str));
+ } else {
+ changed = 1;
+ }
di->data.str = swcsdup(value);
di->data.str = swcsdup(value);
+ if(changed)
+ CBCHAINDOCB(peer->fn, fnetpeer_chdi, peer->fn, peer, di);
}
void fnetpeersetnum(struct fnetpeer *peer, wchar_t *id, int value)
{
struct fnetpeerdatum *datum;
struct fnetpeerdi *di;
}
void fnetpeersetnum(struct fnetpeer *peer, wchar_t *id, int value)
{
struct fnetpeerdatum *datum;
struct fnetpeerdi *di;
if((datum = finddatum(peer->fn, id)) == NULL)
datum = adddatum(peer->fn, id, FNPD_INT);
if((datum = finddatum(peer->fn, id)) == NULL)
datum = adddatum(peer->fn, id, FNPD_INT);
- di = difindoradd(peer, datum);
+ di = difindoradd(peer, datum, &changed);
+ changed = (changed || (di->data.num != value));
+ if(changed)
+ CBCHAINDOCB(peer->fn, fnetpeer_chdi, peer->fn, peer, di);
}
void fnetpeersetlnum(struct fnetpeer *peer, wchar_t *id, long long value)
{
struct fnetpeerdatum *datum;
struct fnetpeerdi *di;
}
void fnetpeersetlnum(struct fnetpeer *peer, wchar_t *id, long long value)
{
struct fnetpeerdatum *datum;
struct fnetpeerdi *di;
if((datum = finddatum(peer->fn, id)) == NULL)
datum = adddatum(peer->fn, id, FNPD_LL);
if((datum = finddatum(peer->fn, id)) == NULL)
datum = adddatum(peer->fn, id, FNPD_LL);
- di = difindoradd(peer, datum);
+ di = difindoradd(peer, datum, &changed);
+ changed = (changed || (di->data.lnum != value));
+ if(changed)
+ CBCHAINDOCB(peer->fn, fnetpeer_chdi, peer->fn, peer, di);
}
static void putdatum(struct fnetpeer *peer, struct fnetpeerdatum *datum)
}
static void putdatum(struct fnetpeer *peer, struct fnetpeerdatum *datum)
fn->peers = new;
fn->numpeers++;
CBCHAINDOCB(fn, fnetnode_ac, fn, L"numpeers");
fn->peers = new;
fn->numpeers++;
CBCHAINDOCB(fn, fnetnode_ac, fn, L"numpeers");
+ CBCHAINDOCB(fn, fnetpeer_new, fn, new);
peer->fn->peers = peer->next;
peer->fn->numpeers--;
CBCHAINDOCB(peer->fn, fnetnode_ac, peer->fn, L"numpeers");
peer->fn->peers = peer->next;
peer->fn->numpeers--;
CBCHAINDOCB(peer->fn, fnetnode_ac, peer->fn, L"numpeers");
+ CBCHAINDOCB(peer->fn, fnetpeer_del, peer->fn, peer);
free(peer->id);
free(peer->nick);
for(i = 0; i < peer->dinum; i++)
free(peer->id);
free(peer->nick);
for(i = 0; i < peer->dinum; i++)