					Automatischer Verbindungsaufbau
             ber IConnect durch eine
							    GEM-Applikation

Stand 18.12.97                      Sven Kopacz

Vorwrtchen:
------------
Es gibt keine Mglichkeit fr ein TOS/TTP-Programm
einen Verbindungsaufbau zu veranlassen.

Es gibt keine Mglichkeit fr eine App, irgendwie
auf das Setup einzuwirken, das fr den Verbindungs-
aufbau verwendet wird. Genausowenig kann man etwas
ber die vorhandenen Setups erfahren. D.h. fr
eine Applikation werden Werte wie lokale Email-
Adresse etc. immer erst dann sichtbar, wenn der User
ber ein bestimmtes Setup eine Verbindung her-
gestellt hat (s. USIS-Doku).

Grundstzlich sollte ein App nicht einfach eine
Verbindung aufbauen, sondern dies hnlich dem Emailer
konfigurierbar halten (ach;-).

Erster Schritt: 
---------------
appl_find("ICONNECT")
Falls vorhanden, weiter bei Zweiter Schritt.

Falls nicht vorhanden, eine Nachricht an den Desktop
schicken (natrlich abhngig von User-Konfig), und zwar:

	pbuf[0]=AV_STARTPROG;		/* siehe AV-Doku */
	pbuf[1]=ap_id;
	pbuf[2]=0;
	*((char**)(&pbuf[3]))="ICONFSET.CFG";
	pbuf[5]=pbuf[6]=0;
	pbuf[7]=<magic>; 					/* Magic um Antwort zu erkennen */
	appl_write(shell_id, 16, pbuf);		/* shell_id ber appl_search */

Der Desktop antwortet mit

	pbuf[0]==VA_PROGSTART
	pbuf[7]==<magic>

	pbuf[3]=0 bedeutet: Nichts gestartet
	pbuf[3]!=0 bedeutet: OK

Problem: Offenbar liefert der Desktop was er will. Deshalb
kann man pbuf[3] gleich ignorieren und sobald die Antwort
eingetroffen ist eine Pause von 0.5-1 sec. einlegen und
anschlieend per appl_find("ICONNECT") prfen, ob der Start
geklappt hat. Da man appl_find ohnehin fr das folgende
Protokoll braucht, ist dies kein zustzlicher Aufwand.

Mgliche Fehler:
-Der Desktop antwortet nicht (Timeout sollte IMO bei 5 Sekunden liegen)
 Meldung an den User, einen AV-fhigen Desktop zu verwenden.
-appl_find("ICONNECT") nach VA_PROGSTART liefert Fehler.
 Meldung an den User, "ICONNECT.PRG" im Desktop auf die Datei
 "ICONFSET.CFG" anzumelden.

Zweiter Schritt:
----------------
Status von ICONNECT erfragen:

	pbuf[0]=ICON_MSG;
	pbuf[1]=ap_id;
	pbuf[2]=0;
	pbuf[3]=ICM_STATUS_REQUEST;
	pbuf[4]=0;
	pbuf[5]=pbuf[6]=0;
	pbuf[7]=<magic>; /* Magic um Antwort zuzuordnen*/
	appl_write(ic_id, 16, pbuf);

IConnect antwortet mit:

	pbuf[0]=ICON_MSG
	pbuf[3]=ICM_STATUS_REPLY
	pbuf[7]=<magic>

	pbuf[4]=ICMS_OFFLINE 		/* Keine Verbindung */
		oder ICMS_CONNECTING 	/* Verbindung wird gerade aufgebaut */
		oder ICMS_ONLINE 			/* Verbindung aktiv */
		oder ICMS_CLOSING 		/* Verbindung wird gerade abgebaut */

Ist der Status ICMS_OFFLINE, sollte je nach Userkonfig der Aufbau
der Verbindung veranlasst werden (Dritter Schritt).
Ist der Status ICMS_CONNECTING sollte auf den Aufbau gewartet
werden (Vierter Schritt).
Ist der Status ICMS_ONLINE ist die Verbindung ok (Fertig).
Ist der Status ICMS_CLOSING, sollte entweder 
a)die ganze Anwahl abgebrochen werden (ggf. Info-Alert) oder 
b)solange gewartet werden, bis sich IConnect beendet hat 
  (d.h. appl_find("ICONNECT") liefert Fehler)
  und wieder von vorne begonnen werden.
	Dabei sollte man aber immer einen Alert der Form
	"Fehler bei Anwahl, wiederholen?" vorsehen, der User knnte 
	sonst ernsthafte Schwierigkeiten bekommen, wenn er eine 
	automatische Einwahl durch "Abbruch" in IConnect verhindern will. 
	Das Ding legt ja dann die ganze Zeit wieder von vorne los...

Mgliche Fehler:
-IConnect antwortet nicht (Timeout ca. 5 Sekunden).
 Prfen, ob IConnect noch luft (appl_find)
 Nein: Demnach hat User IConnect rausgeschmissen->s. a) oder b)
 Ja: IConnect ist zu alt und kann das Protokoll noch nicht
     ->User auf Update hinweisen

Dritter Schritt:
----------------
Anwahl veranlassen:

	pbuf[0]=ICON_MSG;
	pbuf[1]=ap_id;
	pbuf[2]=0;
	pbuf[3]=ICM_CONNECTION_REQUEST;
	pbuf[4]=0;
	pbuf[5]=pbuf[6]=0;
	pbuf[7]=<magic>
	appl_write(ic_id, 16, pbuf);

IConnect antwortet mit:

	pbuf[0]=ICON_MSG
	pbuf[3]=ICM_CONNECTION_REPLY
	pbuf[7]=<magic>

	pbuf[4]=ICMC_NOT_OFFLINE 
		oder ICMC_CONNECTING 

ICMC_NOT_OFFLINE bedeutet, da sich IConnect nicht im Offline-Status
befindet, was eigentlich nur so zu interpretieren ist, da der User 
inzwischen selbst irgendwas gefummelt hat ("Verbinden" geklickt etc.), 
man sollte dann direkt zu Schritt vier bergehen oder mittels 
ICM_STATUS_REQUEST prfen, in welchem Zustand sich IConnect befindet 
und ggf. entsprechend reagieren.
ICMC_CONNECTING bedeutet, da die Nachricht akzeptiert wurde und die 
Verbindung jetzt aufgebaut wird, man sollte zu Schritt vier bergehen.

Mgliche Fehler:
-Genau wie bei Schritt zwei, nur da die ausbleibende Antwort
 aufgrund einer alten Version recht unwahrscheinlich ist, sonst
 wre man wohl kaum bis hierher gekommen.

Vierter Schritt:
----------------
Abwarten des Verbindungsaufbaus:

 Man prft wie in Schritt zwei mittels ICM_STATUS_REQUEST
 in regelmigen Abstnden den Zustand von IConnect und wartet,
 bis einer der folgenden Zustnde eintritt:
 (Die Prfung sollte nicht zu hufig geschehen, damit IConnect
  neben der Beantwortung der Messages auch noch Zeit fr seinen
  eigenen Kram hat. Einmal pro Sekunde reicht vllig aus).

 -IConnect liefert ICMS_ONLINE -> Fertig
 -IConnect liefert ICMS_OFFLINE: Der User hat die Anwahl abgebrochen,
  das Programm sollte dasselbe tun und ggf. mit einem Alert darauf
  aufmerksam machen.
 -IConnect antwortet nicht (Timeout 5 Sekunden): Der User hat
  die Anwahl manuell abgebrochen und IConnect beendet. Das Programm
  sollte die Anwahl ebenfalls abbrechen und ggf. mit einem Alert
  darauf hinweisen.

 In jedem anderen Fall wird Schritt vier wiederholt.
 Es ist insbesondere nicht sinnvoll z.B. einen Timeout fr den Zustand
 ICMS_CONNECTING vorzusehen, da dieser Zustand z.B. durch belegte
 Modems beim Provider beliebig lange andauern kann. Hat der User
 davon irgendwann die Nase voll, wird er in IConnect auf "Abbruch"
 klicken und das Programm erhlt damit ICMS_OFFLINE oder (falls
 der User IConnect sofort beendet) gar keine Antwort, was wie oben
 zu bercksichtigen ist.


Fnfter Schritt:
----------------
Beenden der Verbindung:

 Ein Programm sollte eine Verbindung nur dann beenden, wenn es
 sie auch selbst aufgebaut hat, also sollte man sich irgendwo
 merken, ob IConnect beim Verbindungsbedarf schon Online war
 oder erst gestartet bzw. aktiviert werden mute.
 Der Emailer macht das z.B. automatisch, trotzdem kann man 
 diesen Punkt natrlich ebenfalls User-konfigurierbar halten.

 Um die Verbindung zu beenden schickt man folgende Nachricht
 an IConnect:

	pbuf[0]=ICON_MSG;
	pbuf[1]=ap_id;
	pbuf[2]=0;
	pbuf[3]=ICM_SHUTDOWN_REQUEST;
	pbuf[4]=0;
	pbuf[5]=pbuf[6]=0;
	pbuf[7]=<magic>
	appl_write(ic_id, 16, pbuf);

 IConnect antwortet mit:

	pbuf[0]=ICON_MSG
	pbuf[3]=ICM_SHUTDOWN_REPLY
	pbuf[7]=<magic>

	pbuf[4]=ICMH_NOT_ONLINE
		oder ICMH_DISCONNECTING

 ICMH_NOT_ONLINE bedeutet, da keine Verbindung besteht, es gibt
 also auch nichts abzubauen.
 ICMH_DISCONNECTING bedeutet, da die Nachricht akzeptiert wurde
 und die Verbindung jetzt abgebaut wird.

 Nach erfolgtem Verbindungsabbau beendet sich IConnect (wie immer)
 automatisch. Trotzdem reicht es im Prinzip natrlich vllig aus,
 die Nachricht zu versenden, man mu weder die Antwort noch die
 Terminierung von IConnect abwarten, da alle mglichen Fehler
 (falsche Antwort, Timeout) eigentlich nur bedeuten knnen, da
 der User bereits selbst die Verbindung terminiert hat.


Sonstiges:
----------

Die Nachrichtennummern finden sich in ICON_MSG.H

-EOF-