// ===================================================
// Листинг 29. Прием сообщений
//
// Файл msgrcv\msgrcv.cpp
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

#define WORD unsigned int
#define BYTE unsigned char


extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int GetBroadcastMessage(char*);
extern "C" BYTE GetBroadcastMode(void);
extern "C" void SetBroadcastMode(BYTE);

void main(void) {

	char MajorVersion=0;
	char MinorVersion=0;
	char Revision=0;

	BYTE OldBroadcastMode;
	char MessageBuffer[56];
	int ccode;

	printf("\n*MSGRCV* (C) Frolov A., 1993\n");

// Проверяем присутствие сетевой оболочки

	asm push si
	GetNetWareShellVersion(&MajorVersion,
			&MinorVersion, &Revision);
	asm pop si

	if(MajorVersion == 0) {
		printf("\nОболочка NetWare не загружена\n");
		return;
	}

// Сохраняем старый режим приема сообщений

	OldBroadcastMode = GetBroadcastMode();


// Устанавливаем режим, при котором сообщения от
// файл-сервера и пользователей записываются в
// буфер, но автоматически не отображаются

	SetBroadcastMode(3);

// Ожидаем прихода сообщения

	for(;;) {

// Извлекаем сообщение из буфера

		ccode = GetBroadcastMessage(MessageBuffer);
		if(ccode) break;

// Если сообщение есть в буфере, выводим его

		if(MessageBuffer[0] != '\0') {
			printf(">>> %s\n", MessageBuffer);
		}

// Если оператор нажал на любую клавишу,
// завершаем работу программы

		if(kbhit()) break;
	}

// Восстанавливаем старый режим приема сообщений

	SetBroadcastMode(OldBroadcastMode);
}