At install time:

// If for record, list all providers and ask user which one to record
// (Multiple at once?   *Not at first.)

// If for playback, install as a new provider(?)


-----------------------------------------------------------------------------
At record time:

// Insert between TAPI & target SP (multiple SPs at once?  *Not at first.)

// Really cool to self-modify export table so that only functions exported
// are those exported by the target SP  (unlikely)

// On startup, spin a thread that will take messages & write to a file

// When a message comes up, all parms & timestamp will be added to a queue and the
// other thread will be signaled to put messages to the queue

// When a function call comes down, parms will be recorded for comparison
// to parms sent down during playback  (THIS DEFINITION NEEDS WORK!!)


// !! Events going up should get TWO timestamps!!! One since startup and
// !! one since last (non-status?) function going down.


// After a function call, the return stuff (retcode, async buffer if any,
// async retcode) and timestamp are recorded


Features for recording:

// At set times, or before/after passing functions down to target SP
// and/or after/during messages up, call status functions on calls & lines
// so that if, during playback, status is unexpectedly asked for (because
// the ISV is trying something new) "correct" status is returned


-----------------------------------------------------------------------------
At playback:

// Already installed.  Separate app to kick off, log stuff, and maybe get
// some user intervention (eg: have user manually kick off each event; have
// user alter data going up/down; etc)

// FileOpen common-dialog box to open Repeater file

// Talk through sidedoor (NOT LINEDEVSPECIFIC - MUST NOT ALREADY init provider)
// to get filename to Repeater

// On startup, spin a thread that will log stuff?

// When function calls come down, check them off the list if they are expected
// If not expected, log it (maybe even log it if it was expected, LOGLEVEL)
// If not expected, THEN WHAT? If a status call, return same status if this
// call was reported previously for 2 calls then the same status that was
// returned next.  IE: A developer is working to fix a bug in an event stream
// and sets a loop to check the status of a call before continuing.  He should
// receive a couple of "not done yet" statuses before the "ok, it's done"
// status.

// When completing async events, be sure to use the GOOD (current) asyncID!

// If a function call does not happen by (SOME AMOUNT OF TIME - the next
// status up message?), then log it.

// Pass any events up at the time delta they happened. (Delta from func down?)

// What about UI functions?  Probably just put up a MessageBox that says
// "Kilroy was here"


Features for playback:

// Have playback optionally ignore function down stuff.  So that a PBX maker
// can record events that are calls coming in and send that to ISVs.  The
// ISV can then test their apps against incoming calls on the PBX.

// How valuable to be able to insert into a playback stream?  EG: A PBX
// stream has incoming calls, but to test IVR stuff, an ISV wants to simulate
// DTMF pressed.   EG2: An ISV realizes what he did wrong and wants to run
// a simulation and so wants to change one of the status returned messages.
// - changes a disconnect to dialing, then inserts a conntected then changes
// the disconnect to happen a MINUTE later...
