OK, fatto. Solo che adesso ho un dubbio atroce. Premetto che il file xml sarà formato così:
codice:
<?xml version="1.0" encoding="iso-8859-1"?>
<service>
<phones>
<phone interno="101">
<username>Fabrizio</username>
<status>1</status>
</phone>
</phones>
</service>
Il client in pratica funziona così: legge una variazione di stato del telefono (ad esempio se riceve una chiamata, se sta per inviare una chiamata e così via) ed invia un record (che contiene interno, username e status) al server che esegue questo codice:
codice:
xmlDoc.FileName := path+'status.xml';
try
xmlDoc.Active := true;
ANode := xmlDoc.DocumentElement;
ANode := ANode.ChildNodes.FindNode('phones');
if (ANode <> nil) and (ANode.ChildNodes.Count > 0) then
begin
fh := 0;
found:= false;
repeat
begin
if ANode.ChildNodes[fh].Attributes['interno'] = l.number then
begin
found := true;
ANode.ChildNodes[fh].ChildNodes.FindNode('status').NodeValue :=l.status;
end
else
fh := fh+1;
end;
until (fh<=ANode.ChildNodes.Count) or (found=true);
if (found=false) then
begin
ANode := xmlDoc.DocumentElement;
ANode := Anode.ChildNodes.FindNode('phones');
ANode := ANode.AddChild('phone');
ANode.Attributes['interno'] := l.number;
ANode.AddChild('username').NodeValue := l.user;
ANode.AddChild('status').NodeValue := l.status;
end;
end
else
begin
ANode := xmlDoc.DocumentElement;
ANode := ANode.ChildNodes.FindNode('phones');
ANode := ANode.AddChild('phone');
ANode.Attributes['interno'] := l.number;
ANode.AddChild('username').NodeValue := l.user;
ANode.AddChild('status').NodeValue := l.status;
end;
except on e:exception do
WriteLog('Errore xml: '+E.Message);
end;
xmlDoc.SaveToFile(path+'status.xml');
xmlDoc.Active := false;
In pratica, dopo aver caricato il contenuto del file "status.xml" esegue un clico per cercare se nel file è registrato il telefono con interno l.interno
Se lo trova modifica il campo status, altrimenti aggiunge un altro nodo con interno=l.interno
e tutte le informazioni contenute nel record.
Il problema è che con un unico client non ha problemi (aggiorna correttamente il nodo relativo all'interno associato al client). Già con due client (associati, ovviamente, a due interni differenti) lo status di un client viene aggiornato mentre quello del secondo viene aggiunto anche se già presente.
Premettendo che il server è in realtà un servizio windows (quindi già di per sè multithread), il problema potrebbe essere un accesso simultaneo dei due client al file xml? E se sì, come potrei fare a risolverlo?