home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 21
/
CD_ASCQ_21_040595.iso
/
dos
/
prg
/
pas
/
nwtp06
/
nwmess.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-03-01
|
10KB
|
309 lines
{$X+,B-,V-} {essential compiler directives}
UNIT nwMess;
{ nwMess unit as of 950301 / NwTP 0.6 API. (c) 1993,1995, R.Spronk }
INTERFACE
Uses nwIntr,nwMisc;
{ Primary functions: Interrupt: comments:
* BroadcastToConsole (F215/09)
* GetBroadcastMessage (F215/01)
* GetBroadcastMode (DE..(..04))
* SendBroadcastMessage (F215/00)
* SendConsoleBroadcast (F217/D1)
* SetBroadcastMode (DE..(..0x)), x= 0,1,2,3
Secondary Functions:
* SendMessageToUser
Not implemented:
- CheckPipeStatus (F215/08) (1)
- CloseMessagePipe (F215/07) (1)
- DisableStationBroadcast (F215/02) (3)
- EnableStationBroadcast (F215/03) (3)
- GetPersonalMessage (F215/05) (1)
- LogNetworkMessage (F215/0D) (2)
- OpenMessagePipe (F215/06) (1)
- SendPersonalMessage (F215/04) (1)
Notes:
(1) These calls are NOT supported by Netware 386 versions shipped after
December 1990, because they use pipe mechanisms, which cause a
considerable deal of server overhead.
These functions are not implemented in this unit.
Use IPX/SPX peer-to-peer communication instead (nwIPX,nwSPX,nwPEP).
(2) Network msg file no longer supported by 3.x
(3) Not supported by Netware 3.x. Use SetBroadcastMode instead.
}
Var result:word;
{F215/09 [2.15c+]}
Function BroadcastToConsole(message:string):boolean;
{ broadcast a message to the file server console. }
{F215/01 [2.15c+]}
Function GetBroadcastMessage(var bmessage: string):boolean;
{ Reads a broadcast message strored at server }
{DE..(..04) [1.x/2.x/ 3.x]}
Function GetBroadcastMode(var bmode:byte):boolean;
{ Returns the message mode. }
{F215/00 [2.15c+]}
Function SendBroadcastMessage( message:string;
connCount:byte;
connList:TconnectionList;
VAR resultlist:TconnectionList ):boolean;
{ Sends a broadcast message to a number of logical connections. }
{DE..(..0n) n=0,1,2,3 [1.x/2.x/3.x]}
Function SetBroadcastMode(bmode:byte):boolean;
{F217/D1 [2.15c+]}
Function SendConsoleBroadcast(message:string; connCount:byte;
connList:TconnectionList ):boolean;
{ Sends a message to a number of connections, as if the message was send
by a console broadcast command. Console oprator privileges required. }
{--------------------Secondary Functions-------------------------------}
Procedure SendMessageToUser(UserName,Message:String);
{ sends a message to a (group of) users.
The username may contain wildcards (* and ?).
The message will not be received by stations whose status is CASTOFF.}
IMPLEMENTATION {============================================================}
USES nwConn;
{DE..(..04) [1.x/2.x/ 3.x]}
Function GetBroadcastMode(var bmode:byte):boolean;
{ Returns the message mode.
00 Server Stores : Netware Messages and User Messages,
Shell automaticly displays messages.
01 Server Stores : Server Messages. (User messages discarded)
Shell automaticly displays messages.
02 Server stores : Server messages only.
Applications have to use GetBroadCastMessage to see if there is a message.
03 Server stores : Server messages and User messages.
Applications have to use GetBroadCastMessage to see if there is a message. }
var regs : TTregisters;
begin
regs.ah := $de;
regs.dl := $04;
RealModeIntr($21,regs);
bmode := regs.al;
result:=$00; { the call has no return codes }
GetBroadCastMode:=True;
end;
{DE..(..0n) n=0,1,2,3 [1.x/2.x/3.x]}
Function SetBroadcastMode(bmode:byte):boolean;
{ Sets the new message mode.
possible resultcode: $FF ( illegal broadcastmode supplied or
the broadcastmode after the call is not equal
to the intended broadcast mode )
00 Server Stores : Netware Messages and User Messages,
Shell automaticly displays messages.
01 Server Stores : Server Messages. (User messages discarded)
Shell automaticly displays messages.
02 Server stores : Server messages only.
Applications have to use GetBroadCastMessage to see if there is a message.
03 Server stores : Server messages and User messages.
Applications have to use GetBroadCastMessage to see if there is a message. }
var regs : TTregisters;
begin
if (bmode <4)
then begin
regs.ah := $de;
regs.dl := bmode;
RealModeIntr($21,regs);
if regs.al<>bmode { if confirmation of new mode unequal desired mode }
then result:=$FF
else result:=$00;
end
else result:=$FF;
SetBroadcastMode:=(result=0);
end;
{F215/01 [2.15c+]}
Function GetBroadcastMessage(var bmessage: string):boolean;
{ An application should poll this to see if there is a broadcastmessage
stored (for this workstation) at the default server.
The message mode must be 2 or 3. (No Notification by Shell)
If no message was stored at the server, or the message was empty,
this function will return FALSE and an errorcode of $103. }
Type Treq=record
len :word;
subF :byte;
end;
Trep=record
_message:string[55];
end;
TPreq=^Treq;
TPrep=^Trep;
BEGIN
With TPreq(GlobalreqBuf)^
do begin
subF:=$01;
len:=1;
end;
F2SystemCall($15,sizeOf(Treq),sizeOf(Trep),result);
If result=0
then bmessage:=TPrep(GlobalReplyBuf)^._message;
if bmessage[0]=#0 then result:=$103; { whups! empty message }
GetBroadCastMessage:=(result=0);
{ returncodes:
00 Successful; FC Message Queue Full;
FE I/O failure: Lack of dynamic workspace.
103 No msgs stored at server. }
end;
{F215/00 [2.15c+]}
Function SendBroadcastMessage( message:string;
connCount:byte;
connList:TconnectionList;
VAR resultlist:TconnectionList ):boolean;
{ Sends a broadcast message to a number of logical connections.
The connectionlist is an array[1..connCount] of logical connection numbers,
the result of the broadcast can be found in the resultList parameter.
example:
connCount=5
connList= [ 4,9,1,5,2 ]
resultList= [$00, $00, $FC, $FD, $FF]
possible codes in resultList:
$00: broadcast to this logical connnection was successful.
$FC: message rejected, buffer for this station already contains a message,
$FD: invalid connection number
$FF: The target connection has blocked incoming messages,
or the target connection is not in use. }
Type Treq=record
len :word;
subF :byte;
_connCount :byte;
connLandMessage:array[1..306] of byte; { 250 conn, 56 msg }
end;
Trep=record
connCount:byte;
_ResultList:TconnectionList;
end;
TPreq=^Treq;
TPrep=^Trep;
Var t:byte;
BEGIN
With TPreq(GlobalReqBuf)^
do begin
subF:=$00;
_connCount:=connCount;
move(connList[1],connLandMessage[1],connCount);
t:=ord(message[0]); if t>55 then t:=55;
move(message[0],connLandMessage[connCount+1],t+1);
len:=3+connCount+t; { 2 bytes + [connList] + len(str) + str[0] }
end;
F2SystemCall($15,sizeOf(Treq),sizeOf(Trep),result);
If result=0
then with TPrep(GlobalReplyBuf)^
do resultList:=_resultlist;
SendBroadcastMessage:=(result=0);
end;
{F215/09 [2.15c+]}
Function BroadcastToConsole(message:string):boolean;
{ broadcast a message to the file server console.
The message (max 60 chars, in ascii range [$20..$7E]) will be displayed
at the bottom of the console screen.
This function truncates the messagelength to 60 and repaces illegal
characters with a . }
Type Treq=record
len :word;
subF :byte;
_message :string;
end;
TPreq=^Treq;
Var t:byte;
BEGIN
With TPreq(GlobalReqBuf)^
do begin
subF:=$09;
PstrCopy(_message,message,60);
for t:=1 to 60
do if (_message[t]<>#$0) and
((_message[t]<#$20) or (_message[t]>#$7E))
then _message[t]:='.';
len:=62;
end;
F2SystemCall($15,sizeOf(Treq),0,result);
BroadcastToConsole:=(result=0);
{ resultcodes: 00 success ; $FC message queue full ;
$FE I/O failure: lack of dynamic workspace }
end;
{F217/D1 [2.15c+]}
Function SendConsoleBroadcast(message:string; connCount:byte;
connList:TconnectionList ):boolean;
{Sends a message to a number of connections, as if the message was send
by a console oprator. Console operator privileges required.
If connCount equals 0, then the message is send to all connections. }
Type Treq=record
len :word;
subF :byte;
_ConnCount:byte;
_connAndMess:array[1..306] of byte;
end;
TPreq=^Treq;
Var t:byte;
BEGIN
With TPreq(GlobalReqBuf)^
do begin
subF:=$D1;
_connCount:=connCount;
Move(connList[1],_connAndMess[1],connCount);
t:=ord(message[0]); if t>55 then t:=55;
{!! to do: strip hi-bit of message.. }
Move(message[0],_connAndMess[connCount+1],t+1);
len:=t+connCount+3;
end;
F2SystemCall($17,sizeOf(Treq),0,result);
SendConsoleBroadcast:=(result=0);
{Resultcodes: $00 success; $C6 No Console Rights}
end;
{=================== Secondary Functions ===================================}
Procedure SendMessageToUser(UserName,Message:String);
{ sends a message to a (group of) users.
The username may contain wildcards (* and ?).
The message will not be received by stations whose status is CASTOFF.}
{ calls nwConn.getObjectConnectionNumber and nwMess.SendBroadcastMessage }
Var NbrOfConn:byte;
connList,ResultList:TconnectionList;
begin
IF NwConn.GetObjectConnectionNumbers(UserName,1 {OT_USER},NbrOfConn,connList)
AND (NbrOfConn>0)
then SendBroadcastMessage(Message,NbrOfConn,connList,ResultList);
end;
end. {unit nwMess}