File        :     README.TXT
Author      :     Robert Cripps for Symbian Ltd May 1999
                  (c) Copyright Symbian Ltd 1998
Abstract    :     Overview of the design of the Symbian Telnet implementation
                  and miscellaneous handover notes for BETA Release 1.0

1)  Overall Structure
The Symbian Telnet (Telsess.dll) export entry points are declared in telsess.h
and described in TelApi.Doc .There is a basic sample Telnet Client TTelnet.exe
with Source code that demonstrates most of the API calls.

2)  Class Overview
2.1) CTelnetSession
Main derivation from CBase
Top level class created by client applications.
Creates the CTelnetControl control object and contains the export entry
points for client applications.

2.2) CTelnetControl
Main derivation from CBase
Created by CTelnetSession.
The main Symbian Telnet control object handles client calls/callbacks and
generally coordinates Symbian Telnet operation.
Creates instances of :-

CTelnetResolver
CProto
CIOBufferControl
CActiveWriter
CActiveReader

2.3) CTelnetResolver
Main derivation from CActive
Handles connection/disconnection to Telnet Server using state machine
Owns the Socket handle 

2.4) CActiveWriter
Main derivation from CActive
Handles Writes to the Socket

2.5) CActiveReader
Main derivation from CActive
Handles Reads from the Socket

2.6) CIOBufferControl
Main derivation from CBase
Provides buffering between the ActiveRead/Write objects and the
CTelnetControl control object.

2.7) CProto
Main derivation from CBase
The Telnet Protocol handler coordinates RFC 854
Manipulates data stream to and from the Telnet Server.
ALL calls into this object are effectively synchronous.
Contains the main Server receive state machine.

Creates instances of :-

CBinaryOption            RFC 856
CWindowSizeOption        RFC 1073
CTerminalTypeOption      RFC 1091
CTerminalSpeedOption     RFC 1079
CSuppressGAOption        RFC 858
CStatusOption            RFC 859
CEchoOption              RFC 857
CLogoutOption            RFC 727
CUnknownOption

The above RFC classes are derived from CRFCOptionBase which conatins an 
option negotiation state machine as described in RFC 1143

3)  Creation Heirarchy
                               CTelnetSession
                                     |
                                     |            
                              CTelnetControl
                                     |            
      |--------------|---------------|--------------|----------------|
      |              |               |              |                |
      |              |               |              |                |
 CActiveReader  CActiveWriter     CProto    CTelnetResolver  CIOBufferControl
                                     |
                                     |                               
                               CBinaryOption
                             CWindowSizeOption
                            CTerminalTypeOption
                            CTerminalSpeedOption
                              CSuppressGAOption
                                CStatusOption
                                CEchoOption
                               CLogoutOption
                               CUnknownOption

4) File Overview
4.1)  Telsess.cpp & Telsess.h
Symbian Telnet DLL export methods

4.2)  Telcontrol.cpp & Telcontrol
Code & declarations for the Symbian Telnet control class CTelnetControl

4.3)  Telfsm.cpp & Telfsm.h
Implementation of all the Telnet RFC's

4.4)  Telresol.cpp & Telresol.h
Code & declarations for the Symbian Telnet Resolver class CTelnetResolver

4.5)  IOBuffers.cpp & IOBuffers.h
Code & declarations for the intermmediate buffering class CIOBufferControl 

4.6)  ActiveIO.cpp & ActiveIO.h
Code & declarations for the Socket write and Socket read Active Objects
CActiveReader, CActiveWriter 



5) Connect/Disconnect overview
Data paths travelling from Server to the Client contain notification
(M)Interface callbacks.

5.1) Connect to Server

               Telnet Client            Telnet Client
                    |                         ^
                    |                         |
           CTelnetSession::Connect   (M) CTelnetSession::Connected
                    |                         |
                    |                         |
           CTelnetControl::Connect  (M) CTelnetControl::ResolverConnected           
                    |                         |
                    |                         |
     CTelnetResolver::IssueConnect     CTelnetResolver Async Completion   
                    |                         |
                    V                         |
                    -------Telnet Server------|

5.2) Disconnect by Server
               
               Telnet Server
                    |
                    |
  CTelnetResolver notified of EOF on Socket by CActiveReader
                    |
                    |
      (M) CTelnetControl::ResolverDisconnected
                    |
                    |
      (M) CTelnetSession::ConnectionClosed
                    |
                    V
               Telnet Client


5.3) Disconnect by Client
                   

               Telnet Client             Telnet Client      
                    |                         ^
                    |                         |
    CTelnetSession::Disconnect   (M) CTelnetSession::ConnectionClosed
                    |                         |
                    |                         |
       CTelnetControl::Disconnect (M) CTelnetControl::ResolverDisconnected
                    |                         |
                    |                         |
 CTelnetResolver::IssueDisconnect    CTelnetResolver notified of EOF on Socket
                    |                         |
                    V                         |
                    -------Telnet Server------|
       

6) Data Transfer
Data paths travelling from Server to the Client contain notification
(M)Interface callbacks.
6.1) Write to Server
               
                Telnet Client          Telnet Client
                    |                        ^
                    |                        |
           CTelnetSession::Write      (M) CTelnetSession::WriteComplete
                    |                        ^
                    |                        |
           CTelnetControl::Write -->  (M) CTelnetControl::WriteComplete
                    |       ^       |        |
                    V       |       |        |        
                 CProto::ProtoWrite |        |
                                    |        |
                                    |        |
                    |---------------|        |
                    |                        |
        CIOBufferControl::Write      (M) CIOBufferControl::WriteComplete
                    |                        |
                    |                        |
   CActiveWriter::IssueWrite      CActiveWriter Completes Asynchronously
                    |                        |
                    V                        |
                    ------Telnet Server------|



6.2) Read from Server

                Telnet Client                       Telnet Client
                    |                                     ^
                    |                                     |
           CTelnetSession::Read              (M) CTelnetSession::ReadComplete
                    |                                     |           
                    |                                     |           
                    |          CProto::ProtoRead--->|     |
                    |                        |      |     |
                    |                        |      V     |
           CTelnetSession::Read    (M) CTelnetControl::ReadComplete 
                    |                        |
                    |                        |
           CIOBufferControl::Read  (M) CIOBufferControl::ReadComplete
                    |                        |
                    |                        |
     CActiveReader::IssueRead      CActiveReader Completes Asynchronously
                    |                        |
                    V                        |
                    ------Telnet Server------|


7) Sample Telnet Client
There are only 2 files in this project TTelnet.cpp and TTelnet.h .
This code is not perfect but is fairly easy to understand.

8) Miscellaneous Issues

8.1) Debugs
Debugging has been left in, mainly for Telnet Protocol events. This can be easily removed
when it's no longer useful.

8.2) Testing in Binary Mode
Binary mode is successfully negotiated if a Terminal Type other than "dumb" is selected,
however, we do not have a Terminal emulation to test Binary mode properly.
I have done basic testing to make sure the permitted control signals work in Binary mode
and have carefully desk checked the code that handles the RFC 854 defined behaviour for
receive and transmit in Binary.
As soon as a Terminal emulation, vt100 for example, is "plugged in" over the top of the
Symbian Telnet API, it should be fairly easy to test that Binary mode is working correctly
using "vi" or other Unix applications that require more complex client terminal formatting.

8.3) Finishing Off

i) Error Checks
I need to "Epocise" the code for checking buffer overflows etc

ii) Safe Objects
I'm not sure whether I need to implement things like safe copy constructors.

iii) Error Notifications 
I have not looked into to every single error that can occur on sockets and the resolver,
therefore I've not documented all the error codes that could be passed up to the client.

iv) Coding Standards
Code needs to be checked against the coding standards by myself and then submitted for
review

v) Destructive Testing
Anything I/we can think of to break it.

vi)  Final Documentation
Finish off and make the API official.

