isdn source code uses a not-current coding style. Update the coding style used on a per-line basis so that git diff -w shows only elided blank lines at EOF. Done with emacs and some scripts and some typing. Built x86 allyesconfig. No detected change in objdump -d or size. Signed-off-by: Joe Perches <joe@perches.com>
		
			
				
	
	
		
			2194 lines
		
	
	
	
		
			63 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			2194 lines
		
	
	
	
		
			63 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 *
 | 
						|
 Copyright (c) Eicon Networks, 2000.
 | 
						|
 *
 | 
						|
 This source file is supplied for the use with
 | 
						|
 Eicon Networks range of DIVA Server Adapters.
 | 
						|
 *
 | 
						|
 Eicon File Revision :    1.9
 | 
						|
 *
 | 
						|
 This program is free software; you can redistribute it and/or modify
 | 
						|
 it under the terms of the GNU General Public License as published by
 | 
						|
 the Free Software Foundation; either version 2, or (at your option)
 | 
						|
 any later version.
 | 
						|
 *
 | 
						|
 This program is distributed in the hope that it will be useful,
 | 
						|
 but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
 | 
						|
 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
 See the GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 You should have received a copy of the GNU General Public License
 | 
						|
 along with this program; if not, write to the Free Software
 | 
						|
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
 *
 | 
						|
 */
 | 
						|
#include "platform.h"
 | 
						|
#include "kst_ifc.h"
 | 
						|
#include "di_defs.h"
 | 
						|
#include "maintidi.h"
 | 
						|
#include "pc.h"
 | 
						|
#include "man_defs.h"
 | 
						|
 | 
						|
 | 
						|
extern void diva_mnt_internal_dprintf(dword drv_id, dword type, char *p, ...);
 | 
						|
 | 
						|
#define MODEM_PARSE_ENTRIES  16 /* amount of variables of interest */
 | 
						|
#define FAX_PARSE_ENTRIES    12 /* amount of variables of interest */
 | 
						|
#define LINE_PARSE_ENTRIES   15 /* amount of variables of interest */
 | 
						|
#define STAT_PARSE_ENTRIES   70 /* amount of variables of interest */
 | 
						|
 | 
						|
/*
 | 
						|
  LOCAL FUNCTIONS
 | 
						|
*/
 | 
						|
static int DivaSTraceLibraryStart(void *hLib);
 | 
						|
static int DivaSTraceLibraryStop(void *hLib);
 | 
						|
static int SuperTraceLibraryFinit(void *hLib);
 | 
						|
static void *SuperTraceGetHandle(void *hLib);
 | 
						|
static int SuperTraceMessageInput(void *hLib);
 | 
						|
static int SuperTraceSetAudioTap(void *hLib, int Channel, int on);
 | 
						|
static int SuperTraceSetBChannel(void *hLib, int Channel, int on);
 | 
						|
static int SuperTraceSetDChannel(void *hLib, int on);
 | 
						|
static int SuperTraceSetInfo(void *hLib, int on);
 | 
						|
static int SuperTraceClearCall(void *hLib, int Channel);
 | 
						|
static int SuperTraceGetOutgoingCallStatistics(void *hLib);
 | 
						|
static int SuperTraceGetIncomingCallStatistics(void *hLib);
 | 
						|
static int SuperTraceGetModemStatistics(void *hLib);
 | 
						|
static int SuperTraceGetFaxStatistics(void *hLib);
 | 
						|
static int SuperTraceGetBLayer1Statistics(void *hLib);
 | 
						|
static int SuperTraceGetBLayer2Statistics(void *hLib);
 | 
						|
static int SuperTraceGetDLayer1Statistics(void *hLib);
 | 
						|
static int SuperTraceGetDLayer2Statistics(void *hLib);
 | 
						|
 | 
						|
/*
 | 
						|
  LOCAL FUNCTIONS
 | 
						|
*/
 | 
						|
static int ScheduleNextTraceRequest(diva_strace_context_t *pLib);
 | 
						|
static int process_idi_event(diva_strace_context_t *pLib,
 | 
						|
			     diva_man_var_header_t *pVar);
 | 
						|
static int process_idi_info(diva_strace_context_t *pLib,
 | 
						|
			    diva_man_var_header_t *pVar);
 | 
						|
static int diva_modem_event(diva_strace_context_t *pLib, int Channel);
 | 
						|
static int diva_fax_event(diva_strace_context_t *pLib, int Channel);
 | 
						|
static int diva_line_event(diva_strace_context_t *pLib, int Channel);
 | 
						|
static int diva_modem_info(diva_strace_context_t *pLib,
 | 
						|
			   int Channel,
 | 
						|
			   diva_man_var_header_t *pVar);
 | 
						|
static int diva_fax_info(diva_strace_context_t *pLib,
 | 
						|
			 int Channel,
 | 
						|
			 diva_man_var_header_t *pVar);
 | 
						|
static int diva_line_info(diva_strace_context_t *pLib,
 | 
						|
			  int Channel,
 | 
						|
			  diva_man_var_header_t *pVar);
 | 
						|
static int diva_ifc_statistics(diva_strace_context_t *pLib,
 | 
						|
			       diva_man_var_header_t *pVar);
 | 
						|
static diva_man_var_header_t *get_next_var(diva_man_var_header_t *pVar);
 | 
						|
static diva_man_var_header_t *find_var(diva_man_var_header_t *pVar,
 | 
						|
				       const char *name);
 | 
						|
static int diva_strace_read_int(diva_man_var_header_t *pVar, int *var);
 | 
						|
static int diva_strace_read_uint(diva_man_var_header_t *pVar, dword *var);
 | 
						|
static int diva_strace_read_asz(diva_man_var_header_t *pVar, char *var);
 | 
						|
static int diva_strace_read_asc(diva_man_var_header_t *pVar, char *var);
 | 
						|
static int diva_strace_read_ie(diva_man_var_header_t *pVar,
 | 
						|
			       diva_trace_ie_t *var);
 | 
						|
static void diva_create_parse_table(diva_strace_context_t *pLib);
 | 
						|
static void diva_trace_error(diva_strace_context_t *pLib,
 | 
						|
			     int error, const char *file, int line);
 | 
						|
static void diva_trace_notify_user(diva_strace_context_t *pLib,
 | 
						|
				   int Channel,
 | 
						|
				   int notify_subject);
 | 
						|
static int diva_trace_read_variable(diva_man_var_header_t *pVar,
 | 
						|
				    void *variable);
 | 
						|
 | 
						|
/*
 | 
						|
  Initialize the library and return context
 | 
						|
  of the created trace object that will represent
 | 
						|
  the IDI adapter.
 | 
						|
  Return 0 on error.
 | 
						|
*/
 | 
						|
diva_strace_library_interface_t *DivaSTraceLibraryCreateInstance(int Adapter,
 | 
						|
								 const diva_trace_library_user_interface_t *user_proc,
 | 
						|
								 byte *pmem) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)pmem;
 | 
						|
	int i;
 | 
						|
 | 
						|
	if (!pLib) {
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
 | 
						|
	pmem += sizeof(*pLib);
 | 
						|
	memset(pLib, 0x00, sizeof(*pLib));
 | 
						|
 | 
						|
	pLib->Adapter  = Adapter;
 | 
						|
 | 
						|
	/*
 | 
						|
	  Set up Library Interface
 | 
						|
	*/
 | 
						|
	pLib->instance.hLib                                = pLib;
 | 
						|
	pLib->instance.DivaSTraceLibraryStart              = DivaSTraceLibraryStart;
 | 
						|
	pLib->instance.DivaSTraceLibraryStop               = DivaSTraceLibraryStop;
 | 
						|
	pLib->instance.DivaSTraceLibraryFinit              = SuperTraceLibraryFinit;
 | 
						|
	pLib->instance.DivaSTraceMessageInput              = SuperTraceMessageInput;
 | 
						|
	pLib->instance.DivaSTraceGetHandle                 = SuperTraceGetHandle;
 | 
						|
	pLib->instance.DivaSTraceSetAudioTap               = SuperTraceSetAudioTap;
 | 
						|
	pLib->instance.DivaSTraceSetBChannel               = SuperTraceSetBChannel;
 | 
						|
	pLib->instance.DivaSTraceSetDChannel               = SuperTraceSetDChannel;
 | 
						|
	pLib->instance.DivaSTraceSetInfo                   = SuperTraceSetInfo;
 | 
						|
	pLib->instance.DivaSTraceGetOutgoingCallStatistics = \
 | 
						|
		SuperTraceGetOutgoingCallStatistics;
 | 
						|
	pLib->instance.DivaSTraceGetIncomingCallStatistics = \
 | 
						|
		SuperTraceGetIncomingCallStatistics;
 | 
						|
	pLib->instance.DivaSTraceGetModemStatistics        = \
 | 
						|
		SuperTraceGetModemStatistics;
 | 
						|
	pLib->instance.DivaSTraceGetFaxStatistics          = \
 | 
						|
		SuperTraceGetFaxStatistics;
 | 
						|
	pLib->instance.DivaSTraceGetBLayer1Statistics      = \
 | 
						|
		SuperTraceGetBLayer1Statistics;
 | 
						|
	pLib->instance.DivaSTraceGetBLayer2Statistics      = \
 | 
						|
		SuperTraceGetBLayer2Statistics;
 | 
						|
	pLib->instance.DivaSTraceGetDLayer1Statistics      = \
 | 
						|
		SuperTraceGetDLayer1Statistics;
 | 
						|
	pLib->instance.DivaSTraceGetDLayer2Statistics      = \
 | 
						|
		SuperTraceGetDLayer2Statistics;
 | 
						|
	pLib->instance.DivaSTraceClearCall                 = SuperTraceClearCall;
 | 
						|
 | 
						|
 | 
						|
	if (user_proc) {
 | 
						|
		pLib->user_proc_table.user_context      = user_proc->user_context;
 | 
						|
		pLib->user_proc_table.notify_proc       = user_proc->notify_proc;
 | 
						|
		pLib->user_proc_table.trace_proc        = user_proc->trace_proc;
 | 
						|
		pLib->user_proc_table.error_notify_proc = user_proc->error_notify_proc;
 | 
						|
	}
 | 
						|
 | 
						|
	if (!(pLib->hAdapter = SuperTraceOpenAdapter(Adapter))) {
 | 
						|
		diva_mnt_internal_dprintf(0, DLI_ERR, "Can not open XDI adapter");
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
	pLib->Channels = SuperTraceGetNumberOfChannels(pLib->hAdapter);
 | 
						|
 | 
						|
	/*
 | 
						|
	  Calculate amount of parte table entites necessary to translate
 | 
						|
	  information from all events of onterest
 | 
						|
	*/
 | 
						|
	pLib->parse_entries = (MODEM_PARSE_ENTRIES + FAX_PARSE_ENTRIES + \
 | 
						|
			       STAT_PARSE_ENTRIES + \
 | 
						|
			       LINE_PARSE_ENTRIES + 1) * pLib->Channels;
 | 
						|
	pLib->parse_table = (diva_strace_path2action_t *)pmem;
 | 
						|
 | 
						|
	for (i = 0; i < 30; i++) {
 | 
						|
		pLib->lines[i].pInterface     = &pLib->Interface;
 | 
						|
		pLib->lines[i].pInterfaceStat = &pLib->InterfaceStat;
 | 
						|
	}
 | 
						|
 | 
						|
	pLib->e.R = &pLib->RData;
 | 
						|
 | 
						|
	pLib->req_busy = 1;
 | 
						|
	pLib->rc_ok    = ASSIGN_OK;
 | 
						|
 | 
						|
	diva_create_parse_table(pLib);
 | 
						|
 | 
						|
	return ((diva_strace_library_interface_t *)pLib);
 | 
						|
}
 | 
						|
 | 
						|
static int DivaSTraceLibraryStart(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
 | 
						|
	return (SuperTraceASSIGN(pLib->hAdapter, pLib->buffer));
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Return (-1) on error
 | 
						|
  Return (0) if was initiated or pending
 | 
						|
  Return (1) if removal is complete
 | 
						|
*/
 | 
						|
static int DivaSTraceLibraryStop(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
 | 
						|
	if (!pLib->e.Id) { /* Was never started/assigned */
 | 
						|
		return (1);
 | 
						|
	}
 | 
						|
 | 
						|
	switch (pLib->removal_state) {
 | 
						|
	case 0:
 | 
						|
		pLib->removal_state = 1;
 | 
						|
		ScheduleNextTraceRequest(pLib);
 | 
						|
		break;
 | 
						|
 | 
						|
	case 3:
 | 
						|
		return (1);
 | 
						|
	}
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceLibraryFinit(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	if (pLib) {
 | 
						|
		if (pLib->hAdapter) {
 | 
						|
			SuperTraceCloseAdapter(pLib->hAdapter);
 | 
						|
		}
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
	return (-1);
 | 
						|
}
 | 
						|
 | 
						|
static void *SuperTraceGetHandle(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
 | 
						|
	return (&pLib->e);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  After library handle object is gone in signaled state
 | 
						|
  this function should be called and will pick up incoming
 | 
						|
  IDI messages (return codes and indications).
 | 
						|
*/
 | 
						|
static int SuperTraceMessageInput(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	int ret = 0;
 | 
						|
	byte Rc, Ind;
 | 
						|
 | 
						|
	if (pLib->e.complete == 255) {
 | 
						|
		/*
 | 
						|
		  Process return code
 | 
						|
		*/
 | 
						|
		pLib->req_busy = 0;
 | 
						|
		Rc             = pLib->e.Rc;
 | 
						|
		pLib->e.Rc     = 0;
 | 
						|
 | 
						|
		if (pLib->removal_state == 2) {
 | 
						|
			pLib->removal_state = 3;
 | 
						|
			return (0);
 | 
						|
		}
 | 
						|
 | 
						|
		if (Rc != pLib->rc_ok) {
 | 
						|
			int ignore = 0;
 | 
						|
			/*
 | 
						|
			  Auto-detect amount of events/channels and features
 | 
						|
			*/
 | 
						|
			if (pLib->general_b_ch_event == 1) {
 | 
						|
				pLib->general_b_ch_event = 2;
 | 
						|
				ignore = 1;
 | 
						|
			} else if (pLib->general_fax_event == 1) {
 | 
						|
				pLib->general_fax_event = 2;
 | 
						|
				ignore = 1;
 | 
						|
			} else if (pLib->general_mdm_event == 1) {
 | 
						|
				pLib->general_mdm_event = 2;
 | 
						|
				ignore = 1;
 | 
						|
			} else if ((pLib->ChannelsTraceActive < pLib->Channels) && pLib->ChannelsTraceActive) {
 | 
						|
				pLib->ChannelsTraceActive = pLib->Channels;
 | 
						|
				ignore = 1;
 | 
						|
			} else if (pLib->ModemTraceActive < pLib->Channels) {
 | 
						|
				pLib->ModemTraceActive = pLib->Channels;
 | 
						|
				ignore = 1;
 | 
						|
			} else if (pLib->FaxTraceActive < pLib->Channels) {
 | 
						|
				pLib->FaxTraceActive = pLib->Channels;
 | 
						|
				ignore = 1;
 | 
						|
			} else if (pLib->audio_trace_init == 2) {
 | 
						|
				ignore = 1;
 | 
						|
				pLib->audio_trace_init = 1;
 | 
						|
			} else if (pLib->eye_pattern_pending) {
 | 
						|
				pLib->eye_pattern_pending =  0;
 | 
						|
				ignore = 1;
 | 
						|
			} else if (pLib->audio_tap_pending) {
 | 
						|
				pLib->audio_tap_pending = 0;
 | 
						|
				ignore = 1;
 | 
						|
			}
 | 
						|
 | 
						|
			if (!ignore) {
 | 
						|
				return (-1); /* request failed */
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			if (pLib->general_b_ch_event == 1) {
 | 
						|
				pLib->ChannelsTraceActive = pLib->Channels;
 | 
						|
				pLib->general_b_ch_event = 2;
 | 
						|
			} else if (pLib->general_fax_event == 1) {
 | 
						|
				pLib->general_fax_event = 2;
 | 
						|
				pLib->FaxTraceActive = pLib->Channels;
 | 
						|
			} else if (pLib->general_mdm_event == 1) {
 | 
						|
				pLib->general_mdm_event = 2;
 | 
						|
				pLib->ModemTraceActive = pLib->Channels;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if (pLib->audio_trace_init == 2) {
 | 
						|
			pLib->audio_trace_init = 1;
 | 
						|
		}
 | 
						|
		pLib->rc_ok = 0xff; /* default OK after assign was done */
 | 
						|
		if ((ret = ScheduleNextTraceRequest(pLib))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		/*
 | 
						|
		  Process indication
 | 
						|
		  Always 'RNR' indication if return code is pending
 | 
						|
		*/
 | 
						|
		Ind         = pLib->e.Ind;
 | 
						|
		pLib->e.Ind = 0;
 | 
						|
		if (pLib->removal_state) {
 | 
						|
			pLib->e.RNum	= 0;
 | 
						|
			pLib->e.RNR	= 2;
 | 
						|
		} else if (pLib->req_busy) {
 | 
						|
			pLib->e.RNum	= 0;
 | 
						|
			pLib->e.RNR	= 1;
 | 
						|
		} else {
 | 
						|
			if (pLib->e.complete != 0x02) {
 | 
						|
				/*
 | 
						|
				  Look-ahead call, set up buffers
 | 
						|
				*/
 | 
						|
				pLib->e.RNum       = 1;
 | 
						|
				pLib->e.R->P       = (byte *)&pLib->buffer[0];
 | 
						|
				pLib->e.R->PLength = (word)(sizeof(pLib->buffer) - 1);
 | 
						|
 | 
						|
			} else {
 | 
						|
				/*
 | 
						|
				  Indication reception complete, process it now
 | 
						|
				*/
 | 
						|
				byte *p = (byte *)&pLib->buffer[0];
 | 
						|
				pLib->buffer[pLib->e.R->PLength] = 0; /* terminate I.E. with zero */
 | 
						|
 | 
						|
				switch (Ind) {
 | 
						|
				case MAN_COMBI_IND: {
 | 
						|
					int total_length    = pLib->e.R->PLength;
 | 
						|
					word  this_ind_length;
 | 
						|
 | 
						|
					while (total_length > 3 && *p) {
 | 
						|
						Ind = *p++;
 | 
						|
						this_ind_length = (word)p[0] | ((word)p[1] << 8);
 | 
						|
						p += 2;
 | 
						|
 | 
						|
						switch (Ind) {
 | 
						|
						case MAN_INFO_IND:
 | 
						|
							if (process_idi_info(pLib, (diva_man_var_header_t *)p)) {
 | 
						|
								return (-1);
 | 
						|
							}
 | 
						|
							break;
 | 
						|
						case MAN_EVENT_IND:
 | 
						|
							if (process_idi_event(pLib, (diva_man_var_header_t *)p)) {
 | 
						|
								return (-1);
 | 
						|
							}
 | 
						|
							break;
 | 
						|
						case MAN_TRACE_IND:
 | 
						|
							if (pLib->trace_on == 1) {
 | 
						|
								/*
 | 
						|
								  Ignore first trace event that is result of
 | 
						|
								  EVENT_ON operation
 | 
						|
								*/
 | 
						|
								pLib->trace_on++;
 | 
						|
							} else {
 | 
						|
								/*
 | 
						|
								  Delivery XLOG buffer to application
 | 
						|
								*/
 | 
						|
								if (pLib->user_proc_table.trace_proc) {
 | 
						|
									(*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context,
 | 
						|
													      &pLib->instance, pLib->Adapter,
 | 
						|
													      p, this_ind_length);
 | 
						|
								}
 | 
						|
							}
 | 
						|
							break;
 | 
						|
						default:
 | 
						|
							diva_mnt_internal_dprintf(0, DLI_ERR, "Unknown IDI Ind (DMA mode): %02x", Ind);
 | 
						|
						}
 | 
						|
						p += (this_ind_length + 1);
 | 
						|
						total_length -= (4 + this_ind_length);
 | 
						|
					}
 | 
						|
				} break;
 | 
						|
				case MAN_INFO_IND:
 | 
						|
					if (process_idi_info(pLib, (diva_man_var_header_t *)p)) {
 | 
						|
						return (-1);
 | 
						|
					}
 | 
						|
					break;
 | 
						|
				case MAN_EVENT_IND:
 | 
						|
					if (process_idi_event(pLib, (diva_man_var_header_t *)p)) {
 | 
						|
						return (-1);
 | 
						|
					}
 | 
						|
					break;
 | 
						|
				case MAN_TRACE_IND:
 | 
						|
					if (pLib->trace_on == 1) {
 | 
						|
						/*
 | 
						|
						  Ignore first trace event that is result of
 | 
						|
						  EVENT_ON operation
 | 
						|
						*/
 | 
						|
						pLib->trace_on++;
 | 
						|
					} else {
 | 
						|
						/*
 | 
						|
						  Delivery XLOG buffer to application
 | 
						|
						*/
 | 
						|
						if (pLib->user_proc_table.trace_proc) {
 | 
						|
							(*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context,
 | 
						|
											      &pLib->instance, pLib->Adapter,
 | 
						|
											      p, pLib->e.R->PLength);
 | 
						|
						}
 | 
						|
					}
 | 
						|
					break;
 | 
						|
				default:
 | 
						|
					diva_mnt_internal_dprintf(0, DLI_ERR, "Unknown IDI Ind: %02x", Ind);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if ((ret = ScheduleNextTraceRequest(pLib))) {
 | 
						|
		return (-1);
 | 
						|
	}
 | 
						|
 | 
						|
	return (ret);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Internal state machine responsible for scheduling of requests
 | 
						|
*/
 | 
						|
static int ScheduleNextTraceRequest(diva_strace_context_t *pLib) {
 | 
						|
	char name[64];
 | 
						|
	int ret = 0;
 | 
						|
	int i;
 | 
						|
 | 
						|
	if (pLib->req_busy) {
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->removal_state == 1) {
 | 
						|
		if (SuperTraceREMOVE(pLib->hAdapter)) {
 | 
						|
			pLib->removal_state = 3;
 | 
						|
		} else {
 | 
						|
			pLib->req_busy = 1;
 | 
						|
			pLib->removal_state = 2;
 | 
						|
		}
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->removal_state) {
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->general_b_ch_event) {
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\B Event", pLib->buffer))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->general_b_ch_event = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->general_fax_event) {
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\FAX Event", pLib->buffer))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->general_fax_event = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->general_mdm_event) {
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\Modem Event", pLib->buffer))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->general_mdm_event = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->ChannelsTraceActive < pLib->Channels) {
 | 
						|
		pLib->ChannelsTraceActive++;
 | 
						|
		sprintf(name, "State\\B%d\\Line", pLib->ChannelsTraceActive);
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
 | 
						|
			pLib->ChannelsTraceActive--;
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->ModemTraceActive < pLib->Channels) {
 | 
						|
		pLib->ModemTraceActive++;
 | 
						|
		sprintf(name, "State\\B%d\\Modem\\Event", pLib->ModemTraceActive);
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
 | 
						|
			pLib->ModemTraceActive--;
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->FaxTraceActive < pLib->Channels) {
 | 
						|
		pLib->FaxTraceActive++;
 | 
						|
		sprintf(name, "State\\B%d\\FAX\\Event", pLib->FaxTraceActive);
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
 | 
						|
			pLib->FaxTraceActive--;
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->trace_mask_init) {
 | 
						|
		word tmp = 0x0000;
 | 
						|
		if (SuperTraceWriteVar(pLib->hAdapter,
 | 
						|
				       pLib->buffer,
 | 
						|
				       "Trace\\Event Enable",
 | 
						|
				       &tmp,
 | 
						|
				       0x87, /* MI_BITFLD */
 | 
						|
					sizeof(tmp))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->trace_mask_init = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->audio_trace_init) {
 | 
						|
		dword tmp = 0x00000000;
 | 
						|
		if (SuperTraceWriteVar(pLib->hAdapter,
 | 
						|
				       pLib->buffer,
 | 
						|
				       "Trace\\AudioCh# Enable",
 | 
						|
				       &tmp,
 | 
						|
				       0x87, /* MI_BITFLD */
 | 
						|
					sizeof(tmp))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->audio_trace_init = 2;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->bchannel_init) {
 | 
						|
		dword tmp = 0x00000000;
 | 
						|
		if (SuperTraceWriteVar(pLib->hAdapter,
 | 
						|
				       pLib->buffer,
 | 
						|
				       "Trace\\B-Ch# Enable",
 | 
						|
				       &tmp,
 | 
						|
				       0x87, /* MI_BITFLD */
 | 
						|
					sizeof(tmp))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->bchannel_init = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->trace_length_init) {
 | 
						|
		word tmp = 30;
 | 
						|
		if (SuperTraceWriteVar(pLib->hAdapter,
 | 
						|
				       pLib->buffer,
 | 
						|
				       "Trace\\Max Log Length",
 | 
						|
				       &tmp,
 | 
						|
				       0x82, /* MI_UINT */
 | 
						|
					sizeof(tmp))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->trace_length_init = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->trace_on) {
 | 
						|
		if (SuperTraceTraceOnRequest(pLib->hAdapter,
 | 
						|
					     "Trace\\Log Buffer",
 | 
						|
					     pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->trace_on = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->trace_event_mask != pLib->current_trace_event_mask) {
 | 
						|
		if (SuperTraceWriteVar(pLib->hAdapter,
 | 
						|
				       pLib->buffer,
 | 
						|
				       "Trace\\Event Enable",
 | 
						|
				       &pLib->trace_event_mask,
 | 
						|
				       0x87, /* MI_BITFLD */
 | 
						|
					sizeof(pLib->trace_event_mask))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->current_trace_event_mask = pLib->trace_event_mask;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if ((pLib->audio_tap_pending >= 0) && (pLib->audio_tap_mask != pLib->current_audio_tap_mask)) {
 | 
						|
		if (SuperTraceWriteVar(pLib->hAdapter,
 | 
						|
				       pLib->buffer,
 | 
						|
				       "Trace\\AudioCh# Enable",
 | 
						|
				       &pLib->audio_tap_mask,
 | 
						|
				       0x87, /* MI_BITFLD */
 | 
						|
					sizeof(pLib->audio_tap_mask))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->current_audio_tap_mask = pLib->audio_tap_mask;
 | 
						|
		pLib->audio_tap_pending = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if ((pLib->eye_pattern_pending >= 0) && (pLib->audio_tap_mask != pLib->current_eye_pattern_mask)) {
 | 
						|
		if (SuperTraceWriteVar(pLib->hAdapter,
 | 
						|
				       pLib->buffer,
 | 
						|
				       "Trace\\EyeCh# Enable",
 | 
						|
				       &pLib->audio_tap_mask,
 | 
						|
				       0x87, /* MI_BITFLD */
 | 
						|
					sizeof(pLib->audio_tap_mask))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->current_eye_pattern_mask = pLib->audio_tap_mask;
 | 
						|
		pLib->eye_pattern_pending = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->bchannel_trace_mask != pLib->current_bchannel_trace_mask) {
 | 
						|
		if (SuperTraceWriteVar(pLib->hAdapter,
 | 
						|
				       pLib->buffer,
 | 
						|
				       "Trace\\B-Ch# Enable",
 | 
						|
				       &pLib->bchannel_trace_mask,
 | 
						|
				       0x87, /* MI_BITFLD */
 | 
						|
					sizeof(pLib->bchannel_trace_mask))) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->current_bchannel_trace_mask = pLib->bchannel_trace_mask;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->trace_events_down) {
 | 
						|
		if (SuperTraceTraceOnRequest(pLib->hAdapter,
 | 
						|
					     "Events Down",
 | 
						|
					     pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->trace_events_down = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->l1_trace) {
 | 
						|
		if (SuperTraceTraceOnRequest(pLib->hAdapter,
 | 
						|
					     "State\\Layer1",
 | 
						|
					     pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->l1_trace = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->l2_trace) {
 | 
						|
		if (SuperTraceTraceOnRequest(pLib->hAdapter,
 | 
						|
					     "State\\Layer2 No1",
 | 
						|
					     pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->l2_trace = 1;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	for (i = 0; i < 30; i++) {
 | 
						|
		if (pLib->pending_line_status & (1L << i)) {
 | 
						|
			sprintf(name, "State\\B%d", i + 1);
 | 
						|
			if (SuperTraceReadRequest(pLib->hAdapter, name, pLib->buffer)) {
 | 
						|
				return (-1);
 | 
						|
			}
 | 
						|
			pLib->pending_line_status &= ~(1L << i);
 | 
						|
			pLib->req_busy = 1;
 | 
						|
			return (0);
 | 
						|
		}
 | 
						|
		if (pLib->pending_modem_status & (1L << i)) {
 | 
						|
			sprintf(name, "State\\B%d\\Modem", i + 1);
 | 
						|
			if (SuperTraceReadRequest(pLib->hAdapter, name, pLib->buffer)) {
 | 
						|
				return (-1);
 | 
						|
			}
 | 
						|
			pLib->pending_modem_status &= ~(1L << i);
 | 
						|
			pLib->req_busy = 1;
 | 
						|
			return (0);
 | 
						|
		}
 | 
						|
		if (pLib->pending_fax_status & (1L << i)) {
 | 
						|
			sprintf(name, "State\\B%d\\FAX", i + 1);
 | 
						|
			if (SuperTraceReadRequest(pLib->hAdapter, name, pLib->buffer)) {
 | 
						|
				return (-1);
 | 
						|
			}
 | 
						|
			pLib->pending_fax_status &= ~(1L << i);
 | 
						|
			pLib->req_busy = 1;
 | 
						|
			return (0);
 | 
						|
		}
 | 
						|
		if (pLib->clear_call_command & (1L << i)) {
 | 
						|
			sprintf(name, "State\\B%d\\Clear Call", i + 1);
 | 
						|
			if (SuperTraceExecuteRequest(pLib->hAdapter, name, pLib->buffer)) {
 | 
						|
				return (-1);
 | 
						|
			}
 | 
						|
			pLib->clear_call_command &= ~(1L << i);
 | 
						|
			pLib->req_busy = 1;
 | 
						|
			return (0);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->outgoing_ifc_stats) {
 | 
						|
		if (SuperTraceReadRequest(pLib->hAdapter,
 | 
						|
					  "Statistics\\Outgoing Calls",
 | 
						|
					  pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->outgoing_ifc_stats = 0;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->incoming_ifc_stats) {
 | 
						|
		if (SuperTraceReadRequest(pLib->hAdapter,
 | 
						|
					  "Statistics\\Incoming Calls",
 | 
						|
					  pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->incoming_ifc_stats = 0;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->modem_ifc_stats) {
 | 
						|
		if (SuperTraceReadRequest(pLib->hAdapter,
 | 
						|
					  "Statistics\\Modem",
 | 
						|
					  pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->modem_ifc_stats = 0;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->fax_ifc_stats) {
 | 
						|
		if (SuperTraceReadRequest(pLib->hAdapter,
 | 
						|
					  "Statistics\\FAX",
 | 
						|
					  pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->fax_ifc_stats = 0;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->b1_ifc_stats) {
 | 
						|
		if (SuperTraceReadRequest(pLib->hAdapter,
 | 
						|
					  "Statistics\\B-Layer1",
 | 
						|
					  pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->b1_ifc_stats = 0;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->b2_ifc_stats) {
 | 
						|
		if (SuperTraceReadRequest(pLib->hAdapter,
 | 
						|
					  "Statistics\\B-Layer2",
 | 
						|
					  pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->b2_ifc_stats = 0;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->d1_ifc_stats) {
 | 
						|
		if (SuperTraceReadRequest(pLib->hAdapter,
 | 
						|
					  "Statistics\\D-Layer1",
 | 
						|
					  pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->d1_ifc_stats = 0;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (pLib->d2_ifc_stats) {
 | 
						|
		if (SuperTraceReadRequest(pLib->hAdapter,
 | 
						|
					  "Statistics\\D-Layer2",
 | 
						|
					  pLib->buffer)) {
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->d2_ifc_stats = 0;
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!pLib->IncomingCallsCallsActive) {
 | 
						|
		pLib->IncomingCallsCallsActive = 1;
 | 
						|
		sprintf(name, "%s", "Statistics\\Incoming Calls\\Calls");
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
 | 
						|
			pLib->IncomingCallsCallsActive = 0;
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
	if (!pLib->IncomingCallsConnectedActive) {
 | 
						|
		pLib->IncomingCallsConnectedActive = 1;
 | 
						|
		sprintf(name, "%s", "Statistics\\Incoming Calls\\Connected");
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
 | 
						|
			pLib->IncomingCallsConnectedActive = 0;
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
	if (!pLib->OutgoingCallsCallsActive) {
 | 
						|
		pLib->OutgoingCallsCallsActive = 1;
 | 
						|
		sprintf(name, "%s", "Statistics\\Outgoing Calls\\Calls");
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
 | 
						|
			pLib->OutgoingCallsCallsActive = 0;
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
	if (!pLib->OutgoingCallsConnectedActive) {
 | 
						|
		pLib->OutgoingCallsConnectedActive = 1;
 | 
						|
		sprintf(name, "%s", "Statistics\\Outgoing Calls\\Connected");
 | 
						|
		if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
 | 
						|
			pLib->OutgoingCallsConnectedActive = 0;
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
		pLib->req_busy = 1;
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
static int process_idi_event(diva_strace_context_t *pLib,
 | 
						|
			     diva_man_var_header_t *pVar) {
 | 
						|
	const char *path = (char *)&pVar->path_length + 1;
 | 
						|
	char name[64];
 | 
						|
	int i;
 | 
						|
 | 
						|
	if (!strncmp("State\\B Event", path, pVar->path_length)) {
 | 
						|
		dword ch_id;
 | 
						|
		if (!diva_trace_read_variable(pVar, &ch_id)) {
 | 
						|
			if (!pLib->line_init_event && !pLib->pending_line_status) {
 | 
						|
				for (i = 1; i <= pLib->Channels; i++) {
 | 
						|
					diva_line_event(pLib, i);
 | 
						|
				}
 | 
						|
				return (0);
 | 
						|
			} else if (ch_id && ch_id <= pLib->Channels) {
 | 
						|
				return (diva_line_event(pLib, (int)ch_id));
 | 
						|
			}
 | 
						|
			return (0);
 | 
						|
		}
 | 
						|
		return (-1);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!strncmp("State\\FAX Event", path, pVar->path_length)) {
 | 
						|
		dword ch_id;
 | 
						|
		if (!diva_trace_read_variable(pVar, &ch_id)) {
 | 
						|
			if (!pLib->pending_fax_status && !pLib->fax_init_event) {
 | 
						|
				for (i = 1; i <= pLib->Channels; i++) {
 | 
						|
					diva_fax_event(pLib, i);
 | 
						|
				}
 | 
						|
				return (0);
 | 
						|
			} else if (ch_id && ch_id <= pLib->Channels) {
 | 
						|
				return (diva_fax_event(pLib, (int)ch_id));
 | 
						|
			}
 | 
						|
			return (0);
 | 
						|
		}
 | 
						|
		return (-1);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!strncmp("State\\Modem Event", path, pVar->path_length)) {
 | 
						|
		dword ch_id;
 | 
						|
		if (!diva_trace_read_variable(pVar, &ch_id)) {
 | 
						|
			if (!pLib->pending_modem_status && !pLib->modem_init_event) {
 | 
						|
				for (i = 1; i <= pLib->Channels; i++) {
 | 
						|
					diva_modem_event(pLib, i);
 | 
						|
				}
 | 
						|
				return (0);
 | 
						|
			} else if (ch_id && ch_id <= pLib->Channels) {
 | 
						|
				return (diva_modem_event(pLib, (int)ch_id));
 | 
						|
			}
 | 
						|
			return (0);
 | 
						|
		}
 | 
						|
		return (-1);
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  First look for Line Event
 | 
						|
	*/
 | 
						|
	for (i = 1; i <= pLib->Channels; i++) {
 | 
						|
		sprintf(name, "State\\B%d\\Line", i);
 | 
						|
		if (find_var(pVar, name)) {
 | 
						|
			return (diva_line_event(pLib, i));
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  Look for Moden Progress Event
 | 
						|
	*/
 | 
						|
	for (i = 1; i <= pLib->Channels; i++) {
 | 
						|
		sprintf(name, "State\\B%d\\Modem\\Event", i);
 | 
						|
		if (find_var(pVar, name)) {
 | 
						|
			return (diva_modem_event(pLib, i));
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  Look for Fax Event
 | 
						|
	*/
 | 
						|
	for (i = 1; i <= pLib->Channels; i++) {
 | 
						|
		sprintf(name, "State\\B%d\\FAX\\Event", i);
 | 
						|
		if (find_var(pVar, name)) {
 | 
						|
			return (diva_fax_event(pLib, i));
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  Notification about loss of events
 | 
						|
	*/
 | 
						|
	if (!strncmp("Events Down", path, pVar->path_length)) {
 | 
						|
		if (pLib->trace_events_down == 1) {
 | 
						|
			pLib->trace_events_down = 2;
 | 
						|
		} else {
 | 
						|
			diva_trace_error(pLib, 1, "Events Down", 0);
 | 
						|
		}
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!strncmp("State\\Layer1", path, pVar->path_length)) {
 | 
						|
		diva_strace_read_asz(pVar, &pLib->lines[0].pInterface->Layer1[0]);
 | 
						|
		if (pLib->l1_trace == 1) {
 | 
						|
			pLib->l1_trace = 2;
 | 
						|
		} else {
 | 
						|
			diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
 | 
						|
		}
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
	if (!strncmp("State\\Layer2 No1", path, pVar->path_length)) {
 | 
						|
		char *tmp = &pLib->lines[0].pInterface->Layer2[0];
 | 
						|
		dword l2_state;
 | 
						|
		if (diva_strace_read_uint(pVar, &l2_state))
 | 
						|
			return -1;
 | 
						|
 | 
						|
		switch (l2_state) {
 | 
						|
		case 0:
 | 
						|
			strcpy(tmp, "Idle");
 | 
						|
			break;
 | 
						|
		case 1:
 | 
						|
			strcpy(tmp, "Layer2 UP");
 | 
						|
			break;
 | 
						|
		case 2:
 | 
						|
			strcpy(tmp, "Layer2 Disconnecting");
 | 
						|
			break;
 | 
						|
		case 3:
 | 
						|
			strcpy(tmp, "Layer2 Connecting");
 | 
						|
			break;
 | 
						|
		case 4:
 | 
						|
			strcpy(tmp, "SPID Initializing");
 | 
						|
			break;
 | 
						|
		case 5:
 | 
						|
			strcpy(tmp, "SPID Initialised");
 | 
						|
			break;
 | 
						|
		case 6:
 | 
						|
			strcpy(tmp, "Layer2 Connecting");
 | 
						|
			break;
 | 
						|
 | 
						|
		case  7:
 | 
						|
			strcpy(tmp, "Auto SPID Stopped");
 | 
						|
			break;
 | 
						|
 | 
						|
		case  8:
 | 
						|
			strcpy(tmp, "Auto SPID Idle");
 | 
						|
			break;
 | 
						|
 | 
						|
		case  9:
 | 
						|
			strcpy(tmp, "Auto SPID Requested");
 | 
						|
			break;
 | 
						|
 | 
						|
		case  10:
 | 
						|
			strcpy(tmp, "Auto SPID Delivery");
 | 
						|
			break;
 | 
						|
 | 
						|
		case 11:
 | 
						|
			strcpy(tmp, "Auto SPID Complete");
 | 
						|
			break;
 | 
						|
 | 
						|
		default:
 | 
						|
			sprintf(tmp, "U:%d", (int)l2_state);
 | 
						|
		}
 | 
						|
		if (pLib->l2_trace == 1) {
 | 
						|
			pLib->l2_trace = 2;
 | 
						|
		} else {
 | 
						|
			diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
 | 
						|
		}
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!strncmp("Statistics\\Incoming Calls\\Calls", path, pVar->path_length) ||
 | 
						|
	    !strncmp("Statistics\\Incoming Calls\\Connected", path, pVar->path_length)) {
 | 
						|
		return (SuperTraceGetIncomingCallStatistics(pLib));
 | 
						|
	}
 | 
						|
 | 
						|
	if (!strncmp("Statistics\\Outgoing Calls\\Calls", path, pVar->path_length) ||
 | 
						|
	    !strncmp("Statistics\\Outgoing Calls\\Connected", path, pVar->path_length)) {
 | 
						|
		return (SuperTraceGetOutgoingCallStatistics(pLib));
 | 
						|
	}
 | 
						|
 | 
						|
	return (-1);
 | 
						|
}
 | 
						|
 | 
						|
static int diva_line_event(diva_strace_context_t *pLib, int Channel) {
 | 
						|
	pLib->pending_line_status |= (1L << (Channel - 1));
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
static int diva_modem_event(diva_strace_context_t *pLib, int Channel) {
 | 
						|
	pLib->pending_modem_status |= (1L << (Channel - 1));
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
static int diva_fax_event(diva_strace_context_t *pLib, int Channel) {
 | 
						|
	pLib->pending_fax_status |= (1L << (Channel - 1));
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Process INFO indications that arrive from the card
 | 
						|
  Uses path of first I.E. to detect the source of the
 | 
						|
  infication
 | 
						|
*/
 | 
						|
static int process_idi_info(diva_strace_context_t *pLib,
 | 
						|
			    diva_man_var_header_t *pVar) {
 | 
						|
	const char *path = (char *)&pVar->path_length + 1;
 | 
						|
	char name[64];
 | 
						|
	int i, len;
 | 
						|
 | 
						|
	/*
 | 
						|
	  First look for Modem Status Info
 | 
						|
	*/
 | 
						|
	for (i = pLib->Channels; i > 0; i--) {
 | 
						|
		len = sprintf(name, "State\\B%d\\Modem", i);
 | 
						|
		if (!strncmp(name, path, len)) {
 | 
						|
			return (diva_modem_info(pLib, i, pVar));
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  Look for Fax Status Info
 | 
						|
	*/
 | 
						|
	for (i = pLib->Channels; i > 0; i--) {
 | 
						|
		len = sprintf(name, "State\\B%d\\FAX", i);
 | 
						|
		if (!strncmp(name, path, len)) {
 | 
						|
			return (diva_fax_info(pLib, i, pVar));
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  Look for Line Status Info
 | 
						|
	*/
 | 
						|
	for (i = pLib->Channels; i > 0; i--) {
 | 
						|
		len = sprintf(name, "State\\B%d", i);
 | 
						|
		if (!strncmp(name, path, len)) {
 | 
						|
			return (diva_line_info(pLib, i, pVar));
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if (!diva_ifc_statistics(pLib, pVar)) {
 | 
						|
		return (0);
 | 
						|
	}
 | 
						|
 | 
						|
	return (-1);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  MODEM INSTANCE STATE UPDATE
 | 
						|
 | 
						|
  Update Modem Status Information and issue notification to user,
 | 
						|
  that will inform about change in the state of modem instance, that is
 | 
						|
  associuated with this channel
 | 
						|
*/
 | 
						|
static int diva_modem_info(diva_strace_context_t *pLib,
 | 
						|
			   int Channel,
 | 
						|
			   diva_man_var_header_t *pVar) {
 | 
						|
	diva_man_var_header_t *cur;
 | 
						|
	int i, nr = Channel - 1;
 | 
						|
 | 
						|
	for (i  = pLib->modem_parse_entry_first[nr];
 | 
						|
	     i <= pLib->modem_parse_entry_last[nr]; i++) {
 | 
						|
		if ((cur = find_var(pVar, pLib->parse_table[i].path))) {
 | 
						|
			if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) {
 | 
						|
				diva_trace_error(pLib, -3, __FILE__, __LINE__);
 | 
						|
				return (-1);
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			diva_trace_error(pLib, -2, __FILE__, __LINE__);
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  We do not use first event to notify user - this is the event that is
 | 
						|
	  generated as result of EVENT ON operation and is used only to initialize
 | 
						|
	  internal variables of application
 | 
						|
	*/
 | 
						|
	if (pLib->modem_init_event & (1L << nr)) {
 | 
						|
		diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE);
 | 
						|
	} else {
 | 
						|
		pLib->modem_init_event |= (1L << nr);
 | 
						|
	}
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
static int diva_fax_info(diva_strace_context_t *pLib,
 | 
						|
			 int Channel,
 | 
						|
			 diva_man_var_header_t *pVar) {
 | 
						|
	diva_man_var_header_t *cur;
 | 
						|
	int i, nr = Channel - 1;
 | 
						|
 | 
						|
	for (i  = pLib->fax_parse_entry_first[nr];
 | 
						|
	     i <= pLib->fax_parse_entry_last[nr]; i++) {
 | 
						|
		if ((cur = find_var(pVar, pLib->parse_table[i].path))) {
 | 
						|
			if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) {
 | 
						|
				diva_trace_error(pLib, -3, __FILE__, __LINE__);
 | 
						|
				return (-1);
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			diva_trace_error(pLib, -2, __FILE__, __LINE__);
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  We do not use first event to notify user - this is the event that is
 | 
						|
	  generated as result of EVENT ON operation and is used only to initialize
 | 
						|
	  internal variables of application
 | 
						|
	*/
 | 
						|
	if (pLib->fax_init_event & (1L << nr)) {
 | 
						|
		diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE);
 | 
						|
	} else {
 | 
						|
		pLib->fax_init_event |= (1L << nr);
 | 
						|
	}
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  LINE STATE UPDATE
 | 
						|
  Update Line Status Information and issue notification to user,
 | 
						|
  that will inform about change in the line state.
 | 
						|
*/
 | 
						|
static int diva_line_info(diva_strace_context_t *pLib,
 | 
						|
			  int Channel,
 | 
						|
			  diva_man_var_header_t *pVar) {
 | 
						|
	diva_man_var_header_t *cur;
 | 
						|
	int i, nr = Channel - 1;
 | 
						|
 | 
						|
	for (i = pLib->line_parse_entry_first[nr];
 | 
						|
	     i <= pLib->line_parse_entry_last[nr]; i++) {
 | 
						|
		if ((cur = find_var(pVar, pLib->parse_table[i].path))) {
 | 
						|
			if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) {
 | 
						|
				diva_trace_error(pLib, -3, __FILE__, __LINE__);
 | 
						|
				return (-1);
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			diva_trace_error(pLib, -2 , __FILE__, __LINE__);
 | 
						|
			return (-1);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  We do not use first event to notify user - this is the event that is
 | 
						|
	  generated as result of EVENT ON operation and is used only to initialize
 | 
						|
	  internal variables of application
 | 
						|
 | 
						|
	  Exception is is if the line is "online". In this case we have to notify
 | 
						|
	  user about this confition.
 | 
						|
	*/
 | 
						|
	if (pLib->line_init_event & (1L << nr)) {
 | 
						|
		diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE);
 | 
						|
	} else {
 | 
						|
		pLib->line_init_event |= (1L << nr);
 | 
						|
		if (strcmp(&pLib->lines[nr].Line[0], "Idle")) {
 | 
						|
			diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Move position to next vatianle in the chain
 | 
						|
*/
 | 
						|
static diva_man_var_header_t *get_next_var(diva_man_var_header_t *pVar) {
 | 
						|
	byte *msg = (byte *)pVar;
 | 
						|
	byte *start;
 | 
						|
	int msg_length;
 | 
						|
 | 
						|
	if (*msg != ESC) return NULL;
 | 
						|
 | 
						|
	start = msg + 2;
 | 
						|
	msg_length = *(msg + 1);
 | 
						|
	msg = (start + msg_length);
 | 
						|
 | 
						|
	if (*msg != ESC) return NULL;
 | 
						|
 | 
						|
	return ((diva_man_var_header_t *)msg);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Move position to variable with given name
 | 
						|
*/
 | 
						|
static diva_man_var_header_t *find_var(diva_man_var_header_t *pVar,
 | 
						|
				       const char *name) {
 | 
						|
	const char *path;
 | 
						|
 | 
						|
	do {
 | 
						|
		path = (char *)&pVar->path_length + 1;
 | 
						|
 | 
						|
		if (!strncmp(name, path, pVar->path_length)) {
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	} while ((pVar = get_next_var(pVar)));
 | 
						|
 | 
						|
	return (pVar);
 | 
						|
}
 | 
						|
 | 
						|
static void diva_create_line_parse_table(diva_strace_context_t *pLib,
 | 
						|
					 int Channel) {
 | 
						|
	diva_trace_line_state_t *pLine = &pLib->lines[Channel];
 | 
						|
	int nr = Channel + 1;
 | 
						|
 | 
						|
	if ((pLib->cur_parse_entry + LINE_PARSE_ENTRIES) >= pLib->parse_entries) {
 | 
						|
		diva_trace_error(pLib, -1, __FILE__, __LINE__);
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	pLine->ChannelNumber = nr;
 | 
						|
 | 
						|
	pLib->line_parse_entry_first[Channel] = pLib->cur_parse_entry;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Framing", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Framing[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Line", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Line[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Layer2", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Layer2[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Layer3", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Layer3[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Remote Address", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLine->RemoteAddress[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Remote SubAddr", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLine->RemoteSubAddress[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Local Address", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLine->LocalAddress[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Local SubAddr", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLine->LocalSubAddress[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\BC", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_BC;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\HLC", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_HLC;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\LLC", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_LLC;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Charges", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Charges;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Call Reference", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->CallReference;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Last Disc Cause", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLine->LastDisconnecCause;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\User ID", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->UserID[0];
 | 
						|
 | 
						|
	pLib->line_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
 | 
						|
}
 | 
						|
 | 
						|
static void diva_create_fax_parse_table(diva_strace_context_t *pLib,
 | 
						|
					int Channel) {
 | 
						|
	diva_trace_fax_state_t *pFax = &pLib->lines[Channel].fax;
 | 
						|
	int nr = Channel + 1;
 | 
						|
 | 
						|
	if ((pLib->cur_parse_entry + FAX_PARSE_ENTRIES) >= pLib->parse_entries) {
 | 
						|
		diva_trace_error(pLib, -1, __FILE__, __LINE__);
 | 
						|
		return;
 | 
						|
	}
 | 
						|
	pFax->ChannelNumber = nr;
 | 
						|
 | 
						|
	pLib->fax_parse_entry_first[Channel] = pLib->cur_parse_entry;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Event", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Event;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Page Counter", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Page_Counter;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Features", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Features;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Station ID", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Station_ID[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Subaddress", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Subaddress[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Password", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Password[0];
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Speed", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Speed;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Resolution", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Resolution;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Paper Width", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Paper_Width;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Paper Length", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Paper_Length;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Scanline Time", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Scanline_Time;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\FAX\\Disc Reason", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Disc_Reason;
 | 
						|
 | 
						|
	pLib->fax_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
 | 
						|
}
 | 
						|
 | 
						|
static void diva_create_modem_parse_table(diva_strace_context_t *pLib,
 | 
						|
					  int Channel) {
 | 
						|
	diva_trace_modem_state_t *pModem = &pLib->lines[Channel].modem;
 | 
						|
	int nr = Channel + 1;
 | 
						|
 | 
						|
	if ((pLib->cur_parse_entry + MODEM_PARSE_ENTRIES) >= pLib->parse_entries) {
 | 
						|
		diva_trace_error(pLib, -1, __FILE__, __LINE__);
 | 
						|
		return;
 | 
						|
	}
 | 
						|
	pModem->ChannelNumber = nr;
 | 
						|
 | 
						|
	pLib->modem_parse_entry_first[Channel] = pLib->cur_parse_entry;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Event", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Event;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Norm", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Norm;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Options", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Options;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\TX Speed", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->TxSpeed;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\RX Speed", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RxSpeed;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Roundtrip ms", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RoundtripMsec;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Symbol Rate", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->SymbolRate;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\RX Level dBm", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RxLeveldBm;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Echo Level dBm", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->EchoLeveldBm;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\SNR dB", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->SNRdb;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\MAE", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->MAE;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Local Retrains", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->LocalRetrains;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Remote Retrains", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RemoteRetrains;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Local Resyncs", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->LocalResyncs;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Remote Resyncs", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RemoteResyncs;
 | 
						|
 | 
						|
	sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
		"State\\B%d\\Modem\\Disc Reason", nr);
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->DiscReason;
 | 
						|
 | 
						|
	pLib->modem_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
 | 
						|
}
 | 
						|
 | 
						|
static void diva_create_parse_table(diva_strace_context_t *pLib) {
 | 
						|
	int i;
 | 
						|
 | 
						|
	for (i = 0; i < pLib->Channels; i++) {
 | 
						|
		diva_create_line_parse_table(pLib, i);
 | 
						|
		diva_create_modem_parse_table(pLib, i);
 | 
						|
		diva_create_fax_parse_table(pLib, i);
 | 
						|
	}
 | 
						|
 | 
						|
	pLib->statistic_parse_first = pLib->cur_parse_entry;
 | 
						|
 | 
						|
	/*
 | 
						|
	  Outgoing Calls
 | 
						|
	*/
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Outgoing Calls\\Calls");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.outg.Calls;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Outgoing Calls\\Connected");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.outg.Connected;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Outgoing Calls\\User Busy");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.outg.User_Busy;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Outgoing Calls\\No Answer");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.outg.No_Answer;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Outgoing Calls\\Wrong Number");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.outg.Wrong_Number;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Outgoing Calls\\Call Rejected");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.outg.Call_Rejected;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Outgoing Calls\\Other Failures");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.outg.Other_Failures;
 | 
						|
 | 
						|
	/*
 | 
						|
	  Incoming Calls
 | 
						|
	*/
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Incoming Calls\\Calls");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.inc.Calls;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Incoming Calls\\Connected");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.inc.Connected;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Incoming Calls\\User Busy");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.inc.User_Busy;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Incoming Calls\\Call Rejected");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.inc.Call_Rejected;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Incoming Calls\\Wrong Number");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.inc.Wrong_Number;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Incoming Calls\\Incompatible Dst");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.inc.Incompatible_Dst;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Incoming Calls\\Out of Order");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.inc.Out_of_Order;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Incoming Calls\\Ignored");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.inc.Ignored;
 | 
						|
 | 
						|
	/*
 | 
						|
	  Modem Statistics
 | 
						|
	*/
 | 
						|
	pLib->mdm_statistic_parse_first = pLib->cur_parse_entry;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Modem\\Disc Normal");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.mdm.Disc_Normal;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Modem\\Disc Unspecified");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.mdm.Disc_Unspecified;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Modem\\Disc Busy Tone");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.mdm.Disc_Busy_Tone;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Modem\\Disc Congestion");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.mdm.Disc_Congestion;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Modem\\Disc Carr. Wait");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.mdm.Disc_Carr_Wait;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Modem\\Disc Trn Timeout");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.mdm.Disc_Trn_Timeout;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Modem\\Disc Incompat.");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.mdm.Disc_Incompat;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Modem\\Disc Frame Rej.");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.mdm.Disc_Frame_Rej;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\Modem\\Disc V42bis");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.mdm.Disc_V42bis;
 | 
						|
 | 
						|
	pLib->mdm_statistic_parse_last  = pLib->cur_parse_entry - 1;
 | 
						|
 | 
						|
	/*
 | 
						|
	  Fax Statistics
 | 
						|
	*/
 | 
						|
	pLib->fax_statistic_parse_first = pLib->cur_parse_entry;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Normal");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Normal;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Not Ident.");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Not_Ident;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc No Response");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_No_Response;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Retries");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Retries;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Unexp. Msg.");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Unexp_Msg;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc No Polling.");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_No_Polling;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Training");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Training;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Unexpected");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Unexpected;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Application");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Application;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Incompat.");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Incompat;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc No Command");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_No_Command;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Long Msg");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Long_Msg;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Supervisor");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Supervisor;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc SUB SEP PWD");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_SUB_SEP_PWD;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Invalid Msg");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Invalid_Msg;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Page Coding");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Page_Coding;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc App Timeout");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_App_Timeout;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\FAX\\Disc Unspecified");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.fax.Disc_Unspecified;
 | 
						|
 | 
						|
	pLib->fax_statistic_parse_last  = pLib->cur_parse_entry - 1;
 | 
						|
 | 
						|
	/*
 | 
						|
	  B-Layer1"
 | 
						|
	*/
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer1\\X-Frames");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b1.X_Frames;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer1\\X-Bytes");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b1.X_Bytes;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer1\\X-Errors");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b1.X_Errors;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer1\\R-Frames");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b1.R_Frames;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer1\\R-Bytes");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b1.R_Bytes;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer1\\R-Errors");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b1.R_Errors;
 | 
						|
 | 
						|
	/*
 | 
						|
	  B-Layer2
 | 
						|
	*/
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer2\\X-Frames");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b2.X_Frames;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer2\\X-Bytes");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b2.X_Bytes;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer2\\X-Errors");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b2.X_Errors;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer2\\R-Frames");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b2.R_Frames;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer2\\R-Bytes");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b2.R_Bytes;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\B-Layer2\\R-Errors");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.b2.R_Errors;
 | 
						|
 | 
						|
	/*
 | 
						|
	  D-Layer1
 | 
						|
	*/
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer1\\X-Frames");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d1.X_Frames;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer1\\X-Bytes");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d1.X_Bytes;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer1\\X-Errors");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d1.X_Errors;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer1\\R-Frames");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d1.R_Frames;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer1\\R-Bytes");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d1.R_Bytes;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer1\\R-Errors");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d1.R_Errors;
 | 
						|
 | 
						|
	/*
 | 
						|
	  D-Layer2
 | 
						|
	*/
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer2\\X-Frames");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d2.X_Frames;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer2\\X-Bytes");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d2.X_Bytes;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer2\\X-Errors");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d2.X_Errors;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer2\\R-Frames");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d2.R_Frames;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer2\\R-Bytes");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d2.R_Bytes;
 | 
						|
 | 
						|
	strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
 | 
						|
	       "Statistics\\D-Layer2\\R-Errors");
 | 
						|
	pLib->parse_table[pLib->cur_parse_entry++].variable = \
 | 
						|
		&pLib->InterfaceStat.d2.R_Errors;
 | 
						|
 | 
						|
 | 
						|
	pLib->statistic_parse_last  = pLib->cur_parse_entry - 1;
 | 
						|
}
 | 
						|
 | 
						|
static void diva_trace_error(diva_strace_context_t *pLib,
 | 
						|
			     int error, const char *file, int line) {
 | 
						|
	if (pLib->user_proc_table.error_notify_proc) {
 | 
						|
		(*(pLib->user_proc_table.error_notify_proc))(\
 | 
						|
			pLib->user_proc_table.user_context,
 | 
						|
			&pLib->instance, pLib->Adapter,
 | 
						|
			error, file, line);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Delivery notification to user
 | 
						|
*/
 | 
						|
static void diva_trace_notify_user(diva_strace_context_t *pLib,
 | 
						|
				   int Channel,
 | 
						|
				   int notify_subject) {
 | 
						|
	if (pLib->user_proc_table.notify_proc) {
 | 
						|
		(*(pLib->user_proc_table.notify_proc))(pLib->user_proc_table.user_context,
 | 
						|
						       &pLib->instance,
 | 
						|
						       pLib->Adapter,
 | 
						|
						       &pLib->lines[Channel],
 | 
						|
						       notify_subject);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Read variable value to they destination based on the variable type
 | 
						|
*/
 | 
						|
static int diva_trace_read_variable(diva_man_var_header_t *pVar,
 | 
						|
				    void *variable) {
 | 
						|
	switch (pVar->type) {
 | 
						|
	case 0x03: /* MI_ASCIIZ - syting                               */
 | 
						|
		return (diva_strace_read_asz(pVar, (char *)variable));
 | 
						|
	case 0x04: /* MI_ASCII  - string                               */
 | 
						|
		return (diva_strace_read_asc(pVar, (char *)variable));
 | 
						|
	case 0x05: /* MI_NUMBER - counted sequence of bytes            */
 | 
						|
		return (diva_strace_read_ie(pVar, (diva_trace_ie_t *)variable));
 | 
						|
	case 0x81: /* MI_INT    - signed integer                       */
 | 
						|
		return (diva_strace_read_int(pVar, (int *)variable));
 | 
						|
	case 0x82: /* MI_UINT   - unsigned integer                     */
 | 
						|
		return (diva_strace_read_uint(pVar, (dword *)variable));
 | 
						|
	case 0x83: /* MI_HINT   - unsigned integer, hex representetion */
 | 
						|
		return (diva_strace_read_uint(pVar, (dword *)variable));
 | 
						|
	case 0x87: /* MI_BITFLD - unsigned integer, bit representation */
 | 
						|
		return (diva_strace_read_uint(pVar, (dword *)variable));
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  This type of variable is not handled, indicate error
 | 
						|
	  Or one problem in management interface, or in application recodeing
 | 
						|
	  table, or this application should handle it.
 | 
						|
	*/
 | 
						|
	return (-1);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Read signed integer to destination
 | 
						|
*/
 | 
						|
static int diva_strace_read_int(diva_man_var_header_t *pVar, int *var) {
 | 
						|
	byte *ptr = (char *)&pVar->path_length;
 | 
						|
	int value;
 | 
						|
 | 
						|
	ptr += (pVar->path_length + 1);
 | 
						|
 | 
						|
	switch (pVar->value_length) {
 | 
						|
	case 1:
 | 
						|
		value = *(char *)ptr;
 | 
						|
		break;
 | 
						|
 | 
						|
	case 2:
 | 
						|
		value = (short)GET_WORD(ptr);
 | 
						|
		break;
 | 
						|
 | 
						|
	case 4:
 | 
						|
		value = (int)GET_DWORD(ptr);
 | 
						|
		break;
 | 
						|
 | 
						|
	default:
 | 
						|
		return (-1);
 | 
						|
	}
 | 
						|
 | 
						|
	*var = value;
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
static int diva_strace_read_uint(diva_man_var_header_t *pVar, dword *var) {
 | 
						|
	byte *ptr = (char *)&pVar->path_length;
 | 
						|
	dword value;
 | 
						|
 | 
						|
	ptr += (pVar->path_length + 1);
 | 
						|
 | 
						|
	switch (pVar->value_length) {
 | 
						|
	case 1:
 | 
						|
		value = (byte)(*ptr);
 | 
						|
		break;
 | 
						|
 | 
						|
	case 2:
 | 
						|
		value = (word)GET_WORD(ptr);
 | 
						|
		break;
 | 
						|
 | 
						|
	case 3:
 | 
						|
		value  = (dword)GET_DWORD(ptr);
 | 
						|
		value &= 0x00ffffff;
 | 
						|
		break;
 | 
						|
 | 
						|
	case 4:
 | 
						|
		value = (dword)GET_DWORD(ptr);
 | 
						|
		break;
 | 
						|
 | 
						|
	default:
 | 
						|
		return (-1);
 | 
						|
	}
 | 
						|
 | 
						|
	*var = value;
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Read zero terminated ASCII string
 | 
						|
*/
 | 
						|
static int diva_strace_read_asz(diva_man_var_header_t *pVar, char *var) {
 | 
						|
	char *ptr = (char *)&pVar->path_length;
 | 
						|
	int length;
 | 
						|
 | 
						|
	ptr += (pVar->path_length + 1);
 | 
						|
 | 
						|
	if (!(length = pVar->value_length)) {
 | 
						|
		length = strlen(ptr);
 | 
						|
	}
 | 
						|
	memcpy(var, ptr, length);
 | 
						|
	var[length] = 0;
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Read counted (with leading length byte) ASCII string
 | 
						|
*/
 | 
						|
static int diva_strace_read_asc(diva_man_var_header_t *pVar, char *var) {
 | 
						|
	char *ptr = (char *)&pVar->path_length;
 | 
						|
 | 
						|
	ptr += (pVar->path_length + 1);
 | 
						|
	memcpy(var, ptr + 1, *ptr);
 | 
						|
	var[(int)*ptr] = 0;
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Read one information element - i.e. one string of byte values with
 | 
						|
  one length byte in front
 | 
						|
*/
 | 
						|
static int diva_strace_read_ie(diva_man_var_header_t *pVar,
 | 
						|
			       diva_trace_ie_t *var) {
 | 
						|
	char *ptr = (char *)&pVar->path_length;
 | 
						|
 | 
						|
	ptr += (pVar->path_length + 1);
 | 
						|
 | 
						|
	var->length = *ptr;
 | 
						|
	memcpy(&var->data[0], ptr + 1, *ptr);
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceSetAudioTap(void *hLib, int Channel, int on) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
 | 
						|
	if ((Channel < 1) || (Channel > pLib->Channels)) {
 | 
						|
		return (-1);
 | 
						|
	}
 | 
						|
	Channel--;
 | 
						|
 | 
						|
	if (on) {
 | 
						|
		pLib->audio_tap_mask |=  (1L << Channel);
 | 
						|
	} else {
 | 
						|
		pLib->audio_tap_mask &= ~(1L << Channel);
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  EYE patterns have TM_M_DATA set as additional
 | 
						|
	  condition
 | 
						|
	*/
 | 
						|
	if (pLib->audio_tap_mask) {
 | 
						|
		pLib->trace_event_mask |= TM_M_DATA;
 | 
						|
	} else {
 | 
						|
		pLib->trace_event_mask &= ~TM_M_DATA;
 | 
						|
	}
 | 
						|
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceSetBChannel(void *hLib, int Channel, int on) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
 | 
						|
	if ((Channel < 1) || (Channel > pLib->Channels)) {
 | 
						|
		return (-1);
 | 
						|
	}
 | 
						|
	Channel--;
 | 
						|
 | 
						|
	if (on) {
 | 
						|
		pLib->bchannel_trace_mask |=  (1L << Channel);
 | 
						|
	} else {
 | 
						|
		pLib->bchannel_trace_mask &= ~(1L << Channel);
 | 
						|
	}
 | 
						|
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceSetDChannel(void *hLib, int on) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
 | 
						|
	if (on) {
 | 
						|
		pLib->trace_event_mask |= (TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1);
 | 
						|
	} else {
 | 
						|
		pLib->trace_event_mask &= ~(TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1);
 | 
						|
	}
 | 
						|
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceSetInfo(void *hLib, int on) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
 | 
						|
	if (on) {
 | 
						|
		pLib->trace_event_mask |= TM_STRING;
 | 
						|
	} else {
 | 
						|
		pLib->trace_event_mask &= ~TM_STRING;
 | 
						|
	}
 | 
						|
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceClearCall(void *hLib, int Channel) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
 | 
						|
	if ((Channel < 1) || (Channel > pLib->Channels)) {
 | 
						|
		return (-1);
 | 
						|
	}
 | 
						|
	Channel--;
 | 
						|
 | 
						|
	pLib->clear_call_command |= (1L << Channel);
 | 
						|
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Parse and update cumulative statistice
 | 
						|
*/
 | 
						|
static int diva_ifc_statistics(diva_strace_context_t *pLib,
 | 
						|
			       diva_man_var_header_t *pVar) {
 | 
						|
	diva_man_var_header_t *cur;
 | 
						|
	int i, one_updated = 0, mdm_updated = 0, fax_updated = 0;
 | 
						|
 | 
						|
	for (i  = pLib->statistic_parse_first; i <= pLib->statistic_parse_last; i++) {
 | 
						|
		if ((cur = find_var(pVar, pLib->parse_table[i].path))) {
 | 
						|
			if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) {
 | 
						|
				diva_trace_error(pLib, -3 , __FILE__, __LINE__);
 | 
						|
				return (-1);
 | 
						|
			}
 | 
						|
			one_updated = 1;
 | 
						|
			if ((i >= pLib->mdm_statistic_parse_first) && (i <= pLib->mdm_statistic_parse_last)) {
 | 
						|
				mdm_updated = 1;
 | 
						|
			}
 | 
						|
			if ((i >= pLib->fax_statistic_parse_first) && (i <= pLib->fax_statistic_parse_last)) {
 | 
						|
				fax_updated = 1;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	  We do not use first event to notify user - this is the event that is
 | 
						|
	  generated as result of EVENT ON operation and is used only to initialize
 | 
						|
	  internal variables of application
 | 
						|
	*/
 | 
						|
	if (mdm_updated) {
 | 
						|
		diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_NOTIFY_MDM_STAT_CHANGE);
 | 
						|
	} else if (fax_updated) {
 | 
						|
		diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE);
 | 
						|
	} else if (one_updated) {
 | 
						|
		diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_NOTIFY_STAT_CHANGE);
 | 
						|
	}
 | 
						|
 | 
						|
	return (one_updated ? 0 : -1);
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceGetOutgoingCallStatistics(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	pLib->outgoing_ifc_stats = 1;
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceGetIncomingCallStatistics(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	pLib->incoming_ifc_stats = 1;
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceGetModemStatistics(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	pLib->modem_ifc_stats = 1;
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceGetFaxStatistics(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	pLib->fax_ifc_stats = 1;
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceGetBLayer1Statistics(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	pLib->b1_ifc_stats = 1;
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceGetBLayer2Statistics(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	pLib->b2_ifc_stats = 1;
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceGetDLayer1Statistics(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	pLib->d1_ifc_stats = 1;
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
static int SuperTraceGetDLayer2Statistics(void *hLib) {
 | 
						|
	diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 | 
						|
	pLib->d2_ifc_stats = 1;
 | 
						|
	return (ScheduleNextTraceRequest(pLib));
 | 
						|
}
 | 
						|
 | 
						|
dword DivaSTraceGetMemotyRequirement(int channels) {
 | 
						|
	dword parse_entries = (MODEM_PARSE_ENTRIES + FAX_PARSE_ENTRIES + \
 | 
						|
			       STAT_PARSE_ENTRIES + \
 | 
						|
			       LINE_PARSE_ENTRIES + 1) * channels;
 | 
						|
	return (sizeof(diva_strace_context_t) + \
 | 
						|
		(parse_entries * sizeof(diva_strace_path2action_t)));
 | 
						|
}
 |