mirror of git://vps1.g8bpq.net/linbpq
parent
74c5d023fd
commit
098dc645bb
@ -1 +0,0 @@
|
||||
12
|
||||
@ -1 +0,0 @@
|
||||
12
|
||||
@ -1,111 +0,0 @@
|
||||
#ifndef TELNETSERVER
|
||||
#define TELNETSERVER
|
||||
|
||||
#ifndef LINBPQ
|
||||
//#include "resource.h"
|
||||
#endif
|
||||
#define WSA_ACCEPT WM_USER + 1
|
||||
#define WSA_CONNECT WM_USER + 2
|
||||
#define WSA_DATA WM_USER + 3
|
||||
|
||||
#define InputBufferLen 100000
|
||||
|
||||
struct ConnectionInfo
|
||||
{
|
||||
int Number; // Number of record - for Connections display
|
||||
SOCKET socket;
|
||||
union
|
||||
{
|
||||
struct sockaddr_in6 sin6;
|
||||
struct sockaddr_in sin;
|
||||
};
|
||||
BOOL SocketActive;
|
||||
int BPQStream;
|
||||
char Callsign[10];
|
||||
BOOL GotHeader;
|
||||
unsigned char InputBuffer[InputBufferLen];
|
||||
int InputLen;
|
||||
struct UserRec * UserPointer;
|
||||
int Retries;
|
||||
int LoginState; // 1 = user ok, 2 = password ok
|
||||
BOOL DoingCommand; // Processing Telnet Command
|
||||
BOOL DoEcho; // Telnet Echo option accepted
|
||||
BOOL CMSSession; // Set if connect to CMS
|
||||
BOOL FBBMode; // Pure TCP for FBB forwarding
|
||||
BOOL NeedLF; // FBB mode, but with cr > crlf outbound
|
||||
BOOL RelayMode; // Pure TCP for RMS Relay Emulation forwarding
|
||||
BOOL DRATSMode; // HTML Terminal Emulator
|
||||
BOOL SyncMode; // RMS Relay Sync
|
||||
BOOL HTTPMode; // HTTP Server
|
||||
BOOL APIMode; // REST API Server
|
||||
BOOL TriMode; // Trimode emulation
|
||||
BOOL TriModeConnected; // Set when remote session is connected - now send data to DataSock
|
||||
SOCKET TriModeDataSock; // Data Socket
|
||||
BOOL Auth; // Set if User is flagged as a Secure User
|
||||
BOOL BPQTermMode; // Set if connected to BPQTermTCP
|
||||
BOOL ClientSession; // Set if acting as a client (ie Linux HOST Mode)
|
||||
BOOL MonitorNODES; // Monitor Control Flags
|
||||
unsigned long long MMASK;
|
||||
BOOL MCOM;
|
||||
BOOL MonitorColour;
|
||||
BOOL MTX;
|
||||
BOOL MUIOnly;
|
||||
int CMSIndex; // Pointer to CMS used for this connect
|
||||
UCHAR * FromHostBuffer; // Somewhere to store msg from CMS - it sends the whole message at once
|
||||
int FromHostBufferSize;
|
||||
int FromHostBuffPutptr;
|
||||
int FromHostBuffGetptr;
|
||||
|
||||
struct TNCINFO * TNC; // Used to pass TCP struct to http code (for passwood list)
|
||||
|
||||
time_t ConnectTime;
|
||||
BOOL UTF8; // Set if BPQTerminal in UTF8 Mode
|
||||
BOOL RelaySession; // Set if connection to RMS Relay
|
||||
BOOL LogonSent; // To ignore second callsign: prompt
|
||||
char Signon[100]; // User/Pass/Appl for Outgoing Connects
|
||||
BOOL Keepalive; // For HOST (esp CCC) Keepalives
|
||||
time_t LastSendTime;
|
||||
BOOL NoCallsign; // Don't Send Callsign to host if no Signon
|
||||
UCHAR * ResendBuffer; // Used if send() returns EWOULDBLOCK
|
||||
int ResendLen; // Len to resend
|
||||
|
||||
struct ADIF * ADIF; // ADIF Logging info
|
||||
int WebSocks;
|
||||
char WebURL[32]; // URL for WebSocket Connection
|
||||
int WebSecure; // Set if secure session
|
||||
};
|
||||
|
||||
|
||||
#define Disconnect(stream) SessionControl(stream,2,0)
|
||||
#define Connect(stream) SessionControl(stream,1,0)
|
||||
|
||||
#define SE 240 // End of subnegotiation parameters
|
||||
#define NOP 241 //No operation
|
||||
#define xDM 242 //Data mark Indicates the position of a Synch event within the data stream. This should always be accompanied by a TCP urgent notification.
|
||||
#define BRK 243 //Break Indicates that the "break" or "attention" key was hi.
|
||||
#define IPx 244 //Suspend Interrupt or abort the process to which the NVT is connected.
|
||||
#define AO 245 //Abort output Allows the current process to run to completion but does not send its output to the user.
|
||||
#define AYT 246 //Are you there Send back to the NVT some visible evidence that the AYT was received.
|
||||
#define EC 247 //Erase character The receiver should delete the last preceding undeleted character from the data stream.
|
||||
#define EL 248 //Erase line Delete characters from the data stream back to but not including the previous CRLF.
|
||||
#define GA 249 //Go ahead Under certain circumstances used to tell the other end that it can transmit.
|
||||
#define SB 250 //Subnegotiation Subnegotiation of the indicated option follows.
|
||||
#define WILL 251 //will Indicates the desire to begin performing, or confirmation that you are now performing, the indicated option.
|
||||
#define WONT 252 //wont Indicates the refusal to perform, or continue performing, the indicated option.
|
||||
#define DOx 253 //do Indicates the request that the other party perform, or confirmation that you are expecting the other party to perform, the indicated option.
|
||||
#define DONT 254 //dont Indicates the demand that the other party stop performing, or confirmation that you are no longer expecting the other party to perform, the indicated option.
|
||||
#define IAC 255
|
||||
|
||||
#define suppressgoahead 3 //858
|
||||
#define xStatus 5 //859
|
||||
#define echo 1 //857
|
||||
#define timingmark 6 //860
|
||||
#define terminaltype 24 //1091
|
||||
#define windowsize 31 //1073
|
||||
#define terminalspeed 32 //1079
|
||||
#define remoteflowcontrol 33 //1372
|
||||
#define linemode 34 //1184
|
||||
#define environmentvariables 36 //1408
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,963 +0,0 @@
|
||||
//
|
||||
// Common definitons for Pactor-like Modules
|
||||
|
||||
#include "kernelresource.h"
|
||||
|
||||
#include "rigcontrol.h"
|
||||
|
||||
#define MAXBLOCK 4096
|
||||
|
||||
#define MAXFREQS 20 // RigControl freqs to scan
|
||||
|
||||
extern char HFCTEXT[81];
|
||||
extern int HFCTEXTLEN;
|
||||
|
||||
extern HANDLE hInstance;
|
||||
|
||||
extern HMENU hMainFrameMenu;
|
||||
extern HMENU hWndMenu;
|
||||
|
||||
/*
|
||||
struct WL2KInfo
|
||||
{
|
||||
struct WL2KInfo * Next;
|
||||
|
||||
char * Host;
|
||||
short WL2KPort;
|
||||
|
||||
char RMSCall[10];
|
||||
char BaseCall[10];
|
||||
char GridSquare[7];
|
||||
char Times[80];
|
||||
char ServiceCode[17];
|
||||
|
||||
BOOL UseRigCtrlFreqs;
|
||||
char WL2KFreq[12];
|
||||
char WL2KMode; // WL2K reporting mode
|
||||
char WL2KModeChar; // W or N
|
||||
BOOL DontReportNarrowOnWideFreqs;
|
||||
|
||||
// char NARROWMODE;
|
||||
// char WIDEMODE; // Mode numbers to report to WL2K
|
||||
|
||||
// struct WL2KInfo WL2KInfoList[MAXFREQS]; // Freqs for sending to WL2K
|
||||
|
||||
int Freq;
|
||||
char Bandwidth;
|
||||
// char * TimeList; // eg 06-10,12-15
|
||||
int mode; // see below (an integer)
|
||||
int baud; // see below (an integer)
|
||||
int power; // actual power if known, default to 100 for HF, 30 for VHF/UHF (an integer)
|
||||
int height; // antenna height in feet if known, default to 25
|
||||
int gain; // antenna gain if known, default to 0
|
||||
int direction; // primary antenna direction in degrees if known, use 000 for omni (an integer)
|
||||
BOOL RPonPTC; // Set if scanning for Robust Packet on a PTC
|
||||
};
|
||||
|
||||
*/
|
||||
#pragma pack(1)
|
||||
|
||||
// AGWPE Header Structure
|
||||
|
||||
struct AGWHEADER
|
||||
{
|
||||
UCHAR Port;
|
||||
UCHAR filler1[3];
|
||||
char DataKind;
|
||||
UCHAR filler2;
|
||||
unsigned char PID;
|
||||
UCHAR filler3;
|
||||
unsigned char callfrom[10];
|
||||
unsigned char callto[10];
|
||||
int DataLength;
|
||||
int reserved;
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
// Telnet Server User Record
|
||||
|
||||
struct UserRec
|
||||
{
|
||||
char * Callsign;
|
||||
char * UserName;
|
||||
char * Password;
|
||||
char * Appl; // Autoconnect APPL
|
||||
BOOL Secure; // Authorised User
|
||||
};
|
||||
|
||||
struct LOCALNET
|
||||
{
|
||||
struct LOCALNET * Next;
|
||||
uint32_t Network;
|
||||
uint32_t Mask;
|
||||
};
|
||||
|
||||
|
||||
#define MaxCMS 10 // Number of addresses we can keep - currently 4 are used.
|
||||
|
||||
struct TCPINFO
|
||||
{
|
||||
int NumberofUsers;
|
||||
struct UserRec ** UserRecPtr;
|
||||
int CurrentConnections;
|
||||
|
||||
struct UserRec RelayUser;
|
||||
|
||||
int CurrentSockets;
|
||||
|
||||
int TCPPort;
|
||||
int FBBPort[100];
|
||||
int RelayPort;
|
||||
int HTTPPort;
|
||||
int APIPort;
|
||||
int TriModePort;
|
||||
int SyncPort;
|
||||
int SNMPPort;
|
||||
int DRATSPort;
|
||||
int CMDPort[33];
|
||||
char RELAYHOST[64];
|
||||
char CMSServer[64];
|
||||
BOOL FallbacktoRelay; // Use Relsy if can't connect to CMS
|
||||
|
||||
BOOL IPV4; // Allow Connect using IPV4
|
||||
BOOL IPV6; // Allow Connect using IPV6
|
||||
BOOL CMS; // Allow Connect to CMS
|
||||
BOOL CMSOK; // Internet link is ok.
|
||||
BOOL UseCachedCMSAddrs;
|
||||
struct in_addr CMSAddr[MaxCMS];
|
||||
BOOL CMSFailed[MaxCMS]; // Set if connect to CMS failed.
|
||||
char * CMSName[MaxCMS]; // Reverse DNS Name of Server
|
||||
int NumberofCMSAddrs;
|
||||
int NextCMSAddr; // Round Robin Pointer
|
||||
int CheckCMSTimer; // CMS Poll Timer
|
||||
|
||||
char SecureCMSPassword[80]; // For Secure CMS Signin
|
||||
char GatewayCall[10]; // Call for CMS access
|
||||
char GatewayLoc[10]; // Loc - Needed to report Hybrid Mode
|
||||
int ReportHybrid; // Report as Hybrod Station
|
||||
char * HybridServiceCode;
|
||||
char * HybridFrequencies;
|
||||
char * HybridCoLocatedRMS;
|
||||
|
||||
BOOL DisconnectOnClose;
|
||||
|
||||
char PasswordMsg[100];
|
||||
|
||||
char cfgHOSTPROMPT[100];
|
||||
|
||||
char cfgCTEXT[300];
|
||||
|
||||
char cfgLOCALECHO[100];
|
||||
|
||||
int MaxSessions;
|
||||
|
||||
char LoginMsg[100];
|
||||
|
||||
char RelayAPPL[20];
|
||||
char SyncAPPL[20];
|
||||
|
||||
SOCKET TCPSock;
|
||||
SOCKET FBBsock[100];
|
||||
SOCKET Relaysock;
|
||||
SOCKET HTTPsock;
|
||||
SOCKET APIsock;
|
||||
SOCKET TriModeSock;
|
||||
SOCKET TriModeDataSock;
|
||||
SOCKET Syncsock;
|
||||
SOCKET DRATSsock;
|
||||
SOCKET SNMPsock;
|
||||
|
||||
struct ConnectionInfo * TriModeControlSession;
|
||||
SOCKET sock6;
|
||||
SOCKET FBBsock6[100];
|
||||
SOCKET Relaysock6;
|
||||
SOCKET HTTPsock6;
|
||||
SOCKET APIsock6;
|
||||
SOCKET Syncsock6;
|
||||
SOCKET DRATSsock6;
|
||||
|
||||
fd_set ListenSet;
|
||||
SOCKET maxsock;
|
||||
|
||||
HMENU hActionMenu;
|
||||
HMENU hLogMenu;
|
||||
HMENU hDisMenu; // Disconnect Menu Handle
|
||||
HWND hCMSWnd;
|
||||
|
||||
int SecureTelnet;
|
||||
int ReportRelayTraffic; // Send WL2K Reports for Relay Traffic
|
||||
|
||||
char * WebTermCSS; // css override for web terminal
|
||||
struct LOCALNET * LocalNets;
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct STREAMINFO
|
||||
{
|
||||
// TRANSPORTENTRY * AttachedSession;
|
||||
|
||||
void * PACTORtoBPQ_Q; // Frames for BPQ
|
||||
void * BPQtoPACTOR_Q; // Frames for PACTOR
|
||||
int FramesOutstanding; // Frames Queued - used for flow control
|
||||
int FramesQueued; // Frames Queued - used for flow control
|
||||
BOOL InternalCmd; // Last Command was generated internally
|
||||
int IntCmdDelay; // To limit internal commands
|
||||
BOOL CheckingCall; // Set on PTC if waiting for I response after a Connect RXed
|
||||
|
||||
BOOL Attached; // Set what attached to a BPQ32 stream
|
||||
BOOL Connected; // When set, all data is passed as data instead of commands
|
||||
BOOL Connecting; // Set when Outward Connect in progress
|
||||
BOOL Disconnecting; // Set when disconnect in progress
|
||||
// Used when appplication disconnects the bpq session, and
|
||||
// prevents new attaches while a dirty disconnect is in progress
|
||||
int DisconnectingTimeout; // A hard disconnect occurs if this expires before the disconnect complete
|
||||
int ReportDISC; // Need to report an incoming DISC to kernel
|
||||
BOOL DiscWhenAllSent; // Close session when all msgs have been sent to node
|
||||
BOOL ARQENDSent; // Set when V4 ARQEND Sent
|
||||
|
||||
int DEDStream; // Stream number for DED interface (same as index except for pactor)
|
||||
|
||||
char MyCall[10] ; // Call we are using
|
||||
char RemoteCall[10]; // Callsign
|
||||
|
||||
char callingCall[10]; // for reporting. Link and Our calls depand on which end connected
|
||||
char receivingCall[10]; // for reporting. Link and Our calls depand on which end connected
|
||||
char Direction[4]; // In or Out
|
||||
|
||||
|
||||
|
||||
char AGWKey[21]; // Session Key for AGW Session Based Drivers
|
||||
|
||||
time_t ConnectTime; // Time connection made
|
||||
time_t AttachTime;
|
||||
|
||||
int bytesTXed;
|
||||
int BytesAcked;
|
||||
int bytesRXed;
|
||||
int PacketsSent;
|
||||
int BytesResent;
|
||||
int BytesOutstanding; // For Packet Channels
|
||||
|
||||
UCHAR PTCStatus0; // Status Bytes
|
||||
UCHAR PTCStatus1; // Status Bytes
|
||||
UCHAR PTCStatus2; // Status Bytes
|
||||
UCHAR PTCStatus3; // Status Bytes
|
||||
|
||||
char * CmdSet; // A series of commands to send to the TNC
|
||||
char * CmdSave; // Base address for free
|
||||
|
||||
struct ConnectionInfo * ConnectionInfo; // TCP Server Connection Info
|
||||
|
||||
int TimeInRX; // Too long in send mode timer
|
||||
int NeedDisc; // Timer to send DISC if appl not available
|
||||
|
||||
BOOL NoCMSFallback; // Dont use relay if CMS not available
|
||||
struct ARQINFO * ARQInfo; // FLDIGI/FLARQ Stream Mode Specific Data
|
||||
|
||||
HWND xIDC_MYCALL;
|
||||
HWND xIDC_DESTCALL;
|
||||
HWND xIDC_STATUS;
|
||||
HWND xIDC_SEND;
|
||||
HWND xIDC_RXED;
|
||||
HWND xIDC_RESENT;
|
||||
HWND xIDC_ACKED;
|
||||
HWND xIDC_DIRN;
|
||||
|
||||
int RelaySyncStream;
|
||||
int VaraACMode;
|
||||
};
|
||||
|
||||
typedef struct AGWINFO
|
||||
{
|
||||
// Fields for AGW Session based Ports (eg UZ7HO Modem)
|
||||
|
||||
struct AGWHEADER TXHeader;
|
||||
struct AGWHEADER RXHeader;
|
||||
int MaxSessions;
|
||||
int ConnTimeOut;
|
||||
int PollDelay;
|
||||
time_t LastParamTime;
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
// For selecting UZ7HO Mode and Freq
|
||||
|
||||
COMBOBOXINFO cbinfo; // UZ7HO Modem Combo Box info
|
||||
HWND hFreq; // UZ7HO Frequency Box
|
||||
HWND hSpin; // UZ7HO Spin Button
|
||||
|
||||
#endif
|
||||
|
||||
int isQTSM; // Flag to Identify QtSM
|
||||
|
||||
int CenterFreq;
|
||||
int Modem; // Modem number in list
|
||||
char ModemName[20];
|
||||
unsigned char Version[4];
|
||||
unsigned char fx25Flags;
|
||||
unsigned char il2pFlags;
|
||||
unsigned char il2pcrc;
|
||||
|
||||
} *PAGWINFO;
|
||||
|
||||
typedef struct ARQINFO
|
||||
{
|
||||
// Fields for FLDIGI/FLARQ Ports
|
||||
|
||||
// Max window is 64, though often will use less
|
||||
|
||||
char OurStream;
|
||||
char FarStream;
|
||||
|
||||
PMSGWITHLEN TXHOLDQ[64]; // Frames waiting ACK
|
||||
PMSGWITHLEN RXHOLDQ[64]; // Frames waiting missing frames.
|
||||
|
||||
int TXWindow;
|
||||
int RXWindow;
|
||||
int MaxBlock; // Max sending block size
|
||||
|
||||
int TXSeq;
|
||||
int TXLastACK; // Last frame ACK'ed
|
||||
|
||||
int RXHighest;
|
||||
int RXNext;
|
||||
int RXNoGaps;
|
||||
|
||||
int Retries;
|
||||
int NoAckRetries; // Status received but no data acked
|
||||
int ARQTimer;
|
||||
int ARQState;
|
||||
|
||||
#define ARQ_ACTIVE 1 // Have a session of some type
|
||||
|
||||
int ARQTimerState;
|
||||
|
||||
#define ARQ_CONNECTING 1
|
||||
#define ARQ_CONNECTACK 2
|
||||
#define ARQ_DISC 3
|
||||
#define ARQ_WAITACK 4
|
||||
#define ARQ_WAITDATA 5 // Waiting for more data before polling
|
||||
|
||||
char LastMsg[80]; // Last message sent that expects an ack
|
||||
int LastLen;
|
||||
char TXMsg[80]; // Message to aend after TXDELAY
|
||||
int TXLen;
|
||||
int TurnroundTimer; // RX to TX delay.
|
||||
int TXDelay;
|
||||
|
||||
} *ARQINFO;
|
||||
|
||||
typedef struct FLINFO
|
||||
{
|
||||
// Fields for MPSK Session Ports )
|
||||
|
||||
BOOL TX; // Set when FLDigi is transmitting
|
||||
char DefaultMode[64]; // Mode to return to after session
|
||||
int DefaultFreq; // Freq to return to after session
|
||||
BOOL Beacon; // Use ALE Beacons
|
||||
char LastXML[128]; // Last XML Request Sent
|
||||
int XMLControl; // Controlls polling FLDigi by XML
|
||||
int CmdControl; // Controlls polling FLDigi by KISS Command
|
||||
BOOL FLARQ; // Connection from FLARQ
|
||||
BOOL Busy;
|
||||
BOOL CONOK; // Allow incoming connects
|
||||
BOOL KISSMODE; // Using KISS instead of socket interface
|
||||
BOOL RAW; // Raw (ARQ Socket or KISS RAW, depening on above)
|
||||
int CenterFreq;
|
||||
char CurrentMode[20]; // Mode to return to after session
|
||||
int Responding; // If FLDigi is responding to conmands
|
||||
BOOL MCASTMODE; // If port is in MCAST RX MOde
|
||||
|
||||
} *FLINFO;
|
||||
|
||||
typedef struct MPSKINFO
|
||||
{
|
||||
// Fields for MPSK Session Ports )
|
||||
|
||||
int ConnTimeOut;
|
||||
BOOL TX; // Set when Multipsk is transmitting
|
||||
char DefaultMode[20]; // Mode to return to after session
|
||||
BOOL Beacon; // Use ALE Beacons
|
||||
int MaxSessions;
|
||||
} *MPSKINFO;
|
||||
|
||||
struct FreeDataINFO
|
||||
{
|
||||
int startingTNC;
|
||||
int TNCRunning;
|
||||
int Conecting;
|
||||
int Connected;
|
||||
char ourCall[10];
|
||||
char toCall[10];
|
||||
char farCall[10]; // TNC Call
|
||||
char useBaseCall; // Use base call (without ssid) for TNC Call
|
||||
char * Capture; // Capture Device Name
|
||||
char * Playback; // Playback Device Name
|
||||
char * hamlibHost;
|
||||
int hamlibPort;
|
||||
|
||||
unsigned char toSendData[8192]; // Buffer data from node for more efficiency
|
||||
int toSendCount;
|
||||
int toSendTimeout;
|
||||
unsigned char toSendMsg[256]; // Buffer data from node for more efficiency
|
||||
int toSendMsgCount;
|
||||
int toSendMsgTimeout;
|
||||
char * RXDir; // Directory for Received Files
|
||||
int CONOK; // Virtual Lisren Flag
|
||||
int Chat; // In Chat Mode
|
||||
char ChatCall[10];
|
||||
int needPoll; // Set if get data needed
|
||||
int arqstate; // 1 = Disc / 2 - connecting 3 - connected
|
||||
int TuningRange; // Must be 50, 100, 150, 200, 250
|
||||
int LimitBandWidth;
|
||||
int TXLevel;
|
||||
int Explorer; // Enable reporting to Freedata Explorer
|
||||
char SSIDList[256];
|
||||
char * SSIDS[16];
|
||||
};
|
||||
|
||||
struct sixPackInfo;
|
||||
|
||||
typedef struct TNCINFO
|
||||
{
|
||||
HWND hDlg; // Status Window Handle
|
||||
int (FAR * WebWindowProc)(struct TNCINFO * TNC, char * Buff, BOOL LOCAL); // Routine to build web status window
|
||||
int WebWinX;
|
||||
int WebWinY; // Size of window
|
||||
char * WebBuffer; // Buffer for logs
|
||||
int RigControlRow; // Rig Control Line in Dialog
|
||||
struct _EXTPORTDATA * PortRecord; // BPQ32 port record for this port
|
||||
struct RIGINFO * RIG; // Pointer to Rig Control RIG record for RX or Both
|
||||
struct RIGINFO * TXRIG; // Pointer to Rig Control RIG record for TX
|
||||
char * InitScript; // Initialisation Commands
|
||||
int InitScriptLen; // Length
|
||||
time_t SessionTimeLimit; // Optional limit to total session time
|
||||
time_t DefaultSessionTimeLimit; // Configured value
|
||||
|
||||
time_t AttachTimeLimit; // to trap port left attached for a long time without other activity
|
||||
time_t AttachTime;
|
||||
|
||||
int Hardware; // Hardware Type
|
||||
|
||||
#define H_WINMOR 1
|
||||
#define H_SCS 2
|
||||
#define H_KAM 3
|
||||
#define H_AEA 4
|
||||
#define H_HAL 5
|
||||
#define H_TELNET 6
|
||||
#define H_TRK 7
|
||||
#define H_TRKM 7
|
||||
#define H_V4 8
|
||||
#define H_UZ7HO 9
|
||||
#define H_MPSK 10
|
||||
#define H_FLDIGI 11
|
||||
#define H_UIARQ 12
|
||||
#define H_ARDOP 13
|
||||
#define H_VARA 14
|
||||
#define H_SERIAL 15
|
||||
#define H_KISSHF 16
|
||||
#define H_WINRPR 17
|
||||
#define H_HSMODEM 18
|
||||
#define H_FREEDATA 19
|
||||
#define H_SIXPACK 20
|
||||
|
||||
|
||||
int Port; // BPQ Port Number
|
||||
|
||||
struct RIGINFO DummyRig; // Used if not using Rigcontrol
|
||||
|
||||
BOOL Minimized; // Start Minimized flag
|
||||
|
||||
void * WINMORtoBPQ_Q; // Frames for BPQ, indexed by BPQ Port
|
||||
void * BPQtoWINMOR_Q; // Frames for WINMOR. indexed by WINMOR port. Only used it TCP session is blocked
|
||||
|
||||
SOCKET TCPSock; // Control Socket
|
||||
SOCKET TCPDataSock; // Data Socket
|
||||
SOCKET PacketSock; // Packet Over TCP (ARDOP)
|
||||
|
||||
char * WINMORSignon; // Pointer to message for secure signin
|
||||
char * HostName; // WINMOR Host - may be dotted decimal or DNS Name
|
||||
int TCPPort; //
|
||||
int PacketPort; // Packet Over TCP (ARDOP)
|
||||
char * ApplCmd; // Application to connect to on incoming connect (null = leave at command handler)
|
||||
BOOL SwallowSignon; // Set to suppress *** connected to APPL
|
||||
|
||||
union
|
||||
{
|
||||
UCHAR TCPBuffer[1000]; // For converting byte stream to messages
|
||||
UCHAR DEDBuffer[1000]; // For converting byte stream to messages
|
||||
UCHAR KISSBuffer[1000]; // For KISS over Host Mode
|
||||
};
|
||||
|
||||
UCHAR * ARDOPBuffer; // Needs to be pretty big, so Malloc
|
||||
UCHAR * ARDOPDataBuffer; // Needs to be pretty big, so Malloc
|
||||
|
||||
int InputLen; // Data we have already = Offset of end of an incomplete packet;
|
||||
int DataInputLen; // Data we have already = Offset of end of an incomplete packet;
|
||||
int KISSInputLen; // Data we have already = Offset of end of an incomplete packet;
|
||||
int ESCFLAG; // KISS Escape received
|
||||
|
||||
int MSGCOUNT; // DED WORKING FIELD
|
||||
int MSGLENGTH; // DED Msg Len
|
||||
int MSGCHANNEL; // DED Msg Channel Number
|
||||
int MSGTYPE; // DED Msg Type
|
||||
|
||||
int HOSTSTATE; // ded HOST state machine
|
||||
|
||||
|
||||
BOOL StartSent; // Codec Start send (so will get a disconnect)
|
||||
int ConnectPending; // Set if Connect Pending Received. If so, mustn't allow freq change.
|
||||
BOOL GavePermission; // Set if we allowed freq change
|
||||
BOOL DiscPending; // Set if Disconnect Pending Received. So we can time out stuck in Disconnecting
|
||||
BOOL HadConnect; // Flag to say have been in session
|
||||
BOOL FECMode; // In FEC Mode
|
||||
BOOL FEC1600; // Use 1600 Hz FEC Mode
|
||||
int FECIDTimer; // Time in FEC Mode. Used to trigger ID broadcasts
|
||||
BOOL RestartAfterFailure;
|
||||
BOOL StartInRobust; // For WINMOR, set to Robust Mode for first few packets
|
||||
|
||||
int Busy; // Channel Busy Timer/Counter . Non-zero = Busy
|
||||
|
||||
int BusyFlags; // Channel Busy Flags
|
||||
|
||||
#define CDBusy 1 // For WINMOR - reported busy (set till reported clear)
|
||||
#define PTTBusy 2 // PTT Active
|
||||
|
||||
BOOL FECPending; // Need an FEC Send when channel is next idle
|
||||
|
||||
time_t lasttime;
|
||||
|
||||
BOOL CONNECTING; // TCP Session Flags
|
||||
BOOL CONNECTED;
|
||||
BOOL Alerted; // Connect Failed Prompt sent
|
||||
BOOL DATACONNECTING;
|
||||
BOOL DATACONNECTED;
|
||||
|
||||
BOOL TNCCONNECTING; // For FreeData
|
||||
BOOL TNCCONNECTED;
|
||||
|
||||
BOOL QtSMConnected;
|
||||
|
||||
char NodeCall[10]; // Call we listen for (PORTCALL or NODECALL
|
||||
char CurrentMYC[10]; // Save current call so we don't change it unnecessarily
|
||||
char * LISTENCALLS; // Calls TNC will respond to (currently only for VARA)
|
||||
|
||||
char TargetCall[10]; // Call incoming connect is addressed to (for appl call support)
|
||||
|
||||
struct sockaddr_in destaddr;
|
||||
struct sockaddr_in Datadestaddr;
|
||||
|
||||
int PTTMode; // PTT Mode Flags
|
||||
int PTTState; // Current State
|
||||
uint64_t PTTActivemS; // For Stats
|
||||
uint64_t PTTonTime; //
|
||||
|
||||
uint64_t BusyActivemS; // For channel busy stats
|
||||
uint64_t BusyonTime;
|
||||
|
||||
char PTTOn[60]; // Port override of RIGCONTROL config
|
||||
char PTTOff[60];
|
||||
int PTTOnLen;
|
||||
int PTTOffLen;
|
||||
|
||||
int TXRadio; // Rigcontrol Radio Number for TX
|
||||
int RXRadio; // Rigcontrol Radio Number for RX
|
||||
|
||||
long long int TXFreq; // Freq to set on tx before ptt
|
||||
double ActiveTXFreq; // Freq to set on tx after attach
|
||||
double ActiveRXFreq; // Freq to set on rx after attach
|
||||
|
||||
double DefaultTXFreq; // Freq to set on tx after close
|
||||
double DefaultRXFreq; // Freq to set on rx after close
|
||||
|
||||
char ** DisconnectScript; // May replace above 2 params
|
||||
|
||||
int TXOffset; // Correction to TXFreq
|
||||
|
||||
int PID; // Process ID for Software TNC
|
||||
HWND hWnd; // Main window handle for Software TNC
|
||||
|
||||
char * CaptureDevices;
|
||||
char * PlaybackDevices;
|
||||
char * ProgramPath;
|
||||
BOOL WeStartedTNC;
|
||||
|
||||
int Restarts; // TNC Kill/Restarts done
|
||||
time_t LastRestart;
|
||||
|
||||
int TimeSinceLast; // Time since last message from TNC (10ths of a sec)
|
||||
int HeartBeat;
|
||||
|
||||
// int Interlock; // Port Interlock Group
|
||||
|
||||
HWND hMonitor; // Handle to Monitor control
|
||||
// HMENU hPopMenu; // Actions Menu Handle
|
||||
|
||||
int MaxConReq; // For ARDOP
|
||||
int BusyHold; // Hold Time from SCS reporting channel free till we call
|
||||
int BusyWait; // Time to wait for clear channel before connect
|
||||
|
||||
BOOL OverrideBusy;
|
||||
int BusyDelay; // Timer for busy timeout
|
||||
int AutoStartDelay; // Time to wait for TNC to start
|
||||
char * ConnectCmd; // Saved command if waiting for busy to clear
|
||||
BOOL UseAPPLCalls; // Robust Packet to use Applcalls
|
||||
BOOL UseAPPLCallsforPactor; // Pactor to use Applcalls
|
||||
|
||||
// Fields for reporting to WL2K Map
|
||||
|
||||
struct WL2KInfo * WL2K;
|
||||
|
||||
/*
|
||||
char * Host;
|
||||
short WL2KPort;
|
||||
|
||||
int UpdateWL2KTimer;
|
||||
BOOL UpdateWL2K;
|
||||
char RMSCall[10];
|
||||
char BaseCall[10];
|
||||
char GridSquare[7];
|
||||
char Comment[80];
|
||||
char ServiceCode[17];
|
||||
|
||||
BOOL UseRigCtrlFreqs;
|
||||
char WL2KFreq[12];
|
||||
char WL2KModeChar; // W or N
|
||||
BOOL DontReportNarrowOnWideFreqs;
|
||||
|
||||
// char NARROWMODE;
|
||||
// char WIDEMODE; // Mode numbers to report to WL2K
|
||||
|
||||
struct WL2KInfo WL2KInfoList[MAXFREQS]; // Freqs for sending to WL2K
|
||||
*/
|
||||
char WL2KMode; // WL2K reporting mode
|
||||
|
||||
struct STREAMINFO Streams[27]; // 0 is Pactor 1 - 10 are ax.25.
|
||||
int LastStream; // Last one polled for status or send
|
||||
|
||||
void * BPQtoRadio_Q; // Frames to Rig Interface
|
||||
void * RadiotoBPQ_Q; // Frames from Rig Interface
|
||||
|
||||
void * KISSTX_Q; // Frames to Host Mode KISS interface
|
||||
struct PORTCONTROL * VirtualPORT; // Pointer to Virtual Packet Port of Host Mode KISS
|
||||
|
||||
char * InitPtr; // Next Command
|
||||
int ReinitState; // Reinit State Machine
|
||||
int ReinitCount; // Count for DED Recovery
|
||||
int TermReinitCount; // Count for DED Term Mode Recovery
|
||||
BOOL TNCOK; // TNC is reponding
|
||||
int FramesOutstanding; // Frames Queued - used for flow control
|
||||
BOOL InternalCmd; // Last Command was generated internally
|
||||
int IntCmdDelay; // To limit internal commands
|
||||
|
||||
|
||||
HANDLE hDevice;
|
||||
int ReopenTimer; // Used to reopen device if failed (eg USB port removed)
|
||||
BOOL HostMode; // Set if in DED Host Mode
|
||||
// BOOL CRCMode; // Set if using SCS Extended DED Mode (JHOST4)
|
||||
BOOL UsingTermMode; // Set if tnc should be left in term mode
|
||||
int Timeout; // Timeout response counter
|
||||
int Retries;
|
||||
int Window; // Window Size for ARQ
|
||||
UCHAR TXBuffer[500]; // Last message sent - saved for Retry
|
||||
int TXLen; // Len of last sent
|
||||
UCHAR RXBuffer[520]; // Message being received - may not arrive all at once
|
||||
UINT RXLen; // Data in RXBUffer
|
||||
UCHAR Toggle; // Sequence bit
|
||||
int Buffers; // Free buffers in TNC
|
||||
BOOL WantToChangeFreq; // Request from Scanner to Change
|
||||
int OKToChangeFreq; // 1 = SCS Says OK to change, -1 = Dont Change zero = still waiting
|
||||
BOOL DontWantToChangeFreq; // Change done - ok to SCS
|
||||
BOOL DontReleasePermission; // Hold Permission to prevent calls on this frequency
|
||||
time_t TimeEnteredSYNCMode; // To detect scan lock when using applcalls on PTC
|
||||
BOOL SyncSupported; // TNC reports sync
|
||||
time_t TimeScanLocked; // ditto for TNCs that don't report SYNC
|
||||
int PTCStatus; // Sync, Idle, Traffic, etc
|
||||
UCHAR NexttoPoll[20]; // Streams with data outstanding (from General Poll)
|
||||
BOOL PollSent; // Toggle to ensure we issue a general poll regularly
|
||||
int StreamtoPoll;
|
||||
|
||||
char Bandwidth; // Currently set Mode W or N
|
||||
|
||||
int Mode; // Mode Flag
|
||||
|
||||
BOOL Dragon; // Set if P4Dragon
|
||||
BOOL DragonSingle; // Set if P4Dragon using Pactor and Packet on same port
|
||||
BOOL DragonKISS; // Set if P4Dragon supports sending KISS frames in Hostmode
|
||||
BOOL EnterExit; // Switching to Term mode to change bandwidth
|
||||
int PktStream; // Stream in use for Packet when in single port mode
|
||||
BOOL MaxLevel; // Pactor Level to set for Wide Mode (3 or 4)
|
||||
int MinLevel; // Mimimum accepted Pactor Level
|
||||
int MinLevelTimer; // Time left to achieve Min Level
|
||||
int PacketChannels;
|
||||
int RobustTime; // For PTC, Spend this part of scan cycle (in 10th secs) in Robust Packet Mode
|
||||
int SwitchToPactor; // Countdown to switch
|
||||
|
||||
BOOL OldMode; // Use PACTOR instead of TOR (for old software)
|
||||
BOOL VeryOldMode; // Use MYCALL instead of MYPTCALL (for old software)
|
||||
|
||||
int Mem1; // Free Bytes (VHF /HF)
|
||||
int Mem2;
|
||||
|
||||
BOOL HFPacket; // Set if HF port is in Packet mode instead of Pactor Mode
|
||||
BOOL Robust; // Set if SCS Tracker is in Robust Packet mode or WINMOR TNC is in Robust Mode
|
||||
BOOL RobustDefault; // Set if SCS Tracker default is Robust Packet mode
|
||||
BOOL ForceRobust; // Don't allow Normal Packet even if scan requests it.
|
||||
BOOL TeensyRPR; // Teensy RPR TNC - don't send %R
|
||||
char NormSpeed[8]; // Speed Param for Normal Packet on Tracker
|
||||
char RobustSpeed[8]; // Speed Param for Robust Packet on Tracker
|
||||
BOOL RPBEACON; // Send Beacon after each session
|
||||
|
||||
int TimeInRX; // Time waiting for ISS before sending
|
||||
char TXRXState; // Current ISS/IRS State
|
||||
|
||||
BOOL NeedPACTOR; // Set if need to send PACTOR to put into Standby Mode
|
||||
int CmdStream; // Stream last command was issued on
|
||||
|
||||
union
|
||||
{
|
||||
struct TCPINFO * TCPInfo; // Telnet Server Specific Data
|
||||
struct AGWINFO * AGWInfo; // AGW Stream Mode Specific Data
|
||||
struct MPSKINFO * MPSKInfo; // MPSK Stream Mode Specific Data
|
||||
struct FLINFO * FLInfo; // FLDIGI Stream Mode Specific Data
|
||||
};
|
||||
|
||||
struct ARQINFO * ARQInfo; // FLDIGI/FLARQ Stream Mode Specific Data
|
||||
|
||||
BOOL DataBusy; // Waiting for Data Ack - Don't send any more data
|
||||
BOOL CommandBusy; // Waiting for Command ACK
|
||||
|
||||
BOOL TEXTMODE; // Set if AEA in text mode
|
||||
BOOL NeedTurnRound; // Set if we have sent data, so need to send ctrl/z
|
||||
BOOL NeedTRANS; // Set if we have to send TRANS when ctrl/z is acked.
|
||||
|
||||
char * CmdSet; // A series of commands to send to the TNC
|
||||
char * CmdSave; // Base address for free
|
||||
|
||||
BOOL PktUpdateMap; // Set if Packet MH data to be sent to NodeMap
|
||||
|
||||
int DefaultMode;
|
||||
int CurrentMode; // Used on HAL
|
||||
|
||||
char * DefaultRadioCmd; // RADIO command to send at end of session
|
||||
char * Frequency;
|
||||
// For Mode Map if no Rigcontrol
|
||||
// Mode Equates
|
||||
|
||||
#define Clover 'C'
|
||||
#define Pactor 'P'
|
||||
#define AMTOR 'A'
|
||||
|
||||
UCHAR DataBuffer[500]; // Data Chars split from received stream
|
||||
UCHAR CmdBuffer[500]; // Cmd/Response chars split from received stream
|
||||
int DataLen; // Data in DataBuffer
|
||||
int CmdLen; // Data in CmdBuffer
|
||||
BOOL CmdEsc; // Set if last char rxed was 0x80
|
||||
BOOL DataEsc; // Set if last char rxed was 0x81
|
||||
int PollDelay; // Don't poll too often;
|
||||
int InData; // FLDigi - MCAST <....> received
|
||||
int InPacket; // FLDigi - SOH or < received.
|
||||
int MCASTLen; // Data still to get
|
||||
|
||||
int DataMode; // How to treat data
|
||||
|
||||
#define RXDATA 0x30 // Switch to Receive Data characters
|
||||
#define TXDATA 0x31 // Switch to Transmit Data characters
|
||||
#define SECDATA 0x32 // Switch to RX data from secondary port
|
||||
|
||||
int TXMode; // Where to send data
|
||||
|
||||
#define TXMODEM 0x33 // Send TX data to modem
|
||||
#define TXSEC 0x34 // Send TX data to secondary port
|
||||
|
||||
BOOL XONXOFF; // Set if hardware is using XON/XOFF
|
||||
|
||||
double LastFreq; // Used by V4 to see if freq has changed
|
||||
int ModemCentre; // Modem centre frequency
|
||||
int ClientHeight;
|
||||
int ClientWidth;
|
||||
HWND xIDC_TNCSTATE;
|
||||
HWND xIDC_COMMSSTATE;
|
||||
HWND xIDC_MODE;
|
||||
HWND xIDC_LEDS;
|
||||
HWND xIDC_TRAFFIC;
|
||||
HWND xIDC_BUFFERS;
|
||||
HWND xIDC_CHANSTATE;
|
||||
HWND xIDC_LEVELS;
|
||||
HWND xIDC_STATE;
|
||||
HWND xIDC_TXRX;
|
||||
HWND xIDC_PROTOSTATE;
|
||||
HWND xIDC_RESTARTTIME;
|
||||
HWND xIDC_RESTARTS;
|
||||
HWND xIDC_PACTORLEVEL;
|
||||
HWND xIDC_TXTUNE;
|
||||
HWND xIDC_TXTUNEVAL;
|
||||
|
||||
char * WEB_TNCSTATE;
|
||||
char * WEB_COMMSSTATE;
|
||||
char * WEB_MODE;
|
||||
char * WEB_LEDS;
|
||||
char * WEB_TRAFFIC;
|
||||
char * WEB_BUFFERS;
|
||||
char * WEB_CHANSTATE;
|
||||
char * WEB_STATE;
|
||||
char * WEB_TXRX;
|
||||
char * WEB_PROTOSTATE;
|
||||
char * WEB_RESTARTTIME;
|
||||
char * WEB_RESTARTS;
|
||||
char * WEB_PACTORLEVEL;
|
||||
char * WEB_LEVELS;
|
||||
int WEB_CHANGED; // Used to speed up refresh when active
|
||||
|
||||
HMENU hMenu;
|
||||
HMENU hWndMenu;
|
||||
|
||||
VOID (* SuspendPortProc) (struct TNCINFO * TNC, struct TNCINFO * ThisTNC);
|
||||
VOID (* ReleasePortProc) (struct TNCINFO * TNC);
|
||||
VOID (* ForcedCloseProc) (struct TNCINFO * TNC, int Stream);
|
||||
|
||||
time_t WinmorRestartCodecTimer;
|
||||
int WinmorCurrentMode;
|
||||
char ARDOPCurrentMode[10];
|
||||
char ARDOPCommsMode;
|
||||
char * ARDOPSerialPort; // Have Bus/Device for I2C
|
||||
int ARDOPSerialSpeed;
|
||||
BOOL TCPCONNECTED; // ARDOP over TCP Connected
|
||||
int SlowTimer;
|
||||
int ARQPorts[32]; // For ARQ over KISS
|
||||
char * LogPath;
|
||||
FILE * LogHandle; // Ardop Logging File
|
||||
FILE * DebugHandle; // Ardop Debug File
|
||||
char LastLogType; // For split packets
|
||||
|
||||
UCHAR * ARDOPAPRS; // Used to reconstruct APRS datagram from FEC packets
|
||||
int ARDOPAPRSLen;
|
||||
|
||||
BOOL WRITELOG; // Enable debug logging
|
||||
int InputLevelMin; // Sound card levels
|
||||
int InputLevelMax; // Sound card levels
|
||||
|
||||
int DiscardNextOK; // Used by VARA to suppress OK response to LISTEN commands
|
||||
int SeenCancelPending; // Used by VARA to suppress duplicate cancel pendings
|
||||
|
||||
MESSAGE * Monframe; // Used by DED Host for receiving Packet Monitor Frame
|
||||
// split over 2 packets
|
||||
|
||||
struct HSMODEMINFO * HSModemInfo;
|
||||
struct FreeDataINFO * FreeDataInfo;
|
||||
|
||||
int DontRestart; // Don't automatically restart failed TNC
|
||||
int SendTandRtoRelay; // Send T and R suffix messages to RELAY instead of CMS
|
||||
|
||||
double SNR; // S/N Ratio (VARA)
|
||||
|
||||
int NetRomMode;
|
||||
unsigned char * NetRomTxBuffer; // For Netrom over VARA
|
||||
int NetRomTxLen;
|
||||
char * NRNeighbour;
|
||||
int NRCloseTimer;
|
||||
struct _LINKTABLE * DummyLink; // Simulated link to simplify interface to ax,25 netrom code
|
||||
struct sixPackPortInfo * sixPack;
|
||||
int VaraACAllowed; // Set by config
|
||||
int VaraACMode; // Set by first message received
|
||||
int VaraModeSet; // Have decicded if VarAC mode or not
|
||||
char * VARACMsg; // to build message from packets
|
||||
int VarACTimer; // delayed send timer
|
||||
size_t VARACSize; // malloc'ed size
|
||||
|
||||
} *PTNCINFO;
|
||||
|
||||
VOID * zalloc(int len);
|
||||
|
||||
BOOL ReadConfigFile(int Port, int ProcLine());
|
||||
int GetLine(char * buf);
|
||||
BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height, VOID ForcedCloseProc());
|
||||
char * CheckAppl(struct TNCINFO * TNC, char * Appl);
|
||||
BOOL SendReporttoWL2K(struct TNCINFO * TNC);
|
||||
struct WL2KInfo * DecodeWL2KReportLine(char * buf);
|
||||
VOID UpdateMH(struct TNCINFO * TNC, UCHAR * Call, char Mode, char Direction);
|
||||
VOID UpdateMHEx(struct TNCINFO * TNC, UCHAR * Call, char Mode, char Direction, char * LOC, BOOL Report);
|
||||
VOID SaveWindowPos(int port);
|
||||
VOID SaveMDIWindowPos(HWND hWnd, char * RegKey, char * Value, BOOL Minimized);
|
||||
BOOL ProcessIncommingConnect(struct TNCINFO * TNC, char * Call, int Stream, BOOL SENDCTEXT);
|
||||
BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BOOL SENDCTEXT, BOOL AllowTR);
|
||||
VOID ShowTraffic(struct TNCINFO * TNC);
|
||||
int OpenCOMMPort(struct TNCINFO * conn, char * Port, int Speed, BOOL Quiet);
|
||||
VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * Mode);
|
||||
VOID MoveWindows(struct TNCINFO * TNC);
|
||||
|
||||
static VOID TidyClose(struct TNCINFO * TNC, int Stream);
|
||||
static VOID ForcedClose(struct TNCINFO * TNC, int Stream);
|
||||
static VOID CloseComplete(struct TNCINFO * TNC, int Stream);
|
||||
|
||||
VOID CheckForDetach(struct TNCINFO * TNC, int Stream, struct STREAMINFO * STREAM,
|
||||
VOID TidyCloseProc(struct TNCINFO * TNC, int Stream), VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream),
|
||||
VOID CloseComplete(struct TNCINFO * TNC, int Stream));
|
||||
|
||||
|
||||
BOOL InterlockedCheckBusy(struct TNCINFO * ThisTNC);
|
||||
|
||||
extern UINT CRCTAB;
|
||||
int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS);
|
||||
|
||||
|
||||
static int ProcessLine(char * buf, int Port);
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
VOID __cdecl Consoleprintf(const char * format, ...);
|
||||
|
||||
extern BOOL MinimizetoTray;
|
||||
|
||||
int standardParams(struct TNCINFO * TNC, char * buf);
|
||||
void DecodePTTString(struct TNCINFO * TNC, char * ptr);
|
||||
|
||||
int Rig_Command(TRANSPORTENTRY * Session, char * Command);
|
||||
|
||||
BOOL Rig_Poll();
|
||||
|
||||
VOID Rig_PTT(struct TNCINFO * TNC, BOOL PTTState);
|
||||
VOID Rig_PTTEx(struct RIGINFO * RIG, BOOL PTTState, struct TNCINFO * TNC);
|
||||
|
||||
struct RIGINFO * Rig_GETPTTREC(int Port);
|
||||
|
||||
struct ScanEntry ** CheckTimeBands(struct RIGINFO * RIG);
|
||||
|
||||
#ifndef LINBPQ
|
||||
LRESULT CALLBACK PacWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
#endif
|
||||
|
||||
#define Report_P1 11
|
||||
#define Report_P12 12
|
||||
#define Report_P123 13
|
||||
#define Report_P2 14
|
||||
#define Report_P23 15
|
||||
#define Report_P3 16
|
||||
|
||||
#define Report_P1234 17
|
||||
#define Report_P234 18
|
||||
#define Report_P34 19
|
||||
#define Report_P4 20
|
||||
|
||||
#define Report_WINMOR500 21
|
||||
#define Report_WINMOR1600 22
|
||||
|
||||
#define Report_Robust 30
|
||||
|
||||
#define IOCTL_SERIAL_IS_COM_OPEN CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
#define IOCTL_SERIAL_GETDATA CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x801,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
#define IOCTL_SERIAL_SETDATA CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x802,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_SERIAL_SET_CTS CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x803,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
#define IOCTL_SERIAL_SET_DSR CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x804,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
#define IOCTL_SERIAL_SET_DCD CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x805,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_SERIAL_CLR_CTS CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x806,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
#define IOCTL_SERIAL_CLR_DSR CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x807,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
#define IOCTL_SERIAL_CLR_DCD CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x808,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_BPQ_ADD_DEVICE CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x809,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
#define IOCTL_BPQ_DELETE_DEVICE CTL_CODE(FILE_DEVICE_SERIAL_PORT,0x80a,METHOD_BUFFERED,FILE_ANY_ACCESS)
|
||||
|
||||
#define W98_SERIAL_GETDATA 0x801
|
||||
#define W98_SERIAL_SETDATA 0x802
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,43 +0,0 @@
|
||||
# LinBPQ Makefile
|
||||
|
||||
# To exclude i2c support run make noi2c
|
||||
|
||||
OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pngwutil.o\
|
||||
pngread.o pngwrite.o png.o pngerror.o pngget.o pngmem.o APRSIconData.o AISCommon.o\
|
||||
upnp.o APRSStdPages.o HSMODEM.o WinRPR.o KISSHF.o TNCEmulators.o bpqhdlc.o SerialPort.o\
|
||||
adif.o WebMail.o utf8Routines.o VARA.o LzFind.o Alloc.o LzmaDec.o LzmaEnc.o LzmaLib.o \
|
||||
Multicast.o ARDOP.o IPCode.o FLDigi.o linether.o CMSAuth.o APRSCode.o BPQtoAGW.o KAMPactor.o\
|
||||
AEAPactor.o HALDriver.o MULTIPSK.o BBSHTMLConfig.o ChatHTMLConfig.o BBSUtilities.o bpqaxip.o\
|
||||
BPQINP3.o BPQNRR.o cMain.o Cmd.o CommonCode.o HTMLCommonCode.o compatbits.o config.o datadefs.o \
|
||||
FBBRoutines.o HFCommon.o Housekeeping.o HTTPcode.o kiss.o L2Code.o L3Code.o L4Code.o lzhuf32.o \
|
||||
MailCommands.o MailDataDefs.o LinBPQ.o MailRouting.o MailTCP.o MBLRoutines.o md5.o Moncode.o \
|
||||
NNTPRoutines.o RigControl.o TelnetV6.o WINMOR.o TNCCode.o UZ7HODrv.o WPRoutines.o \
|
||||
SCSTrackeMulti.o SCSPactor.o SCSTracker.o HanksRT.o UIRoutines.o AGWAPI.o AGWMoncode.o \
|
||||
DRATS.o FreeDATA.o base64.o Events.o nodeapi.o mailapi.o mqtt.o RHP.o
|
||||
|
||||
# Configuration:
|
||||
|
||||
CC = gcc
|
||||
|
||||
all: CFLAGS = -DLINBPQ -MMD -g -rdynamic -fcommon
|
||||
all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
|
||||
all: linbpq
|
||||
|
||||
|
||||
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -rdynamic -DNOMQTT
|
||||
nomqtt: linbpq
|
||||
|
||||
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -rdynamic -fcommon
|
||||
noi2c: linbpq
|
||||
|
||||
|
||||
linbpq: $(OBJS)
|
||||
gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o linbpq
|
||||
sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
|
||||
|
||||
-include *.d
|
||||
|
||||
clean :
|
||||
rm *.d
|
||||
rm linbpq $(OBJS)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,71 +0,0 @@
|
||||
|
||||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
//#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "windows.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.K.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
|
||||
#define BPQICON 400
|
||||
|
||||
BPQICON ICON DISCARDABLE "..\\bpqicon.ico"
|
||||
|
||||
//
|
||||
// Version
|
||||
//
|
||||
#define TEXTVER "2. 0. 1. 1\0"
|
||||
#define BINVER 2, 0, 1, 1
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION BINVER
|
||||
PRODUCTVERSION BINVER
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x1L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "080904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "Program to hold BPQ32.dll in memory\0"
|
||||
VALUE "CompanyName", " \0"
|
||||
VALUE "FileDescription", "bpq32\0"
|
||||
VALUE "FileVersion", TEXTVER
|
||||
VALUE "InternalName", "bpq32\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2006-2011 G8BPQ\0"
|
||||
VALUE "OriginalFilename", "bpq32.exe\0"
|
||||
VALUE "ProductName", " bpq32\0"
|
||||
VALUE "ProductVersion", TEXTVER
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x809, 1200
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,223 +0,0 @@
|
||||
/* LzmaDec.h -- LZMA Decoder
|
||||
2008-10-04 : Igor Pavlov : Public domain */
|
||||
|
||||
#ifndef __LZMADEC_H
|
||||
#define __LZMADEC_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
/* #define _LZMA_PROB32 */
|
||||
/* _LZMA_PROB32 can increase the speed on some CPUs,
|
||||
but memory usage for CLzmaDec::probs will be doubled in that case */
|
||||
|
||||
#ifdef _LZMA_PROB32
|
||||
#define CLzmaProb LZ_UInt32
|
||||
#else
|
||||
#define CLzmaProb UInt16
|
||||
#endif
|
||||
|
||||
|
||||
/* ---------- LZMA Properties ---------- */
|
||||
|
||||
#define LZMA_PROPS_SIZE 5
|
||||
|
||||
typedef struct _CLzmaProps
|
||||
{
|
||||
unsigned lc, lp, pb;
|
||||
LZ_UInt32 dicSize;
|
||||
} CLzmaProps;
|
||||
|
||||
/* LzmaProps_Decode - decodes properties
|
||||
Returns:
|
||||
SZ_OK
|
||||
SZ_ERROR_UNSUPPORTED - Unsupported properties
|
||||
*/
|
||||
|
||||
SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
|
||||
|
||||
|
||||
/* ---------- LZMA Decoder state ---------- */
|
||||
|
||||
/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
|
||||
Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
|
||||
|
||||
#define LZMA_REQUIRED_INPUT_MAX 20
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CLzmaProps prop;
|
||||
CLzmaProb *probs;
|
||||
Byte *dic;
|
||||
const Byte *buf;
|
||||
LZ_UInt32 range, code;
|
||||
SizeT dicPos;
|
||||
SizeT dicBufSize;
|
||||
LZ_UInt32 processedPos;
|
||||
LZ_UInt32 checkDicSize;
|
||||
unsigned state;
|
||||
LZ_UInt32 reps[4];
|
||||
unsigned remainLen;
|
||||
int needFlush;
|
||||
int needInitState;
|
||||
LZ_UInt32 numProbs;
|
||||
unsigned tempBufSize;
|
||||
Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
|
||||
} CLzmaDec;
|
||||
|
||||
#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
|
||||
|
||||
void LzmaDec_Init(CLzmaDec *p);
|
||||
|
||||
/* There are two types of LZMA streams:
|
||||
0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
|
||||
1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LZMA_FINISH_ANY, /* finish at any point */
|
||||
LZMA_FINISH_END /* block must be finished at the end */
|
||||
} ELzmaFinishMode;
|
||||
|
||||
/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
|
||||
|
||||
You must use LZMA_FINISH_END, when you know that current output buffer
|
||||
covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
|
||||
|
||||
If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
|
||||
and output value of destLen will be less than output buffer size limit.
|
||||
You can check status result also.
|
||||
|
||||
You can use multiple checks to test data integrity after full decompression:
|
||||
1) Check Result and "status" variable.
|
||||
2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
|
||||
3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
|
||||
You must use correct finish mode in that case. */
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */
|
||||
LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */
|
||||
LZMA_STATUS_NOT_FINISHED, /* stream was not finished */
|
||||
LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */
|
||||
LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */
|
||||
} ELzmaStatus;
|
||||
|
||||
/* ELzmaStatus is used only as output value for function call */
|
||||
|
||||
|
||||
/* ---------- Interfaces ---------- */
|
||||
|
||||
/* There are 3 levels of interfaces:
|
||||
1) Dictionary Interface
|
||||
2) Buffer Interface
|
||||
3) One Call Interface
|
||||
You can select any of these interfaces, but don't mix functions from different
|
||||
groups for same object. */
|
||||
|
||||
|
||||
/* There are two variants to allocate state for Dictionary Interface:
|
||||
1) LzmaDec_Allocate / LzmaDec_Free
|
||||
2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
|
||||
You can use variant 2, if you set dictionary buffer manually.
|
||||
For Buffer Interface you must always use variant 1.
|
||||
|
||||
LzmaDec_Allocate* can return:
|
||||
SZ_OK
|
||||
SZ_ERROR_MEM - Memory allocation error
|
||||
SZ_ERROR_UNSUPPORTED - Unsupported properties
|
||||
*/
|
||||
|
||||
SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
|
||||
void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
|
||||
|
||||
SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
|
||||
void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
|
||||
|
||||
/* ---------- Dictionary Interface ---------- */
|
||||
|
||||
/* You can use it, if you want to eliminate the overhead for data copying from
|
||||
dictionary to some other external buffer.
|
||||
You must work with CLzmaDec variables directly in this interface.
|
||||
|
||||
STEPS:
|
||||
LzmaDec_Constr()
|
||||
LzmaDec_Allocate()
|
||||
for (each new stream)
|
||||
{
|
||||
LzmaDec_Init()
|
||||
while (it needs more decompression)
|
||||
{
|
||||
LzmaDec_DecodeToDic()
|
||||
use data from CLzmaDec::dic and update CLzmaDec::dicPos
|
||||
}
|
||||
}
|
||||
LzmaDec_Free()
|
||||
*/
|
||||
|
||||
/* LzmaDec_DecodeToDic
|
||||
|
||||
The decoding to internal dictionary buffer (CLzmaDec::dic).
|
||||
You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
|
||||
|
||||
finishMode:
|
||||
It has meaning only if the decoding reaches output limit (dicLimit).
|
||||
LZMA_FINISH_ANY - Decode just dicLimit bytes.
|
||||
LZMA_FINISH_END - Stream must be finished after dicLimit.
|
||||
|
||||
Returns:
|
||||
SZ_OK
|
||||
status:
|
||||
LZMA_STATUS_FINISHED_WITH_MARK
|
||||
LZMA_STATUS_NOT_FINISHED
|
||||
LZMA_STATUS_NEEDS_MORE_INPUT
|
||||
LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
|
||||
SZ_ERROR_DATA - Data error
|
||||
*/
|
||||
|
||||
SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
|
||||
const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
|
||||
|
||||
|
||||
/* ---------- Buffer Interface ---------- */
|
||||
|
||||
/* It's zlib-like interface.
|
||||
See LzmaDec_DecodeToDic description for information about STEPS and return results,
|
||||
but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
|
||||
to work with CLzmaDec variables manually.
|
||||
|
||||
finishMode:
|
||||
It has meaning only if the decoding reaches output limit (*destLen).
|
||||
LZMA_FINISH_ANY - Decode just destLen bytes.
|
||||
LZMA_FINISH_END - Stream must be finished after (*destLen).
|
||||
*/
|
||||
|
||||
SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
|
||||
const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
|
||||
|
||||
|
||||
/* ---------- One Call Interface ---------- */
|
||||
|
||||
/* LzmaDecode
|
||||
|
||||
finishMode:
|
||||
It has meaning only if the decoding reaches output limit (*destLen).
|
||||
LZMA_FINISH_ANY - Decode just destLen bytes.
|
||||
LZMA_FINISH_END - Stream must be finished after (*destLen).
|
||||
|
||||
Returns:
|
||||
SZ_OK
|
||||
status:
|
||||
LZMA_STATUS_FINISHED_WITH_MARK
|
||||
LZMA_STATUS_NOT_FINISHED
|
||||
LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
|
||||
SZ_ERROR_DATA - Data error
|
||||
SZ_ERROR_MEM - Memory allocation error
|
||||
SZ_ERROR_UNSUPPORTED - Unsupported properties
|
||||
SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
|
||||
*/
|
||||
|
||||
SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
|
||||
const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
|
||||
ELzmaStatus *status, ISzAlloc *alloc);
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,135 +0,0 @@
|
||||
/* LzmaLib.h -- LZMA library interface
|
||||
2008-08-05
|
||||
Igor Pavlov
|
||||
Public domain */
|
||||
|
||||
#ifndef __LZMALIB_H
|
||||
#define __LZMALIB_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define MY_EXTERN_C extern "C"
|
||||
#else
|
||||
#define MY_EXTERN_C extern
|
||||
#endif
|
||||
|
||||
#define MY_STDAPI MY_EXTERN_C int MY_STD_CALL
|
||||
|
||||
#define LZMA_PROPS_SIZE 5
|
||||
|
||||
/*
|
||||
RAM requirements for LZMA:
|
||||
for compression: (dictSize * 11.5 + 6 MB) + state_size
|
||||
for decompression: dictSize + state_size
|
||||
state_size = (4 + (1.5 << (lc + lp))) KB
|
||||
by default (lc=3, lp=0), state_size = 16 KB.
|
||||
|
||||
LZMA properties (5 bytes) format
|
||||
Offset Size Description
|
||||
0 1 lc, lp and pb in encoded form.
|
||||
1 4 dictSize (little endian).
|
||||
*/
|
||||
|
||||
/*
|
||||
LzmaCompress
|
||||
------------
|
||||
|
||||
outPropsSize -
|
||||
In: the pointer to the size of outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5.
|
||||
Out: the pointer to the size of written properties in outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5.
|
||||
|
||||
LZMA Encoder will use defult values for any parameter, if it is
|
||||
-1 for any from: level, loc, lp, pb, fb, numThreads
|
||||
0 for dictSize
|
||||
|
||||
level - compression level: 0 <= level <= 9;
|
||||
|
||||
level dictSize algo fb
|
||||
0: 16 KB 0 32
|
||||
1: 64 KB 0 32
|
||||
2: 256 KB 0 32
|
||||
3: 1 MB 0 32
|
||||
4: 4 MB 0 32
|
||||
5: 16 MB 1 32
|
||||
6: 32 MB 1 32
|
||||
7+: 64 MB 1 64
|
||||
|
||||
The default value for "level" is 5.
|
||||
|
||||
algo = 0 means fast method
|
||||
algo = 1 means normal method
|
||||
|
||||
dictSize - The dictionary size in bytes. The maximum value is
|
||||
128 MB = (1 << 27) bytes for 32-bit version
|
||||
1 GB = (1 << 30) bytes for 64-bit version
|
||||
The default value is 16 MB = (1 << 24) bytes.
|
||||
It's recommended to use the dictionary that is larger than 4 KB and
|
||||
that can be calculated as (1 << N) or (3 << N) sizes.
|
||||
|
||||
lc - The number of literal context bits (high bits of previous literal).
|
||||
It can be in the range from 0 to 8. The default value is 3.
|
||||
Sometimes lc=4 gives the gain for big files.
|
||||
|
||||
lp - The number of literal pos bits (low bits of current position for literals).
|
||||
It can be in the range from 0 to 4. The default value is 0.
|
||||
The lp switch is intended for periodical data when the period is equal to 2^lp.
|
||||
For example, for 32-bit (4 bytes) periodical data you can use lp=2. Often it's
|
||||
better to set lc=0, if you change lp switch.
|
||||
|
||||
pb - The number of pos bits (low bits of current position).
|
||||
It can be in the range from 0 to 4. The default value is 2.
|
||||
The pb switch is intended for periodical data when the period is equal 2^pb.
|
||||
|
||||
fb - Word size (the number of fast bytes).
|
||||
It can be in the range from 5 to 273. The default value is 32.
|
||||
Usually, a big number gives a little bit better compression ratio and
|
||||
slower compression process.
|
||||
|
||||
numThreads - The number of thereads. 1 or 2. The default value is 2.
|
||||
Fast mode (algo = 0) can use only 1 thread.
|
||||
|
||||
Out:
|
||||
destLen - processed output size
|
||||
Returns:
|
||||
SZ_OK - OK
|
||||
SZ_ERROR_MEM - Memory allocation error
|
||||
SZ_ERROR_PARAM - Incorrect paramater
|
||||
SZ_ERROR_OUTPUT_EOF - output buffer overflow
|
||||
SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
|
||||
*/
|
||||
|
||||
MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen,
|
||||
unsigned char *outProps, size_t *outPropsSize, /* *outPropsSize must be = 5 */
|
||||
int level, /* 0 <= level <= 9, default = 5 */
|
||||
unsigned dictSize, /* default = (1 << 24) */
|
||||
int lc, /* 0 <= lc <= 8, default = 3 */
|
||||
int lp, /* 0 <= lp <= 4, default = 0 */
|
||||
int pb, /* 0 <= pb <= 4, default = 2 */
|
||||
int fb, /* 5 <= fb <= 273, default = 32 */
|
||||
int numThreads /* 1 or 2, default = 2 */
|
||||
);
|
||||
|
||||
/*
|
||||
LzmaUncompress
|
||||
--------------
|
||||
In:
|
||||
dest - output data
|
||||
destLen - output data size
|
||||
src - input data
|
||||
srcLen - input data size
|
||||
Out:
|
||||
destLen - processed output size
|
||||
srcLen - processed input size
|
||||
Returns:
|
||||
SZ_OK - OK
|
||||
SZ_ERROR_DATA - Data error
|
||||
SZ_ERROR_MEM - Memory allocation arror
|
||||
SZ_ERROR_UNSUPPORTED - Unsupported properties
|
||||
SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer (src)
|
||||
*/
|
||||
|
||||
MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen,
|
||||
const unsigned char *props, size_t propsSize);
|
||||
|
||||
#endif
|
||||
|
Before Width: | Height: | Size: 766 B |
@ -1,30 +0,0 @@
|
||||
/* See md5.c for explanation and copyright information. */
|
||||
|
||||
/*
|
||||
* $FreeBSD: src/contrib/cvs/lib/md5.h,v 1.2 1999/12/11 15:10:02 peter Exp $
|
||||
*/
|
||||
|
||||
#ifndef MD5_H
|
||||
#define MD5_H
|
||||
|
||||
/* Unlike previous versions of this code, uint32 need not be exactly
|
||||
32 bits, merely 32 bits or more. Choosing a data type which is 32
|
||||
bits instead of 64 is not important; speed is considerably more
|
||||
important. ANSI guarantees that "unsigned long" will be big enough,
|
||||
and always using it seems to have few disadvantages. */
|
||||
typedef unsigned long cvs_uint32;
|
||||
|
||||
struct cvs_MD5Context {
|
||||
cvs_uint32 buf[4];
|
||||
cvs_uint32 bits[2];
|
||||
unsigned char in[64];
|
||||
};
|
||||
|
||||
void cvs_MD5Init(struct cvs_MD5Context *context);
|
||||
void cvs_MD5Update(struct cvs_MD5Context *context,
|
||||
unsigned char const *buf, unsigned len);
|
||||
void cvs_MD5Final(unsigned char digest[16],
|
||||
struct cvs_MD5Context *context);
|
||||
void cvs_MD5Transform(cvs_uint32 buf[4], const unsigned char in[64]);
|
||||
|
||||
#endif /* !MD5_H */
|
||||
@ -1,424 +0,0 @@
|
||||
// Mail and Chat Server for BPQ32 Packet Switch
|
||||
//
|
||||
// Monitor Window(s) Module
|
||||
|
||||
#include "bpqmail.h"
|
||||
|
||||
static char ClassName[]="BPQMONWINDOW";
|
||||
|
||||
char SYSOPCall[50];
|
||||
|
||||
static WNDPROC wpOrigInputProc;
|
||||
static WNDPROC wpOrigOutputProc;
|
||||
|
||||
HWND hMonitor;
|
||||
|
||||
static HWND hwndInput;
|
||||
static HWND hwndOutput;
|
||||
|
||||
static HMENU hMenu; // handle of menu
|
||||
|
||||
|
||||
#define InputBoxHeight 25
|
||||
RECT MonitorRect;
|
||||
RECT OutputRect;
|
||||
|
||||
int Height, Width, LastY;
|
||||
|
||||
static char kbbuf[160];
|
||||
static int kbptr=0;
|
||||
|
||||
static char * readbuff;
|
||||
static int readbufflen;
|
||||
|
||||
static BOOL StripLF = TRUE;
|
||||
BOOL MonBBS = TRUE;
|
||||
BOOL MonCHAT = TRUE;
|
||||
BOOL MonTCP = TRUE;
|
||||
|
||||
BOOL LogBBS = TRUE;
|
||||
BOOL LogCHAT = TRUE;
|
||||
BOOL LogTCP = TRUE;
|
||||
|
||||
|
||||
static int PartLinePtr=0;
|
||||
static int PartLineIndex=0; // Listbox index of (last) incomplete line
|
||||
|
||||
|
||||
static LRESULT CALLBACK MonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static LRESULT APIENTRY OutputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static LRESULT APIENTRY MonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static void MoveWindows();
|
||||
static void MoveMCWindows();
|
||||
|
||||
#define BGCOLOUR RGB(236,233,216)
|
||||
|
||||
BOOL CreateMonitor()
|
||||
{
|
||||
WNDCLASS wc;
|
||||
HBRUSH bgBrush;
|
||||
|
||||
if (hMonitor)
|
||||
{
|
||||
ShowWindow(hMonitor, SW_SHOWNORMAL);
|
||||
SetForegroundWindow(hMonitor);
|
||||
return FALSE; // Alreaqy open
|
||||
}
|
||||
|
||||
bgBrush = CreateSolidBrush(BGCOLOUR);
|
||||
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wc.lpfnWndProc = MonWndProc;
|
||||
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = DLGWINDOWEXTRA;
|
||||
wc.hInstance = hInst;
|
||||
wc.hIcon = LoadIcon( hInst, MAKEINTRESOURCE(BPQICON) );
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = bgBrush;
|
||||
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = ClassName;
|
||||
|
||||
RegisterClass(&wc);
|
||||
|
||||
hMonitor=CreateDialog(hInst,ClassName,0,NULL);
|
||||
|
||||
if (!hMonitor)
|
||||
return (FALSE);
|
||||
|
||||
readbuff = zalloc(1000);
|
||||
readbufflen = 1000;
|
||||
|
||||
hMenu=GetMenu(hMonitor);
|
||||
|
||||
CheckMenuItem(hMenu,MONBBS, MonBBS ? MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hMenu,MONCHAT, MonCHAT ? MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hMenu,MONTCP, MonTCP ? MF_CHECKED : MF_UNCHECKED);
|
||||
|
||||
DrawMenuBar(hWnd);
|
||||
|
||||
// Retrieve the handlse to the edit controls.
|
||||
|
||||
hwndOutput = GetDlgItem(hMonitor, 121);
|
||||
|
||||
// Set our own WndProcs for the controls.
|
||||
|
||||
wpOrigOutputProc = (WNDPROC)SetWindowLong(hwndOutput, GWL_WNDPROC, (LONG)OutputProc);
|
||||
|
||||
if (cfgMinToTray)
|
||||
AddTrayMenuItem(hMonitor, "Mail Monitor");
|
||||
|
||||
ShowWindow(hMonitor, SW_SHOWNORMAL);
|
||||
|
||||
if (MonitorRect.right < 100 || MonitorRect.bottom < 100)
|
||||
{
|
||||
GetWindowRect(hMonitor, &MonitorRect);
|
||||
}
|
||||
|
||||
MoveWindow(hMonitor,MonitorRect.left,MonitorRect.top, MonitorRect.right-MonitorRect.left, MonitorRect.bottom-MonitorRect.top, TRUE);
|
||||
|
||||
MoveWindows();
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
static void MoveWindows()
|
||||
{
|
||||
RECT rcMain, rcClient;
|
||||
int ClientHeight, ClientWidth;
|
||||
|
||||
GetWindowRect(hMonitor, &rcMain);
|
||||
GetClientRect(hMonitor, &rcClient);
|
||||
|
||||
ClientHeight = rcClient.bottom;
|
||||
ClientWidth = rcClient.right;
|
||||
|
||||
// MoveWindow(hwndMon,2, 0, ClientWidth-4, SplitPos, TRUE);
|
||||
MoveWindow(hwndOutput,2, 2, ClientWidth-4, ClientHeight-4, TRUE);
|
||||
// MoveWindow(hwndSplit,0, SplitPos, ClientWidth, SplitBarHeight, TRUE);
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK MonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int wmId, wmEvent;
|
||||
LPRECT lprc;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
|
||||
case WM_ACTIVATE:
|
||||
|
||||
SetFocus(hwndInput);
|
||||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
if (wParam) // Used by Close All Programs.
|
||||
return 0;
|
||||
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
case WM_COMMAND:
|
||||
|
||||
wmId = LOWORD(wParam); // Remember, these are...
|
||||
wmEvent = HIWORD(wParam); // ...different for Win32!
|
||||
|
||||
switch (wmId) {
|
||||
|
||||
case MONBBS:
|
||||
|
||||
ToggleParam(hMenu, hWnd, &MonBBS, MONBBS);
|
||||
break;
|
||||
|
||||
case MONCHAT:
|
||||
|
||||
ToggleParam(hMenu, hWnd, &MonCHAT, MONCHAT);
|
||||
break;
|
||||
|
||||
case MONTCP:
|
||||
|
||||
ToggleParam(hMenu, hWnd, &MonTCP, MONTCP);
|
||||
break;
|
||||
|
||||
|
||||
case BPQCLEAROUT:
|
||||
|
||||
SendMessage(hwndOutput,LB_RESETCONTENT, 0, 0);
|
||||
break;
|
||||
|
||||
case BPQCOPYOUT:
|
||||
|
||||
CopyToClipboard(hwndOutput);
|
||||
break;
|
||||
|
||||
|
||||
|
||||
//case BPQHELP:
|
||||
|
||||
// HtmlHelp(hWnd,"BPQTerminal.chm",HH_HELP_FINDER,0);
|
||||
// break;
|
||||
|
||||
default:
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
case WM_SYSCOMMAND:
|
||||
|
||||
wmId = LOWORD(wParam); // Remember, these are...
|
||||
wmEvent = HIWORD(wParam); // ...different for Win32!
|
||||
|
||||
switch (wmId) {
|
||||
|
||||
case SC_MINIMIZE:
|
||||
|
||||
if (cfgMinToTray)
|
||||
return ShowWindow(hWnd, SW_HIDE);
|
||||
|
||||
default:
|
||||
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
}
|
||||
|
||||
case WM_SIZING:
|
||||
|
||||
lprc = (LPRECT) lParam;
|
||||
|
||||
Height = lprc->bottom-lprc->top;
|
||||
Width = lprc->right-lprc->left;
|
||||
|
||||
MoveWindows();
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
||||
case WM_DESTROY:
|
||||
|
||||
// Remove the subclass from the edit control.
|
||||
|
||||
GetWindowRect(hWnd, &MonitorRect); // For save soutine
|
||||
|
||||
SetWindowLong(hwndInput, GWL_WNDPROC,
|
||||
(LONG) wpOrigInputProc);
|
||||
|
||||
|
||||
if (cfgMinToTray)
|
||||
DeleteTrayMenuItem(hWnd);
|
||||
|
||||
|
||||
hMonitor = NULL;
|
||||
|
||||
free(readbuff);
|
||||
readbufflen = 0;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
LRESULT APIENTRY OutputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
|
||||
// Trap mouse messages, so we cant select stuff in output and mon windows,
|
||||
// otherwise scrolling doesnt work.
|
||||
|
||||
if (uMsg >= WM_MOUSEFIRST && uMsg <= WM_LBUTTONDBLCLK)
|
||||
return TRUE;
|
||||
|
||||
return CallWindowProc(wpOrigOutputProc, hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
int WritetoMonitorWindow(char * Msg, int len)
|
||||
{
|
||||
char * ptr1, * ptr2;
|
||||
int index;
|
||||
|
||||
if (len+PartLinePtr > readbufflen)
|
||||
{
|
||||
readbufflen += len+PartLinePtr;
|
||||
readbuff = realloc(readbuff, readbufflen);
|
||||
}
|
||||
|
||||
if (PartLinePtr != 0)
|
||||
SendMessage(hwndOutput,LB_DELETESTRING,PartLineIndex,(LPARAM)(LPCTSTR) 0 );
|
||||
|
||||
memcpy(&readbuff[PartLinePtr], Msg, len);
|
||||
|
||||
len=len+PartLinePtr;
|
||||
|
||||
ptr1=&readbuff[0];
|
||||
readbuff[len]=0;
|
||||
|
||||
do {
|
||||
ptr2=memchr(ptr1,7,len);
|
||||
|
||||
if (ptr2)
|
||||
*(ptr2)=32;
|
||||
|
||||
} while (ptr2);
|
||||
|
||||
lineloop:
|
||||
|
||||
// if (PartLinePtr > 300)
|
||||
// PartLinePtr = 0;
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
// copy text to control a line at a time
|
||||
|
||||
ptr2=memchr(ptr1,13,len);
|
||||
|
||||
if (ptr2 == 0)
|
||||
{
|
||||
// no newline. Move data to start of buffer and Save pointer
|
||||
|
||||
PartLinePtr=len;
|
||||
memmove(readbuff,ptr1,len);
|
||||
PartLineIndex=SendMessage(hwndOutput,LB_ADDSTRING,0,(LPARAM)(LPCTSTR) ptr1 );
|
||||
SendMessage(hwndOutput,LB_SETCARETINDEX,(WPARAM) PartLineIndex, MAKELPARAM(FALSE, 0));
|
||||
|
||||
return (0);
|
||||
|
||||
}
|
||||
|
||||
*(ptr2++)=0;
|
||||
|
||||
index=SendMessage(hwndOutput,LB_ADDSTRING,0,(LPARAM)(LPCTSTR) ptr1 );
|
||||
|
||||
// if (LogOutput) WriteMonitorLine(ptr1, ptr2 - ptr1);
|
||||
|
||||
PartLinePtr=0;
|
||||
|
||||
len-=(ptr2-ptr1);
|
||||
|
||||
ptr1=ptr2;
|
||||
|
||||
if ((len > 0) && StripLF)
|
||||
{
|
||||
if (*ptr1 == 0x0a) // Line Feed
|
||||
{
|
||||
ptr1++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
if (index > 1200)
|
||||
|
||||
do{
|
||||
|
||||
index=SendMessage(hwndOutput,LB_DELETESTRING, 0, 0);
|
||||
|
||||
} while (index > 1000);
|
||||
|
||||
SendMessage(hwndOutput,LB_SETCARETINDEX,(WPARAM) index, MAKELPARAM(FALSE, 0));
|
||||
|
||||
goto lineloop;
|
||||
}
|
||||
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int ToggleParam(HMENU hMenu, HWND hWnd, BOOL * Param, int Item)
|
||||
{
|
||||
*Param = !(*Param);
|
||||
|
||||
CheckMenuItem(hMenu,Item, (*Param) ? MF_CHECKED : MF_UNCHECKED);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void CopyToClipboard(HWND hWnd)
|
||||
{
|
||||
int i,n, len=0;
|
||||
HGLOBAL hMem;
|
||||
char * ptr;
|
||||
//
|
||||
// Copy List Box to clipboard
|
||||
//
|
||||
|
||||
n = SendMessage(hWnd, LB_GETCOUNT, 0, 0);
|
||||
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
len+=SendMessage(hWnd, LB_GETTEXTLEN, i, 0);
|
||||
}
|
||||
|
||||
hMem=GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, len+n+n+1);
|
||||
|
||||
|
||||
if (hMem != 0)
|
||||
{
|
||||
ptr=GlobalLock(hMem);
|
||||
|
||||
if (OpenClipboard(MainWnd))
|
||||
{
|
||||
// CopyScreentoBuffer(GlobalLock(hMem));
|
||||
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
ptr+=SendMessage(hWnd, LB_GETTEXT, i, (LPARAM) ptr);
|
||||
*(ptr++)=13;
|
||||
*(ptr++)=10;
|
||||
}
|
||||
|
||||
*(ptr)=0; // end of data
|
||||
|
||||
GlobalUnlock(hMem);
|
||||
EmptyClipboard();
|
||||
SetClipboardData(CF_TEXT,hMem);
|
||||
CloseClipboard();
|
||||
}
|
||||
else
|
||||
GlobalFree(hMem);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,161 +0,0 @@
|
||||
|
||||
/* pngrio.c - functions for data input
|
||||
*
|
||||
* libpng 1.2.8 - December 3, 2004
|
||||
* For conditions of distribution and use, see copyright notice in png.h
|
||||
* Copyright (c) 1998-2004 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
* This file provides a location for all input. Users who need
|
||||
* special handling are expected to write a function that has the same
|
||||
* arguments as this and performs a similar function, but that possibly
|
||||
* has a different input method. Note that you shouldn't change this
|
||||
* function, but rather write a replacement function and then make
|
||||
* libpng use it at run time with png_set_read_fn(...).
|
||||
*/
|
||||
|
||||
#define PNG_INTERNAL
|
||||
#include "png.h"
|
||||
|
||||
/* Read the data from whatever input you are using. The default routine
|
||||
reads from a file pointer. Note that this routine sometimes gets called
|
||||
with very small lengths, so you should implement some kind of simple
|
||||
buffering if you are using unbuffered reads. This should never be asked
|
||||
to read more then 64K on a 16 bit machine. */
|
||||
void /* PRIVATE */
|
||||
png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
{
|
||||
png_debug1(4,"reading %d bytes\n", (int)length);
|
||||
if (png_ptr->read_data_fn != NULL)
|
||||
(*(png_ptr->read_data_fn))(png_ptr, data, length);
|
||||
else
|
||||
png_error(png_ptr, "Call to NULL read function");
|
||||
}
|
||||
|
||||
#if !defined(PNG_NO_STDIO)
|
||||
/* This is the function that does the actual reading of data. If you are
|
||||
not reading from a standard C stream, you should create a replacement
|
||||
read_data function and use it at run time with png_set_read_fn(), rather
|
||||
than changing the library. */
|
||||
#ifndef USE_FAR_KEYWORD
|
||||
void PNGAPI
|
||||
png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
{
|
||||
png_size_t check;
|
||||
|
||||
/* fread() returns 0 on error, so it is OK to store this in a png_size_t
|
||||
* instead of an int, which is what fread() actually returns.
|
||||
*/
|
||||
#if defined(_WIN32_WCE)
|
||||
if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
|
||||
check = 0;
|
||||
#else
|
||||
check = (png_size_t)fread(data, (png_size_t)1, length,
|
||||
(png_FILE_p)png_ptr->io_ptr);
|
||||
#endif
|
||||
|
||||
if (check != length)
|
||||
png_error(png_ptr, "Read Error");
|
||||
}
|
||||
#else
|
||||
/* this is the model-independent version. Since the standard I/O library
|
||||
can't handle far buffers in the medium and small models, we have to copy
|
||||
the data.
|
||||
*/
|
||||
|
||||
#define NEAR_BUF_SIZE 1024
|
||||
#define MIN(a,b) (a <= b ? a : b)
|
||||
|
||||
static void /* PRIVATE */
|
||||
png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
{
|
||||
int check;
|
||||
png_byte *n_data;
|
||||
png_FILE_p io_ptr;
|
||||
|
||||
/* Check if data really is near. If so, use usual code. */
|
||||
n_data = (png_byte *)CVT_PTR_NOCHECK(data);
|
||||
io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
|
||||
if ((png_bytep)n_data == data)
|
||||
{
|
||||
#if defined(_WIN32_WCE)
|
||||
if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
|
||||
check = 0;
|
||||
#else
|
||||
check = fread(n_data, 1, length, io_ptr);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
png_byte buf[NEAR_BUF_SIZE];
|
||||
png_size_t read, remaining, err;
|
||||
check = 0;
|
||||
remaining = length;
|
||||
do
|
||||
{
|
||||
read = MIN(NEAR_BUF_SIZE, remaining);
|
||||
#if defined(_WIN32_WCE)
|
||||
if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) )
|
||||
err = 0;
|
||||
#else
|
||||
err = fread(buf, (png_size_t)1, read, io_ptr);
|
||||
#endif
|
||||
png_memcpy(data, buf, read); /* copy far buffer to near buffer */
|
||||
if(err != read)
|
||||
break;
|
||||
else
|
||||
check += err;
|
||||
data += read;
|
||||
remaining -= read;
|
||||
}
|
||||
while (remaining != 0);
|
||||
}
|
||||
if ((png_uint_32)check != (png_uint_32)length)
|
||||
png_error(png_ptr, "read Error");
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* This function allows the application to supply a new input function
|
||||
for libpng if standard C streams aren't being used.
|
||||
|
||||
This function takes as its arguments:
|
||||
png_ptr - pointer to a png input data structure
|
||||
io_ptr - pointer to user supplied structure containing info about
|
||||
the input functions. May be NULL.
|
||||
read_data_fn - pointer to a new input function that takes as its
|
||||
arguments a pointer to a png_struct, a pointer to
|
||||
a location where input data can be stored, and a 32-bit
|
||||
unsigned int that is the number of bytes to be read.
|
||||
To exit and output any fatal error messages the new write
|
||||
function should call png_error(png_ptr, "Error msg"). */
|
||||
void PNGAPI
|
||||
png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
|
||||
png_rw_ptr read_data_fn)
|
||||
{
|
||||
png_ptr->io_ptr = io_ptr;
|
||||
|
||||
#if !defined(PNG_NO_STDIO)
|
||||
if (read_data_fn != NULL)
|
||||
png_ptr->read_data_fn = read_data_fn;
|
||||
else
|
||||
png_ptr->read_data_fn = png_default_read_data;
|
||||
#else
|
||||
png_ptr->read_data_fn = read_data_fn;
|
||||
#endif
|
||||
|
||||
/* It is an error to write to a read device */
|
||||
if (png_ptr->write_data_fn != NULL)
|
||||
{
|
||||
png_ptr->write_data_fn = NULL;
|
||||
png_warning(png_ptr,
|
||||
"It's an error to set both read_data_fn and write_data_fn in the ");
|
||||
png_warning(png_ptr,
|
||||
"same structure. Resetting write_data_fn to NULL.");
|
||||
}
|
||||
|
||||
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
|
||||
png_ptr->output_flush_fn = NULL;
|
||||
#endif
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,22 +0,0 @@
|
||||
Chat :
|
||||
{
|
||||
ApplNum = 2;
|
||||
MaxStreams = 11;
|
||||
OtherChatNodes = "RDGCHT:GB7RDG-1|C STHGTE|C 1 MB7NCR-2|C RDGCHT\r\nRDGCHT:GB7RDG-1|C STHGTE|C 1 MB7NCR-2|C RDGCHT\r\n\r\n";
|
||||
ChatWelcomeMsg = "G8BPQ Chat Server.$WType /h for command summary.$WBringing up links to other nodes.$WThis may take a minute or two.$WThe /p command shows what nodes are linked.$W";
|
||||
MapPosition = "MapPosition=5259.04N, 00107.01W";
|
||||
MapPopup = "MapPopup=G8BPQ Nottingham<p><a href=\"http://www.g8bpq.org.uk\">BPQ32 Home Page</a";
|
||||
PopupMode = 0;
|
||||
Bells = 1;
|
||||
FlashOnBell = 0;
|
||||
StripLF = 0;
|
||||
WarnWrap = 0;
|
||||
WrapInput = 0;
|
||||
FlashOnConnect = 0;
|
||||
CloseWindowOnBye = 0;
|
||||
ConsoleSize = "821,1629,283,893";
|
||||
MonitorSize = "828,1644,148,770";
|
||||
DebugSize = "0,0,0,0";
|
||||
WindowSize = "231,835,254,602";
|
||||
Version = "6,0,24,32";
|
||||
};
|
||||
Binary file not shown.
@ -1,82 +0,0 @@
|
||||
//
|
||||
// Standard __except handler to dump stack and code around eip
|
||||
//
|
||||
|
||||
__except(memcpy(&exinfo, GetExceptionInformation(), sizeof(struct _EXCEPTION_POINTERS)), EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
unsigned __int32 SPPtr = 0;
|
||||
unsigned __int32 SPVal = 0;
|
||||
unsigned __int32 eip = 0;
|
||||
unsigned __int32 rev = 0;
|
||||
int i;
|
||||
|
||||
DWORD Stack[16];
|
||||
DWORD CodeDump[16];
|
||||
|
||||
#ifndef _WIN64
|
||||
|
||||
eip = exinfo.ContextRecord->Eip;
|
||||
SPPtr = exinfo.ContextRecord->Esp;
|
||||
|
||||
__asm
|
||||
{
|
||||
mov eax, SPPtr
|
||||
mov SPVal,eax
|
||||
lea edi,Stack
|
||||
mov esi,eax
|
||||
mov ecx,64
|
||||
rep movsb
|
||||
|
||||
lea edi,CodeDump
|
||||
mov esi,eip
|
||||
mov ecx,64
|
||||
rep movsb
|
||||
}
|
||||
|
||||
|
||||
|
||||
Debugprintf("BPQ32 *** Program Error %x at %x in %s",
|
||||
exinfo.ExceptionRecord->ExceptionCode, exinfo.ExceptionRecord->ExceptionAddress, EXCEPTMSG);
|
||||
|
||||
Debugprintf("EAX %x EBX %x ECX %x EDX %x ESI %x EDI %x ESP %x",
|
||||
exinfo.ContextRecord->Eax, exinfo.ContextRecord->Ebx, exinfo.ContextRecord->Ecx,
|
||||
exinfo.ContextRecord->Edx, exinfo.ContextRecord->Esi, exinfo.ContextRecord->Edi, SPVal);
|
||||
|
||||
#endif
|
||||
|
||||
Debugprintf("Stack:");
|
||||
|
||||
Debugprintf("%08x %08x %08x %08x %08x %08x %08x %08x %08x ",
|
||||
SPVal, Stack[0], Stack[1], Stack[2], Stack[3], Stack[4], Stack[5], Stack[6], Stack[7]);
|
||||
|
||||
Debugprintf("%08x %08x %08x %08x %08x %08x %08x %08x %08x ",
|
||||
SPVal+32, Stack[8], Stack[9], Stack[10], Stack[11], Stack[12], Stack[13], Stack[14], Stack[15]);
|
||||
|
||||
Debugprintf("Code:");
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
rev = (CodeDump[i] & 0xff) << 24;
|
||||
rev |= (CodeDump[i] & 0xff00) << 8;
|
||||
rev |= (CodeDump[i] & 0xff0000) >> 8;
|
||||
rev |= (CodeDump[i] & 0xff000000) >> 24;
|
||||
|
||||
CodeDump[i] = rev;
|
||||
}
|
||||
|
||||
Debugprintf("%08x %08x %08x %08x %08x %08x %08x %08x %08x ",
|
||||
eip, CodeDump[0], CodeDump[1], CodeDump[2], CodeDump[3], CodeDump[4], CodeDump[5], CodeDump[6], CodeDump[7]);
|
||||
|
||||
Debugprintf("%08x %08x %08x %08x %08x %08x %08x %08x %08x ",
|
||||
eip+32, CodeDump[8], CodeDump[9], CodeDump[10], CodeDump[11], CodeDump[12], CodeDump[13], CodeDump[14], CodeDump[15]);
|
||||
|
||||
WriteMiniDump();
|
||||
|
||||
// Note - no closing } so additional code may be run in the __except block
|
||||
|
||||
#ifdef MDIKERNEL
|
||||
if (CloseOnError == 1)
|
||||
CloseAllNeeded = 1;
|
||||
#endif
|
||||
|
||||
#undef EXCEPTMSG
|
||||
@ -1,277 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2009, 2020 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v2.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* https://www.eclipse.org/legal/epl-2.0/
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* \brief This structure represents a persistent data store, used to store
|
||||
* outbound and inbound messages, in order to achieve reliable messaging.
|
||||
*
|
||||
* The MQTT Client persists QoS1 and QoS2 messages in order to meet the
|
||||
* assurances of delivery associated with these @ref qos levels. The messages
|
||||
* are saved in persistent storage
|
||||
* The type and context of the persistence implementation are specified when
|
||||
* the MQTT client is created (see MQTTClient_create()). The default
|
||||
* persistence type (::MQTTCLIENT_PERSISTENCE_DEFAULT) uses a file system-based
|
||||
* persistence mechanism. The <i>persistence_context</i> argument passed to
|
||||
* MQTTClient_create() when using the default peristence is a string
|
||||
* representing the location of the persistence directory. If the context
|
||||
* argument is NULL, the working directory will be used.
|
||||
*
|
||||
* To use memory-based persistence, an application passes
|
||||
* ::MQTTCLIENT_PERSISTENCE_NONE as the <i>persistence_type</i> to
|
||||
* MQTTClient_create(). This can lead to message loss in certain situations,
|
||||
* but can be appropriate in some cases (see @ref qos).
|
||||
*
|
||||
* Client applications can provide their own persistence mechanism by passing
|
||||
* ::MQTTCLIENT_PERSISTENCE_USER as the <i>persistence_type</i>. To implement a
|
||||
* custom persistence mechanism, the application must pass an initialized
|
||||
* ::MQTTClient_persistence structure as the <i>persistence_context</i>
|
||||
* argument to MQTTClient_create().
|
||||
*
|
||||
* If the functions defined return an ::MQTTCLIENT_PERSISTENCE_ERROR then the
|
||||
* state of the persisted data should remain as it was prior to the function
|
||||
* being called. For example, if Persistence_put() returns
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR, then it is assumed tha tthe persistent store
|
||||
* does not contain the data that was passed to the function. Similarly, if
|
||||
* Persistence_remove() returns ::MQTTCLIENT_PERSISTENCE_ERROR then it is
|
||||
* assumed that the data to be removed is still held in the persistent store.
|
||||
*
|
||||
* It is up to the persistence implementation to log any error information that
|
||||
* may be required to diagnose a persistence mechanism failure.
|
||||
*/
|
||||
|
||||
/*
|
||||
/// @cond EXCLUDE
|
||||
*/
|
||||
#if !defined(MQTTCLIENTPERSISTENCE_H)
|
||||
#define MQTTCLIENTPERSISTENCE_H
|
||||
/*
|
||||
/// @endcond
|
||||
*/
|
||||
|
||||
/**
|
||||
* This <i>persistence_type</i> value specifies the default file system-based
|
||||
* persistence mechanism (see MQTTClient_create()).
|
||||
*/
|
||||
#define MQTTCLIENT_PERSISTENCE_DEFAULT 0
|
||||
/**
|
||||
* This <i>persistence_type</i> value specifies a memory-based
|
||||
* persistence mechanism (see MQTTClient_create()).
|
||||
*/
|
||||
#define MQTTCLIENT_PERSISTENCE_NONE 1
|
||||
/**
|
||||
* This <i>persistence_type</i> value specifies an application-specific
|
||||
* persistence mechanism (see MQTTClient_create()).
|
||||
*/
|
||||
#define MQTTCLIENT_PERSISTENCE_USER 2
|
||||
|
||||
/**
|
||||
* Application-specific persistence functions must return this error code if
|
||||
* there is a problem executing the function.
|
||||
*/
|
||||
#define MQTTCLIENT_PERSISTENCE_ERROR -2
|
||||
|
||||
/**
|
||||
* @brief Initialize the persistent store.
|
||||
*
|
||||
* Either open the existing persistent store for this client ID or create a new
|
||||
* one if one doesn't exist. If the persistent store is already open, return
|
||||
* without taking any action.
|
||||
*
|
||||
* An application can use the same client identifier to connect to many
|
||||
* different servers. The <i>clientid</i> in conjunction with the
|
||||
* <i>serverURI</i> uniquely identifies the persistence store required.
|
||||
*
|
||||
* @param handle The address of a pointer to a handle for this persistence
|
||||
* implementation. This function must set handle to a valid reference to the
|
||||
* persistence following a successful return.
|
||||
* The handle pointer is passed as an argument to all the other
|
||||
* persistence functions. It may include the context parameter and/or any other
|
||||
* data for use by the persistence functions.
|
||||
* @param clientID The client identifier for which the persistent store should
|
||||
* be opened.
|
||||
* @param serverURI The connection string specified when the MQTT client was
|
||||
* created (see MQTTClient_create()).
|
||||
* @param context A pointer to any data required to initialize the persistent
|
||||
* store (see ::MQTTClient_persistence).
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_open)(void** handle, const char* clientID, const char* serverURI, void* context);
|
||||
|
||||
/**
|
||||
* @brief Close the persistent store referred to by the handle.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_close)(void* handle);
|
||||
|
||||
/**
|
||||
* @brief Put the specified data into the persistent store.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param key A string used as the key for the data to be put in the store. The
|
||||
* key is later used to retrieve data from the store with Persistence_get().
|
||||
* @param bufcount The number of buffers to write to the persistence store.
|
||||
* @param buffers An array of pointers to the data buffers associated with
|
||||
* this <i>key</i>.
|
||||
* @param buflens An array of lengths of the data buffers. <i>buflen[n]</i>
|
||||
* gives the length of <i>buffer[n]</i>.
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_put)(void* handle, char* key, int bufcount, char* buffers[], int buflens[]);
|
||||
|
||||
/**
|
||||
* @brief Retrieve the specified data from the persistent store.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param key A string that is the key for the data to be retrieved. This is
|
||||
* the same key used to save the data to the store with Persistence_put().
|
||||
* @param buffer The address of a pointer to a buffer. This function sets the
|
||||
* pointer to point at the retrieved data, if successful.
|
||||
* @param buflen The address of an int that is set to the length of
|
||||
* <i>buffer</i> by this function if successful.
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_get)(void* handle, char* key, char** buffer, int* buflen);
|
||||
|
||||
/**
|
||||
* @brief Remove the data for the specified key from the store.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param key A string that is the key for the data to be removed from the
|
||||
* store. This is the same key used to save the data to the store with
|
||||
* Persistence_put().
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_remove)(void* handle, char* key);
|
||||
|
||||
/**
|
||||
* @brief Returns the keys in this persistent data store.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param keys The address of a pointer to pointers to strings. Assuming
|
||||
* successful execution, this function allocates memory to hold the returned
|
||||
* keys (strings used to store the data with Persistence_put()). It also
|
||||
* allocates memory to hold an array of pointers to these strings. <i>keys</i>
|
||||
* is set to point to the array of pointers to strings.
|
||||
* @param nkeys A pointer to the number of keys in this persistent data store.
|
||||
* This function sets the number of keys, if successful.
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_keys)(void* handle, char*** keys, int* nkeys);
|
||||
|
||||
/**
|
||||
* @brief Clears the persistence store, so that it no longer contains any
|
||||
* persisted data.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_clear)(void* handle);
|
||||
|
||||
/**
|
||||
* @brief Returns whether any data has been persisted using the specified key.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param key The string to be tested for existence in the store.
|
||||
* @return Return 0 if the key was found in the store, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_containskey)(void* handle, char* key);
|
||||
|
||||
/**
|
||||
* @brief A structure containing the function pointers to a persistence
|
||||
* implementation and the context or state that will be shared across all
|
||||
* the persistence functions.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* A pointer to any data required to initialize the persistent store.
|
||||
*/
|
||||
void* context;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_open().
|
||||
*/
|
||||
Persistence_open popen;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_close().
|
||||
*/
|
||||
Persistence_close pclose;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_put().
|
||||
*/
|
||||
Persistence_put pput;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_get().
|
||||
*/
|
||||
Persistence_get pget;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_remove().
|
||||
*/
|
||||
Persistence_remove premove;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_keys().
|
||||
*/
|
||||
Persistence_keys pkeys;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_clear().
|
||||
*/
|
||||
Persistence_clear pclear;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_containskey().
|
||||
*/
|
||||
Persistence_containskey pcontainskey;
|
||||
} MQTTClient_persistence;
|
||||
|
||||
|
||||
/**
|
||||
* A callback which is invoked just before a write to persistence. This can be
|
||||
* used to transform the data, for instance to encrypt it.
|
||||
* @param context The context as set in ::MQTTAsync_setBeforePersistenceWrite
|
||||
* @param bufcount The number of buffers to write to the persistence store.
|
||||
* @param buffers An array of pointers to the data buffers.
|
||||
* @param buflens An array of lengths of the data buffers.
|
||||
* @return Return 0 if the function completes successfully, otherwise non 0.
|
||||
*/
|
||||
typedef int MQTTPersistence_beforeWrite(void* context, int bufcount, char* buffers[], int buflens[]);
|
||||
|
||||
|
||||
/**
|
||||
* A callback which is invoked just after a read from persistence. This can be
|
||||
* used to transform the data, for instance to decrypt it.
|
||||
* @param context The context as set in ::MQTTAsync_setAfterPersistenceRead
|
||||
* @param buffer The address of a pointer to a buffer.
|
||||
* @param buflen The address of an int that is the length of the buffer.
|
||||
* @return Return 0 if the function completes successfully, otherwise non 0.
|
||||
*/
|
||||
typedef int MQTTPersistence_afterRead(void* context, char** buffer, int* buflen);
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,237 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2022 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "compatbits.h"
|
||||
#include <string.h>
|
||||
#include "asmstrucs.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
|
||||
#ifndef WIN32
|
||||
|
||||
#define APIENTRY
|
||||
#define DllExport
|
||||
#define VOID void
|
||||
|
||||
#else
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
extern BOOL EventsEnabled;
|
||||
void MQTTReportSession(char * Msg);
|
||||
extern int MQTT;
|
||||
|
||||
|
||||
extern char Modenames[19][10];
|
||||
|
||||
// Runs use specified routine on certain event
|
||||
#ifndef WIN32
|
||||
|
||||
void RunEventProgram(char * Program, char * Param)
|
||||
{
|
||||
char * arg_list[] = {Program, NULL, NULL};
|
||||
pid_t child_pid;
|
||||
|
||||
if (EventsEnabled == 0)
|
||||
return;
|
||||
|
||||
signal(SIGCHLD, SIG_IGN); // Silently (and portably) reap children.
|
||||
|
||||
if (Param && Param[0])
|
||||
arg_list[1] = Param;
|
||||
|
||||
// Fork and Exec Specified program
|
||||
|
||||
// Duplicate this process.
|
||||
|
||||
child_pid = fork ();
|
||||
|
||||
if (child_pid == -1)
|
||||
{
|
||||
printf ("Event fork() Failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (child_pid == 0)
|
||||
{
|
||||
execvp (arg_list[0], arg_list);
|
||||
|
||||
// The execvp function returns only if an error occurs.
|
||||
|
||||
printf ("Failed to run %s\n", arg_list[0]);
|
||||
exit(0); // Kill the new process
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
DllExport void APIENTRY RunEventProgram(char * Program, char * Param)
|
||||
{
|
||||
int n = 0;
|
||||
char cmdLine[256];
|
||||
|
||||
STARTUPINFO SInfo; // pointer to STARTUPINFO
|
||||
PROCESS_INFORMATION PInfo; // pointer to PROCESS_INFORMATION
|
||||
|
||||
if (EventsEnabled == 0)
|
||||
return;
|
||||
|
||||
|
||||
SInfo.cb=sizeof(SInfo);
|
||||
SInfo.lpReserved=NULL;
|
||||
SInfo.lpDesktop=NULL;
|
||||
SInfo.lpTitle=NULL;
|
||||
SInfo.dwFlags=0;
|
||||
SInfo.cbReserved2=0;
|
||||
SInfo.lpReserved2=NULL;
|
||||
|
||||
sprintf(cmdLine, "%s %s", Program, Param);
|
||||
|
||||
if (!CreateProcess(NULL, cmdLine, NULL, NULL, FALSE,0 ,NULL ,NULL, &SInfo, &PInfo))
|
||||
Debugprintf("Failed to Start %s Error %d ", Program, GetLastError());
|
||||
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK)
|
||||
{
|
||||
// Incoming SABM
|
||||
|
||||
LINK->ConnectTime = time(NULL);
|
||||
LINK->bytesTXed = LINK->bytesRXed = 0;
|
||||
|
||||
strcpy(LINK->callingCall, remotecall);
|
||||
strcpy(LINK->receivingCall, ourcall);
|
||||
strcpy(LINK->Direction, "In");
|
||||
}
|
||||
|
||||
void hookL2SessionDeleted(struct _LINKTABLE * LINK)
|
||||
{
|
||||
// calculate session time and av bytes/min in and out
|
||||
|
||||
if (LINK->ConnectTime)
|
||||
{
|
||||
if (LINK->bytesTXed == 0 && LINK->bytesRXed == 0)
|
||||
{
|
||||
// assume failed connect and ignore for now - maybe log later
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
char Msg[256];
|
||||
char timestamp[16];
|
||||
time_t sessionTime = time(NULL) - LINK->ConnectTime;
|
||||
double avBytesSent = LINK->bytesTXed / (sessionTime / 60.0);
|
||||
double avBytesRXed = LINK->bytesRXed / (sessionTime / 60.0);
|
||||
time_t Now = time(NULL);
|
||||
struct tm * TM = localtime(&Now);
|
||||
|
||||
sprintf(timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
|
||||
|
||||
if (sessionTime == 0)
|
||||
sessionTime = 1; // Or will get divide by zero error
|
||||
|
||||
Debugprintf("KISS Session Stats Port %d %s %s %d secs Bytes Sent %d BPM %4.2f Bytes Received %d %4.2f BPM ",
|
||||
LINK->LINKPORT->PORTNUMBER, LINK->callingCall, LINK->receivingCall, sessionTime, LINK->bytesTXed, avBytesSent, LINK->bytesRXed, avBytesRXed, timestamp);
|
||||
|
||||
|
||||
sprintf(Msg, "{\"mode\": \"%s\", \"direction\": \"%s\", \"port\": %d, \"callfrom\": \"%s\", \"callto\": \"%s\", \"time\": %d, \"bytesSent\": %d,"
|
||||
"\"BPMSent\": %4.2f, \"BytesReceived\": %d, \"BPMReceived\": %4.2f, \"timestamp\": \"%s\"}",
|
||||
"KISS", LINK->Direction, LINK->LINKPORT->PORTNUMBER, LINK->callingCall, LINK->receivingCall, sessionTime,
|
||||
LINK->bytesTXed, avBytesSent, LINK->bytesRXed, avBytesRXed, timestamp);
|
||||
|
||||
if (MQTT)
|
||||
MQTTReportSession(Msg);
|
||||
}
|
||||
|
||||
LINK->ConnectTime = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK)
|
||||
{
|
||||
LINK->ConnectTime = time(NULL);
|
||||
LINK->bytesTXed = LINK->bytesRXed = 0;
|
||||
|
||||
strcpy(LINK->callingCall, ourcall);
|
||||
strcpy(LINK->receivingCall, remotecall);
|
||||
strcpy(LINK->Direction, "Out");
|
||||
}
|
||||
|
||||
void hookL4SessionAttempt(struct STREAMINFO * STREAM, char * remotecall, char * ourcall)
|
||||
{
|
||||
// Outgoing Connect
|
||||
|
||||
STREAM->ConnectTime = time(NULL);
|
||||
STREAM->bytesTXed = STREAM->bytesRXed = 0;
|
||||
|
||||
strcpy(STREAM->callingCall, ourcall);
|
||||
strcpy(STREAM->receivingCall, remotecall);
|
||||
strcpy(STREAM->Direction, "Out");
|
||||
}
|
||||
|
||||
void hookL4SessionAccepted(struct STREAMINFO * STREAM, char * remotecall, char * ourcall)
|
||||
{
|
||||
// Incoming Connect
|
||||
|
||||
STREAM->ConnectTime = time(NULL);
|
||||
STREAM->bytesTXed = STREAM->bytesRXed = 0;
|
||||
|
||||
strcpy(STREAM->callingCall, remotecall);
|
||||
strcpy(STREAM->receivingCall, ourcall);
|
||||
strcpy(STREAM->Direction, "In");
|
||||
}
|
||||
|
||||
void hookL4SessionDeleted(struct TNCINFO * TNC, struct STREAMINFO * STREAM)
|
||||
{
|
||||
char Msg[256];
|
||||
|
||||
char timestamp[16];
|
||||
|
||||
if (STREAM->ConnectTime)
|
||||
{
|
||||
time_t sessionTime = time(NULL) - STREAM->ConnectTime;
|
||||
double avBytesRXed = STREAM->bytesRXed / (sessionTime / 60.0);
|
||||
double avBytesSent = STREAM->bytesTXed / (sessionTime / 60.0);
|
||||
time_t Now = time(NULL);
|
||||
struct tm * TM = localtime(&Now);
|
||||
sprintf(timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
|
||||
|
||||
if (sessionTime == 0)
|
||||
sessionTime = 1; // Or will get divide by zero error
|
||||
|
||||
sprintf(Msg, "{\"mode\": \"%s\", \"direction\": \"%s\", \"port\": %d, \"callfrom\": \"%s\", \"callto\": \"%s\", \"time\": %d, \"bytesSent\": %d,"
|
||||
"\"BPMSent\": %4.2f, \"BytesReceived\": %d, \"BPMReceived\": %4.2f, \"timestamp\": \"%s\"}",
|
||||
Modenames[TNC->Hardware - 1], STREAM->Direction, TNC->Port, STREAM->callingCall, STREAM->receivingCall, sessionTime,
|
||||
STREAM->bytesTXed, avBytesSent, STREAM->bytesRXed, avBytesRXed, timestamp);
|
||||
|
||||
if (MQTT)
|
||||
MQTTReportSession(Msg);
|
||||
|
||||
STREAM->ConnectTime = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,988 +0,0 @@
|
||||
|
||||
// Program to Convert RTS changes on Virtual COM Port to hamlib PTT commands
|
||||
|
||||
|
||||
// Version 1. 0. 0. 1 December 2020
|
||||
|
||||
// Version 1. 0. 2. 1 April 2018
|
||||
|
||||
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <memory.h>
|
||||
#include <Psapi.h>
|
||||
|
||||
#define LIBCONFIG_STATIC
|
||||
#include "libconfig.h"
|
||||
|
||||
|
||||
#include "BPQRemotePTTRes.h"
|
||||
|
||||
#define BPQICON 400
|
||||
|
||||
WSADATA WsaData; // receives data from WSAStartup
|
||||
|
||||
#define WSA_READ WM_USER + 1
|
||||
|
||||
HINSTANCE hInst;
|
||||
char AppName[] = "BPQRemotePTT";
|
||||
char Title[80] = "BPQRemotePTT";
|
||||
|
||||
TCHAR szTitle[]="GPSMuxPC"; // The title bar text
|
||||
TCHAR szWindowClass[]="GPSMAINWINDOW"; // the main window class name
|
||||
|
||||
|
||||
// Foward declarations of functions included in this code module:
|
||||
|
||||
ATOM MyRegisterClass(HINSTANCE hInstance);
|
||||
BOOL InitInstance(HINSTANCE, int);
|
||||
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
|
||||
VOID WINAPI CompletedReadRoutine(DWORD dwErr, DWORD cbBytesRead, LPOVERLAPPED lpOverLap);
|
||||
VOID WINAPI txCompletedReadRoutine(DWORD dwErr, DWORD cbBytesRead, LPOVERLAPPED lpOverLap);
|
||||
VOID CATThread();
|
||||
VOID runTimer();
|
||||
|
||||
int TimerHandle = 0;
|
||||
|
||||
LOGFONT LFTTYFONT ;
|
||||
|
||||
HFONT hFont;
|
||||
|
||||
struct sockaddr_in sinx;
|
||||
struct sockaddr rx;
|
||||
|
||||
int addrlen = sizeof(struct sockaddr_in);
|
||||
|
||||
int HAMLIBPORT; // Port Number for HAMLIB (rigctld) Emulator
|
||||
char * HAMLIBHOST[128];
|
||||
|
||||
BOOL MinimizetoTray=FALSE;
|
||||
|
||||
VOID __cdecl Debugprintf(const char * format, ...)
|
||||
{
|
||||
char Mess[255];
|
||||
va_list(arglist);
|
||||
|
||||
va_start(arglist, format);
|
||||
vsprintf(Mess, format, arglist);
|
||||
strcat(Mess, "\r\n");
|
||||
|
||||
OutputDebugString(Mess);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
char * strlop(char * buf, char delim)
|
||||
{
|
||||
// Terminate buf at delim, and return rest of string
|
||||
|
||||
char * ptr = strchr(buf, delim);
|
||||
|
||||
if (ptr == NULL) return NULL;
|
||||
|
||||
*(ptr)++=0;
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
char * RigPort = NULL;
|
||||
char * RigSpeed = NULL;
|
||||
HANDLE RigHandle = 0;
|
||||
int RigType = 0; // Flag for possible RTS/DTR
|
||||
|
||||
|
||||
char BPQHostIP[128];
|
||||
|
||||
char PTTCATPort[4][16];
|
||||
HANDLE PTTCATHandle[4];
|
||||
short HamLibPort[4];
|
||||
SOCKET HamLibSock[4]; // rigctld socket
|
||||
|
||||
HWND comWnd[4];
|
||||
HWND portWnd[4];
|
||||
HWND stateWnd[4];
|
||||
int stateCtl[4];
|
||||
|
||||
struct sockaddr_in remoteDest[4];
|
||||
|
||||
int RealMux[4]; // BPQ Virtual or Real
|
||||
|
||||
int EndPTTCATThread = 0;
|
||||
|
||||
char ConfigName[256] = "BPQRemotePTT.cfg";
|
||||
|
||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value)
|
||||
{
|
||||
const char * str;
|
||||
config_setting_t *setting;
|
||||
|
||||
setting = config_setting_get_member (group, name);
|
||||
if (setting)
|
||||
{
|
||||
str = config_setting_get_string (setting);
|
||||
strcpy(value, str);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int GetIntValue(config_setting_t * group, char * name)
|
||||
{
|
||||
config_setting_t *setting;
|
||||
|
||||
setting = config_setting_get_member (group, name);
|
||||
if (setting)
|
||||
return config_setting_get_int (setting);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
VOID SaveStringValue(config_setting_t * group, char * name, char * value)
|
||||
{
|
||||
config_setting_t *setting;
|
||||
|
||||
setting = config_setting_add(group, name, CONFIG_TYPE_STRING);
|
||||
if (setting)
|
||||
config_setting_set_string(setting, value);
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID SaveIntValue(config_setting_t * group, char * name, int value)
|
||||
{
|
||||
config_setting_t *setting;
|
||||
|
||||
setting = config_setting_add(group, name, CONFIG_TYPE_INT);
|
||||
if(setting)
|
||||
config_setting_set_int(setting, value);
|
||||
}
|
||||
VOID GetConfig()
|
||||
{
|
||||
config_setting_t *group;
|
||||
config_t cfg;
|
||||
|
||||
memset((void *)&cfg, 0, sizeof(config_t));
|
||||
|
||||
config_init(&cfg);
|
||||
|
||||
if(!config_read_file(&cfg, ConfigName))
|
||||
{
|
||||
fprintf(stderr, "Config read error line %d - %s\n", config_error_line(&cfg), config_error_text(&cfg));
|
||||
config_destroy(&cfg);
|
||||
return;
|
||||
}
|
||||
|
||||
group = config_lookup(&cfg, "main");
|
||||
|
||||
if (group == NULL)
|
||||
{
|
||||
config_destroy(&cfg);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
GetStringValue(group, "BPQHostIP", BPQHostIP);
|
||||
|
||||
GetStringValue(group, "COM1", PTTCATPort[0]);
|
||||
GetStringValue(group, "COM2", PTTCATPort[1]);
|
||||
GetStringValue(group, "COM3", PTTCATPort[2]);
|
||||
GetStringValue(group, "COM4", PTTCATPort[3]);
|
||||
|
||||
HamLibPort[0] = GetIntValue(group, "HamLibPort1");
|
||||
HamLibPort[1] = GetIntValue(group, "HamLibPort2");
|
||||
HamLibPort[2] = GetIntValue(group, "HamLibPort3");
|
||||
HamLibPort[3] = GetIntValue(group, "HamLibPort4");
|
||||
|
||||
config_destroy(&cfg);
|
||||
}
|
||||
|
||||
VOID SaveConfig()
|
||||
{
|
||||
config_setting_t *root, *group;
|
||||
config_t cfg;
|
||||
|
||||
// Get rid of old config before saving
|
||||
|
||||
config_init(&cfg);
|
||||
|
||||
root = config_root_setting(&cfg);
|
||||
|
||||
group = config_setting_add(root, "main", CONFIG_TYPE_GROUP);
|
||||
|
||||
SaveStringValue(group, "BPQHostIP", BPQHostIP);
|
||||
|
||||
SaveStringValue(group, "COM1", PTTCATPort[0]);
|
||||
SaveStringValue(group, "COM2", PTTCATPort[1]);
|
||||
SaveStringValue(group, "COM3", PTTCATPort[2]);
|
||||
SaveStringValue(group, "COM4", PTTCATPort[3]);
|
||||
|
||||
SaveIntValue(group, "HamLibPort1", HamLibPort[0]);
|
||||
SaveIntValue(group, "HamLibPort2", HamLibPort[1]);
|
||||
SaveIntValue(group, "HamLibPort3", HamLibPort[2]);
|
||||
SaveIntValue(group, "HamLibPort4", HamLibPort[3]);
|
||||
|
||||
if(!config_write_file(&cfg, ConfigName))
|
||||
{
|
||||
fprintf(stderr, "Error while writing file.\n");
|
||||
config_destroy(&cfg);
|
||||
return;
|
||||
}
|
||||
|
||||
config_destroy(&cfg);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
if (lpCmdLine[0])
|
||||
{
|
||||
// Port Name and Speed for Remote CAT
|
||||
|
||||
RigPort = _strdup(lpCmdLine);
|
||||
RigSpeed = strlop(RigPort, ':');
|
||||
}
|
||||
|
||||
MyRegisterClass(hInstance);
|
||||
|
||||
GetConfig();
|
||||
|
||||
if (!InitInstance(hInstance, nCmdShow))
|
||||
return (FALSE);
|
||||
|
||||
// Main message loop:
|
||||
|
||||
while (GetMessage(&msg, NULL, 0, 0))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
KillTimer(NULL, TimerHandle);
|
||||
|
||||
return (msg.wParam);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
//
|
||||
// FUNCTION: InitApplication(HANDLE)
|
||||
//
|
||||
// PURPOSE: Initializes window data and registers window class
|
||||
//
|
||||
// COMMENTS:
|
||||
//
|
||||
// In this function, we initialize a window class by filling out a data
|
||||
// structure of type WNDCLASS and calling either RegisterClass or
|
||||
// the internal MyRegisterClass.
|
||||
//
|
||||
|
||||
#define BGCOLOUR RGB(236,233,216)
|
||||
HBRUSH bgBrush;
|
||||
HBRUSH RedBrush;
|
||||
HBRUSH GreenBrush;
|
||||
|
||||
HWND hWnd;
|
||||
|
||||
BOOL InitApplication(HINSTANCE hInstance)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//
|
||||
// FUNCTION: InitInstance(HANDLE, int)
|
||||
//
|
||||
// PURPOSE: Saves instance handle and creates main window
|
||||
//
|
||||
// COMMENTS:
|
||||
//
|
||||
// In this function, we save the instance handle in a global variable and
|
||||
// create and display the main program window.
|
||||
//
|
||||
|
||||
HFONT FAR PASCAL MyCreateFont( void )
|
||||
{
|
||||
CHOOSEFONT cf;
|
||||
LOGFONT lf;
|
||||
HFONT hfont;
|
||||
|
||||
// Initialize members of the CHOOSEFONT structure.
|
||||
|
||||
cf.lStructSize = sizeof(CHOOSEFONT);
|
||||
cf.hwndOwner = (HWND)NULL;
|
||||
cf.hDC = (HDC)NULL;
|
||||
cf.lpLogFont = &lf;
|
||||
cf.iPointSize = 0;
|
||||
cf.Flags = CF_SCREENFONTS | CF_FIXEDPITCHONLY;
|
||||
cf.rgbColors = RGB(0,0,0);
|
||||
cf.lCustData = 0L;
|
||||
cf.lpfnHook = (LPCFHOOKPROC)NULL;
|
||||
cf.lpTemplateName = (LPSTR)NULL;
|
||||
cf.hInstance = (HINSTANCE) NULL;
|
||||
cf.lpszStyle = (LPSTR)NULL;
|
||||
cf.nFontType = SCREEN_FONTTYPE;
|
||||
cf.nSizeMin = 0;
|
||||
cf.nSizeMax = 0;
|
||||
|
||||
// Display the CHOOSEFONT common-dialog box.
|
||||
|
||||
ChooseFont(&cf);
|
||||
|
||||
// Create a logical font based on the user's
|
||||
// selection and return a handle identifying
|
||||
// that font.
|
||||
|
||||
hfont = CreateFontIndirect(cf.lpLogFont);
|
||||
return (hfont);
|
||||
}
|
||||
|
||||
VOID Rig_PTT(int n, BOOL PTTState)
|
||||
{
|
||||
|
||||
char Msg[16];
|
||||
int Len = sprintf(Msg, "T %d\n", PTTState);
|
||||
|
||||
if (HamLibSock[n])
|
||||
{
|
||||
send(HamLibSock[n], Msg, Len, 0);
|
||||
|
||||
if (PTTState)
|
||||
SetDlgItemText(hWnd, stateCtl[n], "PTT");
|
||||
else
|
||||
SetDlgItemText(hWnd, stateCtl[n], "");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID PTTCATThread()
|
||||
{
|
||||
DWORD dwLength = 0;
|
||||
int Length, ret, i;
|
||||
UCHAR * ptr1;
|
||||
UCHAR * ptr2;
|
||||
UCHAR c;
|
||||
UCHAR Block[4][80];
|
||||
UCHAR CurrentState[4] = {0};
|
||||
#define RTS 2
|
||||
#define DTR 4
|
||||
HANDLE Event;
|
||||
DWORD EvtMask[4];
|
||||
OVERLAPPED Overlapped[4];
|
||||
char Port[32];
|
||||
int PIndex = 0;
|
||||
int HIndex = 0;
|
||||
int rc;
|
||||
|
||||
EndPTTCATThread = FALSE;
|
||||
|
||||
while (PIndex < 4 && PTTCATPort[PIndex][0])
|
||||
{
|
||||
RealMux[HIndex] = 0;
|
||||
|
||||
sprintf(Port, "\\\\.\\pipe\\BPQ%s", PTTCATPort[PIndex]);
|
||||
|
||||
PTTCATHandle[HIndex] = CreateFile(Port, GENERIC_READ | GENERIC_WRITE,
|
||||
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
|
||||
|
||||
if (PTTCATHandle[HIndex] == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
int Err = GetLastError();
|
||||
// Consoleprintf("PTTMUX port BPQCOM%s Open failed code %d", RIG->PTTCATPort[PIndex], Err);
|
||||
|
||||
// See if real com port
|
||||
|
||||
sprintf(Port, "\\\\.\\\\%s", PTTCATPort[PIndex]);
|
||||
|
||||
PTTCATHandle[HIndex] = CreateFile(Port, GENERIC_READ | GENERIC_WRITE,
|
||||
0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
|
||||
|
||||
RealMux[HIndex] = 1;
|
||||
|
||||
if (PTTCATHandle[HIndex] == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
int Err = GetLastError();
|
||||
PTTCATHandle[HIndex] = 0;
|
||||
Debugprintf("PTTMUX port COM%s Open failed code %d", PTTCATPort[PIndex], Err);
|
||||
}
|
||||
else
|
||||
{
|
||||
rc = SetCommMask(PTTCATHandle[HIndex], EV_CTS | EV_DSR); // Request notifications
|
||||
HIndex++;
|
||||
}
|
||||
}
|
||||
else
|
||||
HIndex++;
|
||||
|
||||
PIndex++;
|
||||
|
||||
}
|
||||
|
||||
if (PIndex == 0)
|
||||
return; // No ports
|
||||
|
||||
Event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
|
||||
for (i = 0; i < HIndex; i ++)
|
||||
{
|
||||
memset(&Overlapped[i], 0, sizeof(OVERLAPPED));
|
||||
Overlapped[i].hEvent = Event;
|
||||
|
||||
if (RealMux[i])
|
||||
{
|
||||
// Request Interface change notifications
|
||||
|
||||
rc = WaitCommEvent(PTTCATHandle[i], &EvtMask[i], &Overlapped[i]);
|
||||
rc = GetLastError();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Prime a read on each PTTCATHandle
|
||||
|
||||
ReadFile(PTTCATHandle[i], Block[i], 80, &Length, &Overlapped[i]);
|
||||
}
|
||||
}
|
||||
|
||||
while (EndPTTCATThread == FALSE)
|
||||
{
|
||||
|
||||
WaitAgain:
|
||||
|
||||
ret = WaitForSingleObject(Event, 1000);
|
||||
|
||||
if (ret == WAIT_TIMEOUT)
|
||||
{
|
||||
if (EndPTTCATThread)
|
||||
{
|
||||
for (i = 0; i < HIndex; i ++)
|
||||
{
|
||||
CancelIo(PTTCATHandle[i]);
|
||||
CloseHandle(PTTCATHandle[i]);
|
||||
PTTCATHandle[i] = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
CloseHandle(Event);
|
||||
return;
|
||||
}
|
||||
goto WaitAgain;
|
||||
}
|
||||
|
||||
ResetEvent(Event);
|
||||
|
||||
// See which request(s) have completed
|
||||
|
||||
for (i = 0; i < HIndex; i ++)
|
||||
{
|
||||
ret = GetOverlappedResult(PTTCATHandle[i], &Overlapped[i], &Length, FALSE);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
if (RealMux[i])
|
||||
{
|
||||
// Request Interface change notifications
|
||||
|
||||
DWORD Mask;
|
||||
|
||||
GetCommModemStatus(PTTCATHandle[i], &Mask);
|
||||
|
||||
if (Mask & MS_CTS_ON)
|
||||
Rig_PTT(i, TRUE);
|
||||
else
|
||||
Rig_PTT(i, FALSE);
|
||||
|
||||
memset(&Overlapped[i], 0, sizeof(OVERLAPPED));
|
||||
Overlapped[i].hEvent = Event;
|
||||
WaitCommEvent(PTTCATHandle[i], &EvtMask[i], &Overlapped[i]);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
ptr1 = Block[i];
|
||||
ptr2 = Block[i];
|
||||
|
||||
while (Length > 0)
|
||||
{
|
||||
c = *(ptr1++);
|
||||
|
||||
Length--;
|
||||
|
||||
if (c == 0xff)
|
||||
{
|
||||
c = *(ptr1++);
|
||||
Length--;
|
||||
|
||||
if (c == 0xff) // ff ff means ff
|
||||
{
|
||||
Length--;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is connection / RTS/DTR statua from other end
|
||||
// Convert to CAT Command
|
||||
|
||||
if (c == CurrentState[i])
|
||||
continue;
|
||||
|
||||
if (c & RTS)
|
||||
Rig_PTT(i, TRUE);
|
||||
else
|
||||
Rig_PTT(i, FALSE);
|
||||
|
||||
CurrentState[i] = c;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
memset(&Overlapped[i], 0, sizeof(OVERLAPPED));
|
||||
Overlapped[i].hEvent = Event;
|
||||
|
||||
ReadFile(PTTCATHandle[i], Block[i], 80, &Length, &Overlapped[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EndPTTCATThread = FALSE;
|
||||
}
|
||||
|
||||
char ClassName[]="BPQMAIL";
|
||||
|
||||
ATOM MyRegisterClass(HINSTANCE hInstance)
|
||||
{
|
||||
WNDCLASS wc;
|
||||
|
||||
bgBrush = CreateSolidBrush(BGCOLOUR);
|
||||
RedBrush = CreateSolidBrush(RGB(255,0,0));
|
||||
GreenBrush = CreateSolidBrush(RGB(0,255,0));
|
||||
// BlueBrush = CreateSolidBrush(RGB(0,0,255));
|
||||
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
|
||||
wc.lpfnWndProc = WndProc;
|
||||
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = DLGWINDOWEXTRA;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = NULL; //LoadIcon( hInstance, MAKEINTRESOURCE(IDI_GPSMUXPC));
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = bgBrush;
|
||||
|
||||
wc.lpszMenuName = NULL;//"MENU_1";
|
||||
wc.lpszClassName = szWindowClass;
|
||||
|
||||
// RegisterClass(&wc);
|
||||
|
||||
// wc.lpfnWndProc = TraceWndProc;
|
||||
// wc.lpszClassName = TraceClassName;
|
||||
|
||||
// RegisterClass(&wc);
|
||||
|
||||
// wc.lpfnWndProc = ConfigWndProc;
|
||||
// wc.lpszClassName = ConfigClassName;
|
||||
|
||||
return (RegisterClass(&wc));
|
||||
|
||||
}
|
||||
|
||||
|
||||
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
||||
{
|
||||
u_long param=1;
|
||||
BOOL bcopt=TRUE;
|
||||
int ret;
|
||||
WNDCLASS wc = {0};
|
||||
int n = 0;
|
||||
|
||||
|
||||
hInst = hInstance; // Store instance handle in our global variable
|
||||
|
||||
WSAStartup(MAKEWORD(2, 0), &WsaData);
|
||||
|
||||
|
||||
hWnd=CreateDialog(hInst,szWindowClass,0,NULL);
|
||||
|
||||
if (!hWnd)
|
||||
{
|
||||
ret=GetLastError();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// setup default font information
|
||||
|
||||
LFTTYFONT.lfHeight = 12;
|
||||
LFTTYFONT.lfWidth = 8 ;
|
||||
LFTTYFONT.lfEscapement = 0 ;
|
||||
LFTTYFONT.lfOrientation = 0 ;
|
||||
LFTTYFONT.lfWeight = 0 ;
|
||||
LFTTYFONT.lfItalic = 0 ;
|
||||
LFTTYFONT.lfUnderline = 0 ;
|
||||
LFTTYFONT.lfStrikeOut = 0 ;
|
||||
LFTTYFONT.lfCharSet = OEM_CHARSET ;
|
||||
LFTTYFONT.lfOutPrecision = OUT_DEFAULT_PRECIS ;
|
||||
LFTTYFONT.lfClipPrecision = CLIP_DEFAULT_PRECIS ;
|
||||
LFTTYFONT.lfQuality = DEFAULT_QUALITY ;
|
||||
LFTTYFONT.lfPitchAndFamily = FIXED_PITCH | FF_MODERN ;
|
||||
lstrcpy( LFTTYFONT.lfFaceName, "Fixedsys" ) ;
|
||||
|
||||
hFont = CreateFontIndirect(&LFTTYFONT) ;
|
||||
// hFont = MyCreateFont();
|
||||
|
||||
SetWindowText(hWnd,Title);
|
||||
|
||||
comWnd[0] = GetDlgItem(hWnd, IDC_COM1);
|
||||
comWnd[1] = GetDlgItem(hWnd, IDC_COM2);
|
||||
comWnd[2] = GetDlgItem(hWnd, IDC_COM3);
|
||||
comWnd[3] = GetDlgItem(hWnd, IDC_COM4);
|
||||
|
||||
portWnd[0] = GetDlgItem(hWnd, IDC_HAMLIBPORT1);
|
||||
portWnd[1] = GetDlgItem(hWnd, IDC_HAMLIBPORT2);
|
||||
portWnd[2] = GetDlgItem(hWnd, IDC_HAMLIBPORT3);
|
||||
portWnd[3] = GetDlgItem(hWnd, IDC_HAMLIBPORT4);
|
||||
|
||||
stateWnd[0] = GetDlgItem(hWnd, IDC_STATE1);
|
||||
stateWnd[1] = GetDlgItem(hWnd, IDC_STATE2);
|
||||
stateWnd[2] = GetDlgItem(hWnd, IDC_STATE3);
|
||||
stateWnd[3] = GetDlgItem(hWnd, IDC_STATE4);
|
||||
|
||||
|
||||
stateCtl[0] = IDC_STATE1;
|
||||
stateCtl[1] = IDC_STATE2;
|
||||
stateCtl[2] = IDC_STATE3;
|
||||
stateCtl[3] = IDC_STATE4;
|
||||
|
||||
ShowWindow(hWnd, nCmdShow);
|
||||
|
||||
SetDlgItemText(hWnd, IDC_BPQHOST, BPQHostIP);
|
||||
|
||||
SetDlgItemText(hWnd, IDC_COM1, PTTCATPort[0]);
|
||||
SetDlgItemText(hWnd, IDC_COM2, PTTCATPort[1]);
|
||||
SetDlgItemText(hWnd, IDC_COM3, PTTCATPort[2]);
|
||||
SetDlgItemText(hWnd, IDC_COM4, PTTCATPort[3]);
|
||||
|
||||
SetDlgItemInt(hWnd, IDC_HAMLIBPORT1, HamLibPort[0], 0);
|
||||
SetDlgItemInt(hWnd, IDC_HAMLIBPORT2, HamLibPort[1], 0);
|
||||
SetDlgItemInt(hWnd, IDC_HAMLIBPORT3, HamLibPort[2], 0);
|
||||
SetDlgItemInt(hWnd, IDC_HAMLIBPORT4, HamLibPort[3], 0);
|
||||
|
||||
// ioctlsocket (sock, FIONBIO, ¶m);
|
||||
|
||||
if (RigPort)
|
||||
{
|
||||
int Speed = 9600;
|
||||
|
||||
if (RigSpeed)
|
||||
Speed = atoi(RigSpeed);
|
||||
}
|
||||
|
||||
TimerHandle = SetTimer(hWnd, 1, 10000, NULL);
|
||||
|
||||
runTimer(); // Open Hamlib connections
|
||||
|
||||
_beginthread(PTTCATThread, 0);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID ConnecttoHAMLIB(int n);
|
||||
|
||||
VOID runTimer()
|
||||
{
|
||||
int n;
|
||||
|
||||
for (n = 0; n < 4; n++)
|
||||
{
|
||||
if (HamLibPort[n] && HamLibSock[n] == 0)
|
||||
{
|
||||
// try to connect
|
||||
|
||||
ConnecttoHAMLIB(n);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int wmId, wmEvent;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_TIMER:
|
||||
|
||||
runTimer();
|
||||
break;
|
||||
|
||||
case WM_CTLCOLOREDIT:
|
||||
{
|
||||
HDC hdc = (HDC) wParam; // handle to display context
|
||||
HWND hwnd = (HWND) lParam; // handle to control window
|
||||
int n;
|
||||
|
||||
for (n = 0; n < 4; n++)
|
||||
{
|
||||
if (hwnd == comWnd[n] && PTTCATPort[n][0])
|
||||
if (PTTCATHandle[n])
|
||||
return (INT_PTR)GreenBrush;
|
||||
else
|
||||
return (INT_PTR)RedBrush;
|
||||
|
||||
if (hwnd == portWnd[n] && HamLibPort[n])
|
||||
if (HamLibSock[n])
|
||||
return (INT_PTR)GreenBrush;
|
||||
else
|
||||
return (INT_PTR)RedBrush;
|
||||
}
|
||||
|
||||
//return (INT_PTR)RedBrush;
|
||||
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
}
|
||||
|
||||
case WM_SYSCOMMAND:
|
||||
|
||||
wmId = LOWORD(wParam); // Remember, these are...
|
||||
wmEvent = HIWORD(wParam); // ...different for Win32!
|
||||
|
||||
switch (wmId)
|
||||
{
|
||||
case SC_MINIMIZE:
|
||||
|
||||
if (MinimizetoTray)
|
||||
|
||||
return ShowWindow(hWnd, SW_HIDE);
|
||||
else
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
}
|
||||
|
||||
case WM_CLOSE:
|
||||
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
|
||||
wmId = LOWORD(wParam);
|
||||
wmEvent = HIWORD(wParam);
|
||||
|
||||
switch (wmId)
|
||||
{
|
||||
int OK;
|
||||
|
||||
case IDC_TEST1:
|
||||
|
||||
Rig_PTT(0, 1);
|
||||
Sleep(1500);
|
||||
Rig_PTT(0, 0);
|
||||
break;
|
||||
|
||||
case IDC_TEST2:
|
||||
|
||||
Rig_PTT(1, 1);
|
||||
Sleep(1500);
|
||||
Rig_PTT(1, 0);
|
||||
break;
|
||||
|
||||
case IDC_TEST3:
|
||||
|
||||
Rig_PTT(2, 1);
|
||||
Sleep(1500);
|
||||
Rig_PTT(2, 0);
|
||||
break;
|
||||
|
||||
case IDC_TEST4:
|
||||
|
||||
Rig_PTT(3, 1);
|
||||
Sleep(1500);
|
||||
Rig_PTT(3, 0);
|
||||
break;
|
||||
|
||||
case IDOK:
|
||||
|
||||
GetDlgItemText(hWnd, IDC_BPQHOST, BPQHostIP, 127);
|
||||
|
||||
GetDlgItemText(hWnd, IDC_COM1, PTTCATPort[0], 15);
|
||||
GetDlgItemText(hWnd, IDC_COM2, PTTCATPort[1], 15);
|
||||
GetDlgItemText(hWnd, IDC_COM3, PTTCATPort[2], 15);
|
||||
GetDlgItemText(hWnd, IDC_COM4, PTTCATPort[3], 15);
|
||||
|
||||
HamLibPort[0] = GetDlgItemInt(hWnd, IDC_HAMLIBPORT1, &OK, 0);
|
||||
HamLibPort[1] = GetDlgItemInt(hWnd, IDC_HAMLIBPORT2, &OK, 0);
|
||||
HamLibPort[2] = GetDlgItemInt(hWnd, IDC_HAMLIBPORT3, &OK, 0);
|
||||
HamLibPort[3] = GetDlgItemInt(hWnd, IDC_HAMLIBPORT4, &OK, 0);
|
||||
|
||||
SaveConfig();
|
||||
|
||||
// EndPTTCATThread = 1;
|
||||
|
||||
// Sleep(1100);
|
||||
|
||||
// _beginthread(PTTCATThread, 0);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
}
|
||||
}
|
||||
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
}
|
||||
|
||||
void HAMLIBProcessMessage(int n)
|
||||
{
|
||||
char RXBuffer[256];
|
||||
|
||||
int InputLen = recv(HamLibSock[n], RXBuffer, 256, 0);
|
||||
|
||||
if (InputLen == 0 || InputLen == SOCKET_ERROR)
|
||||
{
|
||||
if (HamLibSock[n])
|
||||
closesocket(HamLibSock[n]);
|
||||
|
||||
HamLibSock[n] = 0;
|
||||
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID HAMLIBThread(int n);
|
||||
|
||||
VOID ConnecttoHAMLIB(int n)
|
||||
{
|
||||
_beginthread(HAMLIBThread, 0, n);
|
||||
return ;
|
||||
}
|
||||
|
||||
VOID HAMLIBThread(int n)
|
||||
{
|
||||
// Opens sockets and looks for data
|
||||
|
||||
char Msg[255];
|
||||
int err, i, ret;
|
||||
u_long param=1;
|
||||
BOOL bcopt=TRUE;
|
||||
fd_set readfs;
|
||||
fd_set errorfs;
|
||||
struct timeval timeout;
|
||||
|
||||
if (HamLibSock[n])
|
||||
closesocket(HamLibSock[n]);
|
||||
|
||||
// Param is IPADDR:PORT. Only Allow numeric addresses
|
||||
|
||||
if (HamLibPort[n] == 0)
|
||||
return;
|
||||
|
||||
remoteDest[n].sin_family = AF_INET;
|
||||
remoteDest[n].sin_addr.s_addr = inet_addr(BPQHostIP);
|
||||
remoteDest[n].sin_port = htons(HamLibPort[n]);
|
||||
|
||||
HamLibSock[n] = 0;
|
||||
HamLibSock[n] = socket(AF_INET,SOCK_STREAM,0);
|
||||
|
||||
if (HamLibSock[n] == INVALID_SOCKET)
|
||||
{
|
||||
i=sprintf(Msg, "Socket Failed for HAMLIB socket - error code = %d\r\n", WSAGetLastError());
|
||||
Debugprintf(Msg);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
setsockopt(HamLibSock[n], SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt, 4);
|
||||
setsockopt(HamLibSock[n], IPPROTO_TCP, TCP_NODELAY, (const char FAR *)&bcopt, 4);
|
||||
|
||||
if (connect(HamLibSock[n],(LPSOCKADDR)&remoteDest[n],sizeof(remoteDest[n])) == 0)
|
||||
{
|
||||
//
|
||||
// Connected successful
|
||||
//
|
||||
}
|
||||
else
|
||||
{
|
||||
err=WSAGetLastError();
|
||||
i=sprintf(Msg, "Connect Failed for HAMLIB socket %d - error code = %d\r\n", n, err);
|
||||
Debugprintf(Msg);
|
||||
|
||||
closesocket(HamLibSock[n]);
|
||||
|
||||
HamLibSock[n] = 0;
|
||||
|
||||
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE);
|
||||
|
||||
ret = GetLastError();
|
||||
|
||||
while (HamLibSock[n])
|
||||
{
|
||||
FD_ZERO(&readfs);
|
||||
FD_ZERO(&errorfs);
|
||||
|
||||
FD_SET(HamLibSock[n],&readfs);
|
||||
FD_SET(HamLibSock[n],&errorfs);
|
||||
|
||||
timeout.tv_sec = 60;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
ret = select((int)HamLibSock[n] + 1, &readfs, NULL, &errorfs, &timeout);
|
||||
|
||||
if (ret == SOCKET_ERROR)
|
||||
{
|
||||
Debugprintf("HAMLIB Select failed %d ", WSAGetLastError());
|
||||
goto Lost;
|
||||
}
|
||||
|
||||
if (ret > 0)
|
||||
{
|
||||
// See what happened
|
||||
|
||||
if (FD_ISSET(HamLibSock[n], &readfs))
|
||||
{
|
||||
HAMLIBProcessMessage(n);
|
||||
}
|
||||
|
||||
if (FD_ISSET(HamLibSock[n], &errorfs))
|
||||
{
|
||||
Lost:
|
||||
sprintf(Msg, "HAMLIB Connection lost for Port %d\r\n", n);
|
||||
Debugprintf(Msg);
|
||||
|
||||
closesocket(HamLibSock[n]);
|
||||
HamLibSock[n] = 0;
|
||||
RedrawWindow(hWnd, NULL, NULL, 0);
|
||||
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
sprintf(Msg, "HAMLIB Thread Terminated Port %d\r\n", n);
|
||||
Debugprintf(Msg);
|
||||
}
|
||||
@ -1,45 +0,0 @@
|
||||
//
|
||||
// HTTP Session Control. Used In Kernel HTTPCode, BBSHTMLConfig
|
||||
// and ChatHTMLConfig
|
||||
|
||||
// On Windows changes to layout or length of this struct require rebuilding BPQ32.dll, BPQMail and BPQChat
|
||||
|
||||
struct HTTPConnectionInfo // Used for Web Server for thread-specific stuff
|
||||
{
|
||||
struct HTTPConnectionInfo * Next;
|
||||
struct STATIONRECORD * SelCall; // Station Record for individual station display
|
||||
char Callsign[12];
|
||||
int WindDirn, WindSpeed, WindGust, Temp, RainLastHour, RainLastDay, RainToday, Humidity, Pressure; //WX Fields
|
||||
char * ScreenLines[100]; // Screen Image for Teminal access mode - max 100 lines (cyclic buffer)
|
||||
int ScreenLineLen[100]; // Length of each lime
|
||||
int LastLine; // Pointer to last line of data
|
||||
BOOL PartLine; // Last line does not have CR on end
|
||||
char HTTPCall[10]; // Call of HTTP user
|
||||
BOOL Changed; // Changed since last poll. If set, reply immediately, else set timer and wait
|
||||
SOCKET sock; // Socket for pending send
|
||||
int ResponseTimer; // Timer for delayed response
|
||||
int KillTimer; // Clean up timer (no activity timeout)
|
||||
int Stream; // BPQ Stream Number
|
||||
char Key[20]; // Session Key
|
||||
BOOL Connected;
|
||||
// Use by Mail Module
|
||||
#ifdef MAIL
|
||||
struct UserInfo * User; // Selected User
|
||||
struct MsgInfo * Msg; // Selected Message
|
||||
WPRec * WP; // Selected WP record
|
||||
WebMailInfo * WebMail; // Webmail Forms Info
|
||||
#else
|
||||
VOID * User; // Selected User
|
||||
VOID * Msg; // Selected Message
|
||||
VOID * WP; // Selected WP record
|
||||
VOID * WebMail; // Webmail Forms Info
|
||||
#endif
|
||||
struct UserRec * USER; // Telnet Server USER record
|
||||
int WebMailSkip; // Number to skip at start of list (for paging)
|
||||
char WebMailTypes[4]; // Types To List
|
||||
BOOL WebMailMine; // List all meessage to or from me
|
||||
BOOL WebMailMyTX; // List all meessage from me
|
||||
BOOL WebMailMyRX; // List all meessage to me
|
||||
time_t WebMailLastUsed;
|
||||
struct TNCINFO * TNC; // Session -> TNC link
|
||||
};
|
||||
@ -1,706 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2015 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
//
|
||||
// DLL to provide BPQEther support for G8BPQ switch in a
|
||||
// 32bit environment,
|
||||
//
|
||||
// Uses BPQ EXTERNAL interface
|
||||
//
|
||||
// Uses WINPACAP library
|
||||
|
||||
// Version 1.0 December 2005
|
||||
|
||||
// Version 1.1 January 2006
|
||||
//
|
||||
// Get config file location from Node (will check bpq directory)
|
||||
|
||||
// Version 1.2 October 2006
|
||||
|
||||
// Write diagnostics to BPQ console window instead of STDOUT
|
||||
|
||||
// Version 1.3 February 2008
|
||||
|
||||
// Changes for dynamic unload of bpq32.dll
|
||||
|
||||
// Version 1.3.1 Spetmber 2010
|
||||
|
||||
// Add option to get config from bpq32.dll
|
||||
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
//#include <time.h>
|
||||
|
||||
#include "CHeaders.h"
|
||||
#include <process.h>
|
||||
#include "pcap.h"
|
||||
|
||||
#include "../CommonSource/bpq32.h"
|
||||
|
||||
//#include "packet32.h"
|
||||
//#include "ntddndis.h"
|
||||
|
||||
extern char * PortConfig[33];
|
||||
|
||||
typedef struct PCAPStruct
|
||||
{
|
||||
pcap_t *adhandle;
|
||||
UCHAR EthSource[6];
|
||||
UCHAR EthDest[6];
|
||||
short EtherType;
|
||||
BOOL RLITX;
|
||||
BOOL RLIRX;
|
||||
BOOL Promiscuous;
|
||||
int pcap_reopen_delay;
|
||||
char Adapter[256];
|
||||
|
||||
} PCAPINFO, *PPCAPINFO ;
|
||||
|
||||
PCAPINFO * PCAPInfo[32];
|
||||
|
||||
//PPCAPINFO PCAPInfo[16]={0};
|
||||
|
||||
UCHAR EthDest[7]={01,'B','P','Q',0,0};
|
||||
|
||||
char EtherType[10]="0x08FF";
|
||||
|
||||
//pcap_t *adhandle;
|
||||
|
||||
struct tagMSG Msg;
|
||||
|
||||
short udpport=0;
|
||||
|
||||
extern UCHAR BPQDirectory[];
|
||||
|
||||
unsigned int OurInst = 0;
|
||||
|
||||
HWND hWnd;
|
||||
BOOL GotMsg;
|
||||
|
||||
DWORD n;
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
static HINSTANCE PcapDriver=0;
|
||||
|
||||
typedef int (FAR *FARPROCX)();
|
||||
|
||||
int (FAR * pcap_sendpacketx)();
|
||||
|
||||
FARPROCX pcap_compilex;
|
||||
FARPROCX pcap_setfilterx;
|
||||
FARPROCX pcap_datalinkx;
|
||||
FARPROCX pcap_next_exx;
|
||||
FARPROCX pcap_geterrx;
|
||||
pcap_t * (FAR * pcap_open_livex)(const char *, int, int, int, char *);
|
||||
|
||||
static char Dllname[6]="wpcap";
|
||||
|
||||
FARPROCX GetAddress(char * Proc);
|
||||
|
||||
#else
|
||||
|
||||
#define pcap_compilex pcap_compile
|
||||
#define pcap_open_livex pcap_open_live
|
||||
#define pcap_setfilterx pcap_setfilter
|
||||
#define pcap_datalinkx pcap_datalink
|
||||
#define pcap_next_exx pcap_next_ex
|
||||
#define pcap_geterrx pcap_geterr
|
||||
#define pcap_sendpacketx pcap_sendpacket
|
||||
#endif
|
||||
|
||||
int InitPCAP(void);
|
||||
static FARPROCX GetAddress(char * Proc);
|
||||
|
||||
static BOOL ReadConfigFile(int Port);
|
||||
static int ProcessLine(char * buf,int Port, BOOL CheckPort);
|
||||
static int OpenPCAP(PPCAPINFO PCAP);
|
||||
|
||||
|
||||
int ExtProc(int fn, int port,unsigned char * buff)
|
||||
{
|
||||
int len,txlen=0,res;
|
||||
char txbuff[500];
|
||||
struct pcap_pkthdr *header;
|
||||
u_char *pkt_data;
|
||||
PPCAPINFO PCAP = PCAPInfo[port];
|
||||
|
||||
// char dcall[10],scall[10];
|
||||
|
||||
if (PCAP->adhandle == 0)
|
||||
{
|
||||
// No handle.
|
||||
|
||||
if (PCAP->Adapter[0])
|
||||
{
|
||||
// Try reopening periodically
|
||||
|
||||
PCAP->pcap_reopen_delay --;
|
||||
|
||||
if (PCAP->pcap_reopen_delay < 0)
|
||||
if (OpenPCAP(PCAP) == FALSE)
|
||||
PCAP->pcap_reopen_delay = 300; // Retry every 30 seconds
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
switch (fn)
|
||||
{
|
||||
case 1: // poll
|
||||
|
||||
res = pcap_next_exx(PCAP->adhandle, &header, &pkt_data);
|
||||
|
||||
if (res == 0)
|
||||
/* Timeout elapsed */
|
||||
return 0;
|
||||
|
||||
if (res == -1)
|
||||
{
|
||||
// Failed - try to reopen
|
||||
|
||||
if (OpenPCAP(PCAP) == FALSE)
|
||||
PCAP->pcap_reopen_delay = 300;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (PCAP->RLIRX)
|
||||
|
||||
// RLI MODE - An extra 3 bytes before len, seem to be 00 00 41
|
||||
|
||||
{
|
||||
len=pkt_data[18]*256 + pkt_data[17];
|
||||
|
||||
if ((len < 16) || (len > 320)) return 0; // Probably BPQ Mode Frame
|
||||
|
||||
len-=3;
|
||||
|
||||
memcpy(&buff[7],&pkt_data[19],len);
|
||||
|
||||
len+=5;
|
||||
}
|
||||
else
|
||||
{
|
||||
len=pkt_data[15]*256 + pkt_data[14];
|
||||
|
||||
if ((len < 16) || (len > 320)) return 0; // Probably RLI Mode Frame
|
||||
|
||||
len-=3;
|
||||
|
||||
memcpy(&buff[7],&pkt_data[16],len);
|
||||
|
||||
len+=5;
|
||||
}
|
||||
|
||||
buff[5]=(len & 0xff);
|
||||
buff[6]=(len >> 8);
|
||||
|
||||
return 1;
|
||||
|
||||
|
||||
case 2: // send
|
||||
|
||||
if (PCAP->RLITX)
|
||||
|
||||
// RLI MODE - An extra 3 bytes before len, seem to be 00 00 41
|
||||
|
||||
{
|
||||
txlen=(buff[6]<<8) + buff[5]; // BPQEther is DOS-based - chain word is 2 bytes
|
||||
|
||||
txlen-=2;
|
||||
txbuff[16]=0x41;
|
||||
txbuff[17]=(txlen & 0xff);
|
||||
txbuff[18]=(txlen >> 8);
|
||||
|
||||
if (txlen < 1 || txlen > 400)
|
||||
return 0;
|
||||
|
||||
memcpy(&txbuff[19],&buff[7],txlen);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
txlen=(buff[6]<<8) + buff[5]; // BPQEther is DOS-based - chain word is 2 bytes
|
||||
|
||||
txlen-=2;
|
||||
|
||||
txbuff[14]=(txlen & 0xff);
|
||||
txbuff[15]=(txlen >> 8);
|
||||
|
||||
if (txlen < 1 || txlen > 400)
|
||||
return 0;
|
||||
|
||||
|
||||
memcpy(&txbuff[16],&buff[7],txlen);
|
||||
}
|
||||
|
||||
memcpy(&txbuff[0],&PCAP->EthDest[0],6);
|
||||
memcpy(&txbuff[6],&PCAP->EthSource[0],6);
|
||||
memcpy(&txbuff[12],&PCAP->EtherType,2);
|
||||
|
||||
txlen+=14;
|
||||
|
||||
|
||||
if (txlen < 60) txlen = 60;
|
||||
|
||||
// Send down the packet
|
||||
|
||||
if (pcap_sendpacketx(PCAP->adhandle, // Adapter
|
||||
txbuff, // buffer with the packet
|
||||
txlen // size
|
||||
) != 0)
|
||||
{
|
||||
|
||||
// n=sprintf(buf,"\nError sending the packet: \n", pcap_geterrx(PCAPInfo[port].adhandle));
|
||||
// WritetoConsole(buf);
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
return (0);
|
||||
|
||||
|
||||
case 3: // CHECK IF OK TO SEND
|
||||
|
||||
return (0); // OK
|
||||
|
||||
case 4: // reinit
|
||||
|
||||
return 0;
|
||||
|
||||
case 5: // reinit
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
UINT ETHERExtInit(struct PORTCONTROL * PortEntry)
|
||||
{
|
||||
// Can have multiple ports, each mapping to a different Ethernet Adapter
|
||||
|
||||
// The Adapter number is in IOADDR
|
||||
|
||||
int Port = PortEntry->PORTNUMBER;
|
||||
PPCAPINFO PCAP;
|
||||
char buf[80];
|
||||
|
||||
if (InitPCAP()) // Make sure pcap is installed
|
||||
{
|
||||
WritetoConsole("BPQEther ");
|
||||
|
||||
//
|
||||
// Read config first, to get UDP info if needed
|
||||
//
|
||||
|
||||
PCAP = PCAPInfo[Port] = zalloc(sizeof(struct PCAPStruct));
|
||||
|
||||
if (!ReadConfigFile(Port))
|
||||
return (FALSE);
|
||||
|
||||
if (OpenPCAP(PCAP))
|
||||
sprintf(buf,"Using %s\n", PCAP->Adapter);
|
||||
else
|
||||
sprintf(buf,"Failed to open %s\n", PCAP->Adapter);
|
||||
|
||||
WritetoConsole(buf);
|
||||
}
|
||||
return ((int) ExtProc);
|
||||
}
|
||||
|
||||
|
||||
InitPCAP()
|
||||
{
|
||||
char Msg[255];
|
||||
int err;
|
||||
u_long param=1;
|
||||
BOOL bcopt=TRUE;
|
||||
|
||||
// Use LoadLibrary/GetProcADDR to get round link problem
|
||||
|
||||
#ifndef WIN32
|
||||
|
||||
return TRUE;
|
||||
|
||||
#endif
|
||||
|
||||
if (PcapDriver)
|
||||
return TRUE; // Already loaded
|
||||
|
||||
PcapDriver=LoadLibrary(Dllname);
|
||||
|
||||
if (PcapDriver == NULL)
|
||||
{
|
||||
err=GetLastError();
|
||||
sprintf(Msg,"Error loading Driver %s - Error code %d", Dllname,err);
|
||||
WritetoConsole(Msg);
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
if ((pcap_sendpacketx=GetAddress("pcap_sendpacket")) == 0 ) return FALSE;
|
||||
|
||||
if ((pcap_datalinkx=GetAddress("pcap_datalink")) == 0 ) return FALSE;
|
||||
|
||||
if ((pcap_compilex=GetAddress("pcap_compile")) == 0 ) return FALSE;
|
||||
|
||||
if ((pcap_setfilterx=GetAddress("pcap_setfilter")) == 0 ) return FALSE;
|
||||
|
||||
if ((pcap_open_livex = (pcap_t * (__cdecl *)())
|
||||
GetProcAddress(PcapDriver,"pcap_open_live")) == 0 ) return FALSE;
|
||||
|
||||
if ((pcap_geterrx=GetAddress("pcap_geterr")) == 0 ) return FALSE;
|
||||
|
||||
if ((pcap_next_exx=GetAddress("pcap_next_ex")) == 0 ) return FALSE;
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
FARPROCX GetAddress(char * Proc)
|
||||
{
|
||||
FARPROCX ProcAddr;
|
||||
int err=0;
|
||||
char buf[256];
|
||||
int n;
|
||||
|
||||
|
||||
ProcAddr=(FARPROCX) GetProcAddress(PcapDriver,Proc);
|
||||
|
||||
if (ProcAddr == 0)
|
||||
{
|
||||
err=GetLastError();
|
||||
|
||||
n=sprintf(buf,"Error finding %s - %d\n", Proc,err);
|
||||
WritetoConsole(buf);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
return ProcAddr;
|
||||
}
|
||||
#endif
|
||||
|
||||
#include <iphlpapi.h>
|
||||
|
||||
#pragma comment(lib, "IPHLPAPI.lib")
|
||||
|
||||
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
|
||||
|
||||
int OpenPCAP(PPCAPINFO PCAP)
|
||||
{
|
||||
int i=0;
|
||||
char errbuf[PCAP_ERRBUF_SIZE];
|
||||
u_int netmask;
|
||||
char packet_filter[30];
|
||||
struct bpf_program fcode;
|
||||
char buf[256];
|
||||
int n;
|
||||
|
||||
/* Open the adapter */
|
||||
if ((PCAP->adhandle= pcap_open_livex(PCAP->Adapter, // name of the device
|
||||
65536, // portion of the packet to capture.
|
||||
// 65536 grants that the whole packet will be captured on all the MACs.
|
||||
PCAP->Promiscuous, // promiscuous mode (nonzero means promiscuous)
|
||||
1, // read timeout
|
||||
errbuf // error buffer
|
||||
)) == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Check the link layer. We support only Ethernet for simplicity. */
|
||||
if(pcap_datalinkx(PCAP->adhandle) != DLT_EN10MB)
|
||||
{
|
||||
n=sprintf(buf,"This program works only on Ethernet networks.\n");
|
||||
WritetoConsole(buf);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
netmask=0xffffff;
|
||||
|
||||
sprintf(packet_filter,"ether[12:2]=0x%x",
|
||||
ntohs(PCAP->EtherType));
|
||||
|
||||
//compile the filter
|
||||
if (pcap_compilex(PCAP->adhandle, &fcode, packet_filter, 1, netmask) <0 )
|
||||
{
|
||||
n=sprintf(buf,"Unable to compile the packet filter. Check the syntax.\n");
|
||||
WritetoConsole(buf);
|
||||
|
||||
/* Free the device list */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//set the filter
|
||||
|
||||
if (pcap_setfilterx(PCAP->adhandle, &fcode)<0)
|
||||
{
|
||||
n=sprintf(buf,"Error setting the filter.\n");
|
||||
WritetoConsole(buf);
|
||||
|
||||
/* Free the device list */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static BOOL ReadConfigFile(int Port)
|
||||
{
|
||||
//TYPE 1 08FF # Ethernet Type
|
||||
//ETH 1 FF:FF:FF:FF:FF:FF # Target Ethernet AddrMAP G8BPQ-7 10.2.77.1 # IP 93 for compatibility
|
||||
//ADAPTER 1 \Device\NPF_{21B601E8-8088-4F7D-96 29-EDE2A9243CF4} # Adapter Name
|
||||
|
||||
char buf[256],errbuf[256];
|
||||
char * Config;
|
||||
PPCAPINFO PCAP = PCAPInfo[Port];
|
||||
|
||||
Config = PortConfig[Port];
|
||||
|
||||
PCAP->Promiscuous = 1; // Defaults
|
||||
PCAP->EtherType=htons(0x08FF);
|
||||
memset(PCAP->EthDest, 0xff, 6);
|
||||
|
||||
if (Config)
|
||||
{
|
||||
// Using config from bpq32.cfg
|
||||
|
||||
char * ptr1 = Config, * ptr2;
|
||||
|
||||
ptr2 = strchr(ptr1, 13);
|
||||
while(ptr2)
|
||||
{
|
||||
memcpy(buf, ptr1, ptr2 - ptr1);
|
||||
buf[ptr2 - ptr1] = 0;
|
||||
ptr1 = ptr2 + 2;
|
||||
ptr2 = strchr(ptr1, 13);
|
||||
|
||||
strcpy(errbuf,buf); // save in case of error
|
||||
|
||||
if (!ProcessLine(buf, Port, FALSE))
|
||||
{
|
||||
WritetoConsole("BPQEther - Bad config record ");
|
||||
WritetoConsole(errbuf);
|
||||
WritetoConsole("\n");
|
||||
}
|
||||
}
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
n=sprintf(buf,"No config info found in bpq32.cfg\n");
|
||||
WritetoConsole(buf);
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
||||
static int ProcessLine(char * buf, int Port, BOOL CheckPort)
|
||||
{
|
||||
char * ptr;
|
||||
char * p_port;
|
||||
char * p_mac;
|
||||
char * p_Adapter;
|
||||
char * p_type;
|
||||
|
||||
int port;
|
||||
int a,b,c,d,e,f,num;
|
||||
|
||||
PPCAPINFO PCAP = PCAPInfo[Port];
|
||||
|
||||
ptr = strtok(buf, " \t\n\r");
|
||||
|
||||
if(ptr == NULL) return (TRUE);
|
||||
|
||||
if(*ptr =='#') return (TRUE); // comment
|
||||
|
||||
if(*ptr ==';') return (TRUE); // comment
|
||||
|
||||
if (CheckPort)
|
||||
{
|
||||
p_port = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (p_port == NULL) return (FALSE);
|
||||
|
||||
port = atoi(p_port);
|
||||
|
||||
if (Port != port) return TRUE; // Not for us
|
||||
}
|
||||
|
||||
if(_stricmp(ptr,"ADAPTER") == 0)
|
||||
{
|
||||
IP_ADAPTER_INFO AdapterInfo[16]; // Allocate information for up to 16 NICs
|
||||
DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer
|
||||
DWORD dwStatus = GetAdaptersInfo(AdapterInfo, &dwBufLen);
|
||||
|
||||
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
|
||||
|
||||
p_Adapter = strtok(NULL, " \t\n\r");
|
||||
|
||||
strcpy(PCAP->Adapter, p_Adapter);
|
||||
|
||||
// Look for MAC Address
|
||||
|
||||
do
|
||||
{
|
||||
if (strcmp(pAdapterInfo->AdapterName, &PCAP->Adapter[12]) == 0)
|
||||
{
|
||||
memcpy(PCAP->EthSource, pAdapterInfo->Address, 6);
|
||||
break;
|
||||
}
|
||||
|
||||
pAdapterInfo = pAdapterInfo->Next; // Progress through linked list
|
||||
|
||||
} while(pAdapterInfo); // Terminate if last adapter
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
if(_stricmp(ptr,"TYPE") == 0)
|
||||
{
|
||||
p_type = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (p_type == NULL) return (FALSE);
|
||||
|
||||
num=sscanf(p_type,"%x",&a);
|
||||
|
||||
if (num != 1) return FALSE;
|
||||
|
||||
PCAP->EtherType=htons(a);
|
||||
return (TRUE);
|
||||
|
||||
}
|
||||
|
||||
if(_stricmp(ptr,"promiscuous") == 0)
|
||||
{
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (ptr == NULL) return (FALSE);
|
||||
|
||||
PCAP->Promiscuous = atoi(ptr);
|
||||
|
||||
return (TRUE);
|
||||
|
||||
}
|
||||
|
||||
if(_stricmp(ptr,"RXMODE") == 0)
|
||||
{
|
||||
p_port = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (p_port == NULL) return (FALSE);
|
||||
|
||||
if(_stricmp(p_port,"RLI") == 0)
|
||||
{
|
||||
PCAP->RLIRX=TRUE;
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
if(_stricmp(p_port,"BPQ") == 0)
|
||||
{
|
||||
PCAP->RLIRX=FALSE;
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
if(_stricmp(ptr,"TXMODE") == 0)
|
||||
{
|
||||
p_port = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (p_port == NULL) return (FALSE);
|
||||
|
||||
if(_stricmp(p_port,"RLI") == 0)
|
||||
{
|
||||
PCAP->RLITX=TRUE;
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
if(_stricmp(p_port,"BPQ") == 0)
|
||||
{
|
||||
PCAP->RLITX=FALSE;
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
if(_stricmp(ptr,"DEST") == 0)
|
||||
{
|
||||
p_mac = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (p_mac == NULL) return (FALSE);
|
||||
|
||||
num=sscanf(p_mac,"%x-%x-%x-%x-%x-%x",&a,&b,&c,&d,&e,&f);
|
||||
|
||||
if (num != 6) return FALSE;
|
||||
|
||||
PCAP->EthDest[0]=a;
|
||||
PCAP->EthDest[1]=b;
|
||||
PCAP->EthDest[2]=c;
|
||||
PCAP->EthDest[3]=d;
|
||||
PCAP->EthDest[4]=e;
|
||||
PCAP->EthDest[5]=f;
|
||||
|
||||
|
||||
// strcpy(Adapter,p_Adapter);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
if(_stricmp(ptr,"SOURCE") == 0)
|
||||
{
|
||||
p_mac = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (p_mac == NULL) return (FALSE);
|
||||
|
||||
num=sscanf(p_mac,"%x-%x-%x-%x-%x-%x",&a,&b,&c,&d,&e,&f);
|
||||
|
||||
if (num != 6) return FALSE;
|
||||
|
||||
PCAP->EthSource[0]=a;
|
||||
PCAP->EthSource[1]=b;
|
||||
PCAP->EthSource[2]=c;
|
||||
PCAP->EthSource[3]=d;
|
||||
PCAP->EthSource[4]=e;
|
||||
PCAP->EthSource[5]=f;
|
||||
|
||||
// strcpy(Adapter,p_Adapter);
|
||||
|
||||
return (TRUE);
|
||||
|
||||
}
|
||||
//
|
||||
// Bad line
|
||||
//
|
||||
return (FALSE);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,333 +0,0 @@
|
||||
/* zconf.h -- configuration of the zlib compression library
|
||||
* Copyright (C) 1995-2005 Jean-loup Gailly.
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#ifndef ZCONF_H
|
||||
#define ZCONF_H
|
||||
|
||||
/*
|
||||
* If you *really* need a unique prefix for all types and library functions,
|
||||
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
|
||||
*/
|
||||
#ifdef Z_PREFIX
|
||||
# define deflateInit_ z_deflateInit_
|
||||
# define deflate z_deflate
|
||||
# define deflateEnd z_deflateEnd
|
||||
# define inflateInit_ z_inflateInit_
|
||||
# define inflate z_inflate
|
||||
# define inflateEnd z_inflateEnd
|
||||
# define deflateInit2_ z_deflateInit2_
|
||||
# define deflateSetDictionary z_deflateSetDictionary
|
||||
# define deflateCopy z_deflateCopy
|
||||
# define deflateReset z_deflateReset
|
||||
# define deflateParams z_deflateParams
|
||||
# define deflateBound z_deflateBound
|
||||
# define deflatePrime z_deflatePrime
|
||||
# define inflateInit2_ z_inflateInit2_
|
||||
# define inflateSetDictionary z_inflateSetDictionary
|
||||
# define inflateSync z_inflateSync
|
||||
# define inflateSyncPoint z_inflateSyncPoint
|
||||
# define inflateCopy z_inflateCopy
|
||||
# define inflateReset z_inflateReset
|
||||
# define inflateBack z_inflateBack
|
||||
# define inflateBackEnd z_inflateBackEnd
|
||||
# define compress z_compress
|
||||
# define compress2 z_compress2
|
||||
# define compressBound z_compressBound
|
||||
# define uncompress z_uncompress
|
||||
# define adler32 z_adler32
|
||||
# define crc32 z_crc32
|
||||
# define get_crc_table z_get_crc_table
|
||||
# define zError z_zError
|
||||
|
||||
# define alloc_func z_alloc_func
|
||||
# define free_func z_free_func
|
||||
# define in_func z_in_func
|
||||
# define out_func z_out_func
|
||||
# define Byte z_Byte
|
||||
# define uInt z_uInt
|
||||
# define uLong z_uLong
|
||||
# define Bytef z_Bytef
|
||||
# define charf z_charf
|
||||
# define intf z_intf
|
||||
# define uIntf z_uIntf
|
||||
# define uLongf z_uLongf
|
||||
# define voidpf z_voidpf
|
||||
# define voidp z_voidp
|
||||
#endif
|
||||
|
||||
#if defined(__MSDOS__) && !defined(MSDOS)
|
||||
# define MSDOS
|
||||
#endif
|
||||
#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
|
||||
# define OS2
|
||||
#endif
|
||||
#if defined(_WINDOWS) && !defined(WINDOWS)
|
||||
# define WINDOWS
|
||||
#endif
|
||||
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
|
||||
# ifndef WIN32
|
||||
# define WIN32
|
||||
# endif
|
||||
#endif
|
||||
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
|
||||
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
|
||||
# ifndef SYS16BIT
|
||||
# define SYS16BIT
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
|
||||
* than 64k bytes at a time (needed on systems with 16-bit int).
|
||||
*/
|
||||
#ifdef SYS16BIT
|
||||
# define MAXSEG_64K
|
||||
#endif
|
||||
#ifdef MSDOS
|
||||
# define UNALIGNED_OK
|
||||
#endif
|
||||
|
||||
#ifdef __STDC_VERSION__
|
||||
# ifndef STDC
|
||||
# define STDC
|
||||
# endif
|
||||
# if __STDC_VERSION__ >= 199901L
|
||||
# ifndef STDC99
|
||||
# define STDC99
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
|
||||
# define STDC
|
||||
#endif
|
||||
|
||||
#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
|
||||
# define STDC
|
||||
#endif
|
||||
|
||||
#ifndef STDC
|
||||
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
||||
# define const /* note: need a more gentle solution here */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Some Mac compilers merge all .h files incorrectly: */
|
||||
#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
|
||||
# define NO_DUMMY_DECL
|
||||
#endif
|
||||
|
||||
/* Maximum value for memLevel in deflateInit2 */
|
||||
#ifndef MAX_MEM_LEVEL
|
||||
# ifdef MAXSEG_64K
|
||||
# define MAX_MEM_LEVEL 8
|
||||
# else
|
||||
# define MAX_MEM_LEVEL 9
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
|
||||
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
|
||||
* created by gzip. (Files created by minigzip can still be extracted by
|
||||
* gzip.)
|
||||
*/
|
||||
#ifndef MAX_WBITS
|
||||
# define MAX_WBITS 15 /* 32K LZ77 window */
|
||||
#endif
|
||||
|
||||
/* The memory requirements for deflate are (in bytes):
|
||||
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
||||
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
||||
plus a few kilobytes for small objects. For example, if you want to reduce
|
||||
the default memory requirements from 256K to 128K, compile with
|
||||
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
|
||||
Of course this will generally degrade compression (there's no free lunch).
|
||||
|
||||
The memory requirements for inflate are (in bytes) 1 << windowBits
|
||||
that is, 32K for windowBits=15 (default value) plus a few kilobytes
|
||||
for small objects.
|
||||
*/
|
||||
|
||||
/* Type declarations */
|
||||
|
||||
#ifndef OF /* function prototypes */
|
||||
# ifdef STDC
|
||||
# define OF(args) args
|
||||
# else
|
||||
# define OF(args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The following definitions for FAR are needed only for MSDOS mixed
|
||||
* model programming (small or medium model with some far allocations).
|
||||
* This was tested only with MSC; for other MSDOS compilers you may have
|
||||
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
|
||||
* just define FAR to be empty.
|
||||
*/
|
||||
#ifdef SYS16BIT
|
||||
# if defined(M_I86SM) || defined(M_I86MM)
|
||||
/* MSC small or medium model */
|
||||
# define SMALL_MEDIUM
|
||||
# ifdef _MSC_VER
|
||||
# define FAR _far
|
||||
# else
|
||||
# define FAR far
|
||||
# endif
|
||||
# endif
|
||||
# if (defined(__SMALL__) || defined(__MEDIUM__))
|
||||
/* Turbo C small or medium model */
|
||||
# define SMALL_MEDIUM
|
||||
# ifdef __BORLANDC__
|
||||
# define FAR _far
|
||||
# else
|
||||
# define FAR far
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(WINDOWS) || defined(WIN32)
|
||||
/* If building or using zlib as a DLL, define ZLIB_DLL.
|
||||
* This is not mandatory, but it offers a little performance increase.
|
||||
*/
|
||||
# ifdef ZLIB_DLL
|
||||
# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
|
||||
# ifdef ZLIB_INTERNAL
|
||||
# define ZEXTERN extern __declspec(dllexport)
|
||||
# else
|
||||
# define ZEXTERN extern __declspec(dllimport)
|
||||
# endif
|
||||
# endif
|
||||
# endif /* ZLIB_DLL */
|
||||
/* If building or using zlib with the WINAPI/WINAPIV calling convention,
|
||||
* define ZLIB_WINAPI.
|
||||
* Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
|
||||
*/
|
||||
# ifdef ZLIB_WINAPI
|
||||
# ifdef FAR
|
||||
# undef FAR
|
||||
# endif
|
||||
# include <windows.h>
|
||||
/* No need for _export, use ZLIB.DEF instead. */
|
||||
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
|
||||
# define ZEXPORT WINAPI
|
||||
# ifdef WIN32
|
||||
# define ZEXPORTVA WINAPIV
|
||||
# else
|
||||
# define ZEXPORTVA FAR CDECL
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if defined (__BEOS__)
|
||||
# ifdef ZLIB_DLL
|
||||
# ifdef ZLIB_INTERNAL
|
||||
# define ZEXPORT __declspec(dllexport)
|
||||
# define ZEXPORTVA __declspec(dllexport)
|
||||
# else
|
||||
# define ZEXPORT __declspec(dllimport)
|
||||
# define ZEXPORTVA __declspec(dllimport)
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef ZEXTERN
|
||||
# define ZEXTERN extern
|
||||
#endif
|
||||
#ifndef ZEXPORT
|
||||
# define ZEXPORT
|
||||
#endif
|
||||
#ifndef ZEXPORTVA
|
||||
# define ZEXPORTVA
|
||||
#endif
|
||||
|
||||
#ifndef FAR
|
||||
# define FAR
|
||||
#endif
|
||||
|
||||
#if !defined(__MACTYPES__)
|
||||
typedef unsigned char Byte; /* 8 bits */
|
||||
#endif
|
||||
typedef unsigned int uInt; /* 16 bits or more */
|
||||
typedef unsigned long uLong; /* 32 bits or more */
|
||||
|
||||
#ifdef SMALL_MEDIUM
|
||||
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
||||
# define Bytef Byte FAR
|
||||
#else
|
||||
typedef Byte FAR Bytef;
|
||||
#endif
|
||||
typedef char FAR charf;
|
||||
typedef int FAR intf;
|
||||
typedef uInt FAR uIntf;
|
||||
typedef uLong FAR uLongf;
|
||||
|
||||
#ifdef STDC
|
||||
typedef void const *voidpc;
|
||||
typedef void FAR *voidpf;
|
||||
typedef void *voidp;
|
||||
#else
|
||||
typedef Byte const *voidpc;
|
||||
typedef Byte FAR *voidpf;
|
||||
typedef Byte *voidp;
|
||||
#endif
|
||||
|
||||
#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
|
||||
# include <sys/types.h> /* for off_t */
|
||||
# include <unistd.h> /* for SEEK_* and off_t */
|
||||
# ifdef VMS
|
||||
# include <unixio.h> /* for off_t */
|
||||
# endif
|
||||
# define z_off_t off_t
|
||||
#endif
|
||||
#ifndef SEEK_SET
|
||||
# define SEEK_SET 0 /* Seek from beginning of file. */
|
||||
# define SEEK_CUR 1 /* Seek from current position. */
|
||||
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
||||
#endif
|
||||
#ifndef z_off_t
|
||||
# define z_off_t long
|
||||
#endif
|
||||
|
||||
#if defined(__OS400__)
|
||||
# define NO_vsnprintf
|
||||
#endif
|
||||
|
||||
#if defined(__MVS__)
|
||||
# define NO_vsnprintf
|
||||
# ifdef FAR
|
||||
# undef FAR
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* MVS linker does not support external names larger than 8 bytes */
|
||||
#if defined(__MVS__)
|
||||
# pragma map(deflateInit_,"DEIN")
|
||||
# pragma map(deflateInit2_,"DEIN2")
|
||||
# pragma map(deflateEnd,"DEEND")
|
||||
# pragma map(deflateBound,"DEBND")
|
||||
# pragma map(inflateInit_,"ININ")
|
||||
# pragma map(inflateInit2_,"ININ2")
|
||||
# pragma map(inflateEnd,"INEND")
|
||||
# pragma map(inflateSync,"INSY")
|
||||
# pragma map(inflateSetDictionary,"INSEDI")
|
||||
# pragma map(compressBound,"CMBND")
|
||||
# pragma map(inflate_table,"INTABL")
|
||||
# pragma map(inflate_fast,"INFA")
|
||||
# pragma map(inflate_copyright,"INCOPY")
|
||||
#endif
|
||||
|
||||
#endif /* ZCONF_H */
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,451 +0,0 @@
|
||||
//
|
||||
// Prototypes for BPQ32 Node Functions
|
||||
//
|
||||
|
||||
|
||||
#define DllImport
|
||||
|
||||
#define EXCLUDEBITS
|
||||
|
||||
#define _WINSOCK_DEPRECATED_NO_WARNINGS
|
||||
|
||||
#include "compatbits.h"
|
||||
|
||||
#include "asmstrucs.h"
|
||||
|
||||
BOOL CheckExcludeList(UCHAR * Call);
|
||||
|
||||
Dll int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
|
||||
Dll BOOL ConvToAX25(unsigned char * callsign, unsigned char * ax25call);
|
||||
DllExport BOOL ConvToAX25Ex(unsigned char * callsign, unsigned char * ax25call);
|
||||
int WritetoConsoleLocal(char * buff);
|
||||
VOID Consoleprintf(const char * format, ...);
|
||||
VOID FreeConfig();
|
||||
int GetListeningPortsPID(int Port);
|
||||
|
||||
void * InitializeExtDriver(PEXTPORTDATA PORTVEC);
|
||||
|
||||
VOID PutLengthinBuffer(PDATAMESSAGE buff, USHORT datalen); // Needed for arm5 portability
|
||||
int GetLengthfromBuffer(PDATAMESSAGE buff);
|
||||
int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BOOL APRS, BOOL MCTL);
|
||||
int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
|
||||
int CountBits64(uint64_t in);
|
||||
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
|
||||
#define GetBuff() _GetBuff(__FILE__, __LINE__)
|
||||
#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
|
||||
#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
|
||||
|
||||
#define Q_REM(s) _Q_REM(s, __FILE__, __LINE__)
|
||||
#define Q_REM_NP(s) _Q_REM_NP(s, __FILE__, __LINE__)
|
||||
|
||||
#define C_Q_ADD(s, b) _C_Q_ADD(s, b, __FILE__, __LINE__)
|
||||
|
||||
void _CheckGuardZone(char * File, int Line);
|
||||
|
||||
VOID * _Q_REM(VOID **Q, char * File, int Line);
|
||||
VOID * _Q_REM_NP(VOID *Q, char * File, int Line);
|
||||
|
||||
int _C_Q_ADD(VOID *Q, VOID *BUFF, char * File, int Line);
|
||||
|
||||
UINT _ReleaseBuffer(VOID *BUFF, char * File, int Line);
|
||||
|
||||
VOID * _GetBuff(char * File, int Line);
|
||||
int _C_Q_ADD(VOID *PQ, VOID *PBUFF, char * File, int Line);
|
||||
|
||||
int C_Q_COUNT(VOID *Q);
|
||||
|
||||
DllExport char * APIENTRY GetApplCall(int Appl);
|
||||
DllExport char * APIENTRY GetApplAlias(int Appl);
|
||||
DllExport int APIENTRY FindFreeStream();
|
||||
DllExport int APIENTRY DeallocateStream(int stream);
|
||||
DllExport int APIENTRY SessionState(int stream, int * state, int * change);
|
||||
DllExport int APIENTRY SetAppl(int stream, int flags, int mask);
|
||||
DllExport int APIENTRY GetMsg(int stream, char * msg, int * len, int * count );
|
||||
DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign,
|
||||
int * port, int * sesstype, int * paclen,
|
||||
int * maxframe, int * l4window);
|
||||
|
||||
#define LIBCONFIG_STATIC
|
||||
#include "libconfig.h"
|
||||
|
||||
int GetIntValue(config_setting_t * group, char * name);
|
||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
|
||||
VOID SaveIntValue(config_setting_t * group, char * name, int value);
|
||||
VOID SaveStringValue(config_setting_t * group, char * name, char * value);
|
||||
|
||||
int EncryptPass(char * Pass, char * Encrypt);
|
||||
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
|
||||
Dll VOID APIENTRY CreateOneTimePassword(char * Password, char * KeyPhrase, int TimeOffset);
|
||||
Dll BOOL APIENTRY CheckOneTimePassword(char * Password, char * KeyPhrase);
|
||||
|
||||
DllExport int APIENTRY TXCount(int stream);
|
||||
DllExport int APIENTRY RXCount(int stream);
|
||||
DllExport int APIENTRY MONCount(int stream);
|
||||
|
||||
VOID ReadNodes();
|
||||
int BPQTRACE(MESSAGE * Msg, BOOL APRS);
|
||||
|
||||
VOID CommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
|
||||
|
||||
VOID PostStateChange(TRANSPORTENTRY * Session);
|
||||
|
||||
VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
|
||||
VOID DoTheCommand(TRANSPORTENTRY * Session);
|
||||
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
|
||||
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
|
||||
char * strlop(char * buf, char delim);
|
||||
BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
|
||||
|
||||
VOID PostDataAvailable(TRANSPORTENTRY * Session);
|
||||
int WritetoConsoleLocal(char * buff);
|
||||
char * CHECKBUFFER(TRANSPORTENTRY * Session, char * Bufferptr);
|
||||
VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
|
||||
|
||||
VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
|
||||
|
||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
|
||||
|
||||
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
|
||||
VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
|
||||
|
||||
VOID CloseSessionPartner(TRANSPORTENTRY * Session);
|
||||
int COUNTNODES(struct ROUTE * ROUTE);
|
||||
int DecodeNodeName(char * NodeName, char * ptr);;
|
||||
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
|
||||
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
|
||||
void * zalloc(int len);
|
||||
BOOL FindDestination(UCHAR * Call, struct DEST_LIST ** REQDEST);
|
||||
|
||||
BOOL ProcessConfig();
|
||||
|
||||
VOID PUT_ON_PORT_Q(struct PORTCONTROL * PORT, MESSAGE * Buffer);
|
||||
VOID CLEAROUTLINK(struct _LINKTABLE * LINK);
|
||||
VOID TellINP3LinkGone(struct ROUTE * Route);
|
||||
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason);
|
||||
|
||||
// Reason Equates
|
||||
|
||||
#define NORMALCLOSE 0
|
||||
#define RETRIEDOUT 1
|
||||
#define SETUPFAILED 2
|
||||
#define LINKLOST 3
|
||||
#define LINKSTUCK 4
|
||||
|
||||
int COUNT_AT_L2(struct _LINKTABLE * LINK);
|
||||
VOID SENDIDMSG();
|
||||
VOID SENDBTMSG();
|
||||
VOID INP3TIMER();
|
||||
VOID REMOVENODE(dest_list * DEST);
|
||||
BOOL ACTIVATE_DEST(struct DEST_LIST * DEST);
|
||||
VOID TellINP3LinkSetupFailed(struct ROUTE * Route);
|
||||
BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
|
||||
VOID PROCROUTES(struct DEST_LIST * DEST, struct ROUTE * ROUTE, int Qual);
|
||||
BOOL L2SETUPCROSSLINK(PROUTE ROUTE);
|
||||
VOID REMOVENODE(dest_list * DEST);
|
||||
char * SetupNodeHeader(struct DATAMESSAGE * Buffer);
|
||||
VOID L4CONNECTFAILED(TRANSPORTENTRY * L4);
|
||||
int CountFramesQueuedOnSession(TRANSPORTENTRY * Session);
|
||||
VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session);
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
|
||||
int APIENTRY Restart();
|
||||
int APIENTRY Reboot();
|
||||
int APIENTRY Reconfig();
|
||||
Dll int APIENTRY SaveNodes ();
|
||||
|
||||
|
||||
struct SEM;
|
||||
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
void FreeSemaphore(struct SEM * Semaphore);
|
||||
|
||||
void MySetWindowText(HWND hWnd, char * Msg);
|
||||
|
||||
Dll int APIENTRY SessionControl(int stream, int command, int Mask);
|
||||
|
||||
HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits);
|
||||
int ReadCOMBlock(HANDLE fd, char * Block, int MaxLength);
|
||||
BOOL WriteCOMBlock(HANDLE fd, char * Block, int BytesToWrite);
|
||||
VOID CloseCOMPort(HANDLE fd);
|
||||
|
||||
VOID initUTF8();
|
||||
int Is8Bit(unsigned char *cpt, int len);
|
||||
int WebIsUTF8(unsigned char *ptr, int len);
|
||||
int IsUTF8(unsigned char *ptr, int len);
|
||||
int Convert437toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
|
||||
int Convert1251toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
|
||||
int Convert1252toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
|
||||
int TrytoGuessCode(unsigned char * Char, int Len);
|
||||
|
||||
|
||||
#define CMD_TO_APPL 1 // PASS COMMAND TO APPLICATION
|
||||
#define MSG_TO_USER 2 // SEND 'CONNECTED' TO USER
|
||||
#define MSG_TO_APPL 4 // SEND 'CONECTED' TO APPL
|
||||
#define CHECK_FOR_ESC 8 // Look for ^d (^D) to disconnect session)
|
||||
|
||||
#define UI 3
|
||||
#define SABM 0x2F
|
||||
#define DISC 0x43
|
||||
#define DM 0x0F
|
||||
#define UA 0x63
|
||||
#define FRMR 0x87
|
||||
#define RR 1
|
||||
#define RNR 5
|
||||
#define REJ 9
|
||||
|
||||
// V2.2 Types
|
||||
|
||||
#define SREJ 0x0D
|
||||
#define SABME 0x6F
|
||||
#define XID 0xAF
|
||||
#define TEST 0xE3
|
||||
|
||||
#define SUPPORT2point2 1
|
||||
|
||||
// XID Optional Functions
|
||||
|
||||
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address
|
||||
#define OPSREJ 4
|
||||
#define OPSREJMult 0x200000
|
||||
#define OPREJ 2
|
||||
#define OPMod8 0x400
|
||||
#define OPMod128 0x800
|
||||
|
||||
#define BPQHOSTSTREAMS 64
|
||||
|
||||
extern TRANSPORTENTRY * L4TABLE;
|
||||
extern unsigned char NEXTID;
|
||||
extern int MAXCIRCUITS;
|
||||
extern int L4DEFAULTWINDOW;
|
||||
extern int L4T1;
|
||||
extern APPLCALLS APPLCALLTABLE[];
|
||||
extern char * APPLS;
|
||||
extern int NEEDMH;
|
||||
extern int RFOnly;
|
||||
|
||||
extern char SESSIONHDDR[];
|
||||
|
||||
extern UCHAR NEXTID;
|
||||
|
||||
extern struct ROUTE * NEIGHBOURS;
|
||||
extern int MAXNEIGHBOURS;
|
||||
|
||||
extern struct ROUTE * NEIGHBOURS;
|
||||
extern int ROUTE_LEN;
|
||||
extern int MAXNEIGHBOURS;
|
||||
|
||||
extern struct DEST_LIST * DESTS; // NODE LIST
|
||||
extern struct DEST_LIST * ENDDESTLIST;
|
||||
extern int DEST_LIST_LEN;
|
||||
extern int MAXDESTS; // MAX NODES IN SYSTEM
|
||||
|
||||
extern struct _LINKTABLE * LINKS;
|
||||
extern int LINK_TABLE_LEN;
|
||||
extern int MAXLINKS;
|
||||
|
||||
|
||||
|
||||
extern char MYCALL[]; // DB 7 DUP (0) ; NODE CALLSIGN (BIT SHIFTED)
|
||||
extern char MYALIASTEXT[]; // {" " ; NODE ALIAS (KEEP TOGETHER)
|
||||
|
||||
extern UCHAR MYCALLWITHALIAS[13];
|
||||
extern APPLCALLS APPLCALLTABLE[NumberofAppls];
|
||||
|
||||
extern UCHAR MYNODECALL[]; // NODE CALLSIGN (ASCII)
|
||||
extern char NODECALLLOPPED[]; // NODE CALLSIGN (ASCII). Null terminated
|
||||
extern UCHAR MYNETROMCALL[]; // NETROM CALLSIGN (ASCII)
|
||||
|
||||
extern UCHAR NETROMCALL[]; // NETORM CALL (AX25)
|
||||
|
||||
extern VOID * FREE_Q;
|
||||
|
||||
extern struct PORTCONTROL * PORTTABLE;
|
||||
extern int NUMBEROFPORTS;
|
||||
|
||||
|
||||
extern int OBSINIT; // INITIAL OBSOLESCENCE VALUE
|
||||
extern int OBSMIN; // MINIMUM TO BROADCAST
|
||||
extern int L3INTERVAL; // "NODES" INTERVAL IN MINS
|
||||
extern int IDINTERVAL; // "ID" BROADCAST INTERVAL
|
||||
extern int BTINTERVAL; // "BT" BROADCAST INTERVAL
|
||||
extern int MINQUAL; // MIN QUALITY FOR AUTOUPDATES
|
||||
extern int HIDENODES; // N * COMMAND SWITCH
|
||||
extern int BBSQUAL; // QUALITY OF BBS RELATIVE TO NODE
|
||||
|
||||
extern int NUMBEROFBUFFERS; // PACKET BUFFERS
|
||||
extern int PACLEN; //MAX PACKET SIZE
|
||||
|
||||
// L2 SYSTEM TIMER RUNS AT 3 HZ
|
||||
|
||||
extern int T3; // LINK VALIDATION TIMER (3 MINS) (+ a bit to reduce RR collisions)
|
||||
|
||||
extern int L2KILLTIME; // IDLE LINK TIMER (16 MINS)
|
||||
extern int L3LIVES; // MAX L3 HOPS
|
||||
extern int L4N2; // LEVEL 4 RETRY COUNT
|
||||
extern int L4LIMIT; // IDLE SESSION LIMIT - 15 MINS
|
||||
extern int L4DELAY; // L4 DELAYED ACK TIMER
|
||||
|
||||
extern int BBS; // INCLUDE BBS SUPPORT
|
||||
extern int NODE; // INCLUDE SWITCH SUPPORT
|
||||
|
||||
extern int FULL_CTEXT; // CTEXT ON ALL CONNECTS IF NZ
|
||||
|
||||
|
||||
// Although externally streams are numbered 1 to 64, internally offsets are 0 - 63
|
||||
|
||||
extern BPQVECSTRUC DUMMYVEC; // Needed to force correct order of following
|
||||
|
||||
extern BPQVECSTRUC BPQHOSTVECTOR[BPQHOSTSTREAMS + 5];
|
||||
|
||||
extern int NODEORDER;
|
||||
extern UCHAR LINKEDFLAG;
|
||||
|
||||
extern UCHAR UNPROTOCALL[80];
|
||||
|
||||
|
||||
extern char * INFOMSG;
|
||||
|
||||
extern char * CTEXTMSG;
|
||||
extern int CTEXTLEN;
|
||||
|
||||
extern UCHAR MYALIAS[7]; // ALIAS IN AX25 FORM
|
||||
extern UCHAR BBSALIAS[7];
|
||||
|
||||
extern VOID * TRACE_Q; // TRANSMITTED FRAMES TO BE TRACED
|
||||
|
||||
extern char HEADERCHAR; // CHAR FOR _NODE HEADER MSGS
|
||||
|
||||
extern int AUTOSAVE; // AUTO SAVE NODES ON EXIT FLAG
|
||||
extern int L4APPL; // Application for BBSCALL/ALIAS connects
|
||||
extern int CFLAG; // C =HOST Command
|
||||
|
||||
extern VOID * IDMSG_Q; // ID/BEACONS WAITING TO BE SENT
|
||||
|
||||
extern struct DATAMESSAGE BTHDDR;
|
||||
extern struct _MESSAGE IDHDDR;
|
||||
|
||||
extern VOID * IDMSG;
|
||||
|
||||
extern int L3TIMER; // TIMER FOR 'NODES' MESSAGE
|
||||
extern int IDTIMER; // TIMER FOR ID MESSAGE
|
||||
extern int BTTIMER; // TIMER FOR BT MESSAGE
|
||||
|
||||
extern int STATSTIME;
|
||||
|
||||
|
||||
extern BOOL IPRequired;
|
||||
extern int MaxHops;
|
||||
extern int MAXRTT;
|
||||
extern USHORT CWTABLE[];
|
||||
extern TRANSPORTENTRY * L4TABLE;
|
||||
extern UCHAR ROUTEQUAL;
|
||||
extern UINT BPQMsg;
|
||||
extern UCHAR ExcludeList[];
|
||||
|
||||
|
||||
extern APPLCALLS APPLCALLTABLE[];
|
||||
|
||||
extern char VersionStringWithBuild[];
|
||||
extern char VersionString[];
|
||||
|
||||
extern int MAXHEARDENTRIES;
|
||||
extern int MHLEN;
|
||||
|
||||
extern int APPL1;
|
||||
extern int PASSCMD;
|
||||
extern int NUMBEROFCOMMANDS;
|
||||
|
||||
extern char * ConfigBuffer;
|
||||
|
||||
extern char * WL2KReportLine[];
|
||||
|
||||
extern struct CMDX COMMANDS[];
|
||||
|
||||
extern int QCOUNT, MAXBUFFS, MAXCIRCUITS, L4DEFAULTWINDOW, L4T1, CMDXLEN;
|
||||
extern char CMDALIAS[ALIASLEN][NumberofAppls];
|
||||
|
||||
extern int SEMGETS;
|
||||
extern int SEMRELEASES;
|
||||
extern int SEMCLASHES;
|
||||
extern int MINBUFFCOUNT;
|
||||
|
||||
extern UCHAR BPQDirectory[];
|
||||
extern UCHAR BPQProgramDirectory[];
|
||||
|
||||
extern UCHAR WINMOR[];
|
||||
extern UCHAR PACTORCALL[];
|
||||
|
||||
extern UCHAR MCOM;
|
||||
extern UCHAR MUIONLY;
|
||||
extern UCHAR MTX;
|
||||
extern uint64_t MMASK;
|
||||
|
||||
extern UCHAR NODECALL[]; // NODES in ax.25
|
||||
|
||||
extern int L4CONNECTSOUT;
|
||||
extern int L4CONNECTSIN;
|
||||
extern int L4FRAMESTX;
|
||||
extern int L4FRAMESRX;
|
||||
extern int L4FRAMESRETRIED;
|
||||
extern int OLDFRAMES;
|
||||
extern int L3FRAMES;
|
||||
|
||||
extern char * PortConfig[];
|
||||
extern struct SEM Semaphore;
|
||||
extern UCHAR AuthorisedProgram; // Local Variable. Set if Program is on secure list
|
||||
|
||||
extern int REALTIMETICKS;
|
||||
|
||||
extern time_t CurrentSecs;
|
||||
extern time_t lastSlowSecs;
|
||||
extern time_t lastSaveSecs;
|
||||
|
||||
// SNMP Variables
|
||||
|
||||
extern int InOctets[64];
|
||||
extern int OutOctets[64];
|
||||
|
||||
extern BOOL CloseAllNeeded;
|
||||
extern int CloseOnError;
|
||||
|
||||
extern char * PortConfig[70];
|
||||
extern struct TNCINFO * TNCInfo[71]; // Records are Malloc'd
|
||||
|
||||
#define MaxBPQPortNo 63 // Port 64 reserved for BBS Mon
|
||||
#define MAXBPQPORTS 63
|
||||
|
||||
// IP, APRS use port ocnfig slots above the real port range
|
||||
|
||||
#define IPConfigSlot MaxBPQPortNo + 1
|
||||
#define PortMapConfigSlot MaxBPQPortNo + 2
|
||||
#define APRSConfigSlot MaxBPQPortNo + 3
|
||||
|
||||
|
||||
extern char * UIUIDigi[MaxBPQPortNo + 1];
|
||||
extern char UIUIDEST[MaxBPQPortNo + 1][11]; // Dest for Beacons
|
||||
extern UCHAR FN[MaxBPQPortNo + 1][256]; // Filename
|
||||
extern int Interval[MaxBPQPortNo + 1]; // Beacon Interval (Mins)
|
||||
extern char Message[MaxBPQPortNo + 1][1000]; // Beacon Text
|
||||
|
||||
extern int MinCounter[MaxBPQPortNo + 1]; // Interval Countdown
|
||||
extern BOOL SendFromFile[MaxBPQPortNo + 1];
|
||||
|
||||
extern BOOL MQTT;
|
||||
extern char MQTT_HOST[80];
|
||||
extern int MQTT_PORT;
|
||||
extern char MQTT_USER[80];
|
||||
extern char MQTT_PASS[80];
|
||||
|
||||
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
|
||||
|
||||
|
||||
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
|
||||
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
|
||||
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
|
||||
|
||||
void hookL4SessionAttempt(void * STREAM, char * remotecall, char * ourcall);
|
||||
void hookL4SessionAccepted(void * STREAM, char * remotecall, char * ourcall);
|
||||
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,190 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2022 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
Stuff to make compiling on WINDOWS and LINUX easier
|
||||
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
typedef unsigned int uint32_t;
|
||||
|
||||
#define pthread_t uint32_t
|
||||
|
||||
int pthread_equal(pthread_t T1, pthread_t T2)
|
||||
{
|
||||
return (T1 == T2);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <syslog.h>
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define BOOL int
|
||||
|
||||
#define VOID void
|
||||
#define UCHAR unsigned char
|
||||
#define USHORT unsigned short
|
||||
#define ULONG uint32_t
|
||||
#define UINT unsigned int
|
||||
#define SHORT short
|
||||
#define DWORD int32_t
|
||||
|
||||
#define APIENTRY
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define FAR
|
||||
|
||||
#define HWND unsigned int
|
||||
#define HINSTANCE unsigned int
|
||||
|
||||
#define strtok_s strtok_r
|
||||
|
||||
VOID Debugprintf(const char * format, ...);
|
||||
|
||||
int memicmp(unsigned char *a, unsigned char *b, int n)
|
||||
{
|
||||
if (n)
|
||||
{
|
||||
while (n && (toupper(*a) == toupper(*b)))
|
||||
n--, a++, b++;
|
||||
|
||||
if (n)
|
||||
return toupper(*a) - toupper(*b);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int stricmp(const unsigned char * pStr1, const unsigned char *pStr2)
|
||||
{
|
||||
unsigned char c1, c2;
|
||||
int v;
|
||||
|
||||
if (pStr1 == NULL)
|
||||
{
|
||||
if (pStr2)
|
||||
Debugprintf("stricmp called with NULL 1st param - 2nd %s ", pStr2);
|
||||
else
|
||||
Debugprintf("stricmp called with two NULL params");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
do {
|
||||
c1 = *pStr1++;
|
||||
c2 = *pStr2++;
|
||||
/* The casts are necessary when pStr1 is shorter & char is signed */
|
||||
v = tolower(c1) - tolower(c2);
|
||||
} while ((v == 0) && (c1 != '\0') && (c2 != '\0') );
|
||||
|
||||
return v;
|
||||
}
|
||||
char * strupr(char* s)
|
||||
{
|
||||
char* p = s;
|
||||
|
||||
if (s == 0)
|
||||
return 0;
|
||||
|
||||
while (*p = toupper( *p )) p++;
|
||||
return s;
|
||||
}
|
||||
|
||||
char * strlwr(char* s)
|
||||
{
|
||||
char* p = s;
|
||||
while (*p = tolower( *p )) p++;
|
||||
return s;
|
||||
}
|
||||
|
||||
int sprintf_s(char * string, int plen, const char * format, ...)
|
||||
{
|
||||
va_list(arglist);
|
||||
int Len;
|
||||
|
||||
va_start(arglist, format);
|
||||
Len = vsprintf(string, format, arglist);
|
||||
va_end(arglist);
|
||||
return Len;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
pthread_t _beginthread(void(*start_address)(), unsigned stack_size, VOID * arglist)
|
||||
{
|
||||
pthread_t thread;
|
||||
|
||||
// Need to set stack size for Mac
|
||||
|
||||
int s, tnum, opt, num_threads;
|
||||
struct thread_info *tinfo;
|
||||
pthread_attr_t attr;
|
||||
void *res;
|
||||
|
||||
s = pthread_attr_init(&attr);
|
||||
if (s != 0)
|
||||
{
|
||||
perror("pthread_attr_init");
|
||||
return 0;
|
||||
}
|
||||
if (stack_size > 0)
|
||||
{
|
||||
s = pthread_attr_setstacksize(&attr, stack_size);
|
||||
if (s != 0)
|
||||
{
|
||||
perror("pthread_attr_setstacksize");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (pthread_create(&thread, &attr, (void * (*)(void *))start_address, (void*) arglist) != 0)
|
||||
perror("New Thread");
|
||||
else
|
||||
pthread_detach(thread);
|
||||
|
||||
return thread;
|
||||
}
|
||||
|
||||
int Sleep(int ms)
|
||||
{
|
||||
usleep(ms * 1000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
VOID OutputDebugString(char * string)
|
||||
{
|
||||
syslog(LOG_DEBUG, "%s", string);
|
||||
}
|
||||
|
||||
void closesocket(int sock)
|
||||
{
|
||||
if (sock)
|
||||
close(sock);
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -1,399 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2022 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
//
|
||||
// C replacement for TNCCode.asm
|
||||
//
|
||||
#define Kernel
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#include "time.h"
|
||||
#include "stdio.h"
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
int C_Q_COUNT(VOID *PQ);
|
||||
VOID SENDUIMESSAGE(struct DATAMESSAGE * Msg);
|
||||
|
||||
VOID TNCTimerProc()
|
||||
{
|
||||
// CALLED AT 10 HZ
|
||||
|
||||
int n = BPQHOSTSTREAMS;
|
||||
PBPQVECSTRUC HOSTSESS = BPQHOSTVECTOR;
|
||||
TRANSPORTENTRY * Session;
|
||||
UCHAR DISCFLAG = 0;
|
||||
|
||||
while (n--)
|
||||
{
|
||||
// Action any DISC Requests (must be done in timer owning process)
|
||||
|
||||
if (HOSTSESS->HOSTFLAGS & 0x40) // DISC REQUEST
|
||||
{
|
||||
if (HOSTSESS->HOSTFLAGS & 0x20) // Stay?
|
||||
DISCFLAG = 'S';
|
||||
|
||||
HOSTSESS->HOSTFLAGS &= 0x9F; // Clear Flags
|
||||
|
||||
Session = HOSTSESS->HOSTSESSION;
|
||||
|
||||
if (Session == 0) // Gone??
|
||||
{
|
||||
HOSTSESS->HOSTFLAGS |= 3; // STATE CHANGE
|
||||
#ifndef LINBPQ
|
||||
if (HOSTSESS->HOSTHANDLE);
|
||||
{
|
||||
PostMessage(HOSTSESS->HOSTHANDLE, BPQMsg, HOSTSESS->HOSTSTREAM, 4);
|
||||
}
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Session->L4CROSSLINK)
|
||||
Session->L4CROSSLINK->STAYFLAG = DISCFLAG;
|
||||
|
||||
HOSTSESS->HOSTSESSION = 0;
|
||||
HOSTSESS->HOSTFLAGS |= 3; // STATE CHANGE
|
||||
|
||||
PostStateChange(Session);
|
||||
|
||||
CloseSessionPartner(Session); // SEND CLOSE TO PARTNER (IF PRESENT)
|
||||
}
|
||||
|
||||
// Check Trace Q
|
||||
|
||||
if (HOSTSESS->HOSTAPPLFLAGS & 0x80)
|
||||
{
|
||||
if (HOSTSESS->HOSTTRACEQ)
|
||||
{
|
||||
int Count = C_Q_COUNT(&HOSTSESS->HOSTTRACEQ);
|
||||
|
||||
if (Count > 100)
|
||||
ReleaseBuffer((void *)Q_REM((void *)&HOSTSESS->HOSTTRACEQ));
|
||||
}
|
||||
}
|
||||
HOSTSESS++;
|
||||
}
|
||||
}
|
||||
|
||||
VOID SendSmartID(struct PORTCONTROL * PORT)
|
||||
{
|
||||
struct _MESSAGE * ID = IDMSG;
|
||||
struct _MESSAGE * Buffer;
|
||||
|
||||
PORT->SmartIDNeeded = 0;
|
||||
|
||||
Buffer = GetBuff();
|
||||
|
||||
if (Buffer)
|
||||
{
|
||||
memcpy(Buffer, ID, ID->LENGTH);
|
||||
|
||||
Buffer->PORT = PORT->PORTNUMBER;
|
||||
|
||||
// IF PORT HAS A CALLSIGN DEFINED, SEND THAT INSTEAD
|
||||
|
||||
if (PORT->PORTCALL[0] > 0x40)
|
||||
{
|
||||
memcpy(Buffer->ORIGIN, PORT->PORTCALL, 7);
|
||||
Buffer->ORIGIN[6] |= 1; // SET END OF CALL BIT
|
||||
}
|
||||
|
||||
// If Pactor Style add to UI_Q
|
||||
|
||||
if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF && PORT->UICAPABLE)
|
||||
{
|
||||
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
|
||||
|
||||
C_Q_ADD(&EXTPORT->UI_Q, Buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
PUT_ON_PORT_Q(PORT, Buffer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID SENDIDMSG()
|
||||
{
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
struct _MESSAGE * ID = IDMSG;
|
||||
struct _MESSAGE * Buffer;
|
||||
|
||||
while (PORT)
|
||||
{
|
||||
if (PORT->PROTOCOL < 10) // Not Pactor-style
|
||||
{
|
||||
Buffer = GetBuff();
|
||||
|
||||
if (Buffer)
|
||||
{
|
||||
memcpy(Buffer, ID, ID->LENGTH);
|
||||
|
||||
Buffer->PORT = PORT->PORTNUMBER;
|
||||
|
||||
// IF PORT HAS A CALLSIGN DEFINED, SEND THAT INSTEAD
|
||||
|
||||
if (PORT->PORTCALL[0] > 0x40)
|
||||
{
|
||||
memcpy(Buffer->ORIGIN, PORT->PORTCALL, 7);
|
||||
Buffer->ORIGIN[6] |= 1; // SET END OF CALL BIT
|
||||
}
|
||||
C_Q_ADD(&IDMSG_Q, Buffer);
|
||||
}
|
||||
}
|
||||
PORT = PORT->PORTPOINTER;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID SENDBTMSG()
|
||||
{
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
struct _MESSAGE * Buffer;
|
||||
char * ptr1, * ptr2;
|
||||
|
||||
while (PORT)
|
||||
{
|
||||
if (PORT->PROTOCOL >= 10 || PORT->PORTUNPROTO == 0) // Pactor-style or no UNPROTO ADDR?
|
||||
{
|
||||
PORT = PORT->PORTPOINTER;
|
||||
continue;
|
||||
}
|
||||
|
||||
Buffer = GetBuff();
|
||||
|
||||
if (Buffer)
|
||||
{
|
||||
memcpy(Buffer->DEST, PORT->PORTUNPROTO, 7);
|
||||
Buffer->DEST[6] |= 0xC0; // Set Command bits
|
||||
|
||||
// Send from BBSCALL unless PORTBCALL defined
|
||||
|
||||
if (PORT->PORTBCALL[0] > 32)
|
||||
memcpy(Buffer->ORIGIN, PORT->PORTBCALL, 7);
|
||||
else if (APPLCALLTABLE->APPLCALL[0] > 32)
|
||||
memcpy(Buffer->ORIGIN, APPLCALLTABLE->APPLCALL, 7);
|
||||
else
|
||||
memcpy(Buffer->ORIGIN, MYCALL, 7);
|
||||
|
||||
ptr1 = &PORT->PORTUNPROTO[7]; // First Digi
|
||||
ptr2 = &Buffer->CTL; // Digi field in buffer
|
||||
|
||||
// Copy any digis
|
||||
|
||||
while (*(ptr1))
|
||||
{
|
||||
memcpy(ptr2, ptr1, 7);
|
||||
ptr1 += 7;
|
||||
ptr2 += 7;
|
||||
}
|
||||
|
||||
*(ptr2 - 1) |= 1; // Set End of Address
|
||||
*(ptr2++) = UI;
|
||||
|
||||
memcpy(ptr2, &BTHDDR.PID, BTHDDR.LENGTH);
|
||||
ptr2 += BTHDDR.LENGTH;
|
||||
Buffer->LENGTH = (int)(ptr2 - (char *)Buffer);
|
||||
Buffer->PORT = PORT->PORTNUMBER;
|
||||
|
||||
C_Q_ADD(&IDMSG_Q, Buffer);
|
||||
}
|
||||
PORT = PORT->PORTPOINTER;
|
||||
}
|
||||
}
|
||||
|
||||
VOID SENDUIMESSAGE(struct DATAMESSAGE * Msg)
|
||||
{
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
struct _MESSAGE * Buffer;
|
||||
char * ptr1, * ptr2;
|
||||
|
||||
Msg->LENGTH -= MSGHDDRLEN; // Remove Header
|
||||
|
||||
while (PORT)
|
||||
{
|
||||
if ((PORT->PROTOCOL == 10 && PORT->UICAPABLE == 0) || PORT->PORTUNPROTO == 0) // Pactor-style or no UNPROTO ADDR?
|
||||
{
|
||||
PORT = PORT->PORTPOINTER;
|
||||
continue;
|
||||
}
|
||||
|
||||
Buffer = GetBuff();
|
||||
|
||||
if (Buffer)
|
||||
{
|
||||
memcpy(Buffer->DEST, PORT->PORTUNPROTO, 7);
|
||||
Buffer->DEST[6] |= 0xC0; // Set Command bits
|
||||
|
||||
// Send from BBSCALL unless PORTBCALL defined
|
||||
|
||||
if (PORT->PORTBCALL[0] > 32)
|
||||
memcpy(Buffer->ORIGIN, PORT->PORTBCALL, 7);
|
||||
else if (APPLCALLTABLE->APPLCALL[0] > 32)
|
||||
memcpy(Buffer->ORIGIN, APPLCALLTABLE->APPLCALL, 7);
|
||||
else
|
||||
memcpy(Buffer->ORIGIN, MYCALL, 7);
|
||||
|
||||
ptr1 = &PORT->PORTUNPROTO[7]; // First Digi
|
||||
ptr2 = &Buffer->CTL; // Digi field in buffer
|
||||
|
||||
// Copy any digis
|
||||
|
||||
while (*(ptr1))
|
||||
{
|
||||
memcpy(ptr2, ptr1, 7);
|
||||
ptr1 += 7;
|
||||
ptr2 += 7;
|
||||
}
|
||||
|
||||
*(ptr2 - 1) |= 1; // Set End of Address
|
||||
*(ptr2++) = UI;
|
||||
|
||||
memcpy(ptr2, &Msg->PID, Msg->LENGTH);
|
||||
ptr2 += Msg->LENGTH;
|
||||
Buffer->LENGTH = (int)(ptr2 - (char *)Buffer);
|
||||
Buffer->PORT = PORT->PORTNUMBER;
|
||||
|
||||
if (PORT->PROTOCOL == 10)
|
||||
{
|
||||
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
|
||||
C_Q_ADD(&EXTPORT->UI_Q, Buffer);
|
||||
}
|
||||
else
|
||||
C_Q_ADD(&IDMSG_Q, Buffer);
|
||||
}
|
||||
PORT = PORT->PORTPOINTER;
|
||||
}
|
||||
}
|
||||
|
||||
Dll VOID APIENTRY Send_AX(UCHAR * Block, DWORD Len, UCHAR Port)
|
||||
{
|
||||
// Block included the 7/11 byte header, Len does not
|
||||
|
||||
struct PORTCONTROL * PORT;
|
||||
PMESSAGE Copy;
|
||||
|
||||
if (Len > 360 - 15)
|
||||
return;
|
||||
|
||||
if (QCOUNT < 50)
|
||||
return; // Running low
|
||||
|
||||
PORT = GetPortTableEntryFromPortNum(Port);
|
||||
|
||||
if (PORT == 0)
|
||||
return;
|
||||
|
||||
Copy = GetBuff();
|
||||
|
||||
if (Copy == 0)
|
||||
return;
|
||||
|
||||
memcpy(&Copy->DEST[0], &Block[MSGHDDRLEN], Len);
|
||||
|
||||
Copy->LENGTH = (USHORT)Len + MSGHDDRLEN;
|
||||
|
||||
if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF)
|
||||
{
|
||||
// Pactor Style. Probably will only be used for Tracker uneless we do APRS over V4 or WINMOR
|
||||
|
||||
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
|
||||
|
||||
C_Q_ADD(&EXTPORT->UI_Q, Copy);
|
||||
return;
|
||||
}
|
||||
|
||||
Copy->PORT = Port;
|
||||
|
||||
PUT_ON_PORT_Q(PORT, Copy);
|
||||
}
|
||||
|
||||
|
||||
TRANSPORTENTRY * SetupSessionFromHost(PBPQVECSTRUC HOST, UINT ApplMask)
|
||||
{
|
||||
// Create a Transport (L4) session linked to an incoming HOST (API) Session
|
||||
|
||||
TRANSPORTENTRY * NewSess = L4TABLE;
|
||||
int Index = 0;
|
||||
|
||||
|
||||
while (Index < MAXCIRCUITS)
|
||||
{
|
||||
if (NewSess->L4USER[0] == 0)
|
||||
{
|
||||
// Got One
|
||||
|
||||
UCHAR * ourcall = &MYCALL[0];
|
||||
|
||||
// IF APPL PORT USE APPL CALL, ELSE NODE CALL
|
||||
|
||||
if (ApplMask)
|
||||
{
|
||||
// Circuit for APPL - look for an APPLCALL
|
||||
|
||||
APPLCALLS * APPL = APPLCALLTABLE;
|
||||
|
||||
while ((ApplMask & 1) == 0)
|
||||
{
|
||||
ApplMask >>= 1;
|
||||
APPL++;
|
||||
}
|
||||
if (APPL->APPLCALL[0] > 0x40) // We have an applcall
|
||||
ourcall = &APPL->APPLCALL[0];
|
||||
}
|
||||
|
||||
memcpy(NewSess->L4USER, ourcall, 7);
|
||||
memcpy(NewSess->L4MYCALL, ourcall, 7);
|
||||
|
||||
NewSess->CIRCUITINDEX = Index; //OUR INDEX
|
||||
NewSess->CIRCUITID = NEXTID;
|
||||
|
||||
NEXTID++;
|
||||
if (NEXTID == 0)
|
||||
NEXTID++; // Keep Non-Zero
|
||||
|
||||
NewSess->L4TARGET.HOST = HOST;
|
||||
NewSess->L4STATE = 5;
|
||||
|
||||
|
||||
NewSess->SESSIONT1 = L4T1;
|
||||
NewSess->L4WINDOW = (UCHAR)L4DEFAULTWINDOW;
|
||||
NewSess->SESSPACLEN = PACLEN; // Default;
|
||||
|
||||
return NewSess;
|
||||
}
|
||||
Index++;
|
||||
NewSess++;
|
||||
}
|
||||
|
||||
// Table Full
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,650 +0,0 @@
|
||||
|
||||
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
||||
*
|
||||
* libpng 1.2.8 - December 3, 2004
|
||||
* For conditions of distribution and use, see copyright notice in png.h
|
||||
* Copyright (c) 1998-2004 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*/
|
||||
|
||||
#define PNG_INTERNAL
|
||||
#include "png.h"
|
||||
|
||||
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
|
||||
/* turn on BGR-to-RGB mapping */
|
||||
void PNGAPI
|
||||
png_set_bgr(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_set_bgr\n");
|
||||
png_ptr->transformations |= PNG_BGR;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
|
||||
/* turn on 16 bit byte swapping */
|
||||
void PNGAPI
|
||||
png_set_swap(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_set_swap\n");
|
||||
if (png_ptr->bit_depth == 16)
|
||||
png_ptr->transformations |= PNG_SWAP_BYTES;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
|
||||
/* turn on pixel packing */
|
||||
void PNGAPI
|
||||
png_set_packing(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_set_packing\n");
|
||||
if (png_ptr->bit_depth < 8)
|
||||
{
|
||||
png_ptr->transformations |= PNG_PACK;
|
||||
png_ptr->usr_bit_depth = 8;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
|
||||
/* turn on packed pixel swapping */
|
||||
void PNGAPI
|
||||
png_set_packswap(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_set_packswap\n");
|
||||
if (png_ptr->bit_depth < 8)
|
||||
png_ptr->transformations |= PNG_PACKSWAP;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
|
||||
void PNGAPI
|
||||
png_set_shift(png_structp png_ptr, png_color_8p true_bits)
|
||||
{
|
||||
png_debug(1, "in png_set_shift\n");
|
||||
png_ptr->transformations |= PNG_SHIFT;
|
||||
png_ptr->shift = *true_bits;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
|
||||
defined(PNG_WRITE_INTERLACING_SUPPORTED)
|
||||
int PNGAPI
|
||||
png_set_interlace_handling(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_set_interlace handling\n");
|
||||
if (png_ptr->interlaced)
|
||||
{
|
||||
png_ptr->transformations |= PNG_INTERLACE;
|
||||
return (7);
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
|
||||
/* Add a filler byte on read, or remove a filler or alpha byte on write.
|
||||
* The filler type has changed in v0.95 to allow future 2-byte fillers
|
||||
* for 48-bit input data, as well as to avoid problems with some compilers
|
||||
* that don't like bytes as parameters.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
|
||||
{
|
||||
png_debug(1, "in png_set_filler\n");
|
||||
png_ptr->transformations |= PNG_FILLER;
|
||||
png_ptr->filler = (png_byte)filler;
|
||||
if (filler_loc == PNG_FILLER_AFTER)
|
||||
png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
|
||||
else
|
||||
png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
|
||||
|
||||
/* This should probably go in the "do_read_filler" routine.
|
||||
* I attempted to do that in libpng-1.0.1a but that caused problems
|
||||
* so I restored it in libpng-1.0.2a
|
||||
*/
|
||||
|
||||
if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
|
||||
{
|
||||
png_ptr->usr_channels = 4;
|
||||
}
|
||||
|
||||
/* Also I added this in libpng-1.0.2a (what happens when we expand
|
||||
* a less-than-8-bit grayscale to GA? */
|
||||
|
||||
if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
|
||||
{
|
||||
png_ptr->usr_channels = 2;
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(PNG_1_0_X)
|
||||
/* Added to libpng-1.2.7 */
|
||||
void PNGAPI
|
||||
png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
|
||||
{
|
||||
png_debug(1, "in png_set_add_alpha\n");
|
||||
png_set_filler(png_ptr, filler, filler_loc);
|
||||
png_ptr->transformations |= PNG_ADD_ALPHA;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
|
||||
defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
|
||||
void PNGAPI
|
||||
png_set_swap_alpha(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_set_swap_alpha\n");
|
||||
png_ptr->transformations |= PNG_SWAP_ALPHA;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
|
||||
defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
|
||||
void PNGAPI
|
||||
png_set_invert_alpha(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_set_invert_alpha\n");
|
||||
png_ptr->transformations |= PNG_INVERT_ALPHA;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
|
||||
void PNGAPI
|
||||
png_set_invert_mono(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_set_invert_mono\n");
|
||||
png_ptr->transformations |= PNG_INVERT_MONO;
|
||||
}
|
||||
|
||||
/* invert monochrome grayscale data */
|
||||
void /* PRIVATE */
|
||||
png_do_invert(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_invert\n");
|
||||
/* This test removed from libpng version 1.0.13 and 1.2.0:
|
||||
* if (row_info->bit_depth == 1 &&
|
||||
*/
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
if (row == NULL || row_info == NULL)
|
||||
return;
|
||||
#endif
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop = row_info->rowbytes;
|
||||
|
||||
for (i = 0; i < istop; i++)
|
||||
{
|
||||
*rp = (png_byte)(~(*rp));
|
||||
rp++;
|
||||
}
|
||||
}
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
|
||||
row_info->bit_depth == 8)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop = row_info->rowbytes;
|
||||
|
||||
for (i = 0; i < istop; i+=2)
|
||||
{
|
||||
*rp = (png_byte)(~(*rp));
|
||||
rp+=2;
|
||||
}
|
||||
}
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
|
||||
row_info->bit_depth == 16)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop = row_info->rowbytes;
|
||||
|
||||
for (i = 0; i < istop; i+=4)
|
||||
{
|
||||
*rp = (png_byte)(~(*rp));
|
||||
*(rp+1) = (png_byte)(~(*(rp+1)));
|
||||
rp+=4;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
|
||||
/* swaps byte order on 16 bit depth images */
|
||||
void /* PRIVATE */
|
||||
png_do_swap(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_swap\n");
|
||||
if (
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
row != NULL && row_info != NULL &&
|
||||
#endif
|
||||
row_info->bit_depth == 16)
|
||||
{
|
||||
png_bytep rp = row;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop= row_info->width * row_info->channels;
|
||||
|
||||
for (i = 0; i < istop; i++, rp += 2)
|
||||
{
|
||||
png_byte t = *rp;
|
||||
*rp = *(rp + 1);
|
||||
*(rp + 1) = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
|
||||
static png_byte onebppswaptable[256] = {
|
||||
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
|
||||
0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
|
||||
0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
|
||||
0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
|
||||
0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
|
||||
0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
|
||||
0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
|
||||
0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
|
||||
0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
|
||||
0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
|
||||
0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
|
||||
0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
|
||||
0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
|
||||
0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
|
||||
0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
|
||||
0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
|
||||
0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
|
||||
0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
|
||||
0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
|
||||
0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
|
||||
0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
|
||||
0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
|
||||
0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
|
||||
0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
|
||||
0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
|
||||
0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
|
||||
0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
|
||||
0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
|
||||
0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
|
||||
0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
|
||||
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
|
||||
0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
|
||||
};
|
||||
|
||||
static png_byte twobppswaptable[256] = {
|
||||
0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
|
||||
0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
|
||||
0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
|
||||
0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
|
||||
0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
|
||||
0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
|
||||
0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
|
||||
0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
|
||||
0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
|
||||
0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
|
||||
0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
|
||||
0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
|
||||
0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
|
||||
0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
|
||||
0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
|
||||
0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
|
||||
0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
|
||||
0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
|
||||
0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
|
||||
0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
|
||||
0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
|
||||
0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
|
||||
0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
|
||||
0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
|
||||
0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
|
||||
0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
|
||||
0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
|
||||
0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
|
||||
0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
|
||||
0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
|
||||
0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
|
||||
0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
|
||||
};
|
||||
|
||||
static png_byte fourbppswaptable[256] = {
|
||||
0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
|
||||
0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
|
||||
0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
|
||||
0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
|
||||
0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
|
||||
0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
|
||||
0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
|
||||
0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
|
||||
0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
|
||||
0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
|
||||
0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
|
||||
0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
|
||||
0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
|
||||
0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
|
||||
0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
|
||||
0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
|
||||
0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
|
||||
0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
|
||||
0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
|
||||
0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
|
||||
0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
|
||||
0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
|
||||
0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
|
||||
0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
|
||||
0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
|
||||
0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
|
||||
0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
|
||||
0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
|
||||
0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
|
||||
0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
|
||||
0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
|
||||
0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
|
||||
};
|
||||
|
||||
/* swaps pixel packing order within bytes */
|
||||
void /* PRIVATE */
|
||||
png_do_packswap(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_packswap\n");
|
||||
if (
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
row != NULL && row_info != NULL &&
|
||||
#endif
|
||||
row_info->bit_depth < 8)
|
||||
{
|
||||
png_bytep rp, end, table;
|
||||
|
||||
end = row + row_info->rowbytes;
|
||||
|
||||
if (row_info->bit_depth == 1)
|
||||
table = onebppswaptable;
|
||||
else if (row_info->bit_depth == 2)
|
||||
table = twobppswaptable;
|
||||
else if (row_info->bit_depth == 4)
|
||||
table = fourbppswaptable;
|
||||
else
|
||||
return;
|
||||
|
||||
for (rp = row; rp < end; rp++)
|
||||
*rp = table[*rp];
|
||||
}
|
||||
}
|
||||
#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
|
||||
|
||||
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
|
||||
defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
|
||||
/* remove filler or alpha byte(s) */
|
||||
void /* PRIVATE */
|
||||
png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
|
||||
{
|
||||
png_debug(1, "in png_do_strip_filler\n");
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
if (row != NULL && row_info != NULL)
|
||||
#endif
|
||||
{
|
||||
png_bytep sp=row;
|
||||
png_bytep dp=row;
|
||||
png_uint_32 row_width=row_info->width;
|
||||
png_uint_32 i;
|
||||
|
||||
if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
|
||||
(row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
|
||||
(flags & PNG_FLAG_STRIP_ALPHA))) &&
|
||||
row_info->channels == 4)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This converts from RGBX or RGBA to RGB */
|
||||
if (flags & PNG_FLAG_FILLER_AFTER)
|
||||
{
|
||||
dp+=3; sp+=4;
|
||||
for (i = 1; i < row_width; i++)
|
||||
{
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
sp++;
|
||||
}
|
||||
}
|
||||
/* This converts from XRGB or ARGB to RGB */
|
||||
else
|
||||
{
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
}
|
||||
}
|
||||
row_info->pixel_depth = 24;
|
||||
row_info->rowbytes = row_width * 3;
|
||||
}
|
||||
else /* if (row_info->bit_depth == 16) */
|
||||
{
|
||||
if (flags & PNG_FLAG_FILLER_AFTER)
|
||||
{
|
||||
/* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
|
||||
sp += 8; dp += 6;
|
||||
for (i = 1; i < row_width; i++)
|
||||
{
|
||||
/* This could be (although png_memcpy is probably slower):
|
||||
png_memcpy(dp, sp, 6);
|
||||
sp += 8;
|
||||
dp += 6;
|
||||
*/
|
||||
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
sp += 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
/* This could be (although png_memcpy is probably slower):
|
||||
png_memcpy(dp, sp, 6);
|
||||
sp += 8;
|
||||
dp += 6;
|
||||
*/
|
||||
|
||||
sp+=2;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
}
|
||||
}
|
||||
row_info->pixel_depth = 48;
|
||||
row_info->rowbytes = row_width * 6;
|
||||
}
|
||||
row_info->channels = 3;
|
||||
}
|
||||
else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
|
||||
(row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
|
||||
(flags & PNG_FLAG_STRIP_ALPHA))) &&
|
||||
row_info->channels == 2)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This converts from GX or GA to G */
|
||||
if (flags & PNG_FLAG_FILLER_AFTER)
|
||||
{
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
*dp++ = *sp++;
|
||||
sp++;
|
||||
}
|
||||
}
|
||||
/* This converts from XG or AG to G */
|
||||
else
|
||||
{
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
sp++;
|
||||
*dp++ = *sp++;
|
||||
}
|
||||
}
|
||||
row_info->pixel_depth = 8;
|
||||
row_info->rowbytes = row_width;
|
||||
}
|
||||
else /* if (row_info->bit_depth == 16) */
|
||||
{
|
||||
if (flags & PNG_FLAG_FILLER_AFTER)
|
||||
{
|
||||
/* This converts from GGXX or GGAA to GG */
|
||||
sp += 4; dp += 2;
|
||||
for (i = 1; i < row_width; i++)
|
||||
{
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
sp += 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This converts from XXGG or AAGG to GG */
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
sp += 2;
|
||||
*dp++ = *sp++;
|
||||
*dp++ = *sp++;
|
||||
}
|
||||
}
|
||||
row_info->pixel_depth = 16;
|
||||
row_info->rowbytes = row_width * 2;
|
||||
}
|
||||
row_info->channels = 1;
|
||||
}
|
||||
if (flags & PNG_FLAG_STRIP_ALPHA)
|
||||
row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
|
||||
/* swaps red and blue bytes within a pixel */
|
||||
void /* PRIVATE */
|
||||
png_do_bgr(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_bgr\n");
|
||||
if (
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
row != NULL && row_info != NULL &&
|
||||
#endif
|
||||
(row_info->color_type & PNG_COLOR_MASK_COLOR))
|
||||
{
|
||||
png_uint_32 row_width = row_info->width;
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
|
||||
{
|
||||
png_bytep rp;
|
||||
png_uint_32 i;
|
||||
|
||||
for (i = 0, rp = row; i < row_width; i++, rp += 3)
|
||||
{
|
||||
png_byte save = *rp;
|
||||
*rp = *(rp + 2);
|
||||
*(rp + 2) = save;
|
||||
}
|
||||
}
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
{
|
||||
png_bytep rp;
|
||||
png_uint_32 i;
|
||||
|
||||
for (i = 0, rp = row; i < row_width; i++, rp += 4)
|
||||
{
|
||||
png_byte save = *rp;
|
||||
*rp = *(rp + 2);
|
||||
*(rp + 2) = save;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (row_info->bit_depth == 16)
|
||||
{
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
|
||||
{
|
||||
png_bytep rp;
|
||||
png_uint_32 i;
|
||||
|
||||
for (i = 0, rp = row; i < row_width; i++, rp += 6)
|
||||
{
|
||||
png_byte save = *rp;
|
||||
*rp = *(rp + 4);
|
||||
*(rp + 4) = save;
|
||||
save = *(rp + 1);
|
||||
*(rp + 1) = *(rp + 5);
|
||||
*(rp + 5) = save;
|
||||
}
|
||||
}
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
{
|
||||
png_bytep rp;
|
||||
png_uint_32 i;
|
||||
|
||||
for (i = 0, rp = row; i < row_width; i++, rp += 8)
|
||||
{
|
||||
png_byte save = *rp;
|
||||
*rp = *(rp + 4);
|
||||
*(rp + 4) = save;
|
||||
save = *(rp + 1);
|
||||
*(rp + 1) = *(rp + 5);
|
||||
*(rp + 5) = save;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
|
||||
|
||||
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
|
||||
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
|
||||
defined(PNG_LEGACY_SUPPORTED)
|
||||
void PNGAPI
|
||||
png_set_user_transform_info(png_structp png_ptr, png_voidp
|
||||
user_transform_ptr, int user_transform_depth, int user_transform_channels)
|
||||
{
|
||||
png_debug(1, "in png_set_user_transform_info\n");
|
||||
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
|
||||
png_ptr->user_transform_ptr = user_transform_ptr;
|
||||
png_ptr->user_transform_depth = (png_byte)user_transform_depth;
|
||||
png_ptr->user_transform_channels = (png_byte)user_transform_channels;
|
||||
#else
|
||||
if(user_transform_ptr || user_transform_depth || user_transform_channels)
|
||||
png_warning(png_ptr,
|
||||
"This version of libpng does not support user transform info");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This function returns a pointer to the user_transform_ptr associated with
|
||||
* the user transform functions. The application should free any memory
|
||||
* associated with this pointer before png_write_destroy and png_read_destroy
|
||||
* are called.
|
||||
*/
|
||||
png_voidp PNGAPI
|
||||
png_get_user_transform_ptr(png_structp png_ptr)
|
||||
{
|
||||
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
|
||||
return ((png_voidp)png_ptr->user_transform_ptr);
|
||||
#else
|
||||
if(png_ptr)
|
||||
return (NULL);
|
||||
return (NULL);
|
||||
#endif
|
||||
}
|
||||
@ -1,602 +0,0 @@
|
||||
/*
|
||||
|
||||
Declarations of BPQ32 API funtions
|
||||
|
||||
There are two sets of definitions, one for static linking against bpq32.lib, and one for
|
||||
dynamic linking using LoadLibrary/GetProcAddress
|
||||
|
||||
Define symbol DYNLOADBPQ before including this file to use the dynamic form.
|
||||
|
||||
If you are writing an External Driver, rather than an application,
|
||||
you must use Dynamic Linking, and you must also define symbol EXTDLL, which will
|
||||
make the code use GetProcAddress rather than LoadLibrary. Without this the reference
|
||||
count on BPQ32.dll gets messed up, and the code will not unload cleanly.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef DYNLOADBPQ
|
||||
|
||||
// Definitions for Statically Linked DLL
|
||||
|
||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portslot);
|
||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
|
||||
|
||||
|
||||
// Returns number of free buffers
|
||||
// (BPQHOST function 7 (part)).
|
||||
|
||||
int APIENTRY GetFreeBuffs();
|
||||
|
||||
// Returns count of packets waiting on stream
|
||||
// (BPQHOST function 7 (part)).
|
||||
|
||||
int APIENTRY RXCount(int Stream);
|
||||
|
||||
|
||||
// Returns number of packets on TX queue for stream
|
||||
// (BPQHOST function 7 (part)).
|
||||
|
||||
int APIENTRY TXCount(int Stream);
|
||||
|
||||
|
||||
// Returns number of monitor frames available
|
||||
// (BPQHOST function 7 (part)).
|
||||
|
||||
int APIENTRY MONCount(int Stream);
|
||||
|
||||
|
||||
// Returns call connecten on stream (BPQHOST function 8 (part)).
|
||||
|
||||
int APIENTRY GetCallsign(int stream, char * callsign);
|
||||
|
||||
|
||||
// Returns connection info for stream (BPQHOST function 8).
|
||||
|
||||
int APIENTRY GetConnectionInfo(int stream, char * callsign,
|
||||
int * port, int * sesstype, int * paclen,
|
||||
int * maxframe, int * l4window);
|
||||
|
||||
|
||||
int APIENTRY GetStreamPID(int Stream);
|
||||
|
||||
// Returns Path of BPQDirectroy
|
||||
|
||||
char * APIENTRY GetBPQDirectory();
|
||||
char * APIENTRY GetProgramDirectory();
|
||||
UCHAR * APIENTRY GetLogDirectory();
|
||||
|
||||
HKEY APIENTRY GetRegistryKey();
|
||||
char * APIENTRY GetRegistryKeyText();
|
||||
|
||||
char * APIENTRY GetSignOnMsg();
|
||||
|
||||
char * APIENTRY GetVersionString();
|
||||
|
||||
|
||||
// Returns number of prcess attached to BPQ32
|
||||
|
||||
int APIENTRY GetAttachedProcesses();
|
||||
|
||||
|
||||
// Send Session Control command (BPQHOST function 6)
|
||||
// Command = 0 Connect using APPL MASK IN param
|
||||
// Command = 1 Connect
|
||||
// Command = 2 Disconect
|
||||
// Command = 3 Return to Node
|
||||
|
||||
int APIENTRY SessionControl(int stream, int command, int param);
|
||||
|
||||
|
||||
|
||||
// Sets Application Flags and Mask for stream. (BPQHOST function 1)
|
||||
// Top bit of flags enables monitoring
|
||||
|
||||
int APIENTRY SetAppl(int stream, int flags, int mask);
|
||||
|
||||
|
||||
int APIENTRY GetApplMask(int Stream);
|
||||
|
||||
int APIENTRY GetApplFlags(int Stream);
|
||||
|
||||
|
||||
BOOL APIENTRY GetAllocationState(int Stream);
|
||||
|
||||
|
||||
// Get current Session State. Any state changed is ACK'ed
|
||||
// automatically. See BPQHOST functions 4 and 5.
|
||||
|
||||
int APIENTRY SessionState(int stream, int * state, int * change);
|
||||
|
||||
// Get current Session State. Dont Ack state change
|
||||
// See BPQHOST function 4.
|
||||
|
||||
int APIENTRY SessionStateNoAck(int stream, int * state);
|
||||
|
||||
|
||||
|
||||
// Send message to stream (BPQHOST Function 2)
|
||||
|
||||
int APIENTRY SendMsg(int stream, char * msg, int len);
|
||||
|
||||
|
||||
|
||||
// Send Raw (KISS mode) frame to port (BPQHOST function 10)
|
||||
|
||||
int APIENTRY SendRaw(int port, char * msg, int len);
|
||||
|
||||
|
||||
|
||||
// Get message from stream. Returns length, and count of frames
|
||||
// still waiting to be collected. (BPQHOST function 3)
|
||||
|
||||
int APIENTRY GetMsg(int stream, char * msg, int * len, int * count );
|
||||
|
||||
|
||||
// Perl Version - I couldn't get bpq32.pm to call GetMsg. Returns Lenth
|
||||
|
||||
int APIENTRY GetMsgPerl(int stream, char * msg);
|
||||
|
||||
|
||||
// Get Raw (Trace) data (BPQHOST function 11)
|
||||
|
||||
int APIENTRY GetRaw(int stream, char * msg, int * len, int * count );
|
||||
|
||||
|
||||
|
||||
// This is not an API function. It is a utility to decode a received
|
||||
// monitor frame into ascii text.
|
||||
|
||||
int APIENTRY DecodeFrame(char * msg, char * buffer, time_t Stamp);
|
||||
|
||||
|
||||
|
||||
// Sets the tracing options for DecodeFrame. Mask is a bit
|
||||
// mask of ports to monitor (ie 101 binary will monitor ports
|
||||
// 1 and 3). MTX enables monitoring on transmitted frames. MCOM
|
||||
// enables monitoring of protocol control frames (eg SABM, UA, RR),
|
||||
// as well as info frames.
|
||||
|
||||
int APIENTRY SetTraceOptions(long mask, int mtxparam, int mcomparam);
|
||||
int APIENTRY SetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
|
||||
int APIENTRY SetTraceOptions64(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
|
||||
|
||||
// Returns number of first unused BPQHOST stream. If none available,
|
||||
// returns 255. See API function 13.
|
||||
|
||||
int APIENTRY FindFreeStream();
|
||||
|
||||
|
||||
|
||||
// Allocate stream. If stream is already allocated, return nonzero.
|
||||
// Otherwise allocate stream, and return zero
|
||||
|
||||
int APIENTRY AllocateStream(int stream);
|
||||
|
||||
|
||||
|
||||
// Release stream.
|
||||
|
||||
int APIENTRY DeallocateStream(int stream);
|
||||
|
||||
// Get number of ports configured
|
||||
|
||||
int APIENTRY GetNumberofPorts();
|
||||
|
||||
|
||||
// Get port number (ports aren't necessarily numbered 1 to n)
|
||||
|
||||
int APIENTRY GetPortNumber(int portslot);
|
||||
|
||||
UCHAR * APIENTRY GetPortDescription(int portslot, char * Desc);
|
||||
|
||||
// Enable async operation - new to Win32 version of API
|
||||
|
||||
int APIENTRY BPQSetHandle(int Stream, HWND hWnd);
|
||||
|
||||
int ConvFromAX25(unsigned char * incall, unsigned char * outcall);
|
||||
BOOL ConvToAX25(unsigned char * callsign, unsigned char * ax25call);
|
||||
char * APIENTRY GetNodeCall();
|
||||
|
||||
int APIENTRY ChangeSessionCallsign(int Stream, unsigned char * AXCall);
|
||||
int APIENTRY ChangeSessionPaclen(int Stream, int Paclen);
|
||||
|
||||
int APIENTRY GetApplNum(int Stream);
|
||||
|
||||
char * APIENTRY GetApplCall(int Appl);
|
||||
|
||||
char * APIENTRY GetApplAlias(int Appl);
|
||||
|
||||
long APIENTRY GetApplQual(int Appl);
|
||||
|
||||
char * APIENTRY GetApplNabe(int Appl);
|
||||
|
||||
BOOL APIENTRY SetApplCall(int Appl, char * NewCall);
|
||||
|
||||
BOOL APIENTRY SetApplAlias(int Appl, char * NewCall);
|
||||
|
||||
BOOL APIENTRY SetApplQual(int Appl, int NewQual);
|
||||
|
||||
|
||||
// Routines to support "Minimize to Tray"
|
||||
|
||||
BOOL APIENTRY GetMinimizetoTrayFlag();
|
||||
|
||||
int APIENTRY AddTrayMenuItem(HWND hWnd, char * Label);
|
||||
|
||||
int APIENTRY DeleteTrayMenuItem(HWND hWnd);
|
||||
|
||||
BOOL APIENTRY StartMinimizedFlag();
|
||||
|
||||
// Log a message to the bpq32 console.
|
||||
|
||||
int APIENTRY WritetoConsole(char * buff);
|
||||
|
||||
// CheckTimer should be called regularly to ensure BPQ32 detects if an application crashes
|
||||
|
||||
int APIENTRY CheckTimer();
|
||||
|
||||
// CloseBPQ32 is used if you want to close and restart BPQ32 while your application is
|
||||
// running. This is only relevant of you have Dynamically linked BPQ32
|
||||
|
||||
int APIENTRY CloseBPQ32();
|
||||
|
||||
int APIENTRY GETBPQAPI();
|
||||
|
||||
UINT APIENTRY GETMONDECODE();
|
||||
|
||||
VOID APIENTRY RelBuff(VOID * Msg);
|
||||
//VOID *APIENTRY GetBuff();
|
||||
|
||||
VOID APIENTRY CreateOneTimePassword(char * Password, char * KeyPhrase, int TimeOffset);
|
||||
|
||||
BOOL APIENTRY CheckOneTimePassword(char * Password, char * KeyPhrase);
|
||||
|
||||
VOID APIENTRY md5 (char *arg, unsigned char * checksum);
|
||||
|
||||
int APIENTRY SetupTrayIcon();
|
||||
|
||||
BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile);
|
||||
|
||||
VOID APIENTRY SendChatReport(UINT_PTR ChatReportSocket, char * buff, int txlen);
|
||||
|
||||
int APIENTRY CountFramesQueuedOnStream(int Stream);
|
||||
|
||||
char * APIENTRY GetLOC();
|
||||
|
||||
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqString);
|
||||
|
||||
#else
|
||||
|
||||
struct PORTCONTROL * (FAR WINAPI * GetPortTableEntryFromPortNum) (int portnum);
|
||||
struct PORTCONTROL * (FAR WINAPI * GetPortTableEntryFromSlot) (int portslot);
|
||||
|
||||
// API Definitions for Dynamic Load of BPQ32.dll
|
||||
|
||||
ULONG (FAR WINAPI * GETBPQAPI)();
|
||||
|
||||
ULONG (FAR WINAPI * GETMONDECODE)();
|
||||
|
||||
UCHAR * (FAR WINAPI * GetBPQDirectory)();
|
||||
UCHAR * (FAR WINAPI * GetProgramDirectory)();
|
||||
UCHAR * (FAR WINAPI * GetRegistryKeyText)();
|
||||
HKEY (FAR WINAPI * GetRegistryKey)();
|
||||
|
||||
UCHAR * (FAR WINAPI * GetSignOnMsg)();
|
||||
UCHAR * (FAR WINAPI * GetVersionString)();
|
||||
|
||||
// Returns number of free buffers
|
||||
// (BPQHOST function 7 (part)).
|
||||
|
||||
int (FAR WINAPI * GetFreeBuffs)();
|
||||
|
||||
|
||||
// Returns count of packets waiting on stream
|
||||
// (BPQHOST function 7 (part)).
|
||||
|
||||
int (FAR WINAPI * RXCount) (int Stream);
|
||||
|
||||
// Returns number of packets on TX queue for stream
|
||||
// (BPQHOST function 7 (part)).
|
||||
|
||||
int (FAR WINAPI * TXCount)(int Stream);
|
||||
|
||||
|
||||
// Returns number of monitor frames available
|
||||
// (BPQHOST function 7 (part)).
|
||||
|
||||
int (FAR WINAPI * MONCount) (int Stream);
|
||||
|
||||
// Returns call connecten on stream (BPQHOST function 8 (part)).
|
||||
|
||||
int (FAR WINAPI * GetCallsign)(int stream, char * callsign);
|
||||
|
||||
// Returns connection info for stream (BPQHOST function 8).
|
||||
|
||||
int (FAR WINAPI * GetConnectionInfo) (int stream, char * callsign,
|
||||
int * port, int * sesstype, int * paclen,
|
||||
int * maxframe, int * l4window);
|
||||
|
||||
|
||||
int (FAR WINAPI * GetStreamPID) (int Stream);
|
||||
|
||||
// Returns Path of BPQDirectroy
|
||||
|
||||
UCHAR * (FAR WINAPI * GetBPQDirectory)();
|
||||
|
||||
// Returns number of prcess attached to BPQ32
|
||||
|
||||
int (FAR WINAPI * GetAttachedProcesses) ();
|
||||
|
||||
|
||||
// Send Session Control command (BPQHOST function 6)
|
||||
// Command = 0 Connect using APPL MASK IN param
|
||||
// Command = 1 Connect
|
||||
// Command = 2 Disconect
|
||||
// Command = 3 Return to Node
|
||||
|
||||
int (FAR WINAPI * SessionControl) (int stream, int command, int param);
|
||||
|
||||
|
||||
// Sets Application Flags and Mask for stream. (BPQHOST function 1)
|
||||
// Top bit of flags enables monitoring
|
||||
|
||||
int (FAR WINAPI * SetAppl) (int stream, int flags, int mask);
|
||||
|
||||
int (FAR WINAPI * GetApplMask) (int Stream);
|
||||
|
||||
int (FAR WINAPI * GetApplFlags)(int Stream);
|
||||
|
||||
BOOL (FAR WINAPI * GetAllocationState) (int Stream);
|
||||
|
||||
|
||||
|
||||
// Get current Session State. Any state changed is ACK'ed
|
||||
// automatically. See BPQHOST functions 4 and 5.
|
||||
|
||||
int (FAR WINAPI * SessionState) (int stream, int * state, int * change);
|
||||
|
||||
// Get current Session State. Dont Ack state change
|
||||
// See BPQHOST function 4.
|
||||
|
||||
int (FAR WINAPI * SessionStateNoAck) (int stream, int * state);
|
||||
|
||||
|
||||
// Send message to stream (BPQHOST Function 2)
|
||||
|
||||
int (FAR WINAPI * SendMsg) (int stream, char * msg, int len);
|
||||
|
||||
|
||||
// Send Raw (KISS mode) frame to port (BPQHOST function 10)
|
||||
|
||||
int (FAR WINAPI * SendRaw) (int port, char * msg, int len);
|
||||
|
||||
|
||||
// Get message from stream. Returns length, and count of frames
|
||||
// still waiting to be collected. (BPQHOST function 3)
|
||||
|
||||
int (FAR WINAPI * GetMsg) (int stream, char * msg, int * len, int * count );
|
||||
|
||||
|
||||
// Perl Version - I couldn't get bpq32.pm to call GetMsg. Returns Lenth
|
||||
|
||||
int (FAR WINAPI * GetMsgPerl) (int stream, char * msg);
|
||||
|
||||
|
||||
// Get Raw (Trace) data (BPQHOST function 11)
|
||||
|
||||
int (FAR WINAPI * GetRaw) (int stream, char * msg, int * len, int * count );
|
||||
|
||||
|
||||
|
||||
// This is not an API function. It is a utility to decode a received
|
||||
// monitor frame into ascii text.
|
||||
|
||||
int (FAR WINAPI * DecodeFrame) (char * msg, char * buffer, int Stamp);
|
||||
|
||||
|
||||
// Sets the tracing options for DecodeFrame. Mask is a bit
|
||||
// mask of ports to monitor (ie 101 binary will monitor ports
|
||||
// 1 and 3). MTX enables monitoring on transmitted frames. MCOM
|
||||
// enables monitoring of protocol control frames (eg SABM, UA, RR),
|
||||
// as well as info frames.
|
||||
|
||||
int (FAR WINAPI * SetTraceOptions) (long mask, int mtxparam, int mcomparam);
|
||||
|
||||
|
||||
// Returns number of first unused BPQHOST stream. If none available,
|
||||
// returns 255. See API function 13.
|
||||
|
||||
int (FAR WINAPI * FindFreeStream) ();
|
||||
|
||||
|
||||
// Allocate stream. If stream is already allocated, return nonzero.
|
||||
// Otherwise allocate stream, and return zero
|
||||
|
||||
int (FAR WINAPI * AllocateStream) (int stream);
|
||||
|
||||
|
||||
// Release stream.
|
||||
|
||||
int (FAR WINAPI * DeallocateStream) (int stream);
|
||||
|
||||
// Get number of ports configured
|
||||
|
||||
int (FAR WINAPI * GetNumberofPorts) ();
|
||||
|
||||
|
||||
// Get port number (ports aren't necessarily numbered 1 to n)
|
||||
|
||||
int (FAR WINAPI * GetPortNumber) (int portslot);
|
||||
|
||||
|
||||
// Enable async operation - new to Win32 version of API
|
||||
|
||||
int (FAR WINAPI * BPQSetHandle) (int Stream, HWND hWnd);
|
||||
|
||||
int (FAR * ConvFromAX25) (unsigned char * incall, unsigned char * outcall);
|
||||
BOOL (FAR * ConvToAX25) (unsigned char * callsign, unsigned char * ax25call);
|
||||
|
||||
char * (FAR WINAPI * GetNodeCall) ();
|
||||
int (FAR WINAPI * ChangeSessionCallsign) (int Stream, unsigned char * AXCall);
|
||||
|
||||
int (FAR WINAPI * GetApplNum) (int Stream);
|
||||
|
||||
char * (FAR WINAPI * GetApplCall) (int Appl);
|
||||
|
||||
char * (FAR WINAPI * GetApplAlias) (int Appl);
|
||||
|
||||
char * (FAR WINAPI * GetApplName) (int Appl);
|
||||
|
||||
long (FAR WINAPI * GetApplQual) (int Appl);
|
||||
|
||||
BOOL (FAR WINAPI * SetApplCall) (int Appl, char * NewCall);
|
||||
|
||||
BOOL (FAR WINAPI * SetApplAlias) (int Appl, char * NewCall);
|
||||
|
||||
BOOL (FAR WINAPI * SetApplQual) (int Appl, int NewQual);
|
||||
|
||||
|
||||
// Routines to support "Minimize to Tray"
|
||||
|
||||
BOOL (FAR WINAPI * GetMinimizetoTrayFlag)();
|
||||
|
||||
//int APIENTRY AddTrayMenuItem();
|
||||
int (FAR WINAPI * AddTrayMenuItem)(HWND hWnd, char * Label);
|
||||
|
||||
//int APIENTRY DeleteTrayMenuItem();
|
||||
int (FAR WINAPI * DeleteTrayMenuItem)(HWND hWnd);
|
||||
|
||||
int (FAR WINAPI * SetupTrayIcon)();
|
||||
|
||||
BOOL (FAR WINAPI * GetStartMinimizedFlag)();
|
||||
|
||||
// Log a message to the bpq32 console.
|
||||
|
||||
//int APIENTRY WritetoConsole();
|
||||
int (FAR WINAPI * WritetoConsole)(char * buff);
|
||||
|
||||
int (FAR WINAPI * CheckTimer)();
|
||||
|
||||
int (FAR WINAPI * CloseBPQ32)();
|
||||
|
||||
char (FAR WINAPI * GetLOC)();
|
||||
|
||||
HMODULE ExtDriver;
|
||||
|
||||
BOOL GetAPI()
|
||||
{
|
||||
// This procedure must be called if you are using Dynamic Linking. It loads BPQ32
|
||||
// if necessary, and get the addresses of the API routines
|
||||
|
||||
int err;
|
||||
char Msg[256];
|
||||
|
||||
#ifdef EXTDLL
|
||||
ExtDriver=GetModuleHandle("bpq32.dll");
|
||||
#else
|
||||
ExtDriver=LoadLibrary("bpq32.dll");
|
||||
#endif
|
||||
|
||||
if (ExtDriver == NULL)
|
||||
{
|
||||
err=GetLastError();
|
||||
wsprintf(Msg,"Error loading bpq32.dll - Error code %d",err);
|
||||
|
||||
MessageBox(NULL,Msg,"BPQDEMO",MB_ICONSTOP);
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
GetPortTableEntryFromPortNum = (struct PORTCONTROL * (__stdcall *)(int PortSlot))GetProcAddress(ExtDriver,"_GetPortTableEntryFromPortNum@4");
|
||||
GetPortTableEntryFromSlot = (struct PORTCONTROL * (__stdcall *)(int PortSlot))GetProcAddress(ExtDriver,"_GetPortTableEntryFromSlot@4");
|
||||
|
||||
GETBPQAPI = (ULONG(__stdcall *)())GetProcAddress(ExtDriver,"_GETBPQAPI@0");
|
||||
GETMONDECODE = (ULONG(__stdcall *)())GetProcAddress(ExtDriver,"_GETMONDECODE@0");
|
||||
|
||||
GetFreeBuffs = (int (__stdcall *)(int stream))GetProcAddress(ExtDriver,"_GetFreeBuffs@0");
|
||||
TXCount = (int (__stdcall *)(int stream))GetProcAddress(ExtDriver,"_RXCount@4");
|
||||
RXCount = (int (__stdcall *)(int stream))GetProcAddress(ExtDriver,"_RXCount@4");
|
||||
MONCount = (int (__stdcall *)(int stream))GetProcAddress(ExtDriver,"_MONCount@4");
|
||||
GetCallsign = (int (__stdcall *)(int stream, char * callsign))GetProcAddress(ExtDriver,"_GetCallsign@8");
|
||||
GetBPQDirectory = (UCHAR *(__stdcall *)())GetProcAddress(ExtDriver,"_GetBPQDirectory@0");
|
||||
GetProgramDirectory = (UCHAR *(__stdcall *)())GetProcAddress(ExtDriver,"_GetProgramDirectory@0");
|
||||
|
||||
GetRegistryKey = (HKEY(__stdcall *)())GetProcAddress(ExtDriver,"_GetRegistryKey@0");
|
||||
GetRegistryKeyText = (UCHAR *(__stdcall *)())GetProcAddress(ExtDriver,"_GetRegistryKeyText@0");
|
||||
|
||||
GetSignOnMsg = (UCHAR *(__stdcall *)())GetProcAddress(ExtDriver,"_GetSignOnMsg@0");
|
||||
GetVersionString = (UCHAR *(__stdcall *)())GetProcAddress(ExtDriver,"_GetVersionString@0");
|
||||
GetConnectionInfo = (int (__stdcall *)(int, char *,int *, int *, int *,int *, int *))GetProcAddress(ExtDriver,"_GetConnectionInfo@28");
|
||||
GetStreamPID = (int (__stdcall *)(int Stream))GetProcAddress(ExtDriver,"_GetStreamPID@4");
|
||||
GetAttachedProcesses = (int (__stdcall *)())GetProcAddress(ExtDriver,"_GetAttachedProcesses@0");
|
||||
SessionControl = (int (__stdcall *)(int stream, int command, int param))GetProcAddress(ExtDriver,"_SessionControl@12");
|
||||
SetAppl = (int (__stdcall *)(int stream, int flags, int mask))GetProcAddress(ExtDriver,"_SetAppl@12");
|
||||
GetApplMask = (int (__stdcall *)(int Stream))GetProcAddress(ExtDriver,"_GetApplMask@4");
|
||||
GetApplFlags = (int (__stdcall *)(int Stream))GetProcAddress(ExtDriver,"_GetApplFlags@4");
|
||||
GetAllocationState = (int (__stdcall *)(int Stream))GetProcAddress(ExtDriver,"_GetAllocationState@4");
|
||||
|
||||
SessionState = (int (__stdcall *)(int, int *, int *))GetProcAddress(ExtDriver,"_SessionState@12");
|
||||
SessionStateNoAck = (int (__stdcall *)(int, int *))GetProcAddress(ExtDriver,"_SessionStateNoAck@8");
|
||||
SendMsg = (int (__stdcall *)(int stream, char * msg, int len))GetProcAddress(ExtDriver,"_SendMsg@12");
|
||||
SendRaw = (int (__stdcall *)(int port, char * msg, int len))GetProcAddress(ExtDriver,"_SendRaw@12");
|
||||
GetMsg = (int (__stdcall *)(int stream, char * msg, int * len, int * count ))GetProcAddress(ExtDriver,"_GetMsg@16");
|
||||
GetMsgPerl = (int (__stdcall *)(int stream, char * msg))GetProcAddress(ExtDriver,"_GetMsgPerl@8");
|
||||
GetRaw = (int (__stdcall *)(int stream, char * msg, int * len, int * count))GetProcAddress(ExtDriver,"_GetRaw@16");
|
||||
DecodeFrame = (int (__stdcall *)(char * msg, char * buffer, time_t Stamp))GetProcAddress(ExtDriver,"_DecodeFrame@12");
|
||||
SetTraceOptions = (int (__stdcall *)(long mask, int mtxparam, int mcomparam))GetProcAddress(ExtDriver,"_SetTraceOptions@12");
|
||||
FindFreeStream = (int (__stdcall *)())GetProcAddress(ExtDriver,"_FindFreeStream@0");
|
||||
AllocateStream= (int (__stdcall *)(int Stream))GetProcAddress(ExtDriver,"_AllocateStream@4");
|
||||
DeallocateStream = (int (__stdcall *)(int Stream))GetProcAddress(ExtDriver,"_DeallocateStream@4");
|
||||
|
||||
GetNumberofPorts = (int (__stdcall *)())GetProcAddress(ExtDriver,"_GetNumberofPorts@0");
|
||||
GetPortNumber = (int (__stdcall *)(int))GetProcAddress(ExtDriver,"_GetPortNumber@4");
|
||||
BPQSetHandle = (int (__stdcall *)(int Stream, HWND hWnd))GetProcAddress(ExtDriver,"_BPQSetHandle@8");
|
||||
|
||||
ConvFromAX25 = (int ( *)(unsigned char * incall, unsigned char * outcall))GetProcAddress(ExtDriver,"ConvFromAX25");
|
||||
ConvToAX25 = (BOOL ( *)(unsigned char * callsign, unsigned char * ax25call))GetProcAddress(ExtDriver,"ConvToAX25");
|
||||
GetNodeCall = (char * (__stdcall *) ())GetProcAddress(ExtDriver,"_GetNodeCall@0");
|
||||
ChangeSessionCallsign = (int (__stdcall *) (int Stream, unsigned char * AXCall))GetProcAddress(ExtDriver,"_ChangeSessionCallsign@8");
|
||||
GetApplNum = (int (__stdcall *)(int Stream))GetProcAddress(ExtDriver,"_GetApplNum@4");
|
||||
GetApplCall = (char * (__stdcall *) (int Appl))GetProcAddress(ExtDriver,"_GetApplCall@4");
|
||||
GetApplAlias = (char * (__stdcall *) (int Appl))GetProcAddress(ExtDriver,"_GetApplAlias@4");
|
||||
GetApplQual = (long (__stdcall *)(int Appl))GetProcAddress(ExtDriver,"_GetApplQual@4");
|
||||
GetApplName = (char * (__stdcall *) (int Appl))GetProcAddress(ExtDriver,"_GetApplName@4");
|
||||
SetApplCall = (BOOL (__stdcall *)(int Appl, char * NewCall))GetProcAddress(ExtDriver,"_SetApplCall@8");
|
||||
SetApplAlias = (BOOL (__stdcall *)(int Appl, char * NewCall))GetProcAddress(ExtDriver,"_SetApplAlias@8");
|
||||
SetApplQual = (BOOL (__stdcall *)(int Appl, int NewQual))GetProcAddress(ExtDriver,"_SetApplQual@8");
|
||||
|
||||
GetMinimizetoTrayFlag = (BOOL (__stdcall *)())GetProcAddress(ExtDriver,"_GetMinimizetoTrayFlag@0");
|
||||
AddTrayMenuItem = (int (__stdcall *)(HWND hWnd, char * Label))GetProcAddress(ExtDriver,"_AddTrayMenuItem@8");
|
||||
DeleteTrayMenuItem = (int (__stdcall *)(HWND hWnd))GetProcAddress(ExtDriver,"_DeleteTrayMenuItem@4");
|
||||
SetupTrayIcon = (BOOL (__stdcall *)())GetProcAddress(ExtDriver,"_SetupTrayIcon@0");
|
||||
|
||||
GetStartMinimizedFlag = (BOOL (__stdcall *)())GetProcAddress(ExtDriver,"_GetStartMinimizedFlag@0");
|
||||
WritetoConsole = (int (__stdcall *)(char *))GetProcAddress(ExtDriver,"_WritetoConsole@4");
|
||||
CheckTimer = (int (__stdcall *)(char *))GetProcAddress(ExtDriver,"_CheckTimer@0");
|
||||
CloseBPQ32 = (int (__stdcall *)(char *))GetProcAddress(ExtDriver,"_CloseBPQ32@0");
|
||||
GetLOC = (char * (__stdcall *)(char *))GetProcAddress(ExtDriver,"_GetLOC@0");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//
|
||||
// Constants and equates for async operation
|
||||
//
|
||||
|
||||
#ifndef BPQWINMSG
|
||||
#define BPQWINMSG
|
||||
|
||||
static char BPQWinMsg[] = "BPQWindowMessage";
|
||||
extern UINT BPQMsg;
|
||||
|
||||
//
|
||||
// Values returned in lParam of Windows Message
|
||||
//
|
||||
#define BPQMonitorAvail 1
|
||||
#define BPQDataAvail 2
|
||||
#define BPQStateChange 4
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,224 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2018 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
|
||||
#include "bpqmail.h"
|
||||
|
||||
int LastVer[4] = {0, 0, 0, 0}; // In case we need to do somthing the first time a version is run
|
||||
|
||||
HWND MainWnd;
|
||||
HWND hWndSess;
|
||||
RECT MainRect;
|
||||
HMENU hActionMenu;
|
||||
static HMENU hMenu;
|
||||
HMENU hDisMenu; // Disconnect Menu Handle
|
||||
HMENU hFWDMenu; // Forward Menu Handle
|
||||
|
||||
int SessX, SessY, SessWidth; // Params for Session Window
|
||||
|
||||
char szBuff[80];
|
||||
|
||||
#define MaxSockets 64
|
||||
|
||||
ConnectionInfo Connections[MaxSockets+1];
|
||||
|
||||
struct SEM ChatSemaphore = {0, 0};
|
||||
struct SEM AllocSemaphore = {0, 0};
|
||||
struct SEM ConSemaphore = {0, 0};
|
||||
struct SEM Semaphore = {0, 0};
|
||||
struct SEM OutputSEM = {0, 0};
|
||||
struct SEM ConfigSEM = {0, 0};
|
||||
|
||||
struct UserInfo ** UserRecPtr=NULL;
|
||||
int NumberofUsers=0;
|
||||
|
||||
struct UserInfo * BBSChain = NULL; // Chain of users that are BBSes
|
||||
|
||||
struct MsgInfo ** MsgHddrPtr=NULL;
|
||||
int NumberofMessages=0;
|
||||
|
||||
int FirstMessageIndextoForward = 0; // Lowest Message with a forward bit set - limits search
|
||||
|
||||
BIDRec ** BIDRecPtr=NULL;
|
||||
int NumberofBIDs=0;
|
||||
|
||||
BIDRec ** TempBIDRecPtr=NULL;
|
||||
int NumberofTempBIDs=0;
|
||||
|
||||
WPRec ** WPRecPtr=NULL;
|
||||
int NumberofWPrecs=0;
|
||||
|
||||
char ** BadWords=NULL;
|
||||
int NumberofBadWords=0;
|
||||
char * BadFile = NULL;
|
||||
|
||||
int LatestMsg = 0;
|
||||
struct SEM MsgNoSemaphore = {0, 0}; // For locking updates to LatestMsg
|
||||
int HighestBBSNumber = 0;
|
||||
|
||||
int MaxMsgno = 60000;
|
||||
int BidLifetime = 60;
|
||||
int MaxAge = 30;
|
||||
int MaintInterval = 24;
|
||||
int MaintTime = 0;
|
||||
|
||||
int UserLifetime = 0;
|
||||
|
||||
BOOL cfgMinToTray;
|
||||
|
||||
BOOL DisconnectOnClose=FALSE;
|
||||
|
||||
char PasswordMsg[100]="Password:";
|
||||
|
||||
char cfgHOSTPROMPT[100];
|
||||
|
||||
char cfgCTEXT[100];
|
||||
|
||||
char cfgLOCALECHO[100];
|
||||
|
||||
char AttemptsMsg[] = "Too many attempts - Disconnected\r\r";
|
||||
char disMsg[] = "Disconnected by SYSOP\r\r";
|
||||
|
||||
char LoginMsg[]="user:";
|
||||
|
||||
char BlankCall[]=" ";
|
||||
|
||||
|
||||
ULONG BBSApplMask;
|
||||
ULONG ChatApplMask;
|
||||
|
||||
int BBSApplNum=0;
|
||||
int ChatApplNum=0;
|
||||
|
||||
//int StartStream=0;
|
||||
int NumberofStreams=0;
|
||||
int MaxStreams=0;
|
||||
|
||||
char BBSSID[]="[%s%d.%d.%d.%d-%s%s%s%sIH%sM$]\r";
|
||||
|
||||
char ChatSID[]="[BPQChatServer-%d.%d.%d.%d]\r";
|
||||
|
||||
char NewUserPrompt[100]="Please enter your Name\r>\r";
|
||||
|
||||
char * WelcomeMsg = NULL;
|
||||
char * NewWelcomeMsg = NULL;
|
||||
char * ExpertWelcomeMsg = NULL;
|
||||
|
||||
char * Prompt = NULL;
|
||||
char * NewPrompt = NULL;
|
||||
char * ExpertPrompt = NULL;
|
||||
|
||||
char BBSName[100] = "NOCALL";
|
||||
char SYSOPCall[50];
|
||||
|
||||
char MailForText[100];
|
||||
|
||||
char HRoute[100];
|
||||
char AMPRDomain[100];
|
||||
BOOL SendAMPRDirect = 0;
|
||||
|
||||
char SignoffMsg[120];
|
||||
|
||||
char AbortedMsg[100]="\rOutput aborted\r";
|
||||
|
||||
char UserDatabaseName[MAX_PATH] = "BPQBBSUsers.dat";
|
||||
char UserDatabasePath[MAX_PATH];
|
||||
|
||||
char MsgDatabasePath[MAX_PATH];
|
||||
char MsgDatabaseName[MAX_PATH] = "DIRMES.SYS";
|
||||
|
||||
char BIDDatabasePath[MAX_PATH];
|
||||
char BIDDatabaseName[MAX_PATH] = "WFBID.SYS";
|
||||
|
||||
char WPDatabasePath[MAX_PATH];
|
||||
char WPDatabaseName[MAX_PATH] = "WP.SYS";
|
||||
|
||||
char BadWordsPath[MAX_PATH];
|
||||
char BadWordsName[MAX_PATH] = "BADWORDS.SYS";
|
||||
|
||||
char NTSAliasesPath[MAX_PATH];
|
||||
char NTSAliasesName[MAX_PATH] = "INTRCPT.APS";
|
||||
|
||||
char ConfigName[250];
|
||||
char ChatConfigName[250];
|
||||
|
||||
BOOL UsingingRegConfig = FALSE;
|
||||
|
||||
BOOL MulticastRX = FALSE;
|
||||
|
||||
char BaseDir[MAX_PATH];
|
||||
char BaseDirRaw[MAX_PATH]; // As set in registry - may contain %NAME%
|
||||
char ProperBaseDir[MAX_PATH]; // BPQ Directory/BPQMailChat
|
||||
|
||||
|
||||
char MailDir[MAX_PATH];
|
||||
|
||||
char RlineVer[50];
|
||||
|
||||
BOOL KISSOnly = FALSE;
|
||||
|
||||
BOOL EnableUI = FALSE;
|
||||
BOOL RefuseBulls = FALSE;
|
||||
BOOL SendSYStoSYSOPCall = FALSE;
|
||||
BOOL SendBBStoSYSOPCall = FALSE;
|
||||
BOOL DontHoldNewUsers = FALSE;
|
||||
BOOL DefaultNoWINLINK = FALSE;
|
||||
BOOL ForwardToMe = FALSE;
|
||||
BOOL OnlyKnown = FALSE;
|
||||
|
||||
BOOL DontNeedHomeBBS = FALSE;
|
||||
BOOL DontCheckFromCall = FALSE;
|
||||
|
||||
// Send WP Params
|
||||
|
||||
BOOL SendWP;
|
||||
BOOL FilterWPBulls;
|
||||
BOOL NoWPGuesses;
|
||||
|
||||
char SendWPVIA[81];
|
||||
char SendWPTO[11];
|
||||
|
||||
char ** SendWPAddrs; // Replaces WP To and VIA
|
||||
|
||||
int SendWPType;
|
||||
|
||||
int SMTPMsgs;
|
||||
|
||||
int MailForInterval = 0;
|
||||
|
||||
char zeros[NBMASK]; // For forward bitmask tests
|
||||
|
||||
time_t MaintClock; // Time to run housekeeping
|
||||
time_t APIClock; // Time to sent to MOLTE's Database
|
||||
|
||||
struct MsgInfo * MsgnotoMsg[100000]; // Message Number to Message Slot List.
|
||||
|
||||
// Filter Params
|
||||
|
||||
char ** RejFrom; // Reject on FROM Call
|
||||
char ** RejTo; // Reject on TO Call
|
||||
char ** RejAt; // Reject on AT Call
|
||||
char ** RejBID; // Reject on BID
|
||||
|
||||
char ** HoldFrom; // Hold on FROM Call
|
||||
char ** HoldTo; // Hold on TO Call
|
||||
char ** HoldAt; // Hold on AT Call
|
||||
char ** HoldBID; // Hold on BID
|
||||
|
||||
struct ConsoleInfo * ConsHeader[2];
|
||||
@ -1,205 +0,0 @@
|
||||
/* Types.h -- Basic types
|
||||
2008-11-23 : Igor Pavlov : Public domain */
|
||||
|
||||
#ifndef __7Z_TYPES_H
|
||||
#define __7Z_TYPES_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#define SZ_OK 0
|
||||
|
||||
#define SZ_ERROR_DATA 1
|
||||
#define SZ_ERROR_MEM 2
|
||||
#define SZ_ERROR_CRC 3
|
||||
#define SZ_ERROR_UNSUPPORTED 4
|
||||
#define SZ_ERROR_PARAM 5
|
||||
#define SZ_ERROR_INPUT_EOF 6
|
||||
#define SZ_ERROR_OUTPUT_EOF 7
|
||||
#define SZ_ERROR_READ 8
|
||||
#define SZ_ERROR_WRITE 9
|
||||
#define SZ_ERROR_PROGRESS 10
|
||||
#define SZ_ERROR_FAIL 11
|
||||
#define SZ_ERROR_THREAD 12
|
||||
|
||||
#define SZ_ERROR_ARCHIVE 16
|
||||
#define SZ_ERROR_NO_ARCHIVE 17
|
||||
|
||||
extern const char *LZMA_ERRORS[];
|
||||
|
||||
typedef int SRes;
|
||||
|
||||
#ifdef _WIN32
|
||||
typedef DWORD WRes;
|
||||
#else
|
||||
typedef int WRes;
|
||||
#endif
|
||||
|
||||
#ifndef RINOK
|
||||
#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
|
||||
#endif
|
||||
|
||||
typedef unsigned char Byte;
|
||||
typedef short Int16;
|
||||
typedef unsigned short UInt16;
|
||||
|
||||
#ifdef _LZMA_LZ_UInt32_IS_ULONG
|
||||
typedef long LZ_Int32;
|
||||
typedef unsigned long LZ_UInt32;
|
||||
#else
|
||||
typedef int LZ_Int32;
|
||||
typedef unsigned int LZ_UInt32;
|
||||
#endif
|
||||
|
||||
#ifdef _SZ_NO_INT_64
|
||||
|
||||
/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
|
||||
NOTES: Some code will work incorrectly in that case! */
|
||||
|
||||
typedef long LZ_Int64;
|
||||
typedef unsigned long LZ_UInt64;
|
||||
|
||||
#else
|
||||
|
||||
typedef long long int LZ_Int64;
|
||||
typedef unsigned long long int LZ_UInt64;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef _LZMA_NO_SYSTEM_SIZE_T
|
||||
typedef LZ_UInt32 SizeT;
|
||||
#else
|
||||
typedef size_t SizeT;
|
||||
#endif
|
||||
|
||||
//typedef int Bool;
|
||||
#define True 1
|
||||
#define False 0
|
||||
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
#if _MSC_VER >= 1300
|
||||
#define MY_NO_INLINE __declspec(noinline)
|
||||
#else
|
||||
#define MY_NO_INLINE
|
||||
#endif
|
||||
|
||||
#define MY_CDECL __cdecl
|
||||
#define MY_STD_CALL __stdcall
|
||||
#define MY_FAST_CALL MY_NO_INLINE __fastcall
|
||||
|
||||
#else
|
||||
|
||||
#define MY_CDECL
|
||||
#define MY_STD_CALL
|
||||
#define MY_FAST_CALL
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* The following interfaces use first parameter as pointer to structure */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SRes (*Read)(void *p, void *buf, size_t *size);
|
||||
/* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
|
||||
(output(*size) < input(*size)) is allowed */
|
||||
} ISeqInStream;
|
||||
|
||||
/* it can return SZ_ERROR_INPUT_EOF */
|
||||
SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
|
||||
SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
|
||||
SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
size_t (*Write)(void *p, const void *buf, size_t size);
|
||||
/* Returns: result - the number of actually written bytes.
|
||||
(result < size) means error */
|
||||
} ISeqOutStream;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SZ_SEEK_SET = 0,
|
||||
SZ_SEEK_CUR = 1,
|
||||
SZ_SEEK_END = 2
|
||||
} ESzSeek;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */
|
||||
SRes (*Seek)(void *p, LZ_Int64 *pos, ESzSeek origin);
|
||||
} ISeekInStream;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SRes (*Look)(void *p, void **buf, size_t *size);
|
||||
/* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
|
||||
(output(*size) > input(*size)) is not allowed
|
||||
(output(*size) < input(*size)) is allowed */
|
||||
SRes (*Skip)(void *p, size_t offset);
|
||||
/* offset must be <= output(*size) of Look */
|
||||
|
||||
SRes (*Read)(void *p, void *buf, size_t *size);
|
||||
/* reads directly (without buffer). It's same as ISeqInStream::Read */
|
||||
SRes (*Seek)(void *p, LZ_Int64 *pos, ESzSeek origin);
|
||||
} ILookInStream;
|
||||
|
||||
SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
|
||||
SRes LookInStream_SeekTo(ILookInStream *stream, LZ_UInt64 offset);
|
||||
|
||||
/* reads via ILookInStream::Read */
|
||||
SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
|
||||
SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
|
||||
|
||||
#define LookToRead_BUF_SIZE (1 << 14)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ILookInStream s;
|
||||
ISeekInStream *realStream;
|
||||
size_t pos;
|
||||
size_t size;
|
||||
Byte buf[LookToRead_BUF_SIZE];
|
||||
} CLookToRead;
|
||||
|
||||
void LookToRead_CreateVTable(CLookToRead *p, int lookahead);
|
||||
void LookToRead_Init(CLookToRead *p);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ISeqInStream s;
|
||||
ILookInStream *realStream;
|
||||
} CSecToLook;
|
||||
|
||||
void SecToLook_CreateVTable(CSecToLook *p);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ISeqInStream s;
|
||||
ILookInStream *realStream;
|
||||
} CSecToRead;
|
||||
|
||||
void SecToRead_CreateVTable(CSecToRead *p);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SRes (*Progress)(void *p, LZ_UInt64 inSize, LZ_UInt64 outSize);
|
||||
/* Returns: result. (result != SZ_OK) means break.
|
||||
Value (LZ_UInt64)(LZ_Int64)-1 for size means unknown value. */
|
||||
} ICompressProgress;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void *(*Alloc)(void *p, size_t size);
|
||||
void (*Free)(void *p, void *address); /* address can be 0 */
|
||||
} ISzAlloc;
|
||||
|
||||
#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
|
||||
#define IAlloc_Free(p, a) (p)->Free((p), a)
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
||||
#ifndef MINIUPNPC_DECLSPEC_H_INCLUDED
|
||||
#define MINIUPNPC_DECLSPEC_H_INCLUDED
|
||||
|
||||
#if defined(_WIN32) && !defined(MINIUPNP_STATICLIB)
|
||||
/* for windows dll */
|
||||
#ifdef MINIUPNP_EXPORTS
|
||||
#define MINIUPNP_LIBSPEC __declspec(dllexport)
|
||||
#else
|
||||
#define MINIUPNP_LIBSPEC __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#if defined(__GNUC__) && __GNUC__ >= 4
|
||||
/* fix dynlib for OS X 10.9.2 and Apple LLVM version 5.0 */
|
||||
#define MINIUPNP_LIBSPEC __attribute__ ((visibility ("default")))
|
||||
#else
|
||||
#define MINIUPNP_LIBSPEC
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* MINIUPNPC_DECLSPEC_H_INCLUDED */
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
int MQTTConnect(char* host, int port, char* user, char* pass);
|
||||
int MQTTPublish(void * msg, char *topic);
|
||||
|
||||
void MQTTKISSTX(void *message);
|
||||
void MQTTKISSTX_RAW(char* buffer, int bufferLength, void* PORT);
|
||||
void MQTTKISSRX(void *message);
|
||||
void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT);
|
||||
|
||||
void MQTTMessageEvent(void *message);
|
||||
|
||||
@ -1,68 +0,0 @@
|
||||
// CmdLineAuth.cpp : Defines the entry point for the console application.
|
||||
//
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#define _USE_32BIT_TIME_T
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "MD5.c"
|
||||
|
||||
int LastNow;
|
||||
int PassCode;
|
||||
|
||||
VOID CreateOneTimePassword(char * KeyPhrase)
|
||||
{
|
||||
// Create a time dependent One Time Password from the KeyPhrase
|
||||
|
||||
time_t NOW = time(NULL);
|
||||
unsigned char Hash[16];
|
||||
char Password[20];
|
||||
char Key[1000];
|
||||
int i, chr;
|
||||
long long Val;
|
||||
|
||||
NOW = NOW/30; // Only Change every 30 secs
|
||||
|
||||
if (NOW == LastNow)
|
||||
return;
|
||||
|
||||
LastNow = NOW;
|
||||
|
||||
sprintf(Key, "%s%x", KeyPhrase, NOW);
|
||||
|
||||
md5(Key, Hash);
|
||||
|
||||
for (i=0; i<16; i++)
|
||||
{
|
||||
chr = (Hash[i] & 31);
|
||||
if (chr > 9) chr += 7;
|
||||
|
||||
Password[i] = chr + 48;
|
||||
}
|
||||
|
||||
Password[16] = 0;
|
||||
|
||||
memcpy(&Val, Password, 8);
|
||||
PassCode = Val %= 1000000;
|
||||
printf("Passcode is %d\n", PassCode);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
if (argc < 2)
|
||||
{
|
||||
printf ("Need to supply KeyPhrase\n");
|
||||
return 0;
|
||||
}
|
||||
CreateOneTimePassword(argv[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1,71 +0,0 @@
|
||||
|
||||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
//#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "windows.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.K.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
|
||||
#define BPQICON 400
|
||||
|
||||
BPQICON ICON DISCARDABLE "..\BPQIcon.ICO"
|
||||
|
||||
//
|
||||
// Version
|
||||
//
|
||||
#define TEXTVER "1. 0. 3. 4\0"
|
||||
#define BINVER 1, 0, 3, 4
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION BINVER
|
||||
PRODUCTVERSION BINVER
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x1L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "080904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "Program to control WINMOR TNC when running remotely\0"
|
||||
VALUE "CompanyName", " \0"
|
||||
VALUE "FileDescription", "WinmorControl\0"
|
||||
VALUE "FileVersion", TEXTVER
|
||||
VALUE "InternalName", "bpq32\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2021 G8BPQ\0"
|
||||
VALUE "OriginalFilename", "\WinmorControl.exe\0"
|
||||
VALUE "ProductName", "WinmorControl\0"
|
||||
VALUE "ProductVersion", TEXTVER
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x809, 1200
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
@ -1,578 +0,0 @@
|
||||
//
|
||||
// DLL to inteface the BPQ Virtual COM emulator to BPQ32 switch
|
||||
//
|
||||
// Uses BPQ EXTERNAL interface
|
||||
//
|
||||
|
||||
// Version 1.0 November 2005
|
||||
//
|
||||
|
||||
// Version 1.1 October 2006
|
||||
|
||||
// Write diagmnostics to BPQ console window instead of STDOUT
|
||||
|
||||
// Version 1.2 February 2008
|
||||
|
||||
// Changes for dynamic unload of bpq32.dll
|
||||
|
||||
// Version 1.2.1 May 2008
|
||||
|
||||
// Correct RX length (was 1 byte too long)
|
||||
|
||||
// Version 1.3.1 Jan 2009
|
||||
|
||||
// Support Win98 VirtualCOM Driver
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
//#include <process.h>
|
||||
//#include <time.h>
|
||||
|
||||
#define VERSION_MAJOR 1
|
||||
#define VERSION_MINOR 0
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "bpqvkiss.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
//#define DYNLOADBPQ // Dynamically Load BPQ32.dll
|
||||
//#define EXTDLL // Use GetMuduleHandle instead of LoadLibrary
|
||||
#include "bpq32.h"
|
||||
|
||||
|
||||
static int ASYINIT(int comport, int speed, int bpqport, BOOL Report);
|
||||
int kissencode(UCHAR * inbuff, UCHAR * outbuff, int len);
|
||||
int GetRXMessage(int port, PMESSAGE buff);
|
||||
void CheckReceivedData(PVCOMINFO pVCOMInfo);
|
||||
static int ReadCommBlock(PVCOMINFO pVCOMInfo, LPSTR lpszBlock, DWORD nMaxLength );
|
||||
static BOOL WriteCommBlock(int port, UCHAR * lpByte , DWORD dwBytesToWrite);
|
||||
|
||||
PVCOMINFO CreateInfo( int port,int speed, int bpqport ) ;
|
||||
|
||||
#define FEND 0xC0 // KISS CONTROL CODES
|
||||
#define FESC 0xDB
|
||||
#define TFEND 0xDC
|
||||
#define TFESC 0xDD
|
||||
|
||||
static BOOL Win98 = FALSE;
|
||||
|
||||
struct PORTCONTROL * PORTVEC[MaxBPQPortNo + 1];
|
||||
|
||||
static size_t ExtProc(int fn, int port, PMESSAGE buff)
|
||||
{
|
||||
int len,txlen=0;
|
||||
char txbuff[1000];
|
||||
|
||||
if (VCOMInfo[port]->ComDev == (HANDLE) -1)
|
||||
{
|
||||
// Try to reopen every 30 secs
|
||||
|
||||
VCOMInfo[port]->ReopenTimer++;
|
||||
|
||||
if (VCOMInfo[port]->ReopenTimer < 300)
|
||||
return 0;
|
||||
|
||||
VCOMInfo[port]->ReopenTimer = 0;
|
||||
|
||||
ASYINIT(PORTVEC[port]->IOBASE, 9600, port, FALSE);
|
||||
|
||||
if (VCOMInfo[port]->ComDev == (HANDLE) -1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
switch (fn)
|
||||
{
|
||||
case 1: // poll
|
||||
|
||||
len = GetRXMessage(port,buff);
|
||||
|
||||
// if (len > 0)
|
||||
// {
|
||||
// // Randomly drop packets
|
||||
|
||||
// if ((rand() % 7) > 5)
|
||||
// {
|
||||
// Debugprintf("VKISS Test Drop packet");
|
||||
// return 0;
|
||||
// }
|
||||
// }
|
||||
|
||||
return len;
|
||||
|
||||
case 2: // send
|
||||
|
||||
txlen = GetLengthfromBuffer((PDATAMESSAGE)buff);
|
||||
|
||||
txlen = kissencode(&buff->DEST[0], (char *) &txbuff, txlen - MSGHDDRLEN);
|
||||
|
||||
WriteCommBlock(port, txbuff, txlen);
|
||||
|
||||
return (0);
|
||||
|
||||
|
||||
case 3: // CHECK IF OK TO SEND
|
||||
|
||||
return (0); // OK
|
||||
|
||||
break;
|
||||
|
||||
case 4: // reinit
|
||||
|
||||
CloseHandle(VCOMInfo[port]->ComDev);
|
||||
VCOMInfo[port]->ComDev =(HANDLE) -1;
|
||||
VCOMInfo[port]->ReopenTimer = 250;
|
||||
|
||||
return (0);
|
||||
|
||||
case 5: // Close
|
||||
|
||||
CloseHandle(VCOMInfo[port]->ComDev);
|
||||
|
||||
return (0);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
VOID * VCOMExtInit(struct PORTCONTROL * PortEntry)
|
||||
{
|
||||
char msg[80];
|
||||
|
||||
//
|
||||
// Will be called once for each port to be mapped to a BPQ Virtual COM Port
|
||||
// The VCOM port number is in IOBASE
|
||||
//
|
||||
|
||||
sprintf(msg,"VKISS COM%d", PortEntry->IOBASE);
|
||||
WritetoConsole(msg);
|
||||
|
||||
PORTVEC[PortEntry->PORTNUMBER] = PortEntry;
|
||||
|
||||
CreateInfo(PortEntry->IOBASE, 9600, PortEntry->PORTNUMBER);
|
||||
|
||||
// Open File
|
||||
|
||||
ASYINIT(PortEntry->IOBASE, 9600, PortEntry->PORTNUMBER, TRUE);
|
||||
|
||||
WritetoConsole("\n");
|
||||
|
||||
return ExtProc;
|
||||
}
|
||||
|
||||
static int kissencode(UCHAR * inbuff, UCHAR * outbuff, int len)
|
||||
{
|
||||
int i, txptr = 0;
|
||||
UCHAR c;
|
||||
|
||||
outbuff[0] = FEND;
|
||||
outbuff[1] = 0;
|
||||
txptr = 2;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
c = inbuff[i];
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case FEND:
|
||||
outbuff[txptr++] = FESC;
|
||||
outbuff[txptr++] = TFEND;
|
||||
break;
|
||||
|
||||
case FESC:
|
||||
|
||||
outbuff[txptr++] = FESC;
|
||||
outbuff[txptr++] = TFESC;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
outbuff[txptr++] = c;
|
||||
}
|
||||
}
|
||||
|
||||
outbuff[txptr++] = FEND;
|
||||
|
||||
return txptr;
|
||||
|
||||
}
|
||||
|
||||
int ASYINIT(int comport, int speed, int bpqport, BOOL Report)
|
||||
{
|
||||
char szPort[ 30 ];
|
||||
char buf[256];
|
||||
int n, Err;
|
||||
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4996 )
|
||||
|
||||
#ifndef _winver
|
||||
|
||||
#define _winver 0x0600
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
if (HIBYTE(_winver) < 5)
|
||||
Win98 = TRUE;
|
||||
|
||||
#pragma warning( pop )
|
||||
|
||||
if (Win98)
|
||||
{
|
||||
VCOMInfo[bpqport]->ComDev = CreateFile( "\\\\.\\BPQVCOMM.VXD", GENERIC_READ | GENERIC_WRITE,
|
||||
0, // exclusive access
|
||||
NULL, // no security attrs
|
||||
OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
NULL );
|
||||
}
|
||||
else{
|
||||
sprintf( szPort, "\\\\.\\pipe\\BPQCOM%d", comport ) ;
|
||||
|
||||
VCOMInfo[bpqport]->ComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
|
||||
0, // exclusive access
|
||||
NULL, // no security attrs
|
||||
OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
NULL );
|
||||
|
||||
//Handle = CreateFile(Value, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
|
||||
Err = GetLastError();
|
||||
|
||||
if (VCOMInfo[bpqport]->ComDev != (HANDLE) -1)
|
||||
{
|
||||
VCOMInfo[bpqport]->NewVCOM = TRUE;
|
||||
Err = GetFileType(VCOMInfo[bpqport]->ComDev);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Try old style
|
||||
|
||||
sprintf( szPort, "\\\\.\\BPQ%d", comport ) ;
|
||||
|
||||
VCOMInfo[bpqport]->ComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
|
||||
0, // exclusive access
|
||||
NULL, // no security attrs
|
||||
OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
NULL );
|
||||
}
|
||||
}
|
||||
if (VCOMInfo[bpqport]->ComDev == (HANDLE) -1 && Report)
|
||||
{
|
||||
n=sprintf(buf,"Virtual COM Port %d could not be opened ",comport);
|
||||
WritetoConsole(buf);
|
||||
|
||||
return (FALSE) ;
|
||||
}
|
||||
|
||||
return (TRUE) ;
|
||||
}
|
||||
|
||||
static int GetRXMessage(int port, PMESSAGE buff)
|
||||
{
|
||||
int len;
|
||||
PVCOMINFO pVCOMInfo ;
|
||||
|
||||
if (NULL == (pVCOMInfo = VCOMInfo[port]))
|
||||
return 0;
|
||||
|
||||
if (!pVCOMInfo->MSGREADY)
|
||||
CheckReceivedData(pVCOMInfo); // Look for data in RXBUFFER and COM port
|
||||
|
||||
if (pVCOMInfo->MSGREADY)
|
||||
{
|
||||
len = (int)(pVCOMInfo->RXMPTR- &pVCOMInfo->RXMSG[1]); // Don't need KISS Control Byte
|
||||
|
||||
if (pVCOMInfo->RXMSG[0] != 0 && pVCOMInfo->RXMSG[0] != 12)
|
||||
{
|
||||
pVCOMInfo->MSGREADY=FALSE;
|
||||
pVCOMInfo->RXMPTR=(UCHAR *)&pVCOMInfo->RXMSG;
|
||||
return 0; // Not KISS Data
|
||||
}
|
||||
|
||||
//
|
||||
// Remove KISS control byte
|
||||
//
|
||||
|
||||
if (pVCOMInfo->RXMSG[0] == 12)
|
||||
{
|
||||
// AckMode Frame. Return the next 2 bytes, but don't pass them to Host
|
||||
|
||||
UCHAR AckResp[8];
|
||||
|
||||
AckResp[0] = FEND;
|
||||
memcpy(&AckResp[1], &pVCOMInfo->RXMSG[0], 3); //Copy Opcode and Ack Bytes
|
||||
AckResp[4] = FEND;
|
||||
WriteCommBlock(port, AckResp, 5);
|
||||
|
||||
len -= 2;
|
||||
memcpy(&buff->DEST[0], &pVCOMInfo->RXMSG[3], len);
|
||||
// Debugprintf("VKISS Ackmode Frame");
|
||||
}
|
||||
else
|
||||
|
||||
memcpy(&buff->DEST[0], &pVCOMInfo->RXMSG[1], len);
|
||||
|
||||
len += MSGHDDRLEN;
|
||||
|
||||
PutLengthinBuffer((PDATAMESSAGE)buff, len);
|
||||
|
||||
//
|
||||
// reset pointers
|
||||
//
|
||||
|
||||
pVCOMInfo->MSGREADY=FALSE;
|
||||
pVCOMInfo->RXMPTR=(UCHAR *)&pVCOMInfo->RXMSG;
|
||||
|
||||
return len;
|
||||
}
|
||||
else
|
||||
|
||||
return 0; // nothing doing
|
||||
}
|
||||
|
||||
static void CheckReceivedData(PVCOMINFO pVCOMInfo)
|
||||
{
|
||||
UCHAR c;
|
||||
|
||||
if (pVCOMInfo->RXBCOUNT == 0)
|
||||
{
|
||||
//
|
||||
// Check com buffer
|
||||
//
|
||||
|
||||
pVCOMInfo->RXBCOUNT = ReadCommBlock(pVCOMInfo, (LPSTR) &pVCOMInfo->RXBUFFER, MAXBLOCK-1 );
|
||||
pVCOMInfo->RXBPTR=(UCHAR *)&pVCOMInfo->RXBUFFER;
|
||||
}
|
||||
|
||||
if (pVCOMInfo->RXBCOUNT == 0)
|
||||
return;
|
||||
|
||||
while (pVCOMInfo->RXBCOUNT != 0)
|
||||
{
|
||||
pVCOMInfo->RXBCOUNT--;
|
||||
|
||||
c = *(pVCOMInfo->RXBPTR++);
|
||||
|
||||
if (pVCOMInfo->ESCFLAG)
|
||||
{
|
||||
//
|
||||
// FESC received - next should be TFESC or TFEND
|
||||
|
||||
pVCOMInfo->ESCFLAG = FALSE;
|
||||
|
||||
if (c == TFESC)
|
||||
c=FESC;
|
||||
|
||||
if (c == TFEND)
|
||||
c=FEND;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case FEND:
|
||||
|
||||
//
|
||||
// Either start of message or message complete
|
||||
//
|
||||
|
||||
if (pVCOMInfo->RXMPTR == (UCHAR *)&pVCOMInfo->RXMSG)
|
||||
continue;
|
||||
|
||||
pVCOMInfo->MSGREADY=TRUE;
|
||||
return;
|
||||
|
||||
case FESC:
|
||||
|
||||
pVCOMInfo->ESCFLAG = TRUE;
|
||||
continue;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Ok, a normal char
|
||||
//
|
||||
|
||||
*(pVCOMInfo->RXMPTR++) = c;
|
||||
|
||||
}
|
||||
|
||||
if (pVCOMInfo->RXMPTR - (UCHAR *)&pVCOMInfo->RXMSG > 500)
|
||||
pVCOMInfo->RXMPTR=(UCHAR *)&pVCOMInfo->RXMSG;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static PVCOMINFO CreateInfo( int port,int speed, int bpqport )
|
||||
{
|
||||
PVCOMINFO pVCOMInfo ;
|
||||
|
||||
if (NULL == (pVCOMInfo =
|
||||
(PVCOMINFO) LocalAlloc( LPTR, sizeof( VCOMINFO ) )))
|
||||
return ( (PVCOMINFO) -1 ) ;
|
||||
|
||||
pVCOMInfo->RXBCOUNT=0;
|
||||
pVCOMInfo->MSGREADY=FALSE;
|
||||
pVCOMInfo->RXBPTR=(UCHAR *)&pVCOMInfo->RXBUFFER;
|
||||
pVCOMInfo->RXMPTR=(UCHAR *)&pVCOMInfo->RXMSG;
|
||||
|
||||
pVCOMInfo->ComDev = 0 ;
|
||||
pVCOMInfo->Connected = FALSE ;
|
||||
pVCOMInfo->Port = port;
|
||||
|
||||
VCOMInfo[bpqport]=pVCOMInfo;
|
||||
|
||||
return (pVCOMInfo);
|
||||
}
|
||||
|
||||
static BOOL NEAR DestroyTTYInfo( int port )
|
||||
{
|
||||
PVCOMINFO pVCOMInfo ;
|
||||
|
||||
if (NULL == (pVCOMInfo = VCOMInfo[port]))
|
||||
return ( FALSE ) ;
|
||||
|
||||
LocalFree( pVCOMInfo ) ;
|
||||
|
||||
VCOMInfo[port] = 0;
|
||||
|
||||
return ( TRUE ) ;
|
||||
|
||||
}
|
||||
|
||||
static int ReadCommBlock(PVCOMINFO pVCOMInfo, LPSTR lpszBlock, DWORD nMaxLength)
|
||||
{
|
||||
DWORD dwLength = 0;
|
||||
DWORD Available = 0;
|
||||
|
||||
if (Win98)
|
||||
DeviceIoControl(pVCOMInfo->ComDev, (pVCOMInfo->Port << 16) | W98_SERIAL_GETDATA,
|
||||
NULL,0,lpszBlock,nMaxLength, &dwLength,NULL);
|
||||
|
||||
else if (pVCOMInfo->NewVCOM)
|
||||
{
|
||||
int ret = PeekNamedPipe(pVCOMInfo->ComDev, NULL, 0, NULL, &Available, NULL);
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
ret = GetLastError();
|
||||
|
||||
if (ret == ERROR_BROKEN_PIPE)
|
||||
{
|
||||
CloseHandle(pVCOMInfo->ComDev);
|
||||
pVCOMInfo->ComDev = INVALID_HANDLE_VALUE;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (Available > nMaxLength)
|
||||
Available = nMaxLength;
|
||||
|
||||
if (Available)
|
||||
{
|
||||
UCHAR * ptr1 = lpszBlock;
|
||||
UCHAR * ptr2 = lpszBlock;
|
||||
UCHAR c;
|
||||
int Length;
|
||||
|
||||
ReadFile(pVCOMInfo->ComDev, lpszBlock, Available, &dwLength, NULL);
|
||||
|
||||
// Have to look foro FF escape chars
|
||||
|
||||
Length = dwLength;
|
||||
|
||||
while (Length != 0)
|
||||
{
|
||||
c = *(ptr1++);
|
||||
Length--;
|
||||
|
||||
if (c == 0xff)
|
||||
{
|
||||
c = c = *(ptr1++);
|
||||
Length--;
|
||||
|
||||
if (c == 0xff) // ff ff means ff
|
||||
{
|
||||
dwLength--;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is connection statua from other end
|
||||
|
||||
dwLength -= 2;
|
||||
pVCOMInfo->NewVCOMConnected = c;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
*(ptr2++) = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
DeviceIoControl(
|
||||
pVCOMInfo->ComDev,IOCTL_SERIAL_GETDATA,NULL,0,lpszBlock,nMaxLength, &dwLength,NULL);
|
||||
|
||||
return (dwLength);
|
||||
|
||||
}
|
||||
|
||||
static BOOL WriteCommBlock(int port, UCHAR * Message, DWORD MsgLen)
|
||||
{
|
||||
ULONG bytesReturned;
|
||||
|
||||
// if ((rand() % 100) > 80)
|
||||
// return 0;
|
||||
|
||||
if (Win98)
|
||||
return DeviceIoControl(
|
||||
VCOMInfo[port]->ComDev,(VCOMInfo[port]->Port << 16) | W98_SERIAL_SETDATA,Message,MsgLen,NULL,0, &bytesReturned,NULL);
|
||||
|
||||
else if (VCOMInfo[port]->NewVCOM)
|
||||
{
|
||||
// Have to escape all oxff chars, as these are used to get status info
|
||||
|
||||
UCHAR NewMessage[1000];
|
||||
UCHAR * ptr1 = Message;
|
||||
UCHAR * ptr2 = NewMessage;
|
||||
UCHAR c;
|
||||
|
||||
int Length = MsgLen;
|
||||
|
||||
while (Length != 0)
|
||||
{
|
||||
c = *(ptr1++);
|
||||
*(ptr2++) = c;
|
||||
|
||||
if (c == 0xff)
|
||||
{
|
||||
*(ptr2++) = c;
|
||||
MsgLen++;
|
||||
}
|
||||
Length--;
|
||||
}
|
||||
|
||||
return WriteFile(VCOMInfo[port]->ComDev, NewMessage, MsgLen, &bytesReturned, NULL);
|
||||
}
|
||||
else
|
||||
return DeviceIoControl(
|
||||
VCOMInfo[port]->ComDev,IOCTL_SERIAL_SETDATA,Message,MsgLen,NULL,0, &bytesReturned,NULL);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,654 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2022 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// Monitor Code - from moncode.asm
|
||||
|
||||
// Modified for AGW form monitor
|
||||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
// MSGFLAG contains CMD/RESPONSE BITS
|
||||
|
||||
#define CMDBIT 4 // CURRENT MESSAGE IS A COMMAND
|
||||
#define RESP 2 // CURRENT MSG IS RESPONSE
|
||||
#define VER1 1 // CURRENT MSG IS VERSION 1
|
||||
|
||||
|
||||
#define UI 3
|
||||
#define SABM 0x2F
|
||||
#define DISC 0x43
|
||||
#define DM 0x0F
|
||||
#define UA 0x63
|
||||
#define FRMR 0x87
|
||||
#define RR 1
|
||||
#define RNR 5
|
||||
#define REJ 9
|
||||
|
||||
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
|
||||
|
||||
#define NETROM_PID 0xCF
|
||||
#define IP_PID 0xCC
|
||||
#define ARP_PID 0xCD
|
||||
|
||||
#define NODES_SIG 0xFF
|
||||
|
||||
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen);
|
||||
|
||||
static UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNodes);
|
||||
static UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen);
|
||||
static UCHAR * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output);
|
||||
|
||||
|
||||
int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int DoNodes)
|
||||
{
|
||||
UCHAR * ptr;
|
||||
int n;
|
||||
MESSAGE * ADJBUFFER;
|
||||
ptrdiff_t Work;
|
||||
UCHAR CTL;
|
||||
BOOL PF = 0;
|
||||
char CRCHAR[3] = " ";
|
||||
char PFCHAR[3] = " ";
|
||||
int MSGFLAG = 0; //CR and V1 flags
|
||||
char * Output = buffer;
|
||||
char From[10], To[10];
|
||||
BOOL Info = 0;
|
||||
BOOL FRMRFLAG = 0;
|
||||
BOOL XIDFLAG = 0;
|
||||
BOOL TESTFLAG = 0;
|
||||
size_t MsgLen = msg->LENGTH;
|
||||
|
||||
struct tm * TM;
|
||||
|
||||
if (useLocalTime)
|
||||
TM = localtime(&Stamp);
|
||||
else
|
||||
TM = gmtime(&Stamp);
|
||||
|
||||
// GET THE CONTROL BYTE, TO SEE IF THIS FRAME IS TO BE DISPLAYED
|
||||
|
||||
n = 8; // MAX DIGIS
|
||||
ptr = &msg->ORIGIN[6]; // End of Address bit
|
||||
|
||||
while ((*ptr & 1) == 0)
|
||||
{
|
||||
// MORE TO COME
|
||||
|
||||
ptr += 7;
|
||||
n--;
|
||||
|
||||
if (n == 0)
|
||||
{
|
||||
return 0; // Corrupt - no end of address bit
|
||||
}
|
||||
}
|
||||
|
||||
// Reached End of digis
|
||||
|
||||
Work = ptr - &msg->ORIGIN[6]; // Work is length of digis
|
||||
|
||||
MsgLen -= Work;
|
||||
|
||||
ADJBUFFER = (MESSAGE *)((UCHAR *)msg + Work); // ADJBUFFER points to CTL, etc. allowing for digis
|
||||
|
||||
CTL = ADJBUFFER->CTL;
|
||||
|
||||
if (CTL & PFBIT)
|
||||
PF = TRUE;
|
||||
|
||||
CTL &= ~PFBIT;
|
||||
|
||||
*FrameType = CTL;
|
||||
|
||||
Output += sprintf((char *)Output, " %d:Fm ", msg->PORT & 0x7f); // Mask TX bit
|
||||
|
||||
From[ConvFromAX25(msg->ORIGIN, From)] = 0;
|
||||
To[ConvFromAX25(msg->DEST, To)] = 0;
|
||||
|
||||
Output += sprintf((char *)Output, "%s To %s", From, To);
|
||||
|
||||
// Display any Digi-Peaters
|
||||
|
||||
n = 8; // Max number of digi-peaters
|
||||
ptr = &msg->ORIGIN[6]; // End of Address bit
|
||||
|
||||
while ((*ptr & 1) == 0)
|
||||
{
|
||||
// MORE TO COME
|
||||
|
||||
From[ConvFromAX25(ptr + 1, From)] = 0;
|
||||
|
||||
if (n == 8)
|
||||
Output += sprintf((char *)Output, " Via %s", From); // Send via on first
|
||||
else
|
||||
Output += sprintf((char *)Output, ",%s", From);
|
||||
|
||||
ptr += 7;
|
||||
n--;
|
||||
|
||||
if (n == 0)
|
||||
break;
|
||||
|
||||
// See if digi actioned - put a * on last actioned
|
||||
|
||||
if (*ptr & 0x80)
|
||||
{
|
||||
if (*ptr & 1) // if last address, must need *
|
||||
*(Output++) = '*';
|
||||
else
|
||||
if ((ptr[7] & 0x80) == 0) // Repeased by next?
|
||||
*(Output++) = '*'; // No, so need *
|
||||
}
|
||||
}
|
||||
|
||||
*(Output++) = ' ';
|
||||
|
||||
// Set up CR and PF
|
||||
|
||||
CRCHAR[0] = 0;
|
||||
PFCHAR[0] = 0;
|
||||
|
||||
if (msg->DEST[6] & 0x80)
|
||||
{
|
||||
if (msg->ORIGIN[6] & 0x80) // Both set, assume V1
|
||||
MSGFLAG |= VER1;
|
||||
else
|
||||
{
|
||||
MSGFLAG |= CMDBIT;
|
||||
CRCHAR[0] = ' ';
|
||||
CRCHAR[1] = 'C';
|
||||
if (PF) // If FP set
|
||||
{
|
||||
PFCHAR[0] = ' ';
|
||||
PFCHAR[1] = 'P';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (msg->ORIGIN[6] & 0x80) // Only Origin Set
|
||||
{
|
||||
MSGFLAG |= RESP;
|
||||
CRCHAR[0] = ' ';
|
||||
CRCHAR[1] = 'R';
|
||||
if (PF) // If FP set
|
||||
{
|
||||
PFCHAR[0] = ' ';
|
||||
PFCHAR[1] = 'F';
|
||||
}
|
||||
}
|
||||
else
|
||||
MSGFLAG |= VER1; // Neither, assume V1
|
||||
}
|
||||
|
||||
if ((CTL & 1) == 0) // I frame
|
||||
{
|
||||
int NS = (CTL >> 1) & 7; // ISOLATE RECEIVED N(S)
|
||||
int NR = (CTL >> 5) & 7;
|
||||
|
||||
Info = 1;
|
||||
|
||||
Output += sprintf((char *)Output, "<I%s%s S%d R%d>", CRCHAR, PFCHAR, NS, NR);
|
||||
}
|
||||
else if (CTL == 3)
|
||||
{
|
||||
// Un-numbered Information Frame
|
||||
//UI pid=F0 Len=20 >
|
||||
|
||||
Output += sprintf((char *)Output, "<UI pid=%02X Len=%d>", ADJBUFFER->PID, (int)MsgLen - 23);
|
||||
Info = 1;
|
||||
}
|
||||
else if (CTL & 2)
|
||||
{
|
||||
// UN Numbered
|
||||
|
||||
char SUP[5] = "??";
|
||||
|
||||
switch (CTL)
|
||||
{
|
||||
case SABM:
|
||||
|
||||
strcpy(SUP, "C");
|
||||
break;
|
||||
|
||||
case DISC:
|
||||
|
||||
strcpy(SUP, "D");
|
||||
break;
|
||||
|
||||
case DM:
|
||||
|
||||
strcpy(SUP, "DM");
|
||||
break;
|
||||
|
||||
case UA:
|
||||
|
||||
strcpy(SUP, "UA");
|
||||
break;
|
||||
|
||||
|
||||
case FRMR:
|
||||
|
||||
strcpy(SUP, "FRMR");
|
||||
FRMRFLAG = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
Output += sprintf((char *)Output, "<%s%s%s>", SUP, CRCHAR, PFCHAR);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Super
|
||||
|
||||
int NR = (CTL >> 5) & 7;
|
||||
char SUP[4] = "??";
|
||||
|
||||
switch (CTL & 0x0F)
|
||||
{
|
||||
case RR:
|
||||
|
||||
strcpy(SUP, "RR");
|
||||
break;
|
||||
|
||||
case RNR:
|
||||
|
||||
strcpy(SUP, "RNR");
|
||||
break;
|
||||
|
||||
case REJ:
|
||||
|
||||
strcpy(SUP, "REJ");
|
||||
break;
|
||||
}
|
||||
|
||||
Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR);
|
||||
|
||||
}
|
||||
|
||||
Output += sprintf((char *)Output, "[%02d:%02d:%02d]", TM->tm_hour, TM->tm_min, TM->tm_sec);
|
||||
|
||||
|
||||
if (FRMRFLAG)
|
||||
Output += sprintf((char *)Output, "%02X %02X %02X", ADJBUFFER->PID, ADJBUFFER->L2DATA[0], ADJBUFFER->L2DATA[1]);
|
||||
|
||||
if (Info)
|
||||
{
|
||||
// We have an info frame
|
||||
|
||||
switch (ADJBUFFER->PID)
|
||||
{
|
||||
case 0xF0: // Normal Data
|
||||
{
|
||||
char Infofield[257];
|
||||
char * ptr1 = Infofield;
|
||||
char * ptr2 = ADJBUFFER->L2DATA;
|
||||
UCHAR C;
|
||||
size_t len;
|
||||
|
||||
MsgLen = MsgLen - 23;
|
||||
|
||||
if (MsgLen < 0 || MsgLen > 257)
|
||||
return 0; // Duff
|
||||
|
||||
while (MsgLen--)
|
||||
{
|
||||
C = *(ptr2++);
|
||||
|
||||
// Convert to printable
|
||||
|
||||
C &= 0x7F;
|
||||
|
||||
if (C == 13 || C == 10 || C > 31)
|
||||
*(ptr1++) = C;
|
||||
}
|
||||
|
||||
len = ptr1 - Infofield;
|
||||
|
||||
// Output[0] = ':';
|
||||
Output[0] = 13;
|
||||
memcpy(&Output[1], Infofield, len);
|
||||
Output += (len + 1);
|
||||
|
||||
break;
|
||||
}
|
||||
case NETROM_PID:
|
||||
|
||||
Output = DISPLAY_NETROM(ADJBUFFER, Output,(int) MsgLen, DoNodes);
|
||||
break;
|
||||
|
||||
case IP_PID:
|
||||
|
||||
Output += sprintf((char *)Output, " <IP>\r");
|
||||
Output = DISPLAYIPDATAGRAM((IPMSG *)&ADJBUFFER->L2DATA[0], Output, (int)MsgLen);
|
||||
break;
|
||||
|
||||
case ARP_PID:
|
||||
|
||||
Output = DISPLAYARPDATAGRAM(&ADJBUFFER->L2DATA[0], Output);
|
||||
break;
|
||||
|
||||
case 8: // Fragmented IP
|
||||
|
||||
Output += sprintf((char *)Output, "<Fragmented IP>");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Output == NULL)
|
||||
return 0;
|
||||
|
||||
if (Output[-1] != 13)
|
||||
Output += sprintf((char *)Output, "\r");
|
||||
|
||||
return (int)(Output - buffer);
|
||||
|
||||
}
|
||||
// Display NET/ROM data
|
||||
|
||||
UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNodes)
|
||||
{
|
||||
char Alias[7]= "";
|
||||
char Dest[10];
|
||||
char Node[10];
|
||||
UCHAR TTL, Index, ID, TXNO, RXNO, OpCode, Flags, Window;
|
||||
UCHAR * ptr = &ADJBUFFER->L2DATA[0];
|
||||
|
||||
if (ADJBUFFER->L2DATA[0] == NODES_SIG)
|
||||
{
|
||||
// Display NODES
|
||||
|
||||
if (DoNodes == 0)
|
||||
return NULL;
|
||||
|
||||
// If an INP3 RIF (type <> UI) decode as such
|
||||
|
||||
if (ADJBUFFER->CTL != 3) // UI
|
||||
return DisplayINP3RIF(&ADJBUFFER->L2DATA[1], Output, MsgLen - 24);
|
||||
|
||||
memcpy(Alias, ++ptr, 6);
|
||||
|
||||
ptr += 6;
|
||||
|
||||
Output += sprintf((char *)Output, "\rFF %s (NetRom Routing)\r", Alias);
|
||||
|
||||
MsgLen -= 30; //Header, mnemonic and signature length
|
||||
|
||||
while(MsgLen > 20) // Entries are 21 bytes
|
||||
{
|
||||
Dest[ConvFromAX25(ptr, Dest)] = 0;
|
||||
ptr +=7;
|
||||
memcpy(Alias, ptr, 6);
|
||||
ptr +=6;
|
||||
strlop(Alias, ' ');
|
||||
Node[ConvFromAX25(ptr, Node)] = 0;
|
||||
ptr +=7;
|
||||
|
||||
Output += sprintf((char *)Output, " %s:%s via %s qlty=%d\r", Alias, Dest, Node, ptr[0]);
|
||||
ptr++;
|
||||
MsgLen -= 21;
|
||||
}
|
||||
return Output;
|
||||
}
|
||||
|
||||
// Display normal NET/ROM transmissions
|
||||
|
||||
Output += sprintf((char *)Output, " NET/ROM\r ");
|
||||
|
||||
Dest[ConvFromAX25(ptr, Dest)] = 0;
|
||||
ptr +=7;
|
||||
Node[ConvFromAX25(ptr, Node)] = 0;
|
||||
ptr +=7;
|
||||
|
||||
TTL = *(ptr++);
|
||||
Index = *(ptr++);
|
||||
ID = *(ptr++);
|
||||
TXNO = *(ptr++);
|
||||
RXNO = *(ptr++);
|
||||
OpCode = Flags = *(ptr++);
|
||||
|
||||
OpCode &= 15; // Remove Flags
|
||||
|
||||
Output += sprintf((char *)Output, "%s to %s ttl %d cct=%02X%02X ", Dest, Node, TTL, Index, ID );
|
||||
MsgLen -= 20;
|
||||
|
||||
switch (OpCode)
|
||||
{
|
||||
case L4CREQ:
|
||||
|
||||
Window = *(ptr++);
|
||||
Dest[ConvFromAX25(ptr, Dest)] = 0;
|
||||
ptr +=7;
|
||||
Node[ConvFromAX25(ptr, Node)] = 0;
|
||||
ptr +=7;
|
||||
|
||||
Output += sprintf((char *)Output, "<CON REQ> w=%d %s at %s", Window, Dest, Node);
|
||||
|
||||
if (MsgLen > 38) // BPQ Extended Params
|
||||
{
|
||||
short Timeout = (SHORT)*ptr;
|
||||
Output += sprintf((char *)Output, " t/o %d", Timeout);
|
||||
}
|
||||
|
||||
return Output;
|
||||
|
||||
case L4CACK:
|
||||
|
||||
if (Flags & L4BUSY) // BUSY RETURNED
|
||||
return Output + sprintf((char *)Output, " <CON NAK> - BUSY");
|
||||
|
||||
return Output + sprintf((char *)Output, " <CON ACK> w=%d my cct=%02X%02X", ptr[1], TXNO, RXNO);
|
||||
|
||||
case L4DREQ:
|
||||
|
||||
return Output + sprintf((char *)Output, " <DISC REQ>");
|
||||
|
||||
case L4DACK:
|
||||
|
||||
return Output + sprintf((char *)Output, " <DISC ACK>");
|
||||
|
||||
case L4INFO:
|
||||
{
|
||||
char Infofield[257];
|
||||
char * ptr1 = Infofield;
|
||||
UCHAR C;
|
||||
size_t len;
|
||||
|
||||
Output += sprintf((char *)Output, " <INFO S%d R%d>", TXNO, RXNO);
|
||||
|
||||
if (Flags & L4BUSY)
|
||||
*(Output++) = 'B';
|
||||
|
||||
if (Flags & L4NAK)
|
||||
*(Output++) = 'N';
|
||||
|
||||
if (Flags & L4MORE)
|
||||
*(Output++) = 'M';
|
||||
|
||||
MsgLen = MsgLen - 23;
|
||||
|
||||
if (MsgLen < 0 || MsgLen > 257)
|
||||
return Output; // Duff
|
||||
|
||||
while (MsgLen--)
|
||||
{
|
||||
C = *(ptr++);
|
||||
|
||||
// Convert to printable
|
||||
|
||||
C &= 0x7F;
|
||||
|
||||
if (C == 13 || C == 10 || C > 31)
|
||||
*(ptr1++) = C;
|
||||
}
|
||||
|
||||
len = ptr1 - Infofield;
|
||||
|
||||
Output[0] = ':';
|
||||
Output[1] = 13;
|
||||
memcpy(&Output[2], Infofield, len);
|
||||
Output += (len + 2);
|
||||
}
|
||||
|
||||
return Output;
|
||||
|
||||
case L4IACK:
|
||||
|
||||
Output += sprintf((char *)Output, " <INFO ACK R%d> ", RXNO);
|
||||
|
||||
if (Flags & L4BUSY)
|
||||
*(Output++) = 'B';
|
||||
|
||||
if (Flags & L4NAK)
|
||||
*(Output++) = 'N';
|
||||
|
||||
if (Flags & L4MORE)
|
||||
*(Output++) = 'M';
|
||||
|
||||
return Output;
|
||||
|
||||
|
||||
case 0:
|
||||
|
||||
// OPcode zero is used for several things
|
||||
|
||||
if (Index == 0x0c && ID == 0x0c) // IP
|
||||
{
|
||||
// Output = L3IP(Output);
|
||||
return Output;
|
||||
}
|
||||
|
||||
if (Index == 0 && ID == 1) // NRR
|
||||
{
|
||||
Output += sprintf((char *)Output, " <Record Route>\r");
|
||||
|
||||
MsgLen -= 23;
|
||||
|
||||
while (MsgLen > 6)
|
||||
{
|
||||
Dest[ConvFromAX25(ptr, Dest)] = 0;
|
||||
|
||||
if (ptr[7] & 0x80)
|
||||
Output += sprintf((char *)Output, "%s* ", Dest);
|
||||
else
|
||||
Output += sprintf((char *)Output, "%s ", Dest);
|
||||
|
||||
ptr +=8;
|
||||
MsgLen -= 8;
|
||||
}
|
||||
|
||||
return Output;
|
||||
}
|
||||
}
|
||||
|
||||
Output += sprintf((char *)Output, " <???\?>");
|
||||
return Output;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
PUBLIC L3IP
|
||||
L3IP:
|
||||
;
|
||||
; TCP/IP DATAGRAM
|
||||
;
|
||||
mov EBX,OFFSET IP_MSG
|
||||
call NORMSTR
|
||||
;
|
||||
INC ESI ; NOW POINTING TO IP HEADER
|
||||
|
||||
*/
|
||||
UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen)
|
||||
{
|
||||
UCHAR * ptr;
|
||||
|
||||
ptr = (UCHAR *)&IP->IPSOURCE;
|
||||
Output += sprintf((char *)Output, "%d.%d.%d.%d>", ptr[0], ptr[1], ptr[2], ptr[3]);
|
||||
|
||||
ptr = (UCHAR *)&IP->IPDEST;
|
||||
Output += sprintf((char *)Output, "%d.%d.%d.%d LEN:%d ", ptr[0], ptr[1], ptr[2], ptr[3], htons(IP->IPLENGTH));
|
||||
|
||||
/*
|
||||
MOV AL,IPPROTOCOL[ESI]
|
||||
CMP AL,6
|
||||
JNE @F
|
||||
|
||||
MOV EBX, OFFSET TCP
|
||||
CALL NORMSTR
|
||||
JMP ADD_CR
|
||||
@@:
|
||||
|
||||
CMP AL,1
|
||||
JNE @F
|
||||
|
||||
MOV EBX, OFFSET ICMP
|
||||
CALL NORMSTR
|
||||
JMP ADD_CR
|
||||
@@:
|
||||
|
||||
CALL DISPLAY_BYTE_1 ; DISPLAY PROTOCOL TYPE
|
||||
|
||||
; mov AL,CR
|
||||
; call PUTCHAR
|
||||
;
|
||||
; MOV ECX,39 ; TESTING
|
||||
;IPLOOP:
|
||||
; lodsb
|
||||
; CALL BYTE_TO_HEX
|
||||
;
|
||||
; LOOP IPLOOP
|
||||
|
||||
JMP ADD_CR
|
||||
|
||||
|
||||
*/
|
||||
return Output;
|
||||
}
|
||||
|
||||
|
||||
|
||||
UCHAR * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output)
|
||||
{
|
||||
UCHAR * ptr = Datagram;
|
||||
UCHAR Dest[10];
|
||||
|
||||
if (ptr[7] == 1) // Request
|
||||
return Output + sprintf((char *)Output, " < ARP Request who has %d.%d.%d.%d? Tell %d.%d.%d.%d",
|
||||
ptr[26], ptr[27], ptr[28], ptr[29], ptr[15], ptr[16], ptr[17], ptr[18]);
|
||||
|
||||
// Response
|
||||
|
||||
Dest[ConvFromAX25(&ptr[8], Dest)] = 0;
|
||||
|
||||
return Output + sprintf((char *)Output, " < ARP Rreply %d.%d.%d.%d? is at %s",
|
||||
ptr[15], ptr[16], ptr[17], ptr[18], "??");
|
||||
|
||||
}
|
||||
@ -1,572 +0,0 @@
|
||||
|
||||
EXCLUDEBITS EQU 0 ; INCLUDE ExcludeList SUPPORT
|
||||
|
||||
TNCBUFFLEN EQU 400h
|
||||
BPQHOSTSTREAMS EQU 64
|
||||
;BUFFLEN EQU 400 ; ??
|
||||
|
||||
MAXAPPLS EQU 32 ; Max Application Commands
|
||||
ApplOffset EQU 80000 ; Applications string in buffer
|
||||
C_INFOMSG EQU 85000 ; Info Msg in buffer
|
||||
ApplStringLen EQU 48 ; Length of each config entry
|
||||
|
||||
ALIASLEN EQU 32 ; Max chars in command alias
|
||||
|
||||
MHENTRIES EQU 30 ; Entries in MH List
|
||||
|
||||
;
|
||||
; BUFFLEN-4 = L2 POINTER (FOR CLEARING TIMEOUT WHEN ACKMODE USED)
|
||||
; BUFFLEN-8 = TIMESTAMP
|
||||
; BUFFLEN-12 = BUFFER ALLOCATED FLAG (ADDR OF ALLOCATING ROUTINE)
|
||||
|
||||
;MAXDATA EQU BUFFLEN-16
|
||||
|
||||
MAXDIGIS EQU 8
|
||||
;
|
||||
; BPQHOST MODE VECTOR STRUC
|
||||
;
|
||||
BPQVECSTRUC STRUC
|
||||
|
||||
|
||||
HOSTSESSION DD 0
|
||||
HOSTFLAGS DB 0 ; ALLOCATED AND STATE CHANGE FLAGS
|
||||
HOSTAPPLMASK DD 0
|
||||
HOSTAPPLFLAGS DB 0
|
||||
HOSTSTREAM DB 0 ; STREAM NUMBER
|
||||
HOSTTRACEQ DD 0
|
||||
|
||||
HOSTHANDLE DD 0 ; HANDLE FOR POSTING MSGS TO
|
||||
|
||||
HOSTAPPLNUM DD 0 ; Application Number
|
||||
|
||||
STREAMOWNER DD 0 ; PID of Process owning stream
|
||||
HOSTPGMNAME DB 32 dup (0);
|
||||
|
||||
BPQVECSTRUC ENDS
|
||||
|
||||
; HOSTFLAGS = Bit 80 = Allocated
|
||||
; Bit 40 = Disc Request
|
||||
; Bit 20 = Stay Flag
|
||||
; Bit 02 and 01 State Change Bits
|
||||
|
||||
|
||||
VECTORLENGTH EQU TYPE BPQVECSTRUC
|
||||
|
||||
;
|
||||
; BASIC LINK LEVEL MESSAGE BUFFER LAYOUT
|
||||
;
|
||||
MESSAGE STRUC
|
||||
|
||||
MSGCHAIN DD ? ; CHAIN WORD
|
||||
MSGPORT DB ? ; PORT
|
||||
MSGLENGTH DW ? ; LENGTH
|
||||
|
||||
MSGDEST DB 7 DUP (?) ; DESTINATION
|
||||
MSGORIGIN DB 7 DUP (?) ; ORIGIN
|
||||
;
|
||||
; MAY BE UP TO 56 BYTES OF DIGIS
|
||||
;
|
||||
MSGCONTROL DB ? ; CONTROL BYTE
|
||||
MSGPID DB ? ; PROTOCOL IDENTIFIER
|
||||
MSGDATA DB ? ; START OF LEVEL 2 MESSAGE
|
||||
;
|
||||
MESSAGE ENDS
|
||||
;
|
||||
|
||||
L3MESSAGE STRUC
|
||||
;
|
||||
; NETROM LEVEL 3 MESSAGE - WITHOUT L2 INFO
|
||||
;
|
||||
L3HEADER DB 7 DUP (?) ; CHAIN, PORT, LENGTH
|
||||
L3PID DB ? ; PID
|
||||
|
||||
L3SRCE DB 7 DUP (?) ; ORIGIN NODE
|
||||
L3DEST DB 7 DUP (?) ; DEST NODE
|
||||
L3MONR DB ? ; TX MONITOR FIELD - TO PREVENT MESSAGE GOING
|
||||
; ROUND THE NETWORK FOR EVER DUE TO ROUTING LOOP
|
||||
;
|
||||
; NETROM LEVEL 4 DATA
|
||||
;
|
||||
L4INDEX DB ? ; TRANSPORT SESSION INDEX
|
||||
L4ID DB ? ; TRANSPORT SESSION ID
|
||||
L4TXNO DB ? ; TRANSMIT SEQUENCE NUMBER
|
||||
L4RXNO DB ? ; RECEIVE (ACK) SEQ NUMBER
|
||||
L4FLAGS DB ? ; FRAGMENTATION, ACK/NAK, FLOW CONTROL AND MSG TYPE BITS
|
||||
|
||||
L4DATA DB ? ; DATA
|
||||
L4CALLS DB 14 DUP (?) ; CALLS IN CONNECT REQUEST
|
||||
L4_BPQ DB ? ; THENODE EXTENDED CONNECT PARAMS
|
||||
|
||||
L3MESSAGE ENDS
|
||||
|
||||
;
|
||||
; L4FLAGS DEFINITION
|
||||
;
|
||||
L4BUSY EQU 80H ; BNA - DONT SEND ANY MORE
|
||||
L4NAK EQU 40H ; NEGATIVE RESPONSE FLAG
|
||||
L4MORE EQU 20H ; MORE DATA FOLLOWS - FRAGMENTATION FLAG
|
||||
|
||||
L4CREQ EQU 1 ; CONNECT REQUEST
|
||||
L4CACK EQU 2 ; CONNECT ACK
|
||||
L4DREQ EQU 3 ; DISCONNECT REQUEST
|
||||
L4DACK EQU 4 ; DISCONNECT ACK
|
||||
L4INFO EQU 5 ; INFORMATION
|
||||
L4IACK EQU 6 ; INFORMATION ACK
|
||||
;
|
||||
; PORT CONTROL TABLE
|
||||
;
|
||||
PORTCONTROL STRUC
|
||||
|
||||
PORTCALL DB 7 DUP (0)
|
||||
PORTALIAS DB 7 DUP (0) ; USED FOR UPLINKS ONLY
|
||||
PORTNUMBER DB ?
|
||||
PORTPOINTER DD ? ; NEXT IN CHAIN
|
||||
PORTQUALITY DB ? ; 'STANDARD' QUALITY FOR THIS PORT
|
||||
PORTRX_Q DD ? ; FRAMES RECEIVED ON THIS PORT
|
||||
PORTTX_Q DD ? ; FRAMES TO BE SENT ON THIS PORT
|
||||
PORTTXROUTINE DD ? ; POINTER TO TRANSMIT ROUTINE FOR THIS PORT
|
||||
PORTRXROUTINE DD ? ; POINTER TO RECEIVE ROUTINE FOR THIS PORT
|
||||
PORTINITCODE DD ? ; INITIALISATION ROUTINE
|
||||
PORTTIMERCODE DD ?
|
||||
PORTCLOSECODE DD ?
|
||||
PORTTXCHECK DD ? ; OK to Send Check
|
||||
|
||||
PORTDESCRIPTION DB 30 DUP (0) ; TEXT DESCRIPTION OF FREQ/SPEED ETC
|
||||
PORTBBSFLAG DB ? ; NZ MEANS PORT CALL/ALIAS ARE FOR BBS
|
||||
PORTL3FLAG DB ? ; NZ RESTRICTS OUTGOING L2 CONNECTS
|
||||
;
|
||||
; CWID FIELDS
|
||||
;
|
||||
CWID DW 9 DUP (0) ; 8 ELEMENTS + FLAG
|
||||
ELEMENT DW ? ; REMAINING BITS OF CURRENT CHAR
|
||||
CWPOINTER DD ? ; POINTER TO NEXT CHAR
|
||||
CWIDTIMER DW ? ; TIME TO NEXT ID
|
||||
CWSTATE DB ? ; STATE MACHINE FOR CWID
|
||||
CWTYPE DB ? ; SET TO USE ON/OFF KEYING INSTEAD OF
|
||||
; FSK (FOR RUH MODEMS)
|
||||
PORTMINQUAL DB ? ; MIN QUAL TO BRAOCAST ON THIS PORT
|
||||
|
||||
; STATS COUNTERS
|
||||
;
|
||||
L2DIGIED DD ?
|
||||
L2FRAMES DD ?
|
||||
L2FRAMESFORUS DD ?
|
||||
L2FRAMESSENT DD ?
|
||||
L2TIMEOUTS DD ?
|
||||
L2ORUNC DD ? ; OVERRUNS
|
||||
L2URUNC DD ? ; UNDERRUNS
|
||||
L1DISCARD DD ? ; FRAMES DISCARDED (UNABLE TO TX DUE TO DCD)
|
||||
L2FRMRRX DD ?
|
||||
L2FRMRTX DD ?
|
||||
RXERRORS DD ? ; RECEIVE ERRORS
|
||||
L2REJCOUNT DD ? ; REJ FRAMES RECEIVED
|
||||
L2OUTOFSEQ DD ? ; FRAMES RECEIVED OUT OF SEQUENCE
|
||||
L2RESEQ DD ? ; FRAMES RESEQUENCED
|
||||
SENDING DW 0 ; LINK STATUS BITS
|
||||
ACTIVE DW 0
|
||||
|
||||
AVSENDING DB 0 ; LAST MINUTE
|
||||
AVACTIVE DB 0
|
||||
|
||||
PORTTYPE DB 0 ; H/W TYPE
|
||||
; 0 = ASYNC, 2 = PC120, 4 = DRSI
|
||||
; 6 = TOSH, 8 = QUAD, 10 = RLC100
|
||||
; 12 = RLC400 14 = INTERNAL 16 = EXTERNAL ; 18 = i2c
|
||||
|
||||
PROTOCOL DB 0 ; PORT PROTOCOL
|
||||
; 0 = KISS, 2 = NETROM, 4 = BPQKISS
|
||||
; 6 = HDLC, 8 = L2, 10 = PACTOR
|
||||
|
||||
IOBASE DW ? ; CONFIG PARAMS FOR HARDWARE DRIVERS
|
||||
INTLEVEL DB ? ; FIRST 4 SAME FOR ALL H/W TYPES
|
||||
BAUDRATE DD ? ; SPEED
|
||||
CHANNELNUM DB ? ; ON MULTICHANNEL H/W
|
||||
INTCHAIN DD ? ; POINTER TO NEXT PORT USING THIS LEVEL
|
||||
PORTWINDOW DB ? ; L2 WINDOW FOR THIS PORT
|
||||
PORTTXDELAY DW ? ; TX DELAY FOR THIS PORT
|
||||
PORTPERSISTANCE DB ? ; PERSISTANCE VALUE FOR THIS PORT
|
||||
FULLDUPLEX DB ? ; FULL DUPLEX IF SET
|
||||
SOFTDCDFLAG DB ? ; IF SET USE 'SOFT DCD' - IF MODEM CANT GIVE A REAL ONE
|
||||
PORTSLOTTIME DB ? ; SLOT TIME
|
||||
PORTTAILTIME DB ? ; TAIL TIME
|
||||
BBSBANNED DB ? ; SET IF PORT CAN'T ACCEPT L2 CALLS TO BBS CALLSIGN
|
||||
PORTT1 DB ? ; L2 TIMEOUT
|
||||
PORTT2 DB ? ; L2 DELAYED ACK TIMER
|
||||
PORTN2 DB ? ; RETRIES
|
||||
PORTPACLEN DB ? ; DEFAULT PACLEN FOR INCOMING SESSIONS
|
||||
PORTINTERRUPT DD ? ; ADDRESS OF INTERRUPT HANDLER
|
||||
|
||||
QUAL_ADJUST DB ? ; % REDUCTION IN QUALITY IF ON SAME PORT
|
||||
|
||||
PERMITTEDCALLS DD ? ; POINTER TO PERMITED CALLS LIST
|
||||
PORTUNPROTO DD ? ; POINTER TO UI DEST AND DIGI LIST
|
||||
PORTDISABLED DB 0 ; PORT TX DISABLE FLAG
|
||||
DIGIFLAG DB 0 ; ENABLE/DISABLE/UI ONLY
|
||||
DIGIPORT DB 0 ; CROSSBAND DIGI PORT
|
||||
DIGIMASK DW 0 ; CROSSBAND DIGI MASK
|
||||
USERS DB 0 ; MAX USERS ON PORT
|
||||
KISSFLAGS DB 0 ; KISS SPECIAL MODE BITS
|
||||
PORTINTERLOCK DB 0 ; TO DEFINE PORTS WHICH CANT TX AT SAME TIME
|
||||
NODESPACLEN DB 0 ; MAX LENGTH OF 'NODES' MSG
|
||||
TXPORT DB 0 ; PORT FOR SHARED TX OPERATION
|
||||
PORTMHEARD DD 0 ; POINTER TO MH DATA
|
||||
|
||||
PARAMTIMER DW 0 ; MOVED FROM HW DATA FOR SYSOPH
|
||||
PORTMAXDIGIS DB 0 ; DIGIS ALLOWED ON THIS PORT
|
||||
PORTALIAS2 DB 7 DUP (0) ; 2ND ALIAS FOR DIGIPEATING FOR APRS
|
||||
PORTBCALL DB 7 DUP (0) ; Source for Beacons
|
||||
PortNoKeepAlive DB 0; ; Default to No Keepalives
|
||||
PortUIOnly DB 0;
|
||||
UICAPABLE DB 0; ; Pactor-style port that can do UI
|
||||
WL2K DB 189 DUP (0) ; WL2K Report Data
|
||||
PORTIPADDR DD 0;
|
||||
SerialPortName DD 0 ; Serial Port Name for Unix
|
||||
XDIGIS DD 0; ; Cross Port Digi Definitions
|
||||
|
||||
NormalizeQuality DD 0 ; Normalise Node Qualities
|
||||
IgnoreUnlocked DD 0 ; Ignore Unlocked Routes
|
||||
|
||||
HARDWAREDATA DB 200 DUP (?) ; WORK AREA FOR HARDWARE DRIVERS
|
||||
|
||||
PORTCONTROL ENDS
|
||||
|
||||
;
|
||||
; DEFINE MAPPING FOR EXTERNAL DRIVER
|
||||
;
|
||||
EXTDATA STRUC
|
||||
DB HARDWAREDATA DUP (0) ; REMAP HARDWARE INFO
|
||||
|
||||
PORT_EXT_ADDR DD ? ; ADDR OF RESIDENT ROUTINE
|
||||
PORT_DLL_NAME DB 16 DUP (0);
|
||||
EXTRESTART DB ? ; FLAG FOR DRIVER REINIT
|
||||
DLLHANDLE DD ?
|
||||
MAXHOSTMODESESSIONS DD ? ; Max Host Sessions supported (Used for KAM Pactor + ax.25 support)
|
||||
ATTACHEDSESSIONS DD 27 DUP (0); Owning Sessions for PACTOR, etc
|
||||
PERMITGATEWAY DD 0 ; Set if ax.25 ports can change callsign (ie SCS, not KAM
|
||||
SCANCAPABILITIES DD 0 ; Type of scan control Controller supports (None, Simple, Connect Lock)
|
||||
UI_Q DD 0 ; Unproto Frames for Session Mode Drivers (TRK, etc)
|
||||
|
||||
EXTDATA ENDS
|
||||
|
||||
IF TYPE EXTDATA GT TYPE PORTCONTROL
|
||||
.ERR2 TOO MUCH PORT DATA
|
||||
ENDIF
|
||||
|
||||
EXTERNAL EQU 16
|
||||
L2 EQU 8
|
||||
;
|
||||
; CW STATE MACHINE EQUATES
|
||||
;
|
||||
dot equ 1b
|
||||
dash equ 10b
|
||||
dotspace equ 100b
|
||||
letterspace equ 1000b
|
||||
IDPENDING EQU 10000B
|
||||
;
|
||||
; LEVEL 2 LINK CONTROL TABLE
|
||||
;
|
||||
LINKTABLE STRUC
|
||||
|
||||
LINKCALL DB 7 DUP (?) ; CALLSIGN OF STATION
|
||||
OURCALL DB 7 DUP (?) ; CALLSIGN OF OUR END
|
||||
DIGIS DB MAXDIGIS*7 DUP (?) ; LEVEL 2 DIGIS IN PATH
|
||||
|
||||
LINKPORT DD ? ; PORT POINTER
|
||||
LINKTYPE DB ? ; 1 = UP, 2= DOWN, 3 = INTERNODE
|
||||
|
||||
LINKNR DB ?
|
||||
LINKNS DB ? ; LEV 2 SEQUENCE COUNTS
|
||||
LINKWS DB ? ; WINDOW START
|
||||
LINKOWS DB ? ; OLD (LAST ACKED) WINDOW START
|
||||
LINKWINDOW DB ? ; LEVEL 2 WINDOW SIZE
|
||||
|
||||
L2FLAGS DB ? ; CONTROL BITS
|
||||
VER1FLAG DB ? ; SET IF OTHER END RUNNING VERSION 1
|
||||
|
||||
RX_Q DD ? ; PACKETS RECEIVED ON THIS LINK
|
||||
|
||||
TX_Q DD ? ; PACKETS TO SEND
|
||||
FRAMES DD 8 DUP (?) ; FRAMES WAITING ACK
|
||||
RXFRAMES DD 8 DUP (?) ; Frames received out of sequence
|
||||
|
||||
L2STATE DB ? ; PROCESSING STATE
|
||||
L2TIMER DW ? ; FRAME RETRY TIMER
|
||||
L2TIME DB ? ; RETRY TIMER INITIAL VALUE
|
||||
L2SLOTIM DW ? ; DELAY FOR LINK VALIDATION POLL
|
||||
L2ACKREQ DB ? ; DELAYED TEXT ACK TIMER
|
||||
REJTIMER DB ? ; TO TIME OUT REJ IN VERSION 1
|
||||
LAST_F_TIME DW ? ; TIME LAST R(F) SENT
|
||||
SDREJF DB ? ; FLAGS FOR FRMR
|
||||
SDRBYTE DB ? ; SAVED CONTROL BYTE FOR FRMR
|
||||
|
||||
SDTSLOT DB ? ; POINTER TO NEXT TXSLOT TO USE
|
||||
|
||||
L2RETRIES DB ? ; RETRY COUNTER
|
||||
|
||||
SESSACTIVE DB ? ; SET WHEN WE ARE SURE SESSION IS UP
|
||||
|
||||
KILLTIMER DW ? ; TIME TO KILL IDLE LINK
|
||||
|
||||
CIRCUITPOINTER DD ? ; POINTER TO L4 CIRCUIT TABLE ENTRY
|
||||
; (IF UP/DOWN)
|
||||
NEIGHBOUR DD ? ; POINTER TO NEIGHBOUR (IF CROSSLINK)
|
||||
|
||||
L2FRAG_Q DD ? ; DEFRAGMENTATION QUEUE
|
||||
|
||||
LINKTABLE ENDS
|
||||
;
|
||||
; L2FLAGS EQUATES
|
||||
;
|
||||
REJSENT EQU 1B ; SET WHEN FIRST REJ IS SENT IN REPLY
|
||||
; TO AN I(P)
|
||||
RNRSET EQU 10B ; RNR RECEIVED FROM OTHER END
|
||||
;DISCPENDING EQU 1000B ; SEND DISC WHEN ALL DATA ACK'ED
|
||||
RNRSENT EQU 10000B ; WE HAVE SEND RNR
|
||||
POLLSENT EQU 100000B ; POLL BIT OUTSTANDING
|
||||
;
|
||||
; FRMR REJECT FLAGS
|
||||
;
|
||||
SDINVC EQU 1B ; INVALID COMMAND
|
||||
SDNRER EQU 1000B ; INVALID N(R)
|
||||
|
||||
TRANSPORTENTRY STRUC
|
||||
|
||||
L4USER DB 7 DUP (?) ; CALL OF ORIGINATING USER
|
||||
L4TARGET DD ? ; POINTER TO TARGET LINK/DEST
|
||||
L4MYCALL DB 7 DUP (0) ; CALL WE ARE USING
|
||||
|
||||
CIRCUITINDEX DB ? ; OUR CIRCUIT INFO
|
||||
CIRCUITID DB ?
|
||||
|
||||
FARINDEX DB ?
|
||||
FARID DB ? ; OTHER END'S INFO
|
||||
|
||||
L4WINDOW DB ? ; WINDOW SIZE
|
||||
L4WS DB ? ; WINDOW START - NEXT FRAME TO ACK
|
||||
TXSEQNO DB ?
|
||||
RXSEQNO DB ? ; TRANSPORT LEVEL SEQUENCE INFO
|
||||
L4LASTACKED DB ? ; LAST SEQUENCE ACKED
|
||||
|
||||
FLAGS DB ? ; TRANSPORT LEVEL FLAGS
|
||||
NAKBITS DB ? ; NAK & CHOKE BITS TO BE SENT
|
||||
L4CROSSLINK DD ? ; POINTER TO LINKED L4 SESSION ENTRY
|
||||
L4CIRCUITTYPE DB ? ; BIT SIGNIFICANT - SEE BELOW
|
||||
KAMSESSION DB ? ; Session Number on KAM Host Mode TNC
|
||||
L4TX_Q DD ?
|
||||
L4RX_Q DD ?
|
||||
L4HOLD_Q DD ? ; FRAMES WAITING TO BE ACKED
|
||||
L4RESEQ_Q DD ? ; FRAMES RECEIVED OUT OF SEQUENCE
|
||||
|
||||
L4STATE DB ?
|
||||
L4TIMER DW ?
|
||||
L4ACKREQ DB ? ; DATA ACK NEEDED
|
||||
L4RETRIES DB ? ; RETRY COUNTER
|
||||
L4KILLTIMER DW 0 ; IDLE CIRCUIT TIMER
|
||||
SESSIONT1 DW 0 ; TIMEOUT FOR SESSIONS FROM HERE
|
||||
SESSPACLEN DB 0 ; PACLEN FOR THIS SESSION
|
||||
BADCOMMANDS DB 0 ; SUCCESSIVE BAD COMMANDS
|
||||
STAYFLAG DB 0 ; STAY CONNECTED FLAG
|
||||
SPYFLAG DB 0 ; SPY - CONNECT TO NODE VIA BBS CALLSIGN
|
||||
|
||||
RTT_SEQ DB 0 ; SEQUENCE NUMBER BEING TIMED
|
||||
RTT_TIMER DD 0 ; TIME ABOVE SEQUENCE WAS SENT
|
||||
|
||||
PASSWORD DW 0 ; AUTHORISATION CODE FOR REMOTE SYSOP
|
||||
;
|
||||
SESS_APPLFLAGS DB 0 ; APPL FLAGS FOR THIS SESSION
|
||||
|
||||
Authorised_Session DB 0; // Set if Host session from BPQTerminal or BPQMailChat
|
||||
|
||||
DUMPPTR DD 0 ; POINTER FOR REMOTE DUMP MODE
|
||||
PARTCMDBUFFER DD 0 ; Save area for incomplete commmand
|
||||
|
||||
Frequency DD 0 ; If known - for CMS Reporting Hz
|
||||
RMSCall DB 10 DUP (0);
|
||||
Mode DB 0 ; ditto
|
||||
|
||||
UNPROTO DD 0 ; Unproto Mode flag - port number if in unproto mode
|
||||
UAddrLen DD 0 ;
|
||||
UADDRESS DB 64 DUP (0); Unproto Address String - Dest + Digis
|
||||
|
||||
LISTEN DD 0 ; Listen Mode flag - port number of Listen Mode
|
||||
|
||||
APPL DB 16 DUP (0); Set if session initiated by an APPL
|
||||
L4LIMIT dd 0 ; Idle Timout for this session
|
||||
|
||||
TRANSPORTENTRY ENDS
|
||||
;
|
||||
; CIRCUITTYPE EQUATES
|
||||
;
|
||||
L2LINK EQU 1
|
||||
SESSION EQU 10B
|
||||
UPLINK EQU 100B
|
||||
DOWNLINK EQU 1000B
|
||||
BPQHOST EQU 100000B
|
||||
PACTOR EQU 1000000B
|
||||
;
|
||||
; FLAGS EQUATES
|
||||
;
|
||||
DISCPENDING EQU 1000B ; SEND DISC WHEN ALL DATA ACK'ED
|
||||
;
|
||||
; TOP 4 BITS MATCH L4FLAGS BITS - ALSO USED FOR NAKBITS
|
||||
;
|
||||
;L4BUSY EQU 80H ; BNA - DONT SEND ANY MORE
|
||||
;L4NAK EQU 40H ; NEGATIVE RESPONSE FLAG
|
||||
;L4MORE EQU 20H ; MORE DATA FOLLOWS - FRAGMENTATION FLAG
|
||||
|
||||
|
||||
|
||||
DEST_LIST STRUC
|
||||
|
||||
DEST_CHAIN DD ? ; SORTED LIST CHAIN
|
||||
|
||||
DEST_CALL DB 7 DUP (?) ; DESTINATION CALLSIGN (AX25 FORMAT)
|
||||
DEST_ALIAS DB 6 DUP (?)
|
||||
|
||||
DEST_STATE DB ? ; CONTROL BITS - SETTING UP, ACTIVE ETC
|
||||
|
||||
DEST_ROUTE DB ? ; CURRENTY ACTIVE DESTINATION
|
||||
|
||||
INP3FLAGS DB ?
|
||||
|
||||
ROUT1_NEIGHBOUR DD ? ; POINTER TO NEXT NODE IN PATH
|
||||
ROUT1_QUALITY DB ? ; QUALITY
|
||||
ROUT1_OBSCOUNT DB ?
|
||||
db 5 dup (?); Padding
|
||||
|
||||
ROUT2_NEIGHBOUR DD ?
|
||||
ROUT2_QUALITY DB ?
|
||||
ROUT2_OBSCOUNT DB ?
|
||||
db 5 dup (?); Padding
|
||||
|
||||
ROUT3_NEIGHBOUR DD ?
|
||||
ROUT3_QUALITY DB ?
|
||||
ROUT3_OBSCOUNT DB ?
|
||||
db 5 dup (?); Padding
|
||||
|
||||
INPROUT1_NEIGHBOUR DD ?
|
||||
LastRTT1 DW ?; // Last Value Reported
|
||||
RTT1 DW ?; // Current
|
||||
SRTT1 DW ?; // Smoothed RTT
|
||||
Hops1 DB ?;
|
||||
|
||||
INPROUT2_NEIGHBOUR DD ?
|
||||
LastRTT2 DW ?; // Last Value Reported
|
||||
RTT2 DW ?; // Current
|
||||
SRTT2 DW ?; // Smoothed RTT
|
||||
Hops2 DB ?;
|
||||
|
||||
INPROUT3_NEIGHBOUR DD ?
|
||||
LastRTT3 DW ?; // Last Value Reported
|
||||
RTT3 DW ?; // Current
|
||||
SRTT3 DW ?; // Smoothed RTT
|
||||
Hops3 DB ?;
|
||||
DEST_Q DD ? ; QUEUE OF FRAMES FOR THIS DESTINATION
|
||||
|
||||
DEST_RTT DD ? ; SMOOTHED ROUND TRIP TIMER
|
||||
DEST_COUNT DD ? ; FRAMES SENT
|
||||
|
||||
DEST_LIST ENDS
|
||||
|
||||
|
||||
;
|
||||
; MODEFLAG DEFINITIONS
|
||||
;
|
||||
COMMAND EQU 1B
|
||||
TRANS EQU 10B
|
||||
CONV EQU 100B
|
||||
;
|
||||
; APPL DEFINITIONS
|
||||
;
|
||||
BBSAPPL EQU 1B
|
||||
HOSTAPPL EQU 10B
|
||||
SYSOPAPPL EQU 100B
|
||||
;
|
||||
; HOSTFLAG DEFINITIONS
|
||||
;
|
||||
;HOSTMODE EQU 1B ; PK232 HOSTMODE ENABLED
|
||||
;HOSTESCBIT EQU 10B ; IN ESCAPE SEQUENCE
|
||||
;UFQ EQU 100B ; UFQ MODE (IE NOT AA4RE)
|
||||
;POLLED EQU 1000B ; POLL RECEIVED
|
||||
|
||||
;KISSMODE EQU 10000B ; KISS MODE
|
||||
;KISSESC EQU 100000B ; IN ESCAPE SEQUENCE
|
||||
;
|
||||
; APPLFLAGS BITS
|
||||
;
|
||||
CMD_TO_APPL EQU 1B ; PASS COMMAND TO APPLICATION
|
||||
MSG_TO_USER EQU 10B ; SEND 'CONNECTED' TO USER
|
||||
MSG_TO_APPL EQU 100B ; SEND 'CONECTED' TO APPL
|
||||
;
|
||||
; HDLC COMMANDS (WITHOUT P/F)
|
||||
;
|
||||
UI EQU 3
|
||||
SABM EQU 2FH
|
||||
DISC EQU 43H
|
||||
DM EQU 0FH
|
||||
UA EQU 63H
|
||||
FRMR EQU 87H
|
||||
RR EQU 1
|
||||
RNR EQU 5
|
||||
REJ EQU 9
|
||||
;
|
||||
PFBIT EQU 10H ; POLL/FINAL BIT IN CONTROL BYTE
|
||||
;
|
||||
; MH DATA AREA
|
||||
;
|
||||
;MHSTRUC STRUC
|
||||
|
||||
;MHCALL DB 7 DUP (0)
|
||||
;MHTIME DD 0 ; ? FROM BIOS
|
||||
;MHDIGI DB 0
|
||||
;MHFreq DB 12 DUP (0)
|
||||
;MHLocator DB 6 DUP (0)
|
||||
|
||||
;MHSTRUC ENDS
|
||||
|
||||
; Application Calls/Alias Supports multiple L4 application calls
|
||||
|
||||
APPLCALLS STRUC
|
||||
|
||||
APPLCALL DB 7 DUP (0) ; ax.25
|
||||
APPLALIAS_TEXT DB 10 DUP (0) ; TEXT, WITH APPENDED SPACE
|
||||
|
||||
APPLCALL_TEXT DB 10 DUP (0)
|
||||
APPLALIAS DB 6 DUP (0)
|
||||
APFiller DB 0
|
||||
APPLQUAL DW 0
|
||||
APPNODEPOINTER DD 0 ; Pointer to "NODES" entry for this App (if L4)
|
||||
APPLCMDNAME DB 13 DUP (0) ; Command to invoke this APPL
|
||||
APPLHASALIAS DD 0
|
||||
APPLPORT DD 0 ; Port if Appl has an alias
|
||||
APPLALIASPTR DD 0 ; Pointer to Alias if defined
|
||||
|
||||
APPLCALLS ENDS
|
||||
|
||||
; New Style APPL configuration
|
||||
|
||||
APPLCONFIG STRUC
|
||||
|
||||
ACCommand DB 12 DUP (0);
|
||||
ACCommandAlias DB 48 DUP (0);
|
||||
ACApplCall DB 10 DUP (0);
|
||||
ACApplAlias DB 10 DUP (0);
|
||||
ACApplQual DD 0
|
||||
|
||||
APPLCONFIG ENDS
|
||||
;
|
||||
; HARDWARE TYPE EQUATES
|
||||
;
|
||||
KISS EQU 0
|
||||
PC120 EQU 2
|
||||
DRSI EQU 4
|
||||
TOSH EQU 6
|
||||
QUADRAM EQU 8
|
||||
RLC100 EQU 0AH
|
||||
RLC400 EQU 0CH
|
||||
INTERNAL EQU 0EH
|
||||
EXTERNAL EQU 10H
|
||||
BAYCOM EQU 12H
|
||||
PA0HZP EQU 14H
|
||||
|
||||
|
||||
@ -1,840 +0,0 @@
|
||||
|
||||
// Program to start or stop a Software TNC on a remote host
|
||||
|
||||
// Should work with ARDOP, WINMOR or VARA
|
||||
|
||||
// Version 1. 0. 0. 1 June 2013
|
||||
|
||||
// Version 1. 0. 2. 1 April 2018
|
||||
|
||||
// Updated to support running programs with command line parameters
|
||||
// Add option to KILL by program name
|
||||
|
||||
// Version 1. 0. 3. 1 April 2019
|
||||
|
||||
// Add remote rigcontrol feature
|
||||
|
||||
// Version 1. 0. 3. 2 Feb 2020
|
||||
|
||||
// Fix Rigcontol
|
||||
|
||||
// Version 1. 0. 3. 3 Dec 2020
|
||||
|
||||
// Set working directory when starting TNC
|
||||
|
||||
// Version 1. 0. 3. 4 Jan 2021
|
||||
|
||||
// Add trace window
|
||||
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <memory.h>
|
||||
#include <Psapi.h>
|
||||
|
||||
#define BPQICON 400
|
||||
|
||||
#define WSA_READ WM_USER + 1
|
||||
|
||||
HINSTANCE hInst;
|
||||
char AppName[] = "WinmorControl";
|
||||
char Title[80] = "WinmorControl";
|
||||
|
||||
// Foward declarations of functions included in this code module:
|
||||
|
||||
ATOM MyRegisterClass(CONST WNDCLASS*);
|
||||
BOOL InitApplication(HINSTANCE);
|
||||
BOOL InitInstance(HINSTANCE, int);
|
||||
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
|
||||
VOID WINAPI CompletedReadRoutine(DWORD dwErr, DWORD cbBytesRead, LPOVERLAPPED lpOverLap);
|
||||
VOID WINAPI txCompletedReadRoutine(DWORD dwErr, DWORD cbBytesRead, LPOVERLAPPED lpOverLap);
|
||||
VOID CATThread();
|
||||
|
||||
int TimerHandle = 0;
|
||||
|
||||
LOGFONT LFTTYFONT ;
|
||||
|
||||
HFONT hFont;
|
||||
|
||||
struct sockaddr_in sinx;
|
||||
struct sockaddr rx;
|
||||
SOCKET sock;
|
||||
int udpport = 8500;
|
||||
int addrlen = sizeof(struct sockaddr_in);
|
||||
|
||||
BOOL MinimizetoTray=FALSE;
|
||||
|
||||
VOID __cdecl Debugprintf(const char * format, ...)
|
||||
{
|
||||
char Mess[10000];
|
||||
va_list(arglist);
|
||||
va_start(arglist, format);
|
||||
vsprintf(Mess, format, arglist);
|
||||
strcat(Mess, "\r\n");
|
||||
OutputDebugString(Mess);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
char * strlop(char * buf, char delim)
|
||||
{
|
||||
// Terminate buf at delim, and return rest of string
|
||||
|
||||
char * ptr;
|
||||
|
||||
if (buf == NULL) return NULL; // Protect
|
||||
|
||||
ptr = strchr(buf, delim);
|
||||
|
||||
if (ptr == NULL) return NULL;
|
||||
|
||||
*(ptr)++ = 0;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
BOOL KillOldTNC(char * Path)
|
||||
{
|
||||
HANDLE hProc;
|
||||
char ExeName[256] = "";
|
||||
DWORD Pid = 0;
|
||||
|
||||
DWORD Processes[1024], Needed, Count;
|
||||
unsigned int i;
|
||||
|
||||
if (!EnumProcesses(Processes, sizeof(Processes), &Needed))
|
||||
return FALSE;
|
||||
|
||||
// Calculate how many process identifiers were returned.
|
||||
|
||||
Count = Needed / sizeof(DWORD);
|
||||
|
||||
for (i = 0; i < Count; i++)
|
||||
{
|
||||
if (Processes[i] != 0)
|
||||
{
|
||||
hProc = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, Processes[i]);
|
||||
|
||||
if (hProc)
|
||||
{
|
||||
GetModuleFileNameEx(hProc, 0, ExeName, 255);
|
||||
|
||||
if (_memicmp(ExeName, Path, strlen(ExeName)) == 0)
|
||||
{
|
||||
Debugprintf("Killing Pid %d %s", Processes[i], ExeName);
|
||||
TerminateProcess(hProc, 0);
|
||||
CloseHandle(hProc);
|
||||
return TRUE;
|
||||
}
|
||||
CloseHandle(hProc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
KillTNC(int PID)
|
||||
{
|
||||
HANDLE hProc = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID);
|
||||
|
||||
Debugprintf("KillTNC Called Pid %d", PID);
|
||||
|
||||
if (hProc)
|
||||
{
|
||||
TerminateProcess(hProc, 0);
|
||||
CloseHandle(hProc);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
RestartTNC(char * Path)
|
||||
{
|
||||
STARTUPINFO SInfo; // pointer to STARTUPINFO
|
||||
PROCESS_INFORMATION PInfo; // pointer to PROCESS_INFORMATION
|
||||
int i, n = 0;
|
||||
char workingDirectory[256];
|
||||
|
||||
SInfo.cb=sizeof(SInfo);
|
||||
SInfo.lpReserved=NULL;
|
||||
SInfo.lpDesktop=NULL;
|
||||
SInfo.lpTitle=NULL;
|
||||
SInfo.dwFlags=0;
|
||||
SInfo.cbReserved2=0;
|
||||
SInfo.lpReserved2=NULL;
|
||||
|
||||
Debugprintf("RestartTNC Called for %s", Path);
|
||||
|
||||
strcpy(workingDirectory, Path);
|
||||
|
||||
i = strlen(Path);
|
||||
|
||||
while (i--)
|
||||
{
|
||||
if (workingDirectory[i] == '\\' || workingDirectory[i] == '/')
|
||||
{
|
||||
workingDirectory[i] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
while (KillOldTNC(Path) && n++ < 100)
|
||||
{
|
||||
Sleep(100);
|
||||
}
|
||||
|
||||
if (CreateProcess(NULL, Path, NULL, NULL, FALSE,0 ,NULL ,workingDirectory, &SInfo, &PInfo))
|
||||
Debugprintf("Restart TNC OK");
|
||||
else
|
||||
Debugprintf("Restart TNC Failed %d ", GetLastError());
|
||||
}
|
||||
char * RigPort = NULL;
|
||||
char * RigSpeed = NULL;
|
||||
HANDLE RigHandle = 0;
|
||||
int RigType = 0; // Flag for possible RTS/DTR
|
||||
|
||||
#define RTS 1
|
||||
#define DTR 2
|
||||
|
||||
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
if (lpCmdLine[0])
|
||||
{
|
||||
// Port Name and Speed for Remote CAT
|
||||
|
||||
RigPort = _strdup(lpCmdLine);
|
||||
RigSpeed = strlop(RigPort, ':');
|
||||
}
|
||||
|
||||
if (!InitApplication(hInstance))
|
||||
return (FALSE);
|
||||
|
||||
if (!InitInstance(hInstance, nCmdShow))
|
||||
return (FALSE);
|
||||
|
||||
|
||||
// Main message loop:
|
||||
|
||||
while (GetMessage(&msg, NULL, 0, 0))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
KillTimer(NULL, TimerHandle);
|
||||
|
||||
return (msg.wParam);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
//
|
||||
// FUNCTION: InitApplication(HANDLE)
|
||||
//
|
||||
// PURPOSE: Initializes window data and registers window class
|
||||
//
|
||||
// COMMENTS:
|
||||
//
|
||||
// In this function, we initialize a window class by filling out a data
|
||||
// structure of type WNDCLASS and calling either RegisterClass or
|
||||
// the internal MyRegisterClass.
|
||||
//
|
||||
BOOL InitApplication(HINSTANCE hInstance)
|
||||
{
|
||||
WNDCLASS wc;
|
||||
|
||||
// Fill in window class structure with parameters that describe
|
||||
// the main window.
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wc.lpfnWndProc = (WNDPROC)WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(BPQICON));
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||
|
||||
// wc.lpszMenuName = MAKEINTRESOURCE(BPQMENU) ;
|
||||
|
||||
wc.lpszClassName = AppName;
|
||||
|
||||
// Register the window class and return success/failure code.
|
||||
|
||||
return RegisterClass(&wc);
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// FUNCTION: InitInstance(HANDLE, int)
|
||||
//
|
||||
// PURPOSE: Saves instance handle and creates main window
|
||||
//
|
||||
// COMMENTS:
|
||||
//
|
||||
// In this function, we save the instance handle in a global variable and
|
||||
// create and display the main program window.
|
||||
//
|
||||
|
||||
HFONT FAR PASCAL MyCreateFont( void )
|
||||
{
|
||||
CHOOSEFONT cf;
|
||||
LOGFONT lf;
|
||||
HFONT hfont;
|
||||
|
||||
// Initialize members of the CHOOSEFONT structure.
|
||||
|
||||
cf.lStructSize = sizeof(CHOOSEFONT);
|
||||
cf.hwndOwner = (HWND)NULL;
|
||||
cf.hDC = (HDC)NULL;
|
||||
cf.lpLogFont = &lf;
|
||||
cf.iPointSize = 0;
|
||||
cf.Flags = CF_SCREENFONTS | CF_FIXEDPITCHONLY;
|
||||
cf.rgbColors = RGB(0,0,0);
|
||||
cf.lCustData = 0L;
|
||||
cf.lpfnHook = (LPCFHOOKPROC)NULL;
|
||||
cf.lpTemplateName = (LPSTR)NULL;
|
||||
cf.hInstance = (HINSTANCE) NULL;
|
||||
cf.lpszStyle = (LPSTR)NULL;
|
||||
cf.nFontType = SCREEN_FONTTYPE;
|
||||
cf.nSizeMin = 0;
|
||||
cf.nSizeMax = 0;
|
||||
|
||||
// Display the CHOOSEFONT common-dialog box.
|
||||
|
||||
ChooseFont(&cf);
|
||||
|
||||
// Create a logical font based on the user's
|
||||
// selection and return a handle identifying
|
||||
// that font.
|
||||
|
||||
hfont = CreateFontIndirect(cf.lpLogFont);
|
||||
return (hfont);
|
||||
}
|
||||
|
||||
VOID COMSetDTR(HANDLE fd)
|
||||
{
|
||||
EscapeCommFunction(fd, SETDTR);
|
||||
}
|
||||
|
||||
VOID COMClearDTR(HANDLE fd)
|
||||
{
|
||||
EscapeCommFunction(fd, CLRDTR);
|
||||
}
|
||||
|
||||
VOID COMSetRTS(HANDLE fd)
|
||||
{
|
||||
EscapeCommFunction(fd, SETRTS);
|
||||
}
|
||||
|
||||
VOID COMClearRTS(HANDLE fd)
|
||||
{
|
||||
EscapeCommFunction(fd, CLRRTS);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
OVERLAPPED txOverlapped;
|
||||
|
||||
HANDLE txEvent;
|
||||
|
||||
char RXBuffer[1024];
|
||||
int RXLen;
|
||||
|
||||
int ReadCOMBlock(HANDLE fd, char * Block, int MaxLength)
|
||||
{
|
||||
BOOL fReadStat ;
|
||||
COMSTAT ComStat ;
|
||||
DWORD dwErrorFlags;
|
||||
DWORD dwLength;
|
||||
BOOL ret;
|
||||
|
||||
// only try to read number of bytes in queue
|
||||
|
||||
ret = ClearCommError(fd, &dwErrorFlags, &ComStat);
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
int Err = GetLastError();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
dwLength = min((DWORD) MaxLength, ComStat.cbInQue);
|
||||
|
||||
if (dwLength > 0)
|
||||
{
|
||||
fReadStat = ReadFile(fd, Block, dwLength, &dwLength, NULL) ;
|
||||
|
||||
if (!fReadStat)
|
||||
{
|
||||
dwLength = 0 ;
|
||||
ClearCommError(fd, &dwErrorFlags, &ComStat ) ;
|
||||
}
|
||||
}
|
||||
|
||||
return dwLength;
|
||||
}
|
||||
|
||||
|
||||
BOOL WriteCOMBlock(HANDLE fd, char * Block, int BytesToWrite)
|
||||
{
|
||||
BOOL fWriteStat;
|
||||
DWORD BytesWritten;
|
||||
DWORD ErrorFlags;
|
||||
COMSTAT ComStat;
|
||||
int Err, txLength;
|
||||
|
||||
Err = WaitForSingleObject(txEvent, 1000);
|
||||
|
||||
if (Err == WAIT_TIMEOUT)
|
||||
{
|
||||
Debugprintf("TX Event Wait Timout");
|
||||
}
|
||||
else
|
||||
{
|
||||
ResetEvent(txEvent);
|
||||
Err = GetOverlappedResult(RigHandle, &txOverlapped, &txLength, FALSE);
|
||||
}
|
||||
|
||||
memset(&txOverlapped, 0, sizeof(OVERLAPPED));
|
||||
txOverlapped.hEvent = txEvent;
|
||||
|
||||
fWriteStat = WriteFile(fd, Block, BytesToWrite,
|
||||
&BytesWritten, &txOverlapped);
|
||||
|
||||
if (!fWriteStat)
|
||||
{
|
||||
Err = GetLastError();
|
||||
|
||||
if (Err != ERROR_IO_PENDING)
|
||||
{
|
||||
ClearCommError(fd, &ErrorFlags, &ComStat);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
HANDLE OpenCOMPort(char * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits)
|
||||
{
|
||||
char szPort[80];
|
||||
BOOL fRetVal ;
|
||||
COMMTIMEOUTS CommTimeOuts ;
|
||||
char buf[100];
|
||||
HANDLE fd;
|
||||
DCB dcb;
|
||||
|
||||
sprintf( szPort, "\\\\.\\%s", pPort);
|
||||
|
||||
// open COMM device
|
||||
|
||||
fd = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
|
||||
0, // exclusive access
|
||||
NULL, // no security attrs
|
||||
OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
||||
NULL );
|
||||
|
||||
|
||||
if (fd == (HANDLE) -1)
|
||||
{
|
||||
char Msg[80];
|
||||
|
||||
sprintf(Msg, "%s could not be opened - Error %d", pPort, GetLastError());
|
||||
MessageBox(NULL, Msg, "WinmorControl", MB_OK);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// setup device buffers
|
||||
|
||||
SetupComm(fd, 4096, 4096);
|
||||
|
||||
// purge any information in the buffer
|
||||
|
||||
PurgeComm(fd, PURGE_TXABORT | PURGE_RXABORT |
|
||||
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
|
||||
|
||||
// set up for overlapped I/O
|
||||
|
||||
CommTimeOuts.ReadIntervalTimeout = 20;
|
||||
CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
|
||||
CommTimeOuts.ReadTotalTimeoutConstant = 0 ;
|
||||
CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ;
|
||||
// CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
|
||||
CommTimeOuts.WriteTotalTimeoutConstant = 500 ;
|
||||
|
||||
SetCommTimeouts(fd, &CommTimeOuts);
|
||||
|
||||
dcb.DCBlength = sizeof(DCB);
|
||||
|
||||
GetCommState(fd, &dcb);
|
||||
|
||||
dcb.BaudRate = speed;
|
||||
dcb.ByteSize = 8;
|
||||
dcb.Parity = 0;
|
||||
dcb.StopBits = TWOSTOPBITS;
|
||||
dcb.StopBits = Stopbits;
|
||||
|
||||
// setup hardware flow control
|
||||
|
||||
dcb.fOutxDsrFlow = 0;
|
||||
dcb.fDtrControl = DTR_CONTROL_DISABLE ;
|
||||
|
||||
dcb.fOutxCtsFlow = 0;
|
||||
dcb.fRtsControl = RTS_CONTROL_DISABLE ;
|
||||
|
||||
// setup software flow control
|
||||
|
||||
dcb.fInX = dcb.fOutX = 0;
|
||||
dcb.XonChar = 0;
|
||||
dcb.XoffChar = 0;
|
||||
dcb.XonLim = 100 ;
|
||||
dcb.XoffLim = 100 ;
|
||||
|
||||
// other various settings
|
||||
|
||||
dcb.fBinary = TRUE ;
|
||||
dcb.fParity = FALSE;
|
||||
|
||||
fRetVal = SetCommState(fd, &dcb);
|
||||
|
||||
if (fRetVal)
|
||||
{
|
||||
if (SetDTR)
|
||||
EscapeCommFunction(fd, SETDTR);
|
||||
else
|
||||
EscapeCommFunction(fd, CLRDTR);
|
||||
|
||||
if (SetRTS)
|
||||
EscapeCommFunction(fd, SETRTS);
|
||||
else
|
||||
EscapeCommFunction(fd, CLRRTS);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(buf,"%s Setup Failed %d ", pPort, GetLastError());
|
||||
OutputDebugString(buf);
|
||||
CloseHandle(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
txEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
|
||||
// Start Read Thread
|
||||
|
||||
_beginthread(CATThread, 0, 0);
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID CloseCOMPort(HANDLE fd)
|
||||
{
|
||||
SetCommMask(fd, 0);
|
||||
|
||||
// drop DTR
|
||||
|
||||
COMClearDTR(fd);
|
||||
|
||||
// purge any outstanding reads/writes and close device handle
|
||||
|
||||
PurgeComm(fd, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
|
||||
|
||||
CloseHandle(fd);
|
||||
}
|
||||
|
||||
HWND hMonitor;
|
||||
|
||||
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
||||
{
|
||||
HWND hWnd;
|
||||
u_long param=1;
|
||||
BOOL bcopt=TRUE;
|
||||
char Msg[255];
|
||||
int ret, err;
|
||||
WSADATA WsaData; // receives data from WSAStartup
|
||||
|
||||
|
||||
hInst = hInstance; // Store instance handle in our global variable
|
||||
|
||||
WSAStartup(MAKEWORD(2, 0), &WsaData);
|
||||
|
||||
hWnd = CreateWindow(AppName, Title, WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT, 0, 420,275,
|
||||
NULL, NULL, hInstance, NULL);
|
||||
|
||||
if (!hWnd) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
// setup default font information
|
||||
|
||||
LFTTYFONT.lfHeight = 12;
|
||||
LFTTYFONT.lfWidth = 8 ;
|
||||
LFTTYFONT.lfEscapement = 0 ;
|
||||
LFTTYFONT.lfOrientation = 0 ;
|
||||
LFTTYFONT.lfWeight = 0 ;
|
||||
LFTTYFONT.lfItalic = 0 ;
|
||||
LFTTYFONT.lfUnderline = 0 ;
|
||||
LFTTYFONT.lfStrikeOut = 0 ;
|
||||
LFTTYFONT.lfCharSet = OEM_CHARSET ;
|
||||
LFTTYFONT.lfOutPrecision = OUT_DEFAULT_PRECIS ;
|
||||
LFTTYFONT.lfClipPrecision = CLIP_DEFAULT_PRECIS ;
|
||||
LFTTYFONT.lfQuality = DEFAULT_QUALITY ;
|
||||
LFTTYFONT.lfPitchAndFamily = FIXED_PITCH | FF_MODERN ;
|
||||
lstrcpy( LFTTYFONT.lfFaceName, "Fixedsys" ) ;
|
||||
|
||||
hFont = CreateFontIndirect(&LFTTYFONT) ;
|
||||
// hFont = MyCreateFont();
|
||||
|
||||
SetWindowText(hWnd,Title);
|
||||
|
||||
|
||||
hMonitor = CreateWindowEx(0, "LISTBOX", "", WS_CHILD | WS_VISIBLE | LBS_NOINTEGRALHEIGHT |
|
||||
LBS_DISABLENOSCROLL | WS_HSCROLL | WS_VSCROLL,
|
||||
2,2,400,230, hWnd, NULL, hInstance, NULL);
|
||||
|
||||
|
||||
|
||||
ShowWindow(hWnd, nCmdShow);
|
||||
|
||||
sock = socket(AF_INET,SOCK_DGRAM,0);
|
||||
|
||||
if (sock == INVALID_SOCKET)
|
||||
{
|
||||
err = WSAGetLastError();
|
||||
sprintf(Msg, "Failed to create UDP socket - error code = %d", err);
|
||||
MessageBox(NULL, Msg, "WinmorControl", MB_OK);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (WSAAsyncSelect(sock, hWnd, WSA_READ, FD_READ) > 0)
|
||||
{
|
||||
wsprintf(Msg, TEXT("WSAAsyncSelect failed Error %d"), WSAGetLastError());
|
||||
|
||||
MessageBox(hWnd, Msg, TEXT("WinmorControl"), MB_OK);
|
||||
|
||||
closesocket(sock);
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
// ioctlsocket (sock, FIONBIO, ¶m);
|
||||
|
||||
setsockopt (sock,SOL_SOCKET,SO_BROADCAST,(const char FAR *)&bcopt,4);
|
||||
|
||||
sinx.sin_family = AF_INET;
|
||||
sinx.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
sinx.sin_port = htons(udpport);
|
||||
|
||||
ret = bind(sock, (struct sockaddr *) &sinx, sizeof(sinx));
|
||||
|
||||
if (ret != 0)
|
||||
{
|
||||
// Bind Failed
|
||||
|
||||
err = WSAGetLastError();
|
||||
sprintf(Msg, "Bind Failed for UDP socket - error code = %d", err);
|
||||
MessageBox(NULL, Msg, "WinmorControl", MB_OK);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (RigPort)
|
||||
{
|
||||
int Speed = 9600;
|
||||
|
||||
if (RigSpeed)
|
||||
Speed = atoi(RigSpeed);
|
||||
|
||||
RigHandle = OpenCOMPort(RigPort, Speed, FALSE, FALSE, FALSE, TWOSTOPBITS);
|
||||
|
||||
if (RigHandle)
|
||||
{
|
||||
if (RigType == RTS)
|
||||
COMClearRTS(RigHandle);
|
||||
else
|
||||
COMSetRTS(RigHandle);
|
||||
|
||||
if (RigType == DTR)
|
||||
COMClearDTR(RigHandle);
|
||||
else
|
||||
COMSetDTR(RigHandle);
|
||||
}
|
||||
else
|
||||
return FALSE; // Open Failed
|
||||
}
|
||||
|
||||
TimerHandle = SetTimer(hWnd, 1, 100, NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void Trace(char * Msg)
|
||||
{
|
||||
int index = SendMessage(hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) Msg);
|
||||
|
||||
if (index > 1200)
|
||||
do
|
||||
index=index=SendMessage(hMonitor, LB_DELETESTRING, 0, 0);
|
||||
while (index > 1000);
|
||||
|
||||
if (index > -1)
|
||||
index=SendMessage(hMonitor, LB_SETCARETINDEX,(WPARAM) index, MAKELPARAM(FALSE, 0));
|
||||
}
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int wmId, wmEvent;
|
||||
char Msg[256];
|
||||
int len;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WSA_READ: // Notification on data socket
|
||||
|
||||
len = recvfrom(sock, Msg, 256, 0, &rx, &addrlen);
|
||||
|
||||
if (len <= 0)
|
||||
return 0;
|
||||
|
||||
Msg[len] = 0;
|
||||
|
||||
|
||||
if (_memicmp(Msg, "REMOTE:", 7) == 0)
|
||||
{
|
||||
Trace(Msg);
|
||||
RestartTNC(&Msg[7]);
|
||||
}
|
||||
else
|
||||
if (_memicmp(Msg, "KILL ", 5) == 0)
|
||||
{
|
||||
Trace(Msg);
|
||||
KillTNC(atoi(&Msg[5]));
|
||||
}
|
||||
else
|
||||
if (_memicmp(Msg, "KILLBYNAME ", 11) == 0)
|
||||
{
|
||||
Trace(Msg);
|
||||
KillOldTNC(&Msg[11]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Anything else is Rig Control
|
||||
|
||||
len = WriteCOMBlock(RigHandle, Msg, len);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case WM_SYSCOMMAND:
|
||||
|
||||
wmId = LOWORD(wParam); // Remember, these are...
|
||||
wmEvent = HIWORD(wParam); // ...different for Win32!
|
||||
|
||||
switch (wmId) {
|
||||
|
||||
|
||||
case SC_MINIMIZE:
|
||||
|
||||
if (MinimizetoTray)
|
||||
|
||||
return ShowWindow(hWnd, SW_HIDE);
|
||||
else
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
}
|
||||
|
||||
|
||||
case WM_CLOSE:
|
||||
|
||||
PostQuitMessage(0);
|
||||
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
BOOL EndCATThread = FALSE;
|
||||
|
||||
VOID CATThread()
|
||||
{
|
||||
DWORD dwLength = 0;
|
||||
int Length, ret;
|
||||
HANDLE Event;
|
||||
OVERLAPPED Overlapped;
|
||||
|
||||
EndCATThread = FALSE;
|
||||
|
||||
Event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
|
||||
memset(&Overlapped, 0, sizeof(OVERLAPPED));
|
||||
Overlapped.hEvent = Event;
|
||||
|
||||
ReadFile(RigHandle, RXBuffer, 1024, &RXLen, &Overlapped);
|
||||
|
||||
while (EndCATThread == FALSE)
|
||||
{
|
||||
ret = WaitForSingleObject(Event, 10000);
|
||||
|
||||
if (ret == WAIT_TIMEOUT)
|
||||
{
|
||||
if (EndCATThread)
|
||||
{
|
||||
CancelIo(RigHandle);
|
||||
CloseHandle(RigHandle);
|
||||
RigHandle = INVALID_HANDLE_VALUE;
|
||||
CloseHandle(Event);
|
||||
EndCATThread = FALSE;
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
ResetEvent(Event);
|
||||
|
||||
ret = GetOverlappedResult(RigHandle, &Overlapped, &Length, FALSE);
|
||||
|
||||
if (ret && Length)
|
||||
{
|
||||
// got something so send to BPQ
|
||||
|
||||
sendto(sock, RXBuffer, Length, 0, &rx, sizeof(struct sockaddr));
|
||||
}
|
||||
|
||||
memset(&Overlapped, 0, sizeof(OVERLAPPED));
|
||||
Overlapped.hEvent = Event;
|
||||
|
||||
ReadFile(RigHandle, RXBuffer, 1024, &RXLen, &Overlapped);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,62 +0,0 @@
|
||||
// CmdLineAuth.cpp : Defines the entry point for the console application.
|
||||
//
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#define _USE_32BIT_TIME_T
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "md5.c"
|
||||
|
||||
|
||||
VOID CreateOneTimePassword(char * KeyPhrase)
|
||||
{
|
||||
// Create a time dependent One Time Password from the KeyPhrase
|
||||
|
||||
time_t NOW = time(NULL);
|
||||
unsigned char Hash[16];
|
||||
char Password[20];
|
||||
char Key[1000];
|
||||
int i, chr;
|
||||
long long Val;
|
||||
int PassCode;
|
||||
|
||||
NOW = NOW/30; // Only Change every 30 secs
|
||||
|
||||
sprintf(Key, "%s%x", KeyPhrase, NOW);
|
||||
|
||||
md5(Key, Hash);
|
||||
|
||||
for (i=0; i<16; i++)
|
||||
{
|
||||
chr = (Hash[i] & 31);
|
||||
if (chr > 9) chr += 7;
|
||||
|
||||
Password[i] = chr + 48;
|
||||
}
|
||||
|
||||
Password[16] = 0;
|
||||
|
||||
memcpy(&Val, Password, 8);
|
||||
PassCode = Val % 1000000;
|
||||
printf("Passcode is %06d\n", PassCode);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
if (argc < 2)
|
||||
{
|
||||
printf ("Need to supply KeyPhrase\n");
|
||||
return 0;
|
||||
}
|
||||
CreateOneTimePassword(argv[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1,41 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2015 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
|
||||
|
||||
|
||||
//int SENDNODES() {return 0;}
|
||||
//int BYECMD() {return 0;}
|
||||
//int CMDR00() {return 0;}
|
||||
|
||||
//int DoNetromConnect() {return 0;}
|
||||
|
||||
|
||||
//int CMDC00() {return 0;}
|
||||
|
||||
|
||||
|
||||
//int CheckReceivedData() {return 0;}
|
||||
//int GetLastError() {return 0;}
|
||||
|
||||
|
||||
|
||||
@ -1,434 +0,0 @@
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#ifndef NOMQTT
|
||||
|
||||
#include "MQTTAsync.h"
|
||||
#ifndef WIN32
|
||||
#include <jansson.h>
|
||||
#endif
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "asmstrucs.h"
|
||||
#include "mqtt.h"
|
||||
|
||||
extern int MQTT_Connecting;
|
||||
extern int MQTT_Connected;
|
||||
|
||||
|
||||
DllExport int APIENTRY MQTTSend(char * topic, char * Msg, int MsgLen);
|
||||
|
||||
MQTTAsync client = NULL;
|
||||
|
||||
time_t MQTTLastStatus = 0;
|
||||
|
||||
void MQTTSendStatus()
|
||||
{
|
||||
char topic[256];
|
||||
char payload[128];
|
||||
|
||||
sprintf(topic, "PACKETNODE/%s", NODECALLLOPPED);
|
||||
strcpy(payload,"{\"status\":\"online\"}");
|
||||
|
||||
MQTTSend(topic, payload, strlen(payload));
|
||||
MQTTLastStatus = time(NULL);
|
||||
}
|
||||
|
||||
void MQTTTimer()
|
||||
{
|
||||
if (MQTT_Connecting == 0 && MQTT_Connected == 0)
|
||||
MQTTConnect(MQTT_HOST, MQTT_PORT, MQTT_USER, MQTT_PASS);
|
||||
|
||||
if ((time(NULL) - MQTTLastStatus) > 1800)
|
||||
MQTTSendStatus();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void MQTTDisconnect()
|
||||
{
|
||||
if (MQTT_Connected)
|
||||
{
|
||||
MQTTAsync_disconnectOptions disc_opts = MQTTAsync_disconnectOptions_initializer;
|
||||
|
||||
MQTTAsync_disconnect(client, &disc_opts);
|
||||
|
||||
MQTT_Connecting = MQTT_Connected = 0;
|
||||
|
||||
// Try to recconect. If it fails system will rety every minute
|
||||
|
||||
MQTTConnect(MQTT_HOST, MQTT_PORT, MQTT_USER, MQTT_PASS);
|
||||
}
|
||||
}
|
||||
|
||||
DllExport int APIENTRY MQTTSend(char * topic, char * Msg, int MsgLen)
|
||||
{
|
||||
int rc;
|
||||
|
||||
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
|
||||
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
|
||||
|
||||
pubmsg.payload = Msg;
|
||||
pubmsg.payloadlen = MsgLen;
|
||||
rc = MQTTAsync_sendMessage(client, topic, &pubmsg, &opts);
|
||||
|
||||
if (rc)
|
||||
MQTTDisconnect();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void onConnect(void* context, MQTTAsync_successData* response)
|
||||
{
|
||||
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
|
||||
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
|
||||
|
||||
MQTT_Connecting = 0;
|
||||
MQTT_Connected = 1;
|
||||
|
||||
printf("Successful MQTT connection\n");
|
||||
|
||||
// Send start up message
|
||||
|
||||
MQTTSendStatus();
|
||||
|
||||
}
|
||||
|
||||
void onConnectFailure(void* context, MQTTAsync_failureData* response)
|
||||
{
|
||||
printf("MQTT connection failed, rc %d\n", response ? response->code : 0);
|
||||
MQTT_Connecting = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char* jsonEncodeMessage(MESSAGE *msg)
|
||||
{
|
||||
char From[10];
|
||||
char To[10];
|
||||
|
||||
char buffer[1024];
|
||||
unsigned long long SaveMMASK = MMASK;
|
||||
BOOL SaveMTX = MTX;
|
||||
BOOL SaveMCOM = MCOM;
|
||||
BOOL SaveMUI = MUIONLY;
|
||||
int len;
|
||||
char *msg_str;
|
||||
char payload_timestamp[16];
|
||||
|
||||
struct tm * TM = localtime(&msg->Timestamp);
|
||||
sprintf(payload_timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
|
||||
|
||||
|
||||
IntSetTraceOptionsEx(MMASK, TRUE, TRUE, FALSE);
|
||||
From[ConvFromAX25(msg->ORIGIN, From)] = 0;
|
||||
To[ConvFromAX25(msg->DEST, To)] = 0;
|
||||
|
||||
len = IntDecodeFrame(msg, buffer, msg->Timestamp, 0xffffffffffffffff, FALSE, FALSE);
|
||||
IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI);
|
||||
|
||||
buffer[len] = 0;
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
msg_str = zalloc(2048);
|
||||
|
||||
sprintf(msg_str, "{\"from\": \"%s\", \"to\": \"%s\", \"payload\": \"%s\", \"port\": %d, \"timestamp\": \"%s\"}",
|
||||
From, To, buffer, msg->PORT, payload_timestamp);
|
||||
|
||||
#else
|
||||
|
||||
json_t *root;
|
||||
|
||||
root = json_object();
|
||||
|
||||
json_object_set_new(root, "from", json_string(From));
|
||||
json_object_set_new(root, "to", json_string(To));
|
||||
|
||||
|
||||
json_object_set_new(root, "payload", json_string(buffer));
|
||||
json_object_set_new(root, "port", json_integer(msg->PORT));
|
||||
sprintf(payload_timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
|
||||
json_object_set_new(root, "timestamp", json_string(payload_timestamp));
|
||||
msg_str = json_dumps(root, 0);
|
||||
json_decref(root);
|
||||
|
||||
#endif
|
||||
|
||||
return msg_str;
|
||||
}
|
||||
|
||||
void MQTTKISSTX(void *message)
|
||||
{
|
||||
MESSAGE *msg = (MESSAGE *)message;
|
||||
char topic[256];
|
||||
char *msg_str;
|
||||
|
||||
sprintf(topic, "PACKETNODE/ax25/trace/bpqformat/%s/sent/%d", NODECALLLOPPED, msg->PORT);
|
||||
|
||||
msg_str = jsonEncodeMessage(msg);
|
||||
|
||||
MQTTSend(topic, msg_str, strlen(msg_str));
|
||||
|
||||
free(msg_str);
|
||||
}
|
||||
|
||||
void MQTTKISSTX_RAW(char* buffer, int bufferLength, void* PORT)
|
||||
{
|
||||
PPORTCONTROL PPORT = (PPORTCONTROL)PORT;
|
||||
char topic[256];
|
||||
|
||||
sprintf(topic, "PACKETNODE/kiss/%s/sent/%d", NODECALLLOPPED, PPORT->PORTNUMBER);
|
||||
|
||||
MQTTSend(topic, buffer, bufferLength);
|
||||
}
|
||||
|
||||
|
||||
void MQTTKISSRX(void *message)
|
||||
{
|
||||
MESSAGE *msg = (MESSAGE *)message;
|
||||
char topic[256];
|
||||
char *msg_str;
|
||||
|
||||
|
||||
sprintf(topic, "PACKETNODE/ax25/trace/bpqformat/%s/rcvd/%d", NODECALLLOPPED, msg->PORT);
|
||||
msg_str = jsonEncodeMessage(msg);
|
||||
|
||||
MQTTSend(topic, msg_str, strlen(msg_str));
|
||||
|
||||
free(msg_str);
|
||||
}
|
||||
|
||||
void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT)
|
||||
{
|
||||
PPORTCONTROL PPORT = (PPORTCONTROL)PORT;
|
||||
char topic[256];
|
||||
|
||||
sprintf(topic, "PACKETNODE/kiss/%s/rcvd/%d", NODECALLLOPPED, PPORT->PORTNUMBER);
|
||||
|
||||
MQTTSend(topic, buffer, bufferLength);
|
||||
|
||||
}
|
||||
|
||||
void MQTTReportSession(char * Msg)
|
||||
{
|
||||
char topic[256];
|
||||
sprintf(topic, "PACKETNODE/stats/session/%s", NODECALLLOPPED);
|
||||
|
||||
MQTTSend(topic, Msg, strlen(Msg));
|
||||
}
|
||||
|
||||
|
||||
char* replace(char* str, char* a, char* b)
|
||||
{
|
||||
int len = strlen(str);
|
||||
int lena = strlen(a), lenb = strlen(b);
|
||||
char * p;
|
||||
|
||||
for (p = str; p = strstr(p, a); p) {
|
||||
if (lena != lenb) // shift end as needed
|
||||
memmove(p + lenb, p + lena,
|
||||
len - (p - str) + lenb);
|
||||
memcpy(p, b, lenb);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
int MQTTPublish(void *message, char *topic)
|
||||
{
|
||||
MESSAGE *msg = (MESSAGE *)message;
|
||||
char From[10];
|
||||
char To[10];
|
||||
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
|
||||
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
|
||||
|
||||
unsigned long long SaveMMASK = MMASK;
|
||||
BOOL SaveMTX = MTX;
|
||||
BOOL SaveMCOM = MCOM;
|
||||
BOOL SaveMUI = MUIONLY;
|
||||
int len;
|
||||
char* replaced_buffer;
|
||||
char buffer[1024];
|
||||
|
||||
time_t timestamp = msg->Timestamp;
|
||||
|
||||
|
||||
From[ConvFromAX25(msg->ORIGIN, From)] = 0;
|
||||
To[ConvFromAX25(msg->DEST, To)] = 0;
|
||||
|
||||
|
||||
IntSetTraceOptionsEx(8, TRUE, TRUE, FALSE);
|
||||
len = IntDecodeFrame(msg, buffer, timestamp, 1, FALSE, FALSE);
|
||||
IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI);
|
||||
|
||||
// MQTT _really_ doesn't like \r, so replace it with something
|
||||
// that is at least human readable
|
||||
|
||||
replaced_buffer = replace(buffer, "\r", "\r\n");
|
||||
|
||||
pubmsg.payload = replaced_buffer;
|
||||
pubmsg.payloadlen = strlen(replaced_buffer);
|
||||
|
||||
printf("%s\n", replaced_buffer);
|
||||
|
||||
return MQTTAsync_sendMessage(client, topic, &pubmsg, &opts);
|
||||
}
|
||||
|
||||
int MQTTConnect(char* host, int port, char* user, char* pass)
|
||||
{
|
||||
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
|
||||
int rc;
|
||||
char hostString[256];
|
||||
|
||||
sprintf(hostString, "tcp://%s:%d", host, port);
|
||||
|
||||
printf("MQTT Connect to %s\n", hostString);
|
||||
|
||||
rc = MQTTAsync_create(&client, hostString, NODECALLLOPPED, MQTTCLIENT_PERSISTENCE_NONE, NULL);
|
||||
|
||||
if (rc != MQTTASYNC_SUCCESS)
|
||||
{
|
||||
printf("Failed to create client, return code %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
conn_opts.keepAliveInterval = 20;
|
||||
conn_opts.cleansession = 1;
|
||||
conn_opts.username = user;
|
||||
conn_opts.password = pass;
|
||||
conn_opts.onSuccess = onConnect;
|
||||
conn_opts.onFailure = onConnectFailure;
|
||||
// conn_opts.automaticReconnect = 1;
|
||||
// conn_opts.minRetryInterval = 30;
|
||||
// conn_opts.maxRetryInterval = 300;
|
||||
|
||||
rc = MQTTAsync_connect(client, &conn_opts);
|
||||
|
||||
if (rc != MQTTASYNC_SUCCESS)
|
||||
{
|
||||
printf("Failed to start connect, return code %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
MQTT_Connecting = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Message Database Entry. Designed to be compatible with FBB
|
||||
|
||||
#define NBBBS 160 // Max BBSes we can forward to. Must be Multiple of 8, and must be 80 for FBB compatibliliy
|
||||
#define NBMASK NBBBS/8 // Number of bytes in Forward bitlists.
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
struct MsgInfo
|
||||
{
|
||||
char type;
|
||||
char status;
|
||||
int number;
|
||||
int length;
|
||||
int xdatereceived;
|
||||
char bbsfrom[7]; // ? BBS we got it from ?
|
||||
char via[41];
|
||||
char from[7];
|
||||
char to[7];
|
||||
char bid[13];
|
||||
char title[61];
|
||||
int nntpnum; // Number within topic (ie Bull TO Addr) - used for nntp
|
||||
|
||||
UCHAR B2Flags; // Not all flags specific to B2
|
||||
|
||||
#define B2Msg 1 // Set if Message File is a formatted B2 message
|
||||
#define Attachments 2 // Set if B2 message has attachments
|
||||
#define FromPaclink 4
|
||||
#define FromCMS 8
|
||||
#define FromRMSExpress 16
|
||||
#define RadioOnlyMsg 32 // Received using call-T
|
||||
#define RadioOnlyFwd 64 // Received using call-R
|
||||
#define WarnNotForwardedSent 128
|
||||
|
||||
int xdatecreated;
|
||||
int xdatechanged;
|
||||
UCHAR fbbs[NBMASK];
|
||||
UCHAR forw[NBMASK];
|
||||
char emailfrom[41];
|
||||
char Locked; // Set if selected for sending (NTS Pickup)
|
||||
char Defered; // FBB response '=' received
|
||||
UCHAR UTF8; // Set if Message is in UTF8 (ie from POP/SMTP)
|
||||
|
||||
// For 64 bit time_t compatibility define as long long
|
||||
// (so struct is same with 32 or 64 bit time_t)
|
||||
|
||||
int64_t datereceived;
|
||||
int64_t datecreated;
|
||||
int64_t datechanged;
|
||||
|
||||
char Spare[61 - 24]; // For future use
|
||||
} ;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
void MQTTMessageEvent(void* message)
|
||||
{
|
||||
struct MsgInfo* msg = (struct MsgInfo *)message;
|
||||
char *msg_str;
|
||||
char * ptr;
|
||||
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
|
||||
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
|
||||
char topic[256];
|
||||
|
||||
json_t *root = json_object();
|
||||
json_object_set_new(root, "id", json_integer(msg->number));
|
||||
json_object_set_new(root, "size", json_integer(msg->length));
|
||||
json_object_set_new(root, "type", json_string(msg->type == 'P' ? "P" : "B"));
|
||||
json_object_set_new(root, "to", json_string(msg->to));
|
||||
json_object_set_new(root, "from", json_string(msg->from));
|
||||
json_object_set_new(root, "subj", json_string(msg->title));
|
||||
|
||||
switch(msg->status) {
|
||||
case 'N':
|
||||
json_object_set_new(root, "event", json_string("newmsg"));
|
||||
break;
|
||||
case 'F':
|
||||
json_object_set_new(root, "event", json_string("fwded"));
|
||||
break;
|
||||
case 'R':
|
||||
json_object_set_new(root, "event", json_string("read"));
|
||||
break;
|
||||
case 'K':
|
||||
json_object_set_new(root, "event", json_string("killed"));
|
||||
break;
|
||||
}
|
||||
|
||||
msg_str = json_dumps(root, 0);
|
||||
|
||||
pubmsg.payload = msg_str;
|
||||
pubmsg.payloadlen = strlen(msg_str);
|
||||
|
||||
|
||||
sprintf(topic, "PACKETNODE/event/%s/pmsg", NODECALLLOPPED);
|
||||
|
||||
MQTTAsync_sendMessage(client, topic, &pubmsg, &opts);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// Dummies ofr build without MQTT libraries
|
||||
|
||||
int MQTTConnect(char* host, int port, char* user, char* pass)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void MQTTKISSTX(void *message) {};
|
||||
void MQTTKISSTX_RAW(char* buffer, int bufferLength, void* PORT) {};
|
||||
void MQTTKISSRX(void *message) {};
|
||||
void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT) {};
|
||||
void MQTTTimer() {};
|
||||
void MQTTReportSession(char * Msg) {};
|
||||
|
||||
#endif
|
||||
|
||||
@ -1,229 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="WinmorControl"
|
||||
ProjectGUID="{005A91EA-3A00-4FB4-ADD9-EB78DBFA2B82}"
|
||||
RootNamespace="WinmorControl"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
SuppressStartupBanner="true"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\Debug/WinmorControl.tlb"
|
||||
HeaderFileName=""
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
||||
MinimalRebuild="true"
|
||||
RuntimeLibrary="1"
|
||||
PrecompiledHeaderFile=".\Debug/WinmorControl.pch"
|
||||
AssemblerListingLocation="$(IntDir)\"
|
||||
ObjectFile="$(IntDir)\"
|
||||
ProgramDataBaseFileName="$(IntDir)\"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="true"
|
||||
DebugInformationFormat="4"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="2057"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="WS2_32.Lib Psapi.lib"
|
||||
OutputFile="c:\DevProgs\bpq32\WinmorControl.exe"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="true"
|
||||
GenerateDebugInformation="true"
|
||||
ProgramDatabaseFile=".\Debug/bpq32.pdb"
|
||||
GenerateMapFile="true"
|
||||
MapFileName="c:\devprogs\bpq32\bpqpp.map"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
SuppressStartupBanner="true"
|
||||
OutputFile=".\Debug/WinmorControl.bsc"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
SuppressStartupBanner="true"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\Release/WinmorControl.tlb"
|
||||
HeaderFileName=""
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\cinclude"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
|
||||
StringPooling="true"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="true"
|
||||
PrecompiledHeaderFile="C:\msdev2005\Intermed\Release/WinmorControl.pch"
|
||||
AssemblerListingLocation="$(IntDir)\"
|
||||
ObjectFile="$(IntDir)\"
|
||||
ProgramDataBaseFileName="$(IntDir)\"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="true"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="2057"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="WS2_32.Lib Psapi.lib"
|
||||
OutputFile="c:\DevProgs\bpq32\WinmorControl.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="true"
|
||||
ProgramDatabaseFile=".\Release/WinmorControl.pdb"
|
||||
GenerateMapFile="true"
|
||||
MapFileName="c:\devprogs\bpq32\WinmorControl.map"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
SuppressStartupBanner="true"
|
||||
OutputFile=".\Release/WinmorControl.bsc"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\WinmorControl.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\WinmorControl.rc"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,193 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2022 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
//
|
||||
// Netrom Record ROute Suport Code for BPQ32 Switch
|
||||
//
|
||||
|
||||
// All code runs from the BPQ32 Received or Timer Routines under Semaphore.
|
||||
// As most data areas are dynamically allocated, they will not survive a Timer Process Swap.
|
||||
// Shared data can be used for Config Info.
|
||||
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#include "time.h"
|
||||
#include "stdio.h"
|
||||
#include <fcntl.h>
|
||||
//#include "vmm.h"
|
||||
|
||||
|
||||
#include "cheaders.h"
|
||||
|
||||
|
||||
extern int SENDNETFRAME();
|
||||
extern VOID Q_ADD();
|
||||
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
|
||||
TRANSPORTENTRY * NRRSession;
|
||||
|
||||
/*
|
||||
datagrams (and other things) to be transported in Netrom L3 frames.
|
||||
When the frametype is 0x00, the "circuit index" and "circuit id" (first 2
|
||||
bytes of the transport header) take on a different meaning, something like
|
||||
"protocol family" and "protocol id". IP over netrom uses 0x0C for both
|
||||
bytes, TheNet uses 0x00 for both bytes when making L3RTT measurements, and
|
||||
Xnet uses family 0x00, protocol id 0x01 for Netrom Record Route. I believe
|
||||
there are authors using other values too. Unfortunately there is no
|
||||
co-ordinating authority for these numbers, so authors just pick an unused
|
||||
one.
|
||||
*/
|
||||
|
||||
VOID NRRecordRoute(UCHAR * Buff, int Len)
|
||||
{
|
||||
// NRR frame for us. If We originated it, report outcome, else put our call on end, and send back
|
||||
|
||||
L3MESSAGEBUFFER * Msg = (L3MESSAGEBUFFER *)Buff;
|
||||
struct DEST_LIST * DEST;
|
||||
char Temp[7];
|
||||
int NRRLen = Len - (21 + MSGHDDRLEN);
|
||||
UCHAR Flags;
|
||||
char call[10];
|
||||
int calllen;
|
||||
char * Save = Buff;
|
||||
|
||||
if (memcmp(&Msg->L4DATA, MYCALL, 7) == 0)
|
||||
{
|
||||
UCHAR * BUFFER = GetBuff();
|
||||
UCHAR * ptr1;
|
||||
struct _MESSAGE * Msg;
|
||||
|
||||
if (BUFFER == NULL)
|
||||
return;
|
||||
|
||||
ptr1 = &BUFFER[MSGHDDRLEN];
|
||||
|
||||
*ptr1++ = 0xf0; // PID
|
||||
|
||||
ptr1 += sprintf(ptr1, "NRR Response:");
|
||||
|
||||
Buff += 21 + MSGHDDRLEN;
|
||||
Len -= (21 + MSGHDDRLEN);
|
||||
|
||||
while (Len > 0)
|
||||
{
|
||||
calllen = ConvFromAX25(Buff, call);
|
||||
call[calllen] = 0;
|
||||
ptr1 += sprintf(ptr1, " %s", call);
|
||||
if ((Buff[7] & 0x80) == 0x80) // Check turnround bit
|
||||
*ptr1++ = '*';
|
||||
|
||||
Buff+=8;
|
||||
Len -= 8;
|
||||
}
|
||||
|
||||
// Add ours on end for neatness
|
||||
|
||||
calllen = ConvFromAX25(MYCALL, call);
|
||||
call[calllen] = 0;
|
||||
ptr1 += sprintf(ptr1, " %s", call);
|
||||
|
||||
*ptr1++ = 0x0d; // CR
|
||||
|
||||
Len = (int)(ptr1 - BUFFER);
|
||||
|
||||
Msg = (struct _MESSAGE *)BUFFER;
|
||||
|
||||
Msg->LENGTH = Len;
|
||||
|
||||
Msg->CHAIN = NULL;
|
||||
|
||||
C_Q_ADD(&NRRSession->L4TX_Q, (UINT *)BUFFER);
|
||||
|
||||
PostDataAvailable(NRRSession);
|
||||
|
||||
ReleaseBuffer(Save);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Add our call on end, and increase count
|
||||
|
||||
Flags = Buff[Len - 1];
|
||||
|
||||
Flags--;
|
||||
|
||||
if (Flags && NRRLen < 228) // Dont update if full
|
||||
{
|
||||
Flags |= 0x80; // Set End of route bit
|
||||
|
||||
Msg->L3PID = NRPID;
|
||||
|
||||
memcpy(&Msg->L4DATA[NRRLen], MYCALL, 7);
|
||||
Msg->L4DATA[NRRLen+7] = Flags;
|
||||
NRRLen += 8;
|
||||
}
|
||||
|
||||
// We should send it back via our bast route, or recorded route could be wrong
|
||||
|
||||
memcpy(Temp, Msg->L3DEST, 7);
|
||||
memcpy(Msg->L3DEST, Msg->L3SRCE, 7);
|
||||
memcpy(Msg->L3SRCE, Temp, 7);
|
||||
|
||||
if (FindDestination(Msg->L3DEST, &DEST) == 0)
|
||||
{
|
||||
ReleaseBuffer(Msg); // CANT FIND DESTINATION
|
||||
return;
|
||||
}
|
||||
|
||||
Msg->LENGTH = NRRLen + 21 + MSGHDDRLEN;
|
||||
|
||||
Debugprintf("NRR TX Len %d Flags %d NRRLen %d", Msg->LENGTH, Flags, NRRLen);
|
||||
|
||||
C_Q_ADD(&DEST->DEST_Q, Msg);
|
||||
}
|
||||
|
||||
|
||||
VOID SendNRRecordRoute(struct DEST_LIST * DEST, TRANSPORTENTRY * Session)
|
||||
{
|
||||
L3MESSAGEBUFFER * Msg = GetBuff();
|
||||
int Stream = 1;
|
||||
|
||||
if (Msg == NULL)
|
||||
return;
|
||||
|
||||
NRRSession = Session; // Save Session Pointer for reply
|
||||
|
||||
Msg->Port = 0;
|
||||
Msg->L3PID = NRPID;
|
||||
|
||||
memcpy(Msg->L3DEST, DEST->DEST_CALL, 7);
|
||||
memcpy(Msg->L3SRCE, MYCALL, 7);
|
||||
|
||||
Msg->L3TTL = L3LIVES;
|
||||
Msg->L4ID = 1;
|
||||
Msg->L4INDEX = 0;
|
||||
Msg->L4FLAGS = 0;
|
||||
|
||||
memcpy(Msg->L4DATA, MYCALL, 7);
|
||||
Msg->L4DATA[7] = Stream + 28;
|
||||
|
||||
Msg->LENGTH = 8 + 21 + MSGHDDRLEN;
|
||||
|
||||
C_Q_ADD(&DEST->DEST_Q, Msg);
|
||||
}
|
||||
@ -1,297 +0,0 @@
|
||||
|
||||
/* pngerror.c - stub functions for i/o and memory allocation
|
||||
*
|
||||
* libpng version 1.2.8 - December 3, 2004
|
||||
* For conditions of distribution and use, see copyright notice in png.h
|
||||
* Copyright (c) 1998-2004 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
* This file provides a location for all error handling. Users who
|
||||
* need special error handling are expected to write replacement functions
|
||||
* and use png_set_error_fn() to use those functions. See the instructions
|
||||
* at each function.
|
||||
*/
|
||||
|
||||
#define PNG_INTERNAL
|
||||
#include "png.h"
|
||||
|
||||
void Myabort();
|
||||
|
||||
static void /* PRIVATE */
|
||||
png_default_error PNGARG((png_structp png_ptr,
|
||||
png_const_charp error_message));
|
||||
static void /* PRIVATE */
|
||||
png_default_warning PNGARG((png_structp png_ptr,
|
||||
png_const_charp warning_message));
|
||||
|
||||
/* This function is called whenever there is a fatal error. This function
|
||||
* should not be changed. If there is a need to handle errors differently,
|
||||
* you should supply a replacement error function and use png_set_error_fn()
|
||||
* to replace the error function at run-time.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_error(png_structp png_ptr, png_const_charp error_message)
|
||||
{
|
||||
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||
char msg[16];
|
||||
if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
|
||||
{
|
||||
if (*error_message == '#')
|
||||
{
|
||||
int offset;
|
||||
for (offset=1; offset<15; offset++)
|
||||
if (*(error_message+offset) == ' ')
|
||||
break;
|
||||
if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<offset-1; i++)
|
||||
msg[i]=error_message[i+1];
|
||||
msg[i]='\0';
|
||||
error_message=msg;
|
||||
}
|
||||
else
|
||||
error_message+=offset;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
|
||||
{
|
||||
msg[0]='0';
|
||||
msg[1]='\0';
|
||||
error_message=msg;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (png_ptr != NULL && png_ptr->error_fn != NULL)
|
||||
(*(png_ptr->error_fn))(png_ptr, error_message);
|
||||
|
||||
/* If the custom handler doesn't exist, or if it returns,
|
||||
use the default handler, which will not return. */
|
||||
png_default_error(png_ptr, error_message);
|
||||
}
|
||||
|
||||
/* This function is called whenever there is a non-fatal error. This function
|
||||
* should not be changed. If there is a need to handle warnings differently,
|
||||
* you should supply a replacement warning function and use
|
||||
* png_set_error_fn() to replace the warning function at run-time.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_warning(png_structp png_ptr, png_const_charp warning_message)
|
||||
{
|
||||
int offset = 0;
|
||||
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||
if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
|
||||
#endif
|
||||
{
|
||||
if (*warning_message == '#')
|
||||
{
|
||||
for (offset=1; offset<15; offset++)
|
||||
if (*(warning_message+offset) == ' ')
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (png_ptr != NULL && png_ptr->warning_fn != NULL)
|
||||
(*(png_ptr->warning_fn))(png_ptr, warning_message+offset);
|
||||
else
|
||||
png_default_warning(png_ptr, warning_message+offset);
|
||||
}
|
||||
|
||||
/* These utilities are used internally to build an error message that relates
|
||||
* to the current chunk. The chunk name comes from png_ptr->chunk_name,
|
||||
* this is used to prefix the message. The message is limited in length
|
||||
* to 63 bytes, the name characters are output as hex digits wrapped in []
|
||||
* if the character is invalid.
|
||||
*/
|
||||
#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))
|
||||
static PNG_CONST char png_digit[16] = {
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
'A', 'B', 'C', 'D', 'E', 'F'
|
||||
};
|
||||
|
||||
static void /* PRIVATE */
|
||||
png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
|
||||
error_message)
|
||||
{
|
||||
int iout = 0, iin = 0;
|
||||
|
||||
while (iin < 4)
|
||||
{
|
||||
int c = png_ptr->chunk_name[iin++];
|
||||
if (isnonalpha(c))
|
||||
{
|
||||
buffer[iout++] = '[';
|
||||
buffer[iout++] = png_digit[(c & 0xf0) >> 4];
|
||||
buffer[iout++] = png_digit[c & 0x0f];
|
||||
buffer[iout++] = ']';
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer[iout++] = (png_byte)c;
|
||||
}
|
||||
}
|
||||
|
||||
if (error_message == NULL)
|
||||
buffer[iout] = 0;
|
||||
else
|
||||
{
|
||||
buffer[iout++] = ':';
|
||||
buffer[iout++] = ' ';
|
||||
png_strncpy(buffer+iout, error_message, 63);
|
||||
buffer[iout+63] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void PNGAPI
|
||||
png_chunk_error(png_structp png_ptr, png_const_charp error_message)
|
||||
{
|
||||
char msg[18+64];
|
||||
png_format_buffer(png_ptr, msg, error_message);
|
||||
png_error(png_ptr, msg);
|
||||
}
|
||||
|
||||
void PNGAPI
|
||||
png_chunk_warning(png_structp png_ptr, png_const_charp warning_message)
|
||||
{
|
||||
char msg[18+64];
|
||||
png_format_buffer(png_ptr, msg, warning_message);
|
||||
png_warning(png_ptr, msg);
|
||||
}
|
||||
|
||||
/* This is the default error handling function. Note that replacements for
|
||||
* this function MUST NOT RETURN, or the program will likely crash. This
|
||||
* function is used by default, or if the program supplies NULL for the
|
||||
* error function pointer in png_set_error_fn().
|
||||
*/
|
||||
static void /* PRIVATE */
|
||||
png_default_error(png_structp png_ptr, png_const_charp error_message)
|
||||
{
|
||||
#ifndef PNG_NO_CONSOLE_IO
|
||||
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||
if (*error_message == '#')
|
||||
{
|
||||
int offset;
|
||||
char error_number[16];
|
||||
for (offset=0; offset<15; offset++)
|
||||
{
|
||||
error_number[offset] = *(error_message+offset+1);
|
||||
if (*(error_message+offset) == ' ')
|
||||
break;
|
||||
}
|
||||
if((offset > 1) && (offset < 15))
|
||||
{
|
||||
error_number[offset-1]='\0';
|
||||
fprintf(stderr, "libpng error no. %s: %s\n", error_number,
|
||||
error_message+offset);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "libpng error: %s, offset=%d\n", error_message,offset);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
fprintf(stderr, "libpng error: %s\n", error_message);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_SETJMP_SUPPORTED
|
||||
# ifdef USE_FAR_KEYWORD
|
||||
{
|
||||
jmp_buf jmpbuf;
|
||||
png_memcpy(jmpbuf,png_ptr->jmpbuf,png_sizeof(jmp_buf));
|
||||
longjmp(jmpbuf, 1);
|
||||
}
|
||||
# else
|
||||
longjmp(png_ptr->jmpbuf, 1);
|
||||
# endif
|
||||
#else
|
||||
/* make compiler happy */ ;
|
||||
if (png_ptr)
|
||||
PNG_ABORT();
|
||||
#endif
|
||||
#ifdef PNG_NO_CONSOLE_IO
|
||||
/* make compiler happy */ ;
|
||||
// if (&error_message != NULL)
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* This function is called when there is a warning, but the library thinks
|
||||
* it can continue anyway. Replacement functions don't have to do anything
|
||||
* here if you don't want them to. In the default configuration, png_ptr is
|
||||
* not used, but it is passed in case it may be useful.
|
||||
*/
|
||||
static void /* PRIVATE */
|
||||
png_default_warning(png_structp png_ptr, png_const_charp warning_message)
|
||||
{
|
||||
#ifndef PNG_NO_CONSOLE_IO
|
||||
# ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||
if (*warning_message == '#')
|
||||
{
|
||||
int offset;
|
||||
char warning_number[16];
|
||||
for (offset=0; offset<15; offset++)
|
||||
{
|
||||
warning_number[offset]=*(warning_message+offset+1);
|
||||
if (*(warning_message+offset) == ' ')
|
||||
break;
|
||||
}
|
||||
if((offset > 1) && (offset < 15))
|
||||
{
|
||||
warning_number[offset-1]='\0';
|
||||
fprintf(stderr, "libpng warning no. %s: %s\n", warning_number,
|
||||
warning_message+offset);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "libpng warning: %s\n", warning_message);
|
||||
}
|
||||
else
|
||||
# endif
|
||||
fprintf(stderr, "libpng warning: %s\n", warning_message);
|
||||
#else
|
||||
/* make compiler happy */ ;
|
||||
if (warning_message)
|
||||
return;
|
||||
#endif
|
||||
/* make compiler happy */ ;
|
||||
if (png_ptr)
|
||||
return;
|
||||
}
|
||||
|
||||
/* This function is called when the application wants to use another method
|
||||
* of handling errors and warnings. Note that the error function MUST NOT
|
||||
* return to the calling routine or serious problems will occur. The return
|
||||
* method used in the default routine calls longjmp(png_ptr->jmpbuf, 1)
|
||||
*/
|
||||
void PNGAPI
|
||||
png_set_error_fn(png_structp png_ptr, png_voidp error_ptr,
|
||||
png_error_ptr error_fn, png_error_ptr warning_fn)
|
||||
{
|
||||
png_ptr->error_ptr = error_ptr;
|
||||
png_ptr->error_fn = error_fn;
|
||||
png_ptr->warning_fn = warning_fn;
|
||||
}
|
||||
|
||||
|
||||
/* This function returns a pointer to the error_ptr associated with the user
|
||||
* functions. The application should free any memory associated with this
|
||||
* pointer before png_write_destroy and png_read_destroy are called.
|
||||
*/
|
||||
png_voidp PNGAPI
|
||||
png_get_error_ptr(png_structp png_ptr)
|
||||
{
|
||||
return ((png_voidp)png_ptr->error_ptr);
|
||||
}
|
||||
|
||||
|
||||
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||
void PNGAPI
|
||||
png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode)
|
||||
{
|
||||
if(png_ptr != NULL)
|
||||
{
|
||||
png_ptr->flags &=
|
||||
((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,673 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2022 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
// DRATS support code
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
#include "telnetserver.h"
|
||||
|
||||
|
||||
/*
|
||||
The header is the first 23 bytes of of the frame. The payload is the rest of the frame.
|
||||
|
||||
Byte 1 is a "magic" number. It is 0xDD if the payload is zlib compressed before being yencoded.
|
||||
Bytes 2 and 3 is a 16 bit sequence number.
|
||||
Byte 4 is a session number.
|
||||
Byte 5 is a type. Still don't know the types.
|
||||
Bytes 6 and 7, 16 bits, is the checksum of the data after any compression.
|
||||
Bytes 8 and 9, 16 bits, is the length of the data.
|
||||
bytes 10-18, 8 bits, are the source call sign.
|
||||
bytes 19-25, 8 bits, are the destination call sign.
|
||||
If a call sign is less than 8 characters, it is padded to fill the space with the "~" tilde character.
|
||||
|
||||
Frame types: (Some from sessions/chat.py)
|
||||
|
||||
0 - T_DEF
|
||||
1 - T_PING_REQ - Ping request (Used in Test frame)
|
||||
2 - T_PING_RSP - Ping response
|
||||
3 - T_PING_ERS - Ping error status?
|
||||
4 - T_STATUS - Status frame
|
||||
5 - File Transfer
|
||||
8 - Used in Test frame
|
||||
254 - Apparently a warm up frame.
|
||||
|
||||
T_DEF = 0
|
||||
T_PNG_REQ = 1
|
||||
T_PNG_RSP = 2
|
||||
T_PNG_ERQ = 3
|
||||
T_PNG_ERS = 4
|
||||
T_STATUS = 5
|
||||
For a station status frame, the first byte of the message is an ASCII station status value.
|
||||
|
||||
'0' - Unknown
|
||||
'1' - Online
|
||||
'2' - Unattended
|
||||
'9' - Offline
|
||||
*/
|
||||
|
||||
#define T_DEF 0
|
||||
#define T_PNG_REQ 1
|
||||
#define T_PNG_RSP 2
|
||||
#define T_PNG_ERQ 3
|
||||
#define T_PNG_ERS 4
|
||||
#define T_STATUS 5
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
// shorts are big-endian
|
||||
|
||||
struct DRATSHeader
|
||||
{
|
||||
unsigned char Magic;
|
||||
unsigned short Seq;
|
||||
unsigned char Sessno;
|
||||
unsigned char Type;
|
||||
unsigned short CheckSum;
|
||||
unsigned short Length;
|
||||
char CallFrom[8];
|
||||
char CallTo[8];
|
||||
unsigned char Message[2048];
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
struct DRATSSession
|
||||
{
|
||||
struct ConnectionInfo * sockptr;
|
||||
unsigned int Seq;
|
||||
unsigned int Sessno;
|
||||
char CallFrom[8];
|
||||
char CallTo[8];
|
||||
int Stream; // BPQ Stream
|
||||
int StreamState;
|
||||
struct DRATSQueue * Queue;
|
||||
struct DRATSSession * Next;
|
||||
};
|
||||
|
||||
struct DRATSQueue
|
||||
{
|
||||
// Queue of messages to be sent to node from background (ie not under semaphore)
|
||||
|
||||
int Stream;
|
||||
int Len;
|
||||
unsigned char * Msg;
|
||||
struct DRATSQueue * Next;
|
||||
};
|
||||
|
||||
|
||||
struct DRATSSession * DRATSSessions = NULL;
|
||||
|
||||
|
||||
char peer0_2[] = { /* Packet 17 */
|
||||
0x5b, 0x53, 0x4f, 0x42, 0x5d, 0xdd, 0x3d, 0x40,
|
||||
0x3d, 0x40, 0x01, 0x05, 0x45, 0x78, 0x3d, 0x40,
|
||||
0x18, 0x47, 0x38, 0x42, 0x50, 0x51, 0x7e, 0x7e,
|
||||
0x7e, 0x43, 0x51, 0x43, 0x51, 0x43, 0x51, 0x7e,
|
||||
0x7e, 0x78, 0xda, 0x33, 0xf4, 0xcf, 0xcb, 0xc9,
|
||||
0xcc, 0x4b, 0x55, 0xd0, 0x70, 0xd1, 0x0d, 0x72,
|
||||
0x0c, 0x09, 0xd6, 0x04, 0x3d, 0x40, 0x2a, 0x8c,
|
||||
0x04, 0xb3, 0x5b, 0x45, 0x4f, 0x42, 0x5d };
|
||||
|
||||
|
||||
void processDRATSFrame(unsigned char * Message, int Len, struct ConnectionInfo * sockptr);
|
||||
|
||||
int testDRATS()
|
||||
{
|
||||
// processDRATSFrame(peer0_1, sizeof(peer0_1), 0);
|
||||
// processDRATSFrame(peer0_2, sizeof(peer0_2), 0);
|
||||
// processDRATSFrame(peer1_1, sizeof(peer1_1), 0);
|
||||
// processDRATSFrame(peer1_20, sizeof(peer1_20));
|
||||
// processDRATSFrame(peer0_20, sizeof(peer0_20));
|
||||
// processDRATSFrame(peer1_21, sizeof(peer1_21));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
extern char pgm[256];
|
||||
extern char TextVerstring[50];
|
||||
|
||||
int HeaderLen = offsetof(struct DRATSHeader, Message);
|
||||
|
||||
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
|
||||
int dratscrc(unsigned char *ptr, int count);
|
||||
int FindFreeStreamNoSem();
|
||||
void sendDRATSFrame(struct ConnectionInfo * sockptr, struct DRATSHeader * Header);
|
||||
int yEncode(unsigned char * in, unsigned char * out, int len, unsigned char * Banned);
|
||||
|
||||
|
||||
int AllocateDRATSStream(struct DRATSSession * Sess)
|
||||
{
|
||||
int Stream;
|
||||
|
||||
strcpy(pgm, "DRATS");
|
||||
|
||||
Stream = FindFreeStreamNoSem();
|
||||
|
||||
strcpy(pgm, "bpq32.exe");
|
||||
|
||||
if (Stream == 255) return 0;
|
||||
|
||||
if (memcmp(Sess->CallTo, "NODE", 4) == 0)
|
||||
{
|
||||
// Just connect to command level on switch
|
||||
}
|
||||
|
||||
return Stream;
|
||||
}
|
||||
|
||||
void ProcessDRATSPayload(struct DRATSHeader * Header, struct DRATSSession * Sess)
|
||||
{
|
||||
struct DRATSQueue * QEntry;
|
||||
BPQVECSTRUC * HOST;
|
||||
|
||||
if (Sess->Stream == 0)
|
||||
{
|
||||
Sess->Stream = AllocateDRATSStream(Sess);
|
||||
}
|
||||
|
||||
if (Sess->StreamState == 0)
|
||||
{
|
||||
unsigned char AXCall[10];
|
||||
|
||||
Connect(Sess->Stream); // Connect
|
||||
ConvToAX25(Sess->CallFrom, AXCall);
|
||||
ChangeSessionCallsign(Sess->Stream, AXCall); // Prevent triggering incoming connect code
|
||||
|
||||
// Clear State Changed bits (cant use SessionState under semaphore)
|
||||
|
||||
HOST = &BPQHOSTVECTOR[Sess->Stream -1]; // API counts from 1
|
||||
HOST->HOSTFLAGS &= 0xFC; // Clear Change Bits
|
||||
Sess->StreamState = 1;
|
||||
}
|
||||
|
||||
strcat(Header->Message, "\r");
|
||||
|
||||
// Need to Queue to Background as we can't use SendMsg under semaphore
|
||||
|
||||
QEntry = zalloc(sizeof(struct DRATSQueue));
|
||||
QEntry->Len = strlen(Header->Message);
|
||||
QEntry->Msg = malloc(QEntry->Len);
|
||||
memcpy(QEntry->Msg, Header->Message, QEntry->Len);
|
||||
|
||||
// Add to queue
|
||||
|
||||
if (Sess->Queue)
|
||||
{
|
||||
struct DRATSQueue * End = Sess->Queue;
|
||||
|
||||
// Add on end
|
||||
while (End->Next)
|
||||
End = End->Next;
|
||||
|
||||
End->Next = QEntry;
|
||||
}
|
||||
else
|
||||
Sess->Queue = QEntry;
|
||||
|
||||
}
|
||||
|
||||
// Called under semaphore
|
||||
|
||||
|
||||
void processDRATSFrame(unsigned char * Message, int Len, struct ConnectionInfo * sockptr)
|
||||
{
|
||||
unsigned char * Payload;
|
||||
unsigned char * ptr;
|
||||
unsigned char dest[2048];
|
||||
struct DRATSHeader * Header;
|
||||
int outLen;
|
||||
struct DRATSSession * Sess = DRATSSessions;
|
||||
unsigned short crc, savecrc;
|
||||
char CallFrom[10] = "";
|
||||
char CallTo[10] = "";
|
||||
|
||||
Message[Len] = 0;
|
||||
Debugprintf(Message);
|
||||
|
||||
Payload = strstr(Message, "[SOB]");
|
||||
|
||||
if (Payload == 0)
|
||||
return;
|
||||
|
||||
ptr = strstr(Message, "[EOB]");
|
||||
|
||||
if (ptr == 0)
|
||||
return;
|
||||
|
||||
ptr[0] = 0;
|
||||
|
||||
Payload += 5;
|
||||
|
||||
Header = (struct DRATSHeader *)Payload;
|
||||
|
||||
// Undo = transparency
|
||||
|
||||
ptr = Payload;
|
||||
|
||||
while (ptr = strchr(ptr, '='))
|
||||
{
|
||||
memmove(ptr, ptr + 1, Len);
|
||||
ptr[0] -= 64;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
// Check CRC
|
||||
|
||||
savecrc = htons(Header->CheckSum);
|
||||
Header->CheckSum = 0;
|
||||
|
||||
crc = dratscrc(Payload, htons(Header->Length) + HeaderLen);
|
||||
|
||||
if (crc != savecrc)
|
||||
{
|
||||
Debugprintf(" DRARS CRC Error %x %x", crc, savecrc); // Good CRC
|
||||
return;
|
||||
}
|
||||
|
||||
Header->Length = htons(Header->Length); // convert to machine order
|
||||
|
||||
if (Header->Magic == 0xdd) // Zlib compressed
|
||||
{
|
||||
doinflate(Header->Message, dest, Header->Length, 2048, &outLen);
|
||||
memcpy(Header->Message, dest, outLen + 1);
|
||||
Header->Length = outLen;
|
||||
}
|
||||
Debugprintf(Header->Message);
|
||||
|
||||
// Look for a matching From/To/Session
|
||||
|
||||
memcpy(CallFrom, Header->CallFrom, 8);
|
||||
memcpy(CallTo, Header->CallTo, 8);
|
||||
|
||||
strlop(CallFrom, '~');
|
||||
strlop(CallTo, '~');
|
||||
|
||||
if (Header->Type == T_STATUS)
|
||||
{
|
||||
// Status frame ?? What to do with it ??
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (Header->Type == T_PNG_REQ)
|
||||
{
|
||||
// "Ping Request"
|
||||
|
||||
// if to "NODE" reply to it
|
||||
|
||||
if (strcmp(CallTo, "NODE") == 0)
|
||||
{
|
||||
// Reuse incoming message
|
||||
|
||||
strcpy(Header->CallFrom, CallTo);
|
||||
strcpy(Header->CallTo, CallFrom);
|
||||
Header->Type = T_PNG_RSP;
|
||||
Header->Length = sprintf(Header->Message, "Running BPQ32 Version %s", TextVerstring);
|
||||
|
||||
sendDRATSFrame(sockptr, Header);
|
||||
return;
|
||||
}
|
||||
|
||||
// Not to us - do we route it ??
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (Header->Type == T_PNG_RSP)
|
||||
{
|
||||
// Reponse is PNG_RSP then Status - 1Online (D-RATS)
|
||||
// "Running D-RATS 0.3.9 (Windows 8->10 (6, 2, 9200, 2, ''))"
|
||||
// "Running D-RATS 0.3.10 beta 4 (Linux - Raspbian GNU/Linux 9)"
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (Header->Type != T_DEF)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// ?? Normal Data
|
||||
|
||||
if (strcmp(CallTo, "NODE") != 0)
|
||||
{
|
||||
// Not not Node - should we route it ??
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
while (Sess)
|
||||
{
|
||||
if (Sess->Sessno == Header->Sessno && memcmp(Sess->CallFrom, CallFrom, 8) == 0
|
||||
&& memcmp(Sess->CallTo, CallTo, 8) == 0 && Sess->sockptr == sockptr)
|
||||
{
|
||||
ProcessDRATSPayload(Header, Sess);
|
||||
return;
|
||||
}
|
||||
Sess = Sess->Next;
|
||||
}
|
||||
|
||||
// Allocate a new one
|
||||
|
||||
Sess = zalloc(sizeof(struct DRATSSession));
|
||||
|
||||
Sess->Sessno = Header->Sessno;
|
||||
memcpy(Sess->CallFrom, CallFrom, 8);
|
||||
memcpy(Sess->CallTo, CallTo, 8);
|
||||
Sess->sockptr = sockptr;
|
||||
|
||||
if (DRATSSessions)
|
||||
{
|
||||
// Add to front of Chain
|
||||
|
||||
Sess->Next = DRATSSessions;
|
||||
}
|
||||
|
||||
DRATSSessions = Sess;
|
||||
|
||||
ProcessDRATSPayload(Header, Sess);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
void DRATSPoll()
|
||||
{
|
||||
struct DRATSSession * Sess = DRATSSessions;
|
||||
int Stream, state, change;
|
||||
int count;
|
||||
struct DRATSHeader Header;
|
||||
struct DRATSQueue * QEntry;
|
||||
struct DRATSQueue * Save;
|
||||
|
||||
while (Sess)
|
||||
{
|
||||
Stream = Sess->Stream;
|
||||
SessionState(Stream, &state, &change);
|
||||
|
||||
if (change == 1)
|
||||
{
|
||||
if (state == 1)
|
||||
{
|
||||
// Connected - do we need anything ??
|
||||
}
|
||||
else
|
||||
{
|
||||
// Send a disconnected message
|
||||
|
||||
char From[10] = "~~~~~~~~~";
|
||||
char To[10] = "~~~~~~~~~";
|
||||
|
||||
Sess->StreamState = 0;
|
||||
|
||||
Header.Length = sprintf(Header.Message, "*** Disconnected from Node");
|
||||
|
||||
|
||||
memcpy(To, Sess->CallFrom, strlen(Sess->CallFrom));
|
||||
memcpy(From, Sess->CallTo, strlen(Sess->CallTo));
|
||||
|
||||
memcpy(Header.CallFrom, From, 8);
|
||||
memcpy(Header.CallTo, To, 8);
|
||||
|
||||
Header.Magic = 0x22;
|
||||
Header.Type = 0;
|
||||
Header.Seq = 0;
|
||||
Header.Sessno = Sess->Sessno;
|
||||
|
||||
sendDRATSFrame(Sess->sockptr, &Header);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
int Len;
|
||||
|
||||
GetMsg(Stream, (char *)Header.Message, &Len, &count);
|
||||
Header.Length = Len;
|
||||
|
||||
if (Header.Length)
|
||||
{
|
||||
char From[10] = "~~~~~~~~~";
|
||||
char To[10] = "~~~~~~~~~";
|
||||
|
||||
memcpy(To, Sess->CallFrom, strlen(Sess->CallFrom));
|
||||
memcpy(From, Sess->CallTo, strlen(Sess->CallTo));
|
||||
|
||||
memcpy(Header.CallFrom, From, 8);
|
||||
memcpy(Header.CallTo, To, 8);
|
||||
|
||||
Header.Magic = 0x22;
|
||||
Header.Type = 0;
|
||||
Header.Seq = 0;
|
||||
Header.Sessno = Sess->Sessno;
|
||||
|
||||
sendDRATSFrame(Sess->sockptr, &Header);
|
||||
}
|
||||
}
|
||||
while (count > 0);
|
||||
|
||||
// See if anything to send to node
|
||||
|
||||
QEntry = Sess->Queue;
|
||||
|
||||
while (QEntry)
|
||||
{
|
||||
SendMsg(Sess->Stream, QEntry->Msg, QEntry->Len);
|
||||
Save = QEntry;
|
||||
QEntry = QEntry->Next;
|
||||
free(Save->Msg);
|
||||
free(Save);
|
||||
}
|
||||
|
||||
Sess->Queue = 0;
|
||||
Sess = Sess->Next;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned char BANNED[] = {'=', 0x11, 0x13, 0x1A, 0xFD, 0xFE, 0xFF, 0};
|
||||
|
||||
|
||||
void sendDRATSFrame(struct ConnectionInfo * sockptr, struct DRATSHeader * Header)
|
||||
{
|
||||
unsigned short crc;
|
||||
int len;
|
||||
unsigned char out[2048] = "[SOB]";
|
||||
int packetLen = Header->Length + HeaderLen;
|
||||
|
||||
// Length is in host order
|
||||
|
||||
Header->Length = htons(Header->Length);
|
||||
|
||||
Header->CheckSum = 0;
|
||||
|
||||
crc = dratscrc((unsigned char *)Header, packetLen);
|
||||
Header->CheckSum = htons(crc);
|
||||
|
||||
len = yEncode((unsigned char *)Header, out + 5, packetLen, BANNED);
|
||||
|
||||
memcpy(&out[len + 5], "[EOB]", 5);
|
||||
Debugprintf(out);
|
||||
send(sockptr->socket, out, len + 10, 0);
|
||||
}
|
||||
|
||||
void DRATSConnectionLost(struct ConnectionInfo * sockptr)
|
||||
{
|
||||
// Disconnect any sessions, then free Stream and Sess record
|
||||
|
||||
struct DRATSSession * Sess = DRATSSessions;
|
||||
struct DRATSSession * Save = 0;
|
||||
BPQVECSTRUC * HOST;
|
||||
|
||||
while (Sess)
|
||||
{
|
||||
if (Sess->sockptr == sockptr)
|
||||
{
|
||||
if (Sess->StreamState == 1) // COnnected
|
||||
{
|
||||
Disconnect(Sess->Stream);
|
||||
HOST = &BPQHOSTVECTOR[Sess->Stream -1]; // API counts from 1
|
||||
HOST->HOSTFLAGS &= 0xFC; // Clear Change Bits
|
||||
}
|
||||
DeallocateStream(Sess->Stream);
|
||||
|
||||
// We must unhook from chain
|
||||
|
||||
if (Save)
|
||||
Save->Next = Sess->Next;
|
||||
else
|
||||
DRATSSessions = Sess->Next;
|
||||
|
||||
// Should really Free any Queue, but unlikely to be any
|
||||
|
||||
free(Sess);
|
||||
|
||||
if (Save)
|
||||
Sess = Save->Next;
|
||||
else
|
||||
Sess = DRATSSessions;
|
||||
}
|
||||
else
|
||||
{
|
||||
Save = Sess;
|
||||
Sess = Sess->Next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define ZEXPORT __stdcall
|
||||
#endif
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
|
||||
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen)
|
||||
{
|
||||
int ret;
|
||||
z_stream strm;
|
||||
|
||||
strm.zalloc = Z_NULL;
|
||||
strm.zfree = Z_NULL;
|
||||
strm.opaque = Z_NULL;
|
||||
strm.avail_in = 0;
|
||||
strm.next_in = Z_NULL;
|
||||
|
||||
ret = inflateInit(&strm);
|
||||
if (ret != Z_OK)
|
||||
return ret;
|
||||
|
||||
strm.avail_in = Len;
|
||||
strm.next_in = source;
|
||||
|
||||
strm.avail_out = destlen;
|
||||
strm.next_out = dest;
|
||||
|
||||
ret = inflate(&strm, Z_NO_FLUSH);
|
||||
|
||||
inflateEnd(&strm);
|
||||
|
||||
dest[strm.total_out] = 0;
|
||||
|
||||
*outLen = strm.total_out;
|
||||
|
||||
return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
|
||||
}
|
||||
|
||||
// No idea what this CRC is, but it works! (converted from DRATS python code)
|
||||
|
||||
int update_crc(int c, int crc)
|
||||
{
|
||||
int i;
|
||||
int v;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if ((c & 0x80))
|
||||
v = 1;
|
||||
else
|
||||
v = 0;
|
||||
|
||||
if (crc & 0x8000)
|
||||
{
|
||||
crc <<= 1;
|
||||
crc += v;
|
||||
crc ^= 0x1021;
|
||||
}
|
||||
else
|
||||
{
|
||||
crc <<= 1;
|
||||
crc += v;
|
||||
}
|
||||
|
||||
c <<= 1;
|
||||
}
|
||||
|
||||
crc &= 0xFFFF;
|
||||
return crc;
|
||||
|
||||
}
|
||||
|
||||
int dratscrc(unsigned char *ptr, int count)
|
||||
{
|
||||
int i;
|
||||
int checksum = 0;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
checksum = update_crc(ptr[i], checksum);
|
||||
|
||||
checksum = update_crc(0, checksum);
|
||||
checksum = update_crc(0, checksum);
|
||||
return checksum;
|
||||
}
|
||||
|
||||
#define OFFSET 64
|
||||
|
||||
int yEncode(unsigned char * in, unsigned char * out, int len, unsigned char * Banned)
|
||||
{
|
||||
unsigned char * ptr = out;
|
||||
unsigned char c;
|
||||
|
||||
while (len--)
|
||||
{
|
||||
c = *(in++);
|
||||
|
||||
if (strchr(&Banned[0], c))
|
||||
{
|
||||
*(out++) = '=';
|
||||
*(out++) = (c + OFFSET) & 0xFF;
|
||||
}
|
||||
else
|
||||
*(out++) = c;
|
||||
}
|
||||
|
||||
return (out - ptr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,750 +0,0 @@
|
||||
// This is a part of the Microsoft Foundation Classes C++ library.
|
||||
// Copyright (C) 1992-1995 Microsoft Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// This source code is only intended as a supplement to the
|
||||
// Microsoft Foundation Classes Reference and related
|
||||
// electronic documentation provided with the library.
|
||||
// See these sources for detailed information regarding the
|
||||
// Microsoft Foundation Classes product.
|
||||
|
||||
#ifndef __AFXRES_H__
|
||||
#define __AFXRES_H__
|
||||
|
||||
#ifdef REZ // Mac resource compiler (mrc) defines REZ
|
||||
#define RC_INVOKED
|
||||
#endif
|
||||
|
||||
#ifdef RC_INVOKED
|
||||
#ifndef _INC_WINDOWS
|
||||
#define _INC_WINDOWS
|
||||
#include "..\include\winres.h" // extract from windows header
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _AFX_MINREBUILD
|
||||
#pragma component(minrebuild, off)
|
||||
#endif
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#define APSTUDIO_HIDDEN_SYMBOLS
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// MFC resource types (see Technical note TN024 for implementation details)
|
||||
|
||||
#ifndef RC_INVOKED
|
||||
#define RT_DLGINIT MAKEINTRESOURCE(240)
|
||||
#define RT_TOOLBAR MAKEINTRESOURCE(241)
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#undef APSTUDIO_HIDDEN_SYMBOLS
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// General style bits etc
|
||||
|
||||
// Tab Control styles
|
||||
#ifndef TCS_MULTILINE // new in later versions of Win32
|
||||
#define TCS_MULTILINE 0x0200
|
||||
#endif
|
||||
|
||||
// ControlBar styles
|
||||
#define CBRS_ALIGN_LEFT 0x1000L
|
||||
#define CBRS_ALIGN_TOP 0x2000L
|
||||
#define CBRS_ALIGN_RIGHT 0x4000L
|
||||
#define CBRS_ALIGN_BOTTOM 0x8000L
|
||||
#define CBRS_ALIGN_ANY 0xF000L
|
||||
|
||||
#define CBRS_BORDER_LEFT 0x0100L
|
||||
#define CBRS_BORDER_TOP 0x0200L
|
||||
#define CBRS_BORDER_RIGHT 0x0400L
|
||||
#define CBRS_BORDER_BOTTOM 0x0800L
|
||||
#define CBRS_BORDER_ANY 0x0F00L
|
||||
|
||||
#define CBRS_TOOLTIPS 0x0010L
|
||||
#define CBRS_FLYBY 0x0020L
|
||||
#define CBRS_FLOAT_MULTI 0x0040L
|
||||
#define CBRS_BORDER_3D 0x0080L
|
||||
#define CBRS_HIDE_INPLACE 0x0008L
|
||||
#define CBRS_SIZE_DYNAMIC 0x0004L
|
||||
#define CBRS_SIZE_FIXED 0x0002L
|
||||
#define CBRS_FLOATING 0x0001L
|
||||
|
||||
#define CBRS_ORIENT_HORZ (CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM)
|
||||
#define CBRS_ORIENT_VERT (CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT)
|
||||
#define CBRS_ORIENT_ANY (CBRS_ORIENT_HORZ|CBRS_ORIENT_VERT)
|
||||
|
||||
#define CBRS_ALL 0xFFFFL
|
||||
|
||||
|
||||
// the CBRS_ style is made up of an alignment style and a draw border style
|
||||
// the alignment styles are mutually exclusive
|
||||
// the draw border styles may be combined
|
||||
#define CBRS_NOALIGN 0x00000000L
|
||||
#define CBRS_LEFT (CBRS_ALIGN_LEFT|CBRS_BORDER_RIGHT)
|
||||
#define CBRS_TOP (CBRS_ALIGN_TOP|CBRS_BORDER_BOTTOM)
|
||||
#define CBRS_RIGHT (CBRS_ALIGN_RIGHT|CBRS_BORDER_LEFT)
|
||||
#define CBRS_BOTTOM (CBRS_ALIGN_BOTTOM|CBRS_BORDER_TOP)
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Standard window components
|
||||
|
||||
// Mode indicators in status bar - these are routed like commands
|
||||
#define ID_INDICATOR_EXT 0xE700 // extended selection indicator
|
||||
#define ID_INDICATOR_CAPS 0xE701 // cap lock indicator
|
||||
#define ID_INDICATOR_NUM 0xE702 // num lock indicator
|
||||
#define ID_INDICATOR_SCRL 0xE703 // scroll lock indicator
|
||||
#define ID_INDICATOR_OVR 0xE704 // overtype mode indicator
|
||||
#define ID_INDICATOR_REC 0xE705 // record mode indicator
|
||||
#define ID_INDICATOR_KANA 0xE706 // kana lock indicator
|
||||
|
||||
#define ID_SEPARATOR 0 // special separator value
|
||||
|
||||
#ifndef RC_INVOKED // code only
|
||||
// Standard control bars (IDW = window ID)
|
||||
#define AFX_IDW_CONTROLBAR_FIRST 0xE800
|
||||
#define AFX_IDW_CONTROLBAR_LAST 0xE8FF
|
||||
|
||||
#define AFX_IDW_TOOLBAR 0xE800 // main Toolbar for window
|
||||
#define AFX_IDW_STATUS_BAR 0xE801 // Status bar window
|
||||
#define AFX_IDW_PREVIEW_BAR 0xE802 // PrintPreview Dialog Bar
|
||||
#define AFX_IDW_RESIZE_BAR 0xE803 // OLE in-place resize bar
|
||||
|
||||
// Note: If your application supports docking toolbars, you should
|
||||
// not use the following IDs for your own toolbars. The IDs chosen
|
||||
// are at the top of the first 32 such that the bars will be hidden
|
||||
// while in print preview mode, and are not likely to conflict with
|
||||
// IDs your application may have used succesfully in the past.
|
||||
|
||||
#define AFX_IDW_DOCKBAR_TOP 0xE81B
|
||||
#define AFX_IDW_DOCKBAR_LEFT 0xE81C
|
||||
#define AFX_IDW_DOCKBAR_RIGHT 0xE81D
|
||||
#define AFX_IDW_DOCKBAR_BOTTOM 0xE81E
|
||||
#define AFX_IDW_DOCKBAR_FLOAT 0xE81F
|
||||
|
||||
// Macro for mapping standard control bars to bitmask (limit of 32)
|
||||
#define AFX_CONTROLBAR_MASK(nIDC) (1L << (nIDC - AFX_IDW_CONTROLBAR_FIRST))
|
||||
|
||||
// parts of Main Frame
|
||||
#define AFX_IDW_PANE_FIRST 0xE900 // first pane (256 max)
|
||||
#define AFX_IDW_PANE_LAST 0xE9ff
|
||||
#define AFX_IDW_HSCROLL_FIRST 0xEA00 // first Horz scrollbar (16 max)
|
||||
#define AFX_IDW_VSCROLL_FIRST 0xEA10 // first Vert scrollbar (16 max)
|
||||
|
||||
#define AFX_IDW_SIZE_BOX 0xEA20 // size box for splitters
|
||||
#define AFX_IDW_PANE_SAVE 0xEA21 // to shift AFX_IDW_PANE_FIRST
|
||||
#endif //!RC_INVOKED
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
|
||||
// common style for form views
|
||||
#define AFX_WS_DEFAULT_VIEW (WS_CHILD | WS_VISIBLE | WS_BORDER)
|
||||
|
||||
#endif //!APSTUDIO_INVOKED
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Standard app configurable strings
|
||||
|
||||
// for application title (defaults to EXE name or name in constructor)
|
||||
#define AFX_IDS_APP_TITLE 0xE000
|
||||
// idle message bar line
|
||||
#define AFX_IDS_IDLEMESSAGE 0xE001
|
||||
// message bar line when in shift-F1 help mode
|
||||
#define AFX_IDS_HELPMODEMESSAGE 0xE002
|
||||
// document title when editing OLE embedding
|
||||
#define AFX_IDS_APP_TITLE_EMBEDDING 0xE003
|
||||
// company name
|
||||
#define AFX_IDS_COMPANY_NAME 0xE004
|
||||
// object name when server is inplace
|
||||
#define AFX_IDS_OBJ_TITLE_INPLACE 0xE005
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Standard Commands
|
||||
|
||||
// File commands
|
||||
#define ID_FILE_NEW 0xE100
|
||||
#define ID_FILE_OPEN 0xE101
|
||||
#define ID_FILE_CLOSE 0xE102
|
||||
#define ID_FILE_SAVE 0xE103
|
||||
#define ID_FILE_SAVE_AS 0xE104
|
||||
#define ID_FILE_PAGE_SETUP 0xE105
|
||||
#define ID_FILE_PRINT_SETUP 0xE106
|
||||
#define ID_FILE_PRINT 0xE107
|
||||
#define ID_FILE_PRINT_DIRECT 0xE108
|
||||
#define ID_FILE_PRINT_PREVIEW 0xE109
|
||||
#define ID_FILE_UPDATE 0xE10A
|
||||
#define ID_FILE_SAVE_COPY_AS 0xE10B
|
||||
#define ID_FILE_SEND_MAIL 0xE10C
|
||||
|
||||
#define ID_FILE_MRU_FIRST 0xE110
|
||||
#define ID_FILE_MRU_FILE1 0xE110 // range - 16 max
|
||||
#define ID_FILE_MRU_FILE2 0xE111
|
||||
#define ID_FILE_MRU_FILE3 0xE112
|
||||
#define ID_FILE_MRU_FILE4 0xE113
|
||||
#define ID_FILE_MRU_FILE5 0xE114
|
||||
#define ID_FILE_MRU_FILE6 0xE115
|
||||
#define ID_FILE_MRU_FILE7 0xE116
|
||||
#define ID_FILE_MRU_FILE8 0xE117
|
||||
#define ID_FILE_MRU_FILE9 0xE118
|
||||
#define ID_FILE_MRU_FILE10 0xE119
|
||||
#define ID_FILE_MRU_FILE11 0xE11A
|
||||
#define ID_FILE_MRU_FILE12 0xE11B
|
||||
#define ID_FILE_MRU_FILE13 0xE11C
|
||||
#define ID_FILE_MRU_FILE14 0xE11D
|
||||
#define ID_FILE_MRU_FILE15 0xE11E
|
||||
#define ID_FILE_MRU_FILE16 0xE11F
|
||||
#define ID_FILE_MRU_LAST 0xE11F
|
||||
|
||||
// Edit commands
|
||||
#define ID_EDIT_CLEAR 0xE120
|
||||
#define ID_EDIT_CLEAR_ALL 0xE121
|
||||
#define ID_EDIT_COPY 0xE122
|
||||
#define ID_EDIT_CUT 0xE123
|
||||
#define ID_EDIT_FIND 0xE124
|
||||
#define ID_EDIT_PASTE 0xE125
|
||||
#define ID_EDIT_PASTE_LINK 0xE126
|
||||
#define ID_EDIT_PASTE_SPECIAL 0xE127
|
||||
#define ID_EDIT_REPEAT 0xE128
|
||||
#define ID_EDIT_REPLACE 0xE129
|
||||
#define ID_EDIT_SELECT_ALL 0xE12A
|
||||
#define ID_EDIT_UNDO 0xE12B
|
||||
#define ID_EDIT_REDO 0xE12C
|
||||
|
||||
// Window commands
|
||||
#define ID_WINDOW_NEW 0xE130
|
||||
#define ID_WINDOW_ARRANGE 0xE131
|
||||
#define ID_WINDOW_CASCADE 0xE132
|
||||
#define ID_WINDOW_TILE_HORZ 0xE133
|
||||
#define ID_WINDOW_TILE_VERT 0xE134
|
||||
#define ID_WINDOW_SPLIT 0xE135
|
||||
#ifndef RC_INVOKED // code only
|
||||
#define AFX_IDM_WINDOW_FIRST 0xE130
|
||||
#define AFX_IDM_WINDOW_LAST 0xE13F
|
||||
#define AFX_IDM_FIRST_MDICHILD 0xFF00 // window list starts here
|
||||
#endif //!RC_INVOKED
|
||||
|
||||
// Help and App commands
|
||||
#define ID_APP_ABOUT 0xE140
|
||||
#define ID_APP_EXIT 0xE141
|
||||
#define ID_HELP_INDEX 0xE142
|
||||
#define ID_HELP_FINDER 0xE143
|
||||
#define ID_HELP_USING 0xE144
|
||||
#define ID_CONTEXT_HELP 0xE145 // shift-F1
|
||||
// special commands for processing help
|
||||
#define ID_HELP 0xE146 // first attempt for F1
|
||||
#define ID_DEFAULT_HELP 0xE147 // last attempt
|
||||
|
||||
// Misc
|
||||
#define ID_NEXT_PANE 0xE150
|
||||
#define ID_PREV_PANE 0xE151
|
||||
|
||||
// Format
|
||||
#define ID_FORMAT_FONT 0xE160
|
||||
|
||||
// OLE commands
|
||||
#define ID_OLE_INSERT_NEW 0xE200
|
||||
#define ID_OLE_EDIT_LINKS 0xE201
|
||||
#define ID_OLE_EDIT_CONVERT 0xE202
|
||||
#define ID_OLE_EDIT_CHANGE_ICON 0xE203
|
||||
#define ID_OLE_EDIT_PROPERTIES 0xE204
|
||||
#define ID_OLE_VERB_FIRST 0xE210 // range - 16 max
|
||||
#ifndef RC_INVOKED // code only
|
||||
#define ID_OLE_VERB_LAST 0xE21F
|
||||
#endif //!RC_INVOKED
|
||||
|
||||
// for print preview dialog bar
|
||||
#define AFX_ID_PREVIEW_CLOSE 0xE300
|
||||
#define AFX_ID_PREVIEW_NUMPAGE 0xE301 // One/Two Page button
|
||||
#define AFX_ID_PREVIEW_NEXT 0xE302
|
||||
#define AFX_ID_PREVIEW_PREV 0xE303
|
||||
#define AFX_ID_PREVIEW_PRINT 0xE304
|
||||
#define AFX_ID_PREVIEW_ZOOMIN 0xE305
|
||||
#define AFX_ID_PREVIEW_ZOOMOUT 0xE306
|
||||
|
||||
// View commands (same number used as IDW used for control bar)
|
||||
#define ID_VIEW_TOOLBAR 0xE800
|
||||
#define ID_VIEW_STATUS_BAR 0xE801
|
||||
// -> E8FF reserved for other control bar commands
|
||||
|
||||
// RecordForm commands
|
||||
#define ID_RECORD_FIRST 0xE900
|
||||
#define ID_RECORD_LAST 0xE901
|
||||
#define ID_RECORD_NEXT 0xE902
|
||||
#define ID_RECORD_PREV 0xE903
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Standard control IDs
|
||||
|
||||
#ifdef IDC_STATIC
|
||||
#undef IDC_STATIC
|
||||
#endif
|
||||
#define IDC_STATIC (-1) // all static controls
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Standard string error/warnings
|
||||
|
||||
#ifndef RC_INVOKED // code only
|
||||
#define AFX_IDS_SCFIRST 0xEF00
|
||||
#endif //!RC_INVOKED
|
||||
|
||||
#define AFX_IDS_SCSIZE 0xEF00
|
||||
#define AFX_IDS_SCMOVE 0xEF01
|
||||
#define AFX_IDS_SCMINIMIZE 0xEF02
|
||||
#define AFX_IDS_SCMAXIMIZE 0xEF03
|
||||
#define AFX_IDS_SCNEXTWINDOW 0xEF04
|
||||
#define AFX_IDS_SCPREVWINDOW 0xEF05
|
||||
#define AFX_IDS_SCCLOSE 0xEF06
|
||||
#define AFX_IDS_SCRESTORE 0xEF12
|
||||
#define AFX_IDS_SCTASKLIST 0xEF13
|
||||
|
||||
#define AFX_IDS_MDICHILD 0xEF1F
|
||||
|
||||
#define AFX_IDS_DESKACCESSORY 0xEFDA
|
||||
|
||||
// General strings
|
||||
#define AFX_IDS_OPENFILE 0xF000
|
||||
#define AFX_IDS_SAVEFILE 0xF001
|
||||
#define AFX_IDS_ALLFILTER 0xF002
|
||||
#define AFX_IDS_UNTITLED 0xF003
|
||||
#define AFX_IDS_SAVEFILECOPY 0xF004
|
||||
#define AFX_IDS_PREVIEW_CLOSE 0xF005
|
||||
#define AFX_IDS_UNNAMED_FILE 0xF006
|
||||
#ifdef _MAC
|
||||
#define AFX_IDS_ABOUT 0xF010
|
||||
#endif
|
||||
#define AFX_IDS_HIDE 0xF011
|
||||
|
||||
// MFC Standard Exception Error messages
|
||||
#define AFX_IDP_NO_ERROR_AVAILABLE 0xF020
|
||||
#define AFX_IDS_NOT_SUPPORTED_EXCEPTION 0xF021
|
||||
#define AFX_IDS_RESOURCE_EXCEPTION 0xF022
|
||||
#define AFX_IDS_MEMORY_EXCEPTION 0xF023
|
||||
#define AFX_IDS_USER_EXCEPTION 0xF024
|
||||
|
||||
// Printing and print preview strings
|
||||
#define AFX_IDS_PRINTONPORT 0xF040
|
||||
#define AFX_IDS_ONEPAGE 0xF041
|
||||
#define AFX_IDS_TWOPAGE 0xF042
|
||||
#define AFX_IDS_PRINTPAGENUM 0xF043
|
||||
#define AFX_IDS_PREVIEWPAGEDESC 0xF044
|
||||
#define AFX_IDS_PRINTDEFAULTEXT 0xF045
|
||||
#define AFX_IDS_PRINTDEFAULT 0xF046
|
||||
#define AFX_IDS_PRINTFILTER 0xF047
|
||||
#define AFX_IDS_PRINTCAPTION 0xF048
|
||||
#define AFX_IDS_PRINTTOFILE 0xF049
|
||||
|
||||
|
||||
// OLE strings
|
||||
#define AFX_IDS_OBJECT_MENUITEM 0xF080
|
||||
#define AFX_IDS_EDIT_VERB 0xF081
|
||||
#define AFX_IDS_ACTIVATE_VERB 0xF082
|
||||
#define AFX_IDS_CHANGE_LINK 0xF083
|
||||
#define AFX_IDS_AUTO 0xF084
|
||||
#define AFX_IDS_MANUAL 0xF085
|
||||
#define AFX_IDS_FROZEN 0xF086
|
||||
#define AFX_IDS_ALL_FILES 0xF087
|
||||
// dynamically changing menu items
|
||||
#define AFX_IDS_SAVE_MENU 0xF088
|
||||
#define AFX_IDS_UPDATE_MENU 0xF089
|
||||
#define AFX_IDS_SAVE_AS_MENU 0xF08A
|
||||
#define AFX_IDS_SAVE_COPY_AS_MENU 0xF08B
|
||||
#define AFX_IDS_EXIT_MENU 0xF08C
|
||||
#define AFX_IDS_UPDATING_ITEMS 0xF08D
|
||||
// COlePasteSpecialDialog defines
|
||||
#define AFX_IDS_METAFILE_FORMAT 0xF08E
|
||||
#define AFX_IDS_DIB_FORMAT 0xF08F
|
||||
#define AFX_IDS_BITMAP_FORMAT 0xF090
|
||||
#define AFX_IDS_LINKSOURCE_FORMAT 0xF091
|
||||
#define AFX_IDS_EMBED_FORMAT 0xF092
|
||||
// other OLE utility strings
|
||||
#define AFX_IDS_PASTELINKEDTYPE 0xF094
|
||||
#define AFX_IDS_UNKNOWNTYPE 0xF095
|
||||
#define AFX_IDS_RTF_FORMAT 0xF096
|
||||
#define AFX_IDS_TEXT_FORMAT 0xF097
|
||||
// OLE datatype format error strings
|
||||
#define AFX_IDS_INVALID_CURRENCY 0xF098
|
||||
#define AFX_IDS_INVALID_DATETIME 0xF099
|
||||
#define AFX_IDS_INVALID_DATETIMESPAN 0xF09A
|
||||
|
||||
// General error / prompt strings
|
||||
#define AFX_IDP_INVALID_FILENAME 0xF100
|
||||
#define AFX_IDP_FAILED_TO_OPEN_DOC 0xF101
|
||||
#define AFX_IDP_FAILED_TO_SAVE_DOC 0xF102
|
||||
#define AFX_IDP_ASK_TO_SAVE 0xF103
|
||||
#define AFX_IDP_FAILED_TO_CREATE_DOC 0xF104
|
||||
#define AFX_IDP_FILE_TOO_LARGE 0xF105
|
||||
#define AFX_IDP_FAILED_TO_START_PRINT 0xF106
|
||||
#define AFX_IDP_FAILED_TO_LAUNCH_HELP 0xF107
|
||||
#define AFX_IDP_INTERNAL_FAILURE 0xF108 // general failure
|
||||
#define AFX_IDP_COMMAND_FAILURE 0xF109 // command failure
|
||||
#define AFX_IDP_FAILED_MEMORY_ALLOC 0xF10A
|
||||
|
||||
// DDV parse errors
|
||||
#define AFX_IDP_PARSE_INT 0xF110
|
||||
#define AFX_IDP_PARSE_REAL 0xF111
|
||||
#define AFX_IDP_PARSE_INT_RANGE 0xF112
|
||||
#define AFX_IDP_PARSE_REAL_RANGE 0xF113
|
||||
#define AFX_IDP_PARSE_STRING_SIZE 0xF114
|
||||
#define AFX_IDP_PARSE_RADIO_BUTTON 0xF115
|
||||
#define AFX_IDP_PARSE_BYTE 0xF116
|
||||
#define AFX_IDP_PARSE_UINT 0xF117
|
||||
#define AFX_IDP_PARSE_DATETIME 0xF118
|
||||
#define AFX_IDP_PARSE_CURRENCY 0xF119
|
||||
|
||||
// CFile/CArchive error strings for user failure
|
||||
#define AFX_IDP_FAILED_INVALID_FORMAT 0xF120
|
||||
#define AFX_IDP_FAILED_INVALID_PATH 0xF121
|
||||
#define AFX_IDP_FAILED_DISK_FULL 0xF122
|
||||
#define AFX_IDP_FAILED_ACCESS_READ 0xF123
|
||||
#define AFX_IDP_FAILED_ACCESS_WRITE 0xF124
|
||||
#define AFX_IDP_FAILED_IO_ERROR_READ 0xF125
|
||||
#define AFX_IDP_FAILED_IO_ERROR_WRITE 0xF126
|
||||
|
||||
// OLE errors / prompt strings
|
||||
#define AFX_IDP_STATIC_OBJECT 0xF180
|
||||
#define AFX_IDP_FAILED_TO_CONNECT 0xF181
|
||||
#define AFX_IDP_SERVER_BUSY 0xF182
|
||||
#define AFX_IDP_BAD_VERB 0xF183
|
||||
#define AFX_IDP_FAILED_TO_NOTIFY 0xF185
|
||||
#define AFX_IDP_FAILED_TO_LAUNCH 0xF186
|
||||
#define AFX_IDP_ASK_TO_UPDATE 0xF187
|
||||
#define AFX_IDP_FAILED_TO_UPDATE 0xF188
|
||||
#define AFX_IDP_FAILED_TO_REGISTER 0xF189
|
||||
#define AFX_IDP_FAILED_TO_AUTO_REGISTER 0xF18A
|
||||
#define AFX_IDP_FAILED_TO_CONVERT 0xF18B
|
||||
#define AFX_IDP_GET_NOT_SUPPORTED 0xF18C
|
||||
#define AFX_IDP_SET_NOT_SUPPORTED 0xF18D
|
||||
#define AFX_IDP_ASK_TO_DISCARD 0xF18E
|
||||
#define AFX_IDP_FAILED_TO_CREATE 0xF18F
|
||||
|
||||
// MAPI errors / prompt strings
|
||||
#define AFX_IDP_FAILED_MAPI_LOAD 0xF190
|
||||
#define AFX_IDP_INVALID_MAPI_DLL 0xF191
|
||||
#define AFX_IDP_FAILED_MAPI_SEND 0xF192
|
||||
|
||||
#define AFX_IDP_FILE_NONE 0xF1A0
|
||||
#define AFX_IDP_FILE_GENERIC 0xF1A1
|
||||
#define AFX_IDP_FILE_NOT_FOUND 0xF1A2
|
||||
#define AFX_IDP_FILE_BAD_PATH 0xF1A3
|
||||
#define AFX_IDP_FILE_TOO_MANY_OPEN 0xF1A4
|
||||
#define AFX_IDP_FILE_ACCESS_DENIED 0xF1A5
|
||||
#define AFX_IDP_FILE_INVALID_FILE 0xF1A6
|
||||
#define AFX_IDP_FILE_REMOVE_CURRENT 0xF1A7
|
||||
#define AFX_IDP_FILE_DIR_FULL 0xF1A8
|
||||
#define AFX_IDP_FILE_BAD_SEEK 0xF1A9
|
||||
#define AFX_IDP_FILE_HARD_IO 0xF1AA
|
||||
#define AFX_IDP_FILE_SHARING 0xF1AB
|
||||
#define AFX_IDP_FILE_LOCKING 0xF1AC
|
||||
#define AFX_IDP_FILE_DISKFULL 0xF1AD
|
||||
#define AFX_IDP_FILE_EOF 0xF1AE
|
||||
|
||||
#define AFX_IDP_ARCH_NONE 0xF1B0
|
||||
#define AFX_IDP_ARCH_GENERIC 0xF1B1
|
||||
#define AFX_IDP_ARCH_READONLY 0xF1B2
|
||||
#define AFX_IDP_ARCH_ENDOFFILE 0xF1B3
|
||||
#define AFX_IDP_ARCH_WRITEONLY 0xF1B4
|
||||
#define AFX_IDP_ARCH_BADINDEX 0xF1B5
|
||||
#define AFX_IDP_ARCH_BADCLASS 0xF1B6
|
||||
#define AFX_IDP_ARCH_BADSCHEMA 0xF1B7
|
||||
|
||||
#define AFX_IDS_OCC_SCALEUNITS_PIXELS 0xF1C0
|
||||
|
||||
// 0xf200-0xf20f reserved
|
||||
|
||||
// font names and point sizes
|
||||
#define AFX_IDS_STATUS_FONT 0xF230
|
||||
#define AFX_IDS_TOOLTIP_FONT 0xF231
|
||||
#define AFX_IDS_UNICODE_FONT 0xF232
|
||||
#define AFX_IDS_MINI_FONT 0xF233
|
||||
|
||||
// ODBC Database errors / prompt strings
|
||||
#ifndef RC_INVOKED // code only
|
||||
#define AFX_IDP_SQL_FIRST 0xF280
|
||||
#endif //!RC_INVOKED
|
||||
#define AFX_IDP_SQL_CONNECT_FAIL 0xF281
|
||||
#define AFX_IDP_SQL_RECORDSET_FORWARD_ONLY 0xF282
|
||||
#define AFX_IDP_SQL_EMPTY_COLUMN_LIST 0xF283
|
||||
#define AFX_IDP_SQL_FIELD_SCHEMA_MISMATCH 0xF284
|
||||
#define AFX_IDP_SQL_ILLEGAL_MODE 0xF285
|
||||
#define AFX_IDP_SQL_MULTIPLE_ROWS_AFFECTED 0xF286
|
||||
#define AFX_IDP_SQL_NO_CURRENT_RECORD 0xF287
|
||||
#define AFX_IDP_SQL_NO_ROWS_AFFECTED 0xF288
|
||||
#define AFX_IDP_SQL_RECORDSET_READONLY 0xF289
|
||||
#define AFX_IDP_SQL_SQL_NO_TOTAL 0xF28A
|
||||
#define AFX_IDP_SQL_ODBC_LOAD_FAILED 0xF28B
|
||||
#define AFX_IDP_SQL_DYNASET_NOT_SUPPORTED 0xF28C
|
||||
#define AFX_IDP_SQL_SNAPSHOT_NOT_SUPPORTED 0xF28D
|
||||
#define AFX_IDP_SQL_API_CONFORMANCE 0xF28E
|
||||
#define AFX_IDP_SQL_SQL_CONFORMANCE 0xF28F
|
||||
#define AFX_IDP_SQL_NO_DATA_FOUND 0xF290
|
||||
#define AFX_IDP_SQL_ROW_UPDATE_NOT_SUPPORTED 0xF291
|
||||
#define AFX_IDP_SQL_ODBC_V2_REQUIRED 0xF292
|
||||
#define AFX_IDP_SQL_NO_POSITIONED_UPDATES 0xF293
|
||||
#define AFX_IDP_SQL_LOCK_MODE_NOT_SUPPORTED 0xF294
|
||||
#define AFX_IDP_SQL_DATA_TRUNCATED 0xF295
|
||||
#define AFX_IDP_SQL_ROW_FETCH 0xF296
|
||||
#define AFX_IDP_SQL_INCORRECT_ODBC 0xF297
|
||||
#define AFX_IDP_SQL_UPDATE_DELETE_FAILED 0xF298
|
||||
#define AFX_IDP_SQL_DYNAMIC_CURSOR_NOT_SUPPORTED 0xF299
|
||||
|
||||
// DAO Database errors / prompt strings
|
||||
#ifndef RC_INVOKED // code only
|
||||
#define AFX_IDP_DAO_FIRST 0xF2A0
|
||||
#endif //!RC_INVOKED
|
||||
#define AFX_IDP_DAO_ENGINE_INITIALIZATION 0xF2A0
|
||||
#define AFX_IDP_DAO_DFX_BIND 0xF2A1
|
||||
#define AFX_IDP_DAO_OBJECT_NOT_OPEN 0xF2A2
|
||||
|
||||
// ICDAORecordset::GetRows Errors
|
||||
// These are not placed in DAO Errors collection
|
||||
// and must be handled directly by MFC.
|
||||
#define AFX_IDP_DAO_ROWTOOSHORT 0xF2A3
|
||||
#define AFX_IDP_DAO_BADBINDINFO 0xF2A4
|
||||
#define AFX_IDP_DAO_COLUMNUNAVAILABLE 0xF2A5
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// AFX implementation - control IDs (AFX_IDC)
|
||||
|
||||
// Parts of dialogs
|
||||
#define AFX_IDC_LISTBOX 100
|
||||
#define AFX_IDC_CHANGE 101
|
||||
|
||||
// for print dialog
|
||||
#define AFX_IDC_PRINT_DOCNAME 201
|
||||
#define AFX_IDC_PRINT_PRINTERNAME 202
|
||||
#define AFX_IDC_PRINT_PORTNAME 203
|
||||
#define AFX_IDC_PRINT_PAGENUM 204
|
||||
|
||||
// Property Sheet control id's (determined with Spy++)
|
||||
#define ID_APPLY_NOW 0x3021
|
||||
#define ID_WIZBACK 0x3023
|
||||
#define ID_WIZNEXT 0x3024
|
||||
#define ID_WIZFINISH 0x3025
|
||||
#define AFX_IDC_TAB_CONTROL 0x3020
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// IDRs for standard components
|
||||
|
||||
#ifndef RC_INVOKED // code only
|
||||
// These are really COMMDLG dialogs, so there usually isn't a resource
|
||||
// for them, but these IDs are used as help IDs.
|
||||
#define AFX_IDD_FILEOPEN 28676
|
||||
#define AFX_IDD_FILESAVE 28677
|
||||
#define AFX_IDD_FONT 28678
|
||||
#define AFX_IDD_COLOR 28679
|
||||
#define AFX_IDD_PRINT 28680
|
||||
#define AFX_IDD_PRINTSETUP 28681
|
||||
#define AFX_IDD_FIND 28682
|
||||
#define AFX_IDD_REPLACE 28683
|
||||
#endif //!RC_INVOKED
|
||||
|
||||
// Standard dialogs app should leave alone (0x7801->)
|
||||
#define AFX_IDD_NEWTYPEDLG 30721
|
||||
#define AFX_IDD_PRINTDLG 30722
|
||||
#define AFX_IDD_PREVIEW_TOOLBAR 30723
|
||||
#ifdef _MAC
|
||||
#define AFX_IDD_PREVIEW_SHORTTOOLBAR 30731
|
||||
#endif
|
||||
|
||||
// Dialogs defined for OLE2UI library
|
||||
#define AFX_IDD_INSERTOBJECT 30724
|
||||
#define AFX_IDD_CHANGEICON 30725
|
||||
#define AFX_IDD_CONVERT 30726
|
||||
#define AFX_IDD_PASTESPECIAL 30727
|
||||
#define AFX_IDD_EDITLINKS 30728
|
||||
#define AFX_IDD_FILEBROWSE 30729
|
||||
#define AFX_IDD_BUSY 30730
|
||||
|
||||
#define AFX_IDD_OBJECTPROPERTIES 30732
|
||||
#define AFX_IDD_CHANGESOURCE 30733
|
||||
|
||||
// Standard cursors (0x7901->)
|
||||
// AFX_IDC = Cursor resources
|
||||
#define AFX_IDC_CONTEXTHELP 30977 // context sensitive help
|
||||
#define AFX_IDC_MAGNIFY 30978 // print preview zoom
|
||||
#define AFX_IDC_SMALLARROWS 30979 // splitter
|
||||
#define AFX_IDC_HSPLITBAR 30980 // splitter
|
||||
#define AFX_IDC_VSPLITBAR 30981 // splitter
|
||||
#define AFX_IDC_NODROPCRSR 30982 // No Drop Cursor
|
||||
#define AFX_IDC_TRACKNWSE 30983 // tracker
|
||||
#define AFX_IDC_TRACKNESW 30984 // tracker
|
||||
#define AFX_IDC_TRACKNS 30985 // tracker
|
||||
#define AFX_IDC_TRACKWE 30986 // tracker
|
||||
#define AFX_IDC_TRACK4WAY 30987 // tracker
|
||||
#define AFX_IDC_MOVE4WAY 30988 // resize bar (server only)
|
||||
|
||||
// Mini frame window bitmap ID
|
||||
#define AFX_IDB_MINIFRAME_MENU 30994
|
||||
|
||||
// CheckListBox checks bitmap ID
|
||||
#define AFX_IDB_CHECKLISTBOX_NT 30995
|
||||
#define AFX_IDB_CHECKLISTBOX_95 30996
|
||||
|
||||
// AFX standard accelerator resources
|
||||
#define AFX_IDR_PREVIEW_ACCEL 30997
|
||||
|
||||
// AFX standard ICON IDs (for MFC V1 apps) (0x7A01->)
|
||||
#define AFX_IDI_STD_MDIFRAME 31233
|
||||
#define AFX_IDI_STD_FRAME 31234
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// AFX OLE control implementation - control IDs (AFX_IDC)
|
||||
|
||||
// Font property page
|
||||
#define AFX_IDC_FONTPROP 1000
|
||||
#define AFX_IDC_FONTNAMES 1001
|
||||
#define AFX_IDC_FONTSTYLES 1002
|
||||
#define AFX_IDC_FONTSIZES 1003
|
||||
#define AFX_IDC_STRIKEOUT 1004
|
||||
#define AFX_IDC_UNDERLINE 1005
|
||||
#define AFX_IDC_SAMPLEBOX 1006
|
||||
|
||||
// Color property page
|
||||
#define AFX_IDC_COLOR_BLACK 1100
|
||||
#define AFX_IDC_COLOR_WHITE 1101
|
||||
#define AFX_IDC_COLOR_RED 1102
|
||||
#define AFX_IDC_COLOR_GREEN 1103
|
||||
#define AFX_IDC_COLOR_BLUE 1104
|
||||
#define AFX_IDC_COLOR_YELLOW 1105
|
||||
#define AFX_IDC_COLOR_MAGENTA 1106
|
||||
#define AFX_IDC_COLOR_CYAN 1107
|
||||
#define AFX_IDC_COLOR_GRAY 1108
|
||||
#define AFX_IDC_COLOR_LIGHTGRAY 1109
|
||||
#define AFX_IDC_COLOR_DARKRED 1110
|
||||
#define AFX_IDC_COLOR_DARKGREEN 1111
|
||||
#define AFX_IDC_COLOR_DARKBLUE 1112
|
||||
#define AFX_IDC_COLOR_LIGHTBROWN 1113
|
||||
#define AFX_IDC_COLOR_DARKMAGENTA 1114
|
||||
#define AFX_IDC_COLOR_DARKCYAN 1115
|
||||
#define AFX_IDC_COLORPROP 1116
|
||||
#define AFX_IDC_SYSTEMCOLORS 1117
|
||||
|
||||
// Picture porperty page
|
||||
#define AFX_IDC_PROPNAME 1201
|
||||
#define AFX_IDC_PICTURE 1202
|
||||
#define AFX_IDC_BROWSE 1203
|
||||
#define AFX_IDC_CLEAR 1204
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// IDRs for OLE control standard components
|
||||
|
||||
// Standard propery page dialogs app should leave alone (0x7E01->)
|
||||
#define AFX_IDD_PROPPAGE_COLOR 32257
|
||||
#define AFX_IDD_PROPPAGE_FONT 32258
|
||||
#define AFX_IDD_PROPPAGE_PICTURE 32259
|
||||
|
||||
#define AFX_IDB_TRUETYPE 32384
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Standard OLE control strings
|
||||
|
||||
// OLE Control page strings
|
||||
#define AFX_IDS_PROPPAGE_UNKNOWN 0xFE01
|
||||
#define AFX_IDS_COLOR_DESKTOP 0xFE04
|
||||
#define AFX_IDS_COLOR_APPWORKSPACE 0xFE05
|
||||
#define AFX_IDS_COLOR_WNDBACKGND 0xFE06
|
||||
#define AFX_IDS_COLOR_WNDTEXT 0xFE07
|
||||
#define AFX_IDS_COLOR_MENUBAR 0xFE08
|
||||
#define AFX_IDS_COLOR_MENUTEXT 0xFE09
|
||||
#define AFX_IDS_COLOR_ACTIVEBAR 0xFE0A
|
||||
#define AFX_IDS_COLOR_INACTIVEBAR 0xFE0B
|
||||
#define AFX_IDS_COLOR_ACTIVETEXT 0xFE0C
|
||||
#define AFX_IDS_COLOR_INACTIVETEXT 0xFE0D
|
||||
#define AFX_IDS_COLOR_ACTIVEBORDER 0xFE0E
|
||||
#define AFX_IDS_COLOR_INACTIVEBORDER 0xFE0F
|
||||
#define AFX_IDS_COLOR_WNDFRAME 0xFE10
|
||||
#define AFX_IDS_COLOR_SCROLLBARS 0xFE11
|
||||
#define AFX_IDS_COLOR_BTNFACE 0xFE12
|
||||
#define AFX_IDS_COLOR_BTNSHADOW 0xFE13
|
||||
#define AFX_IDS_COLOR_BTNTEXT 0xFE14
|
||||
#define AFX_IDS_COLOR_BTNHIGHLIGHT 0xFE15
|
||||
#define AFX_IDS_COLOR_DISABLEDTEXT 0xFE16
|
||||
#define AFX_IDS_COLOR_HIGHLIGHT 0xFE17
|
||||
#define AFX_IDS_COLOR_HIGHLIGHTTEXT 0xFE18
|
||||
#define AFX_IDS_REGULAR 0xFE19
|
||||
#define AFX_IDS_BOLD 0xFE1A
|
||||
#define AFX_IDS_ITALIC 0xFE1B
|
||||
#define AFX_IDS_BOLDITALIC 0xFE1C
|
||||
#define AFX_IDS_SAMPLETEXT 0xFE1D
|
||||
#define AFX_IDS_DISPLAYSTRING_FONT 0xFE1E
|
||||
#define AFX_IDS_DISPLAYSTRING_COLOR 0xFE1F
|
||||
#define AFX_IDS_DISPLAYSTRING_PICTURE 0xFE20
|
||||
#define AFX_IDS_PICTUREFILTER 0xFE21
|
||||
#define AFX_IDS_PICTYPE_UNKNOWN 0xFE22
|
||||
#define AFX_IDS_PICTYPE_NONE 0xFE23
|
||||
#define AFX_IDS_PICTYPE_BITMAP 0xFE24
|
||||
#define AFX_IDS_PICTYPE_METAFILE 0xFE25
|
||||
#define AFX_IDS_PICTYPE_ICON 0xFE26
|
||||
#define AFX_IDS_COLOR_PPG 0xFE28
|
||||
#define AFX_IDS_COLOR_PPG_CAPTION 0xFE29
|
||||
#define AFX_IDS_FONT_PPG 0xFE2A
|
||||
#define AFX_IDS_FONT_PPG_CAPTION 0xFE2B
|
||||
#define AFX_IDS_PICTURE_PPG 0xFE2C
|
||||
#define AFX_IDS_PICTURE_PPG_CAPTION 0xFE2D
|
||||
#define AFX_IDS_PICTUREBROWSETITLE 0xFE30
|
||||
#define AFX_IDS_BORDERSTYLE_0 0xFE31
|
||||
#define AFX_IDS_BORDERSTYLE_1 0xFE32
|
||||
|
||||
// OLE Control verb names
|
||||
#define AFX_IDS_VERB_EDIT 0xFE40
|
||||
#define AFX_IDS_VERB_PROPERTIES 0xFE41
|
||||
|
||||
// OLE Control internal error messages
|
||||
#define AFX_IDP_PICTURECANTOPEN 0xFE83
|
||||
#define AFX_IDP_PICTURECANTLOAD 0xFE84
|
||||
#define AFX_IDP_PICTURETOOLARGE 0xFE85
|
||||
#define AFX_IDP_PICTUREREADFAILED 0xFE86
|
||||
|
||||
// Standard OLE Control error strings
|
||||
#define AFX_IDP_E_ILLEGALFUNCTIONCALL 0xFEA0
|
||||
#define AFX_IDP_E_OVERFLOW 0xFEA1
|
||||
#define AFX_IDP_E_OUTOFMEMORY 0xFEA2
|
||||
#define AFX_IDP_E_DIVISIONBYZERO 0xFEA3
|
||||
#define AFX_IDP_E_OUTOFSTRINGSPACE 0xFEA4
|
||||
#define AFX_IDP_E_OUTOFSTACKSPACE 0xFEA5
|
||||
#define AFX_IDP_E_BADFILENAMEORNUMBER 0xFEA6
|
||||
#define AFX_IDP_E_FILENOTFOUND 0xFEA7
|
||||
#define AFX_IDP_E_BADFILEMODE 0xFEA8
|
||||
#define AFX_IDP_E_FILEALREADYOPEN 0xFEA9
|
||||
#define AFX_IDP_E_DEVICEIOERROR 0xFEAA
|
||||
#define AFX_IDP_E_FILEALREADYEXISTS 0xFEAB
|
||||
#define AFX_IDP_E_BADRECORDLENGTH 0xFEAC
|
||||
#define AFX_IDP_E_DISKFULL 0xFEAD
|
||||
#define AFX_IDP_E_BADRECORDNUMBER 0xFEAE
|
||||
#define AFX_IDP_E_BADFILENAME 0xFEAF
|
||||
#define AFX_IDP_E_TOOMANYFILES 0xFEB0
|
||||
#define AFX_IDP_E_DEVICEUNAVAILABLE 0xFEB1
|
||||
#define AFX_IDP_E_PERMISSIONDENIED 0xFEB2
|
||||
#define AFX_IDP_E_DISKNOTREADY 0xFEB3
|
||||
#define AFX_IDP_E_PATHFILEACCESSERROR 0xFEB4
|
||||
#define AFX_IDP_E_PATHNOTFOUND 0xFEB5
|
||||
#define AFX_IDP_E_INVALIDPATTERNSTRING 0xFEB6
|
||||
#define AFX_IDP_E_INVALIDUSEOFNULL 0xFEB7
|
||||
#define AFX_IDP_E_INVALIDFILEFORMAT 0xFEB8
|
||||
#define AFX_IDP_E_INVALIDPROPERTYVALUE 0xFEB9
|
||||
#define AFX_IDP_E_INVALIDPROPERTYARRAYINDEX 0xFEBA
|
||||
#define AFX_IDP_E_SETNOTSUPPORTEDATRUNTIME 0xFEBB
|
||||
#define AFX_IDP_E_SETNOTSUPPORTED 0xFEBC
|
||||
#define AFX_IDP_E_NEEDPROPERTYARRAYINDEX 0xFEBD
|
||||
#define AFX_IDP_E_SETNOTPERMITTED 0xFEBE
|
||||
#define AFX_IDP_E_GETNOTSUPPORTEDATRUNTIME 0xFEBF
|
||||
#define AFX_IDP_E_GETNOTSUPPORTED 0xFEC0
|
||||
#define AFX_IDP_E_PROPERTYNOTFOUND 0xFEC1
|
||||
#define AFX_IDP_E_INVALIDCLIPBOARDFORMAT 0xFEC2
|
||||
#define AFX_IDP_E_INVALIDPICTURE 0xFEC3
|
||||
#define AFX_IDP_E_PRINTERERROR 0xFEC4
|
||||
#define AFX_IDP_E_CANTSAVEFILETOTEMP 0xFEC5
|
||||
#define AFX_IDP_E_SEARCHTEXTNOTFOUND 0xFEC6
|
||||
#define AFX_IDP_E_REPLACEMENTSTOOLONG 0xFEC7
|
||||
|
||||
#ifdef _AFX_MINREBUILD
|
||||
#pragma component(minrebuild, on)
|
||||
#endif
|
||||
|
||||
#endif //__AFXRES_H__
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
@ -1,432 +0,0 @@
|
||||
// Mail and Chat Server for BPQ32 Packet Switch
|
||||
//
|
||||
// Debug Window(s) Module
|
||||
|
||||
#include "BPQChat.h"
|
||||
|
||||
static char ClassName[]="BPQDEBUGWINDOW";
|
||||
|
||||
|
||||
static WNDPROC wpOrigInputProc;
|
||||
static WNDPROC wpOrigOutputProc;
|
||||
|
||||
HWND hDebug;
|
||||
static HWND hwndInput;
|
||||
static HWND hwndOutput;
|
||||
|
||||
static HMENU hMenu; // handle of menu
|
||||
|
||||
#define InputBoxHeight 25
|
||||
|
||||
RECT DebugRect;
|
||||
|
||||
|
||||
int Height, Width, LastY;
|
||||
|
||||
static char readbuff[1024];
|
||||
|
||||
static BOOL Bells = TRUE;
|
||||
static BOOL StripLF = TRUE;
|
||||
static BOOL MonBBS = TRUE;
|
||||
static BOOL MonCHAT = TRUE;
|
||||
static BOOL MonTCP = TRUE;
|
||||
|
||||
static int PartLinePtr=0;
|
||||
static int PartLineIndex=0; // Listbox index of (last) incomplete line
|
||||
|
||||
|
||||
static LRESULT CALLBACK MonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static LRESULT APIENTRY OutputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static LRESULT APIENTRY MonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static LRESULT APIENTRY SplitProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static void MoveWindows();
|
||||
|
||||
#define BGCOLOUR RGB(236,233,216)
|
||||
|
||||
extern char DebugSize[32];
|
||||
|
||||
BOOL CreateDebugWindow()
|
||||
{
|
||||
WNDCLASS wc;
|
||||
HBRUSH bgBrush;
|
||||
char Text[80];
|
||||
|
||||
if (hDebug)
|
||||
{
|
||||
ShowWindow(hDebug, SW_SHOWNORMAL);
|
||||
SetForegroundWindow(hDebug);
|
||||
return FALSE; // Alreaqy open
|
||||
}
|
||||
|
||||
bgBrush = CreateSolidBrush(BGCOLOUR);
|
||||
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wc.lpfnWndProc = MonWndProc;
|
||||
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = DLGWINDOWEXTRA;
|
||||
wc.hInstance = hInst;
|
||||
wc.hIcon = LoadIcon( hInst, MAKEINTRESOURCE(BPQICON) );
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = bgBrush;
|
||||
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = ClassName;
|
||||
|
||||
RegisterClass(&wc);
|
||||
|
||||
hDebug=CreateDialog(hInst,ClassName,0,NULL);
|
||||
|
||||
if (!hDebug)
|
||||
return (FALSE);
|
||||
|
||||
wsprintf(Text, "Chat %s Debug", Session);
|
||||
SetWindowText(hDebug, Text);
|
||||
|
||||
hMenu=GetMenu(hDebug);
|
||||
|
||||
if (Bells & 1)
|
||||
CheckMenuItem(hMenu,BPQBELLS, MF_CHECKED);
|
||||
else
|
||||
CheckMenuItem(hMenu,BPQBELLS, MF_UNCHECKED);
|
||||
|
||||
if (StripLF & 1)
|
||||
CheckMenuItem(hMenu,BPQStripLF, MF_CHECKED);
|
||||
else
|
||||
CheckMenuItem(hMenu,BPQStripLF, MF_UNCHECKED);
|
||||
|
||||
CheckMenuItem(hMenu,MONBBS, MonBBS ? MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hMenu,MONCHAT, MonCHAT ? MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hMenu,MONTCP, MonTCP ? MF_CHECKED : MF_UNCHECKED);
|
||||
|
||||
DrawMenuBar(hWnd);
|
||||
|
||||
// Retrieve the handlse to the edit controls.
|
||||
|
||||
hwndOutput = GetDlgItem(hDebug, 122);
|
||||
|
||||
// Set our own WndProcs for the controls.
|
||||
|
||||
wpOrigOutputProc = (WNDPROC)SetWindowLong(hwndOutput, GWL_WNDPROC, (LONG)OutputProc);
|
||||
|
||||
if (cfgMinToTray)
|
||||
{
|
||||
AddTrayMenuItem(hDebug, Text);
|
||||
}
|
||||
ShowWindow(hDebug, SW_SHOWNORMAL);
|
||||
|
||||
if (DebugRect.right < 100 || DebugRect.bottom < 100)
|
||||
{
|
||||
GetWindowRect(hDebug, &DebugRect);
|
||||
}
|
||||
|
||||
MoveWindow(hDebug,DebugRect.left,DebugRect.top, DebugRect.right-DebugRect.left, DebugRect.bottom-DebugRect.top, TRUE);
|
||||
|
||||
MoveWindows();
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void MoveWindows()
|
||||
{
|
||||
RECT rcMain, rcClient;
|
||||
int ClientHeight, ClientWidth;
|
||||
|
||||
GetWindowRect(hDebug, &rcMain);
|
||||
GetClientRect(hDebug, &rcClient);
|
||||
|
||||
ClientHeight = rcClient.bottom;
|
||||
ClientWidth = rcClient.right;
|
||||
|
||||
// MoveWindow(hwndMon,2, 0, ClientWidth-4, SplitPos, TRUE);
|
||||
MoveWindow(hwndOutput,2, 2, ClientWidth-4, ClientHeight-4, TRUE);
|
||||
// MoveWindow(hwndSplit,0, SplitPos, ClientWidth, SplitBarHeight, TRUE);
|
||||
}
|
||||
|
||||
|
||||
static LRESULT CALLBACK MonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int wmId, wmEvent;
|
||||
LPRECT lprc;
|
||||
|
||||
switch (message) {
|
||||
|
||||
case WM_ACTIVATE:
|
||||
|
||||
SetFocus(hwndInput);
|
||||
break;
|
||||
|
||||
|
||||
case WM_COMMAND:
|
||||
|
||||
wmId = LOWORD(wParam); // Remember, these are...
|
||||
wmEvent = HIWORD(wParam); // ...different for Win32!
|
||||
|
||||
switch (wmId) {
|
||||
|
||||
case MONBBS:
|
||||
|
||||
ToggleParam(hMenu, hWnd, &MonBBS, MONBBS);
|
||||
break;
|
||||
|
||||
case MONCHAT:
|
||||
|
||||
ToggleParam(hMenu, hWnd, &MonCHAT, MONCHAT);
|
||||
break;
|
||||
|
||||
case MONTCP:
|
||||
|
||||
ToggleParam(hMenu, hWnd, &MonTCP, MONTCP);
|
||||
break;
|
||||
|
||||
|
||||
case BPQCLEAROUT:
|
||||
|
||||
SendMessage(hwndOutput,LB_RESETCONTENT, 0, 0);
|
||||
break;
|
||||
|
||||
case BPQCOPYOUT:
|
||||
|
||||
CopyToClipboard(hwndOutput);
|
||||
break;
|
||||
|
||||
|
||||
|
||||
//case BPQHELP:
|
||||
|
||||
// HtmlHelp(hWnd,"BPQTerminal.chm",HH_HELP_FINDER,0);
|
||||
// break;
|
||||
|
||||
default:
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
case WM_SYSCOMMAND:
|
||||
|
||||
wmId = LOWORD(wParam); // Remember, these are...
|
||||
wmEvent = HIWORD(wParam); // ...different for Win32!
|
||||
|
||||
switch (wmId) {
|
||||
|
||||
case SC_MINIMIZE:
|
||||
|
||||
if (cfgMinToTray)
|
||||
return ShowWindow(hWnd, SW_HIDE);
|
||||
|
||||
default:
|
||||
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
}
|
||||
|
||||
case WM_SIZING:
|
||||
|
||||
lprc = (LPRECT) lParam;
|
||||
|
||||
Height = lprc->bottom-lprc->top;
|
||||
Width = lprc->right-lprc->left;
|
||||
|
||||
MoveWindows();
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
||||
case WM_DESTROY:
|
||||
|
||||
// Remove the subclass from the edit control.
|
||||
|
||||
GetWindowRect(hWnd, &DebugRect); // For save soutine
|
||||
|
||||
SetWindowLong(hwndInput, GWL_WNDPROC,
|
||||
(LONG) wpOrigInputProc);
|
||||
|
||||
|
||||
if (cfgMinToTray)
|
||||
DeleteTrayMenuItem(hWnd);
|
||||
|
||||
|
||||
hDebug = NULL;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
LRESULT APIENTRY OutputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
|
||||
// Trap mouse messages, so we cant select stuff in output and mon windows,
|
||||
// otherwise scrolling doesnt work.
|
||||
|
||||
if (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST)
|
||||
return TRUE;
|
||||
|
||||
return CallWindowProc(wpOrigOutputProc, hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
VOID ClearDebugWindow()
|
||||
{
|
||||
SendMessage(hwndOutput,LB_RESETCONTENT, 0, 0);
|
||||
}
|
||||
|
||||
VOID WritetoDebugWindow(char * Msg, int len)
|
||||
{
|
||||
char * ptr1, * ptr2;
|
||||
int index;
|
||||
|
||||
if (len ==0)
|
||||
return;
|
||||
|
||||
|
||||
if (PartLinePtr != 0)
|
||||
SendMessage(hwndOutput,LB_DELETESTRING,PartLineIndex,(LPARAM)(LPCTSTR) 0 );
|
||||
|
||||
memcpy(&readbuff[PartLinePtr], Msg, len);
|
||||
|
||||
len=len+PartLinePtr;
|
||||
|
||||
ptr1=&readbuff[0];
|
||||
readbuff[len]=0;
|
||||
|
||||
if (Bells)
|
||||
{
|
||||
do {
|
||||
|
||||
ptr2=memchr(ptr1,7,len);
|
||||
|
||||
if (ptr2)
|
||||
{
|
||||
*(ptr2)=32;
|
||||
Beep(440,250);
|
||||
}
|
||||
|
||||
} while (ptr2);
|
||||
|
||||
}
|
||||
|
||||
lineloop:
|
||||
|
||||
if (PartLinePtr > 300)
|
||||
PartLinePtr = 0;
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
// copy text to control a line at a time
|
||||
|
||||
ptr2=memchr(ptr1,13,len);
|
||||
|
||||
if (ptr2 == 0)
|
||||
{
|
||||
// no newline. Move data to start of buffer and Save pointer
|
||||
|
||||
PartLinePtr=len;
|
||||
memmove(readbuff,ptr1,len);
|
||||
PartLineIndex=SendMessage(hwndOutput,LB_ADDSTRING,0,(LPARAM)(LPCTSTR) ptr1 );
|
||||
SendMessage(hwndOutput,LB_SETCARETINDEX,(WPARAM) PartLineIndex, MAKELPARAM(FALSE, 0));
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
*(ptr2++)=0;
|
||||
|
||||
index=SendMessage(hwndOutput,LB_ADDSTRING,0,(LPARAM)(LPCTSTR) ptr1 );
|
||||
|
||||
// if (LogOutput) WriteMonitorLine(ptr1, ptr2 - ptr1);
|
||||
|
||||
PartLinePtr=0;
|
||||
|
||||
len-=(ptr2-ptr1);
|
||||
|
||||
ptr1=ptr2;
|
||||
|
||||
if ((len > 0) && StripLF)
|
||||
{
|
||||
if (*ptr1 == 0x0a) // Line Feed
|
||||
{
|
||||
ptr1++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
if (index > 1200)
|
||||
|
||||
do{
|
||||
|
||||
index=SendMessage(hwndOutput,LB_DELETESTRING, 0, 0);
|
||||
|
||||
} while (index > 1000);
|
||||
|
||||
SendMessage(hwndOutput,LB_SETCARETINDEX,(WPARAM) index, MAKELPARAM(FALSE, 0));
|
||||
|
||||
goto lineloop;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*static int ToggleParam(HMENU hMenu, HWND hWnd, BOOL * Param, int Item)
|
||||
{
|
||||
*Param = !(*Param);
|
||||
|
||||
CheckMenuItem(hMenu,Item, (*Param) ? MF_CHECKED : MF_UNCHECKED);
|
||||
|
||||
return (0);
|
||||
}
|
||||
*/
|
||||
static void CopyToClipboard(HWND hWnd)
|
||||
{
|
||||
int i,n, len=0;
|
||||
HGLOBAL hMem;
|
||||
char * ptr;
|
||||
//
|
||||
// Copy List Box to clipboard
|
||||
//
|
||||
|
||||
n = SendMessage(hWnd, LB_GETCOUNT, 0, 0);
|
||||
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
len+=SendMessage(hWnd, LB_GETTEXTLEN, i, 0);
|
||||
}
|
||||
|
||||
hMem=GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, len+n+n+1);
|
||||
|
||||
|
||||
if (hMem != 0)
|
||||
{
|
||||
ptr=GlobalLock(hMem);
|
||||
|
||||
if (OpenClipboard(MainWnd))
|
||||
{
|
||||
// CopyScreentoBuffer(GlobalLock(hMem));
|
||||
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
ptr+=SendMessage(hWnd, LB_GETTEXT, i, (LPARAM) ptr);
|
||||
*(ptr++)=13;
|
||||
*(ptr++)=10;
|
||||
}
|
||||
|
||||
*(ptr)=0; // end of data
|
||||
|
||||
GlobalUnlock(hMem);
|
||||
EmptyClipboard();
|
||||
SetClipboardData(CF_TEXT,hMem);
|
||||
CloseClipboard();
|
||||
}
|
||||
else
|
||||
GlobalFree(hMem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,26 +0,0 @@
|
||||
/* $Id: upnperrors.h,v 1.6 2015/07/21 13:16:55 nanard Exp $ */
|
||||
/* (c) 2007-2015 Thomas Bernard
|
||||
* All rights reserved.
|
||||
* MiniUPnP Project.
|
||||
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
||||
* This software is subjet to the conditions detailed in the
|
||||
* provided LICENCE file. */
|
||||
#ifndef UPNPERRORS_H_INCLUDED
|
||||
#define UPNPERRORS_H_INCLUDED
|
||||
|
||||
#include "miniupnpc_declspec.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* strupnperror()
|
||||
* Return a string description of the UPnP error code
|
||||
* or NULL for undefinded errors */
|
||||
MINIUPNP_LIBSPEC const char * strupnperror(int err);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,563 +0,0 @@
|
||||
|
||||
/* pngwtran.c - transforms the data in a row for PNG writers
|
||||
*
|
||||
* libpng version 1.2.8 - December 3, 2004
|
||||
* For conditions of distribution and use, see copyright notice in png.h
|
||||
* Copyright (c) 1998-2004 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*/
|
||||
|
||||
#define PNG_INTERNAL
|
||||
#include "png.h"
|
||||
#ifdef PNG_WRITE_SUPPORTED
|
||||
|
||||
/* Transform the data according to the user's wishes. The order of
|
||||
* transformations is significant.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_do_write_transformations(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_do_write_transformations\n");
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_USER_TRANSFORM)
|
||||
if(png_ptr->write_user_transform_fn != NULL)
|
||||
(*(png_ptr->write_user_transform_fn)) /* user write transform function */
|
||||
(png_ptr, /* png_ptr */
|
||||
&(png_ptr->row_info), /* row_info: */
|
||||
/* png_uint_32 width; width of row */
|
||||
/* png_uint_32 rowbytes; number of bytes in row */
|
||||
/* png_byte color_type; color type of pixels */
|
||||
/* png_byte bit_depth; bit depth of samples */
|
||||
/* png_byte channels; number of channels (1-4) */
|
||||
/* png_byte pixel_depth; bits per pixel (depth*channels) */
|
||||
png_ptr->row_buf + 1); /* start of pixel data for row */
|
||||
#endif
|
||||
#if defined(PNG_WRITE_FILLER_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_FILLER)
|
||||
png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,
|
||||
png_ptr->flags);
|
||||
#endif
|
||||
#if defined(PNG_WRITE_PACKSWAP_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_PACKSWAP)
|
||||
png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
#endif
|
||||
#if defined(PNG_WRITE_PACK_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_PACK)
|
||||
png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1,
|
||||
(png_uint_32)png_ptr->bit_depth);
|
||||
#endif
|
||||
#if defined(PNG_WRITE_SWAP_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_SWAP_BYTES)
|
||||
png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
#endif
|
||||
#if defined(PNG_WRITE_SHIFT_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_SHIFT)
|
||||
png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1,
|
||||
&(png_ptr->shift));
|
||||
#endif
|
||||
#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_INVERT_ALPHA)
|
||||
png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
#endif
|
||||
#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_SWAP_ALPHA)
|
||||
png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
#endif
|
||||
#if defined(PNG_WRITE_BGR_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_BGR)
|
||||
png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
#endif
|
||||
#if defined(PNG_WRITE_INVERT_SUPPORTED)
|
||||
if (png_ptr->transformations & PNG_INVERT_MONO)
|
||||
png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(PNG_WRITE_PACK_SUPPORTED)
|
||||
/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The
|
||||
* row_info bit depth should be 8 (one pixel per byte). The channels
|
||||
* should be 1 (this only happens on grayscale and paletted images).
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
|
||||
{
|
||||
png_debug(1, "in png_do_pack\n");
|
||||
if (row_info->bit_depth == 8 &&
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
row != NULL && row_info != NULL &&
|
||||
#endif
|
||||
row_info->channels == 1)
|
||||
{
|
||||
switch ((int)bit_depth)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
int mask, v;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
sp = row;
|
||||
dp = row;
|
||||
mask = 0x80;
|
||||
v = 0;
|
||||
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
if (*sp != 0)
|
||||
v |= mask;
|
||||
sp++;
|
||||
if (mask > 1)
|
||||
mask >>= 1;
|
||||
else
|
||||
{
|
||||
mask = 0x80;
|
||||
*dp = (png_byte)v;
|
||||
dp++;
|
||||
v = 0;
|
||||
}
|
||||
}
|
||||
if (mask != 0x80)
|
||||
*dp = (png_byte)v;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
int shift, v;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
sp = row;
|
||||
dp = row;
|
||||
shift = 6;
|
||||
v = 0;
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
png_byte value;
|
||||
|
||||
value = (png_byte)(*sp & 0x03);
|
||||
v |= (value << shift);
|
||||
if (shift == 0)
|
||||
{
|
||||
shift = 6;
|
||||
*dp = (png_byte)v;
|
||||
dp++;
|
||||
v = 0;
|
||||
}
|
||||
else
|
||||
shift -= 2;
|
||||
sp++;
|
||||
}
|
||||
if (shift != 6)
|
||||
*dp = (png_byte)v;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
int shift, v;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
sp = row;
|
||||
dp = row;
|
||||
shift = 4;
|
||||
v = 0;
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
png_byte value;
|
||||
|
||||
value = (png_byte)(*sp & 0x0f);
|
||||
v |= (value << shift);
|
||||
|
||||
if (shift == 0)
|
||||
{
|
||||
shift = 4;
|
||||
*dp = (png_byte)v;
|
||||
dp++;
|
||||
v = 0;
|
||||
}
|
||||
else
|
||||
shift -= 4;
|
||||
|
||||
sp++;
|
||||
}
|
||||
if (shift != 4)
|
||||
*dp = (png_byte)v;
|
||||
break;
|
||||
}
|
||||
}
|
||||
row_info->bit_depth = (png_byte)bit_depth;
|
||||
row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels);
|
||||
row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
|
||||
row_info->width);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_WRITE_SHIFT_SUPPORTED)
|
||||
/* Shift pixel values to take advantage of whole range. Pass the
|
||||
* true number of bits in bit_depth. The row should be packed
|
||||
* according to row_info->bit_depth. Thus, if you had a row of
|
||||
* bit depth 4, but the pixels only had values from 0 to 7, you
|
||||
* would pass 3 as bit_depth, and this routine would translate the
|
||||
* data to 0 to 15.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
|
||||
{
|
||||
png_debug(1, "in png_do_shift\n");
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
if (row != NULL && row_info != NULL &&
|
||||
#else
|
||||
if (
|
||||
#endif
|
||||
row_info->color_type != PNG_COLOR_TYPE_PALETTE)
|
||||
{
|
||||
int shift_start[4], shift_dec[4];
|
||||
int channels = 0;
|
||||
|
||||
if (row_info->color_type & PNG_COLOR_MASK_COLOR)
|
||||
{
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->red;
|
||||
shift_dec[channels] = bit_depth->red;
|
||||
channels++;
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->green;
|
||||
shift_dec[channels] = bit_depth->green;
|
||||
channels++;
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->blue;
|
||||
shift_dec[channels] = bit_depth->blue;
|
||||
channels++;
|
||||
}
|
||||
else
|
||||
{
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->gray;
|
||||
shift_dec[channels] = bit_depth->gray;
|
||||
channels++;
|
||||
}
|
||||
if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
|
||||
{
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->alpha;
|
||||
shift_dec[channels] = bit_depth->alpha;
|
||||
channels++;
|
||||
}
|
||||
|
||||
/* with low row depths, could only be grayscale, so one channel */
|
||||
if (row_info->bit_depth < 8)
|
||||
{
|
||||
png_bytep bp = row;
|
||||
png_uint_32 i;
|
||||
png_byte mask;
|
||||
png_uint_32 row_bytes = row_info->rowbytes;
|
||||
|
||||
if (bit_depth->gray == 1 && row_info->bit_depth == 2)
|
||||
mask = 0x55;
|
||||
else if (row_info->bit_depth == 4 && bit_depth->gray == 3)
|
||||
mask = 0x11;
|
||||
else
|
||||
mask = 0xff;
|
||||
|
||||
for (i = 0; i < row_bytes; i++, bp++)
|
||||
{
|
||||
png_uint_16 v;
|
||||
int j;
|
||||
|
||||
v = *bp;
|
||||
*bp = 0;
|
||||
for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0])
|
||||
{
|
||||
if (j > 0)
|
||||
*bp |= (png_byte)((v << j) & 0xff);
|
||||
else
|
||||
*bp |= (png_byte)((v >> (-j)) & mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (row_info->bit_depth == 8)
|
||||
{
|
||||
png_bytep bp = row;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop = channels * row_info->width;
|
||||
|
||||
for (i = 0; i < istop; i++, bp++)
|
||||
{
|
||||
|
||||
png_uint_16 v;
|
||||
int j;
|
||||
int c = (int)(i%channels);
|
||||
|
||||
v = *bp;
|
||||
*bp = 0;
|
||||
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
|
||||
{
|
||||
if (j > 0)
|
||||
*bp |= (png_byte)((v << j) & 0xff);
|
||||
else
|
||||
*bp |= (png_byte)((v >> (-j)) & 0xff);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
png_bytep bp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop = channels * row_info->width;
|
||||
|
||||
for (bp = row, i = 0; i < istop; i++)
|
||||
{
|
||||
int c = (int)(i%channels);
|
||||
png_uint_16 value, v;
|
||||
int j;
|
||||
|
||||
v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1));
|
||||
value = 0;
|
||||
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
|
||||
{
|
||||
if (j > 0)
|
||||
value |= (png_uint_16)((v << j) & (png_uint_16)0xffff);
|
||||
else
|
||||
value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff);
|
||||
}
|
||||
*bp++ = (png_byte)(value >> 8);
|
||||
*bp++ = (png_byte)(value & 0xff);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
|
||||
void /* PRIVATE */
|
||||
png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_write_swap_alpha\n");
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
if (row != NULL && row_info != NULL)
|
||||
#endif
|
||||
{
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
{
|
||||
/* This converts from ARGB to RGBA */
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save;
|
||||
}
|
||||
}
|
||||
/* This converts from AARRGGBB to RRGGBBAA */
|
||||
else
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save[2];
|
||||
save[0] = *(sp++);
|
||||
save[1] = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save[0];
|
||||
*(dp++) = save[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
{
|
||||
/* This converts from AG to GA */
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save;
|
||||
}
|
||||
}
|
||||
/* This converts from AAGG to GGAA */
|
||||
else
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save[2];
|
||||
save[0] = *(sp++);
|
||||
save[1] = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save[0];
|
||||
*(dp++) = save[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
|
||||
void /* PRIVATE */
|
||||
png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_write_invert_alpha\n");
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
if (row != NULL && row_info != NULL)
|
||||
#endif
|
||||
{
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
{
|
||||
/* This inverts the alpha channel in RGBA */
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
/* This inverts the alpha channel in RRGGBBAA */
|
||||
else
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
{
|
||||
/* This inverts the alpha channel in GA */
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
/* This inverts the alpha channel in GGAA */
|
||||
else
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_MNG_FEATURES_SUPPORTED)
|
||||
/* undoes intrapixel differencing */
|
||||
void /* PRIVATE */
|
||||
png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_write_intrapixel\n");
|
||||
if (
|
||||
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||
row != NULL && row_info != NULL &&
|
||||
#endif
|
||||
(row_info->color_type & PNG_COLOR_MASK_COLOR))
|
||||
{
|
||||
int bytes_per_pixel;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
png_bytep rp;
|
||||
png_uint_32 i;
|
||||
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
|
||||
bytes_per_pixel = 3;
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
bytes_per_pixel = 4;
|
||||
else
|
||||
return;
|
||||
|
||||
for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
|
||||
{
|
||||
*(rp) = (png_byte)((*rp - *(rp+1))&0xff);
|
||||
*(rp+2) = (png_byte)((*(rp+2) - *(rp+1))&0xff);
|
||||
}
|
||||
}
|
||||
else if (row_info->bit_depth == 16)
|
||||
{
|
||||
png_bytep rp;
|
||||
png_uint_32 i;
|
||||
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
|
||||
bytes_per_pixel = 6;
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
bytes_per_pixel = 8;
|
||||
else
|
||||
return;
|
||||
|
||||
for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
|
||||
{
|
||||
png_uint_32 s0 = (*(rp ) << 8) | *(rp+1);
|
||||
png_uint_32 s1 = (*(rp+2) << 8) | *(rp+3);
|
||||
png_uint_32 s2 = (*(rp+4) << 8) | *(rp+5);
|
||||
png_uint_32 red = (png_uint_32)((s0-s1) & 0xffffL);
|
||||
png_uint_32 blue = (png_uint_32)((s2-s1) & 0xffffL);
|
||||
*(rp ) = (png_byte)((red >> 8) & 0xff);
|
||||
*(rp+1) = (png_byte)(red & 0xff);
|
||||
*(rp+4) = (png_byte)((blue >> 8) & 0xff);
|
||||
*(rp+5) = (png_byte)(blue & 0xff);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* PNG_MNG_FEATURES_SUPPORTED */
|
||||
#endif /* PNG_WRITE_SUPPORTED */
|
||||
@ -1,455 +0,0 @@
|
||||
// Mail and Chat Server for BPQ32 Packet Switch
|
||||
//
|
||||
// Monitor Window(s) Module
|
||||
|
||||
#include "BPQChat.h"
|
||||
|
||||
static char ClassName[]="BPQMONWINDOW";
|
||||
|
||||
|
||||
static WNDPROC wpOrigInputProc;
|
||||
static WNDPROC wpOrigOutputProc;
|
||||
|
||||
HWND hMonitor;
|
||||
|
||||
static HWND hwndInput;
|
||||
static HWND hwndOutput;
|
||||
|
||||
static HMENU hMenu; // handle of menu
|
||||
|
||||
|
||||
#define InputBoxHeight 25
|
||||
RECT MonitorRect;
|
||||
RECT OutputRect;
|
||||
|
||||
int Height, Width, LastY;
|
||||
|
||||
static char kbbuf[160];
|
||||
static int kbptr=0;
|
||||
|
||||
static char * readbuff;
|
||||
static int readbufflen;
|
||||
|
||||
static BOOL StripLF = TRUE;
|
||||
static BOOL MonBBS = TRUE;
|
||||
static BOOL MonCHAT = TRUE;
|
||||
static BOOL MonTCP = TRUE;
|
||||
|
||||
BOOL LogBBS = TRUE;
|
||||
BOOL LogCHAT = TRUE;
|
||||
BOOL LogTCP = TRUE;
|
||||
|
||||
static int PartLinePtr=0;
|
||||
static int PartLineIndex=0; // Listbox index of (last) incomplete line
|
||||
|
||||
|
||||
static LRESULT CALLBACK MonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static LRESULT APIENTRY OutputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static LRESULT APIENTRY MonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
static void MoveWindows();
|
||||
|
||||
#define BGCOLOUR RGB(236,233,216)
|
||||
|
||||
extern char MonitorSize[32];
|
||||
|
||||
BOOL CreateMonitor()
|
||||
{
|
||||
WNDCLASS wc;
|
||||
HBRUSH bgBrush;
|
||||
char Text[80];
|
||||
|
||||
if (hMonitor)
|
||||
{
|
||||
ShowWindow(hMonitor, SW_SHOWNORMAL);
|
||||
SetForegroundWindow(hMonitor);
|
||||
return FALSE; // Alreaqy open
|
||||
}
|
||||
|
||||
bgBrush = CreateSolidBrush(BGCOLOUR);
|
||||
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wc.lpfnWndProc = MonWndProc;
|
||||
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = DLGWINDOWEXTRA;
|
||||
wc.hInstance = hInst;
|
||||
wc.hIcon = LoadIcon( hInst, MAKEINTRESOURCE(BPQICON) );
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = bgBrush;
|
||||
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = ClassName;
|
||||
|
||||
RegisterClass(&wc);
|
||||
|
||||
hMonitor=CreateDialog(hInst,ClassName,0,NULL);
|
||||
|
||||
if (!hMonitor)
|
||||
return (FALSE);
|
||||
|
||||
wsprintf(Text, "Chat %s Monitor", Session);
|
||||
SetWindowText(hMonitor, Text);
|
||||
|
||||
readbuff = zalloc(1000);
|
||||
readbufflen = 1000;
|
||||
|
||||
hMenu=GetMenu(hMonitor);
|
||||
|
||||
CheckMenuItem(hMenu,MONBBS, MonBBS ? MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hMenu,MONCHAT, MonCHAT ? MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hMenu,MONTCP, MonTCP ? MF_CHECKED : MF_UNCHECKED);
|
||||
|
||||
DrawMenuBar(hWnd);
|
||||
|
||||
// Retrieve the handlse to the edit controls.
|
||||
|
||||
hwndOutput = GetDlgItem(hMonitor, 121);
|
||||
|
||||
// Set our own WndProcs for the controls.
|
||||
|
||||
wpOrigOutputProc = (WNDPROC)SetWindowLong(hwndOutput, GWL_WNDPROC, (LONG)OutputProc);
|
||||
|
||||
if (cfgMinToTray)
|
||||
{
|
||||
AddTrayMenuItem(hMonitor, Text);
|
||||
}
|
||||
|
||||
ShowWindow(hMonitor, SW_SHOWNORMAL);
|
||||
|
||||
if (MonitorRect.right < 100 || MonitorRect.bottom < 100)
|
||||
{
|
||||
GetWindowRect(hMonitor, &MonitorRect);
|
||||
}
|
||||
|
||||
MoveWindow(hMonitor,MonitorRect.left,MonitorRect.top, MonitorRect.right-MonitorRect.left, MonitorRect.bottom-MonitorRect.top, TRUE);
|
||||
|
||||
MoveWindows();
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void MoveWindows()
|
||||
{
|
||||
RECT rcMain, rcClient;
|
||||
int ClientHeight, ClientWidth;
|
||||
|
||||
GetWindowRect(hMonitor, &rcMain);
|
||||
GetClientRect(hMonitor, &rcClient);
|
||||
|
||||
ClientHeight = rcClient.bottom;
|
||||
ClientWidth = rcClient.right;
|
||||
|
||||
// MoveWindow(hwndMon,2, 0, ClientWidth-4, SplitPos, TRUE);
|
||||
MoveWindow(hwndOutput,2, 2, ClientWidth-4, ClientHeight-4, TRUE);
|
||||
// MoveWindow(hwndSplit,0, SplitPos, ClientWidth, SplitBarHeight, TRUE);
|
||||
}
|
||||
|
||||
|
||||
static LRESULT CALLBACK MonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int wmId, wmEvent;
|
||||
LPRECT lprc;
|
||||
|
||||
switch (message) {
|
||||
|
||||
case WM_ACTIVATE:
|
||||
|
||||
SetFocus(hwndInput);
|
||||
break;
|
||||
|
||||
|
||||
case WM_COMMAND:
|
||||
|
||||
wmId = LOWORD(wParam); // Remember, these are...
|
||||
wmEvent = HIWORD(wParam); // ...different for Win32!
|
||||
|
||||
switch (wmId) {
|
||||
|
||||
case MONBBS:
|
||||
|
||||
ToggleParam(hMenu, hWnd, &MonBBS, MONBBS);
|
||||
break;
|
||||
|
||||
case MONCHAT:
|
||||
|
||||
ToggleParam(hMenu, hWnd, &MonCHAT, MONCHAT);
|
||||
break;
|
||||
|
||||
case MONTCP:
|
||||
|
||||
ToggleParam(hMenu, hWnd, &MonTCP, MONTCP);
|
||||
break;
|
||||
|
||||
|
||||
case BPQCLEAROUT:
|
||||
|
||||
SendMessage(hwndOutput,LB_RESETCONTENT, 0, 0);
|
||||
break;
|
||||
|
||||
case BPQCOPYOUT:
|
||||
|
||||
CopyToClipboard(hwndOutput);
|
||||
break;
|
||||
|
||||
|
||||
|
||||
//case BPQHELP:
|
||||
|
||||
// HtmlHelp(hWnd,"BPQTerminal.chm",HH_HELP_FINDER,0);
|
||||
// break;
|
||||
|
||||
default:
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
case WM_SYSCOMMAND:
|
||||
|
||||
wmId = LOWORD(wParam); // Remember, these are...
|
||||
wmEvent = HIWORD(wParam); // ...different for Win32!
|
||||
|
||||
switch (wmId) {
|
||||
|
||||
case SC_MINIMIZE:
|
||||
|
||||
if (cfgMinToTray)
|
||||
return ShowWindow(hWnd, SW_HIDE);
|
||||
|
||||
default:
|
||||
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
}
|
||||
|
||||
case WM_SIZING:
|
||||
|
||||
lprc = (LPRECT) lParam;
|
||||
|
||||
Height = lprc->bottom-lprc->top;
|
||||
Width = lprc->right-lprc->left;
|
||||
|
||||
MoveWindows();
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
||||
case WM_DESTROY:
|
||||
|
||||
// Remove the subclass from the edit control.
|
||||
|
||||
GetWindowRect(hWnd, &MonitorRect); // For save soutine
|
||||
|
||||
SetWindowLong(hwndInput, GWL_WNDPROC,
|
||||
(LONG) wpOrigInputProc);
|
||||
|
||||
|
||||
if (cfgMinToTray)
|
||||
DeleteTrayMenuItem(hWnd);
|
||||
|
||||
|
||||
hMonitor = NULL;
|
||||
|
||||
free(readbuff);
|
||||
readbufflen = 0;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
LRESULT APIENTRY OutputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
|
||||
// Trap mouse messages, so we cant select stuff in output and mon windows,
|
||||
// otherwise scrolling doesnt work.
|
||||
|
||||
if (uMsg >= WM_MOUSEFIRST && uMsg <= WM_LBUTTONDBLCLK)
|
||||
return TRUE;
|
||||
|
||||
return CallWindowProc(wpOrigOutputProc, hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
int WritetoMonitorWindow(char * Msg, int len)
|
||||
{
|
||||
char * ptr1, * ptr2;
|
||||
int index;
|
||||
|
||||
if (len+PartLinePtr > readbufflen)
|
||||
{
|
||||
readbufflen += len+PartLinePtr;
|
||||
readbuff = realloc(readbuff, readbufflen);
|
||||
}
|
||||
|
||||
if (PartLinePtr != 0)
|
||||
SendMessage(hwndOutput,LB_DELETESTRING,PartLineIndex,(LPARAM)(LPCTSTR) 0 );
|
||||
|
||||
memcpy(&readbuff[PartLinePtr], Msg, len);
|
||||
|
||||
len=len+PartLinePtr;
|
||||
|
||||
ptr1=&readbuff[0];
|
||||
readbuff[len]=0;
|
||||
|
||||
do {
|
||||
ptr2=memchr(ptr1,7,len);
|
||||
|
||||
if (ptr2)
|
||||
*(ptr2)=32;
|
||||
|
||||
} while (ptr2);
|
||||
|
||||
lineloop:
|
||||
|
||||
// if (PartLinePtr > 300)
|
||||
// PartLinePtr = 0;
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
// copy text to control a line at a time
|
||||
|
||||
ptr2=memchr(ptr1,13,len);
|
||||
|
||||
if (ptr2 == 0)
|
||||
{
|
||||
// no newline. Move data to start of buffer and Save pointer
|
||||
|
||||
PartLinePtr=len;
|
||||
memmove(readbuff,ptr1,len);
|
||||
PartLineIndex=SendMessage(hwndOutput,LB_ADDSTRING,0,(LPARAM)(LPCTSTR) ptr1 );
|
||||
SendMessage(hwndOutput,LB_SETCARETINDEX,(WPARAM) PartLineIndex, MAKELPARAM(FALSE, 0));
|
||||
|
||||
return (0);
|
||||
|
||||
}
|
||||
|
||||
*(ptr2++)=0;
|
||||
|
||||
index=SendMessage(hwndOutput,LB_ADDSTRING,0,(LPARAM)(LPCTSTR) ptr1 );
|
||||
|
||||
// if (LogOutput) WriteMonitorLine(ptr1, ptr2 - ptr1);
|
||||
|
||||
PartLinePtr=0;
|
||||
|
||||
len-=(ptr2-ptr1);
|
||||
|
||||
ptr1=ptr2;
|
||||
|
||||
if ((len > 0) && StripLF)
|
||||
{
|
||||
if (*ptr1 == 0x0a) // Line Feed
|
||||
{
|
||||
ptr1++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
if (index > 1200)
|
||||
|
||||
do{
|
||||
|
||||
index=SendMessage(hwndOutput,LB_DELETESTRING, 0, 0);
|
||||
|
||||
} while (index > 1000);
|
||||
|
||||
SendMessage(hwndOutput,LB_SETCARETINDEX,(WPARAM) index, MAKELPARAM(FALSE, 0));
|
||||
|
||||
goto lineloop;
|
||||
}
|
||||
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int ToggleParam(HMENU hMenu, HWND hWnd, BOOL * Param, int Item)
|
||||
{
|
||||
*Param = !(*Param);
|
||||
|
||||
CheckMenuItem(hMenu,Item, (*Param) ? MF_CHECKED : MF_UNCHECKED);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void CopyToClipboard(HWND hWnd)
|
||||
{
|
||||
int i,n, len=0;
|
||||
HGLOBAL hMem;
|
||||
char * ptr;
|
||||
//
|
||||
// Copy List Box to clipboard
|
||||
//
|
||||
|
||||
n = SendMessage(hWnd, LB_GETCOUNT, 0, 0);
|
||||
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
len+=SendMessage(hWnd, LB_GETTEXTLEN, i, 0);
|
||||
}
|
||||
|
||||
hMem=GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, len+n+n+1);
|
||||
|
||||
|
||||
if (hMem != 0)
|
||||
{
|
||||
ptr=GlobalLock(hMem);
|
||||
|
||||
if (OpenClipboard(MainWnd))
|
||||
{
|
||||
// CopyScreentoBuffer(GlobalLock(hMem));
|
||||
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
ptr+=SendMessage(hWnd, LB_GETTEXT, i, (LPARAM) ptr);
|
||||
*(ptr++)=13;
|
||||
*(ptr++)=10;
|
||||
}
|
||||
|
||||
*(ptr)=0; // end of data
|
||||
|
||||
GlobalUnlock(hMem);
|
||||
EmptyClipboard();
|
||||
SetClipboardData(CF_TEXT,hMem);
|
||||
CloseClipboard();
|
||||
}
|
||||
else
|
||||
GlobalFree(hMem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
HANDLE LogHandle[4] = {INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE};
|
||||
|
||||
char * Logs[4] = {"BBS", "CHAT", "TCP", "DEBUG"};
|
||||
|
||||
BOOL OpenLogfile(int Flags)
|
||||
{
|
||||
UCHAR FN[MAX_PATH];
|
||||
time_t T;
|
||||
struct tm * tm;
|
||||
|
||||
T = time(NULL);
|
||||
tm = gmtime(&T);
|
||||
|
||||
sprintf(FN,"%s/logs/log_%02d%02d%02d_%s.txt", GetLogDirectory(), tm->tm_year-100, tm->tm_mon+1, tm->tm_mday, Logs[Flags]);
|
||||
|
||||
LogHandle[Flags] = CreateFile(FN,
|
||||
GENERIC_WRITE,
|
||||
FILE_SHARE_READ,
|
||||
NULL,
|
||||
OPEN_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
NULL);
|
||||
|
||||
SetFilePointer(LogHandle[Flags], 0, 0, FILE_END);
|
||||
|
||||
return (LogHandle[Flags] != INVALID_HANDLE_VALUE);
|
||||
}
|
||||
|
||||
@ -1,79 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2017, 2020 IBM Corp. and others
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v2.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* https://www.eclipse.org/legal/epl-2.0/
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(MQTTREASONCODES_H)
|
||||
#define MQTTREASONCODES_H
|
||||
|
||||
#include "MQTTExportDeclarations.h"
|
||||
|
||||
/** The MQTT V5 one byte reason code */
|
||||
enum MQTTReasonCodes {
|
||||
MQTTREASONCODE_SUCCESS = 0,
|
||||
MQTTREASONCODE_NORMAL_DISCONNECTION = 0,
|
||||
MQTTREASONCODE_GRANTED_QOS_0 = 0,
|
||||
MQTTREASONCODE_GRANTED_QOS_1 = 1,
|
||||
MQTTREASONCODE_GRANTED_QOS_2 = 2,
|
||||
MQTTREASONCODE_DISCONNECT_WITH_WILL_MESSAGE = 4,
|
||||
MQTTREASONCODE_NO_MATCHING_SUBSCRIBERS = 16,
|
||||
MQTTREASONCODE_NO_SUBSCRIPTION_FOUND = 17,
|
||||
MQTTREASONCODE_CONTINUE_AUTHENTICATION = 24,
|
||||
MQTTREASONCODE_RE_AUTHENTICATE = 25,
|
||||
MQTTREASONCODE_UNSPECIFIED_ERROR = 128,
|
||||
MQTTREASONCODE_MALFORMED_PACKET = 129,
|
||||
MQTTREASONCODE_PROTOCOL_ERROR = 130,
|
||||
MQTTREASONCODE_IMPLEMENTATION_SPECIFIC_ERROR = 131,
|
||||
MQTTREASONCODE_UNSUPPORTED_PROTOCOL_VERSION = 132,
|
||||
MQTTREASONCODE_CLIENT_IDENTIFIER_NOT_VALID = 133,
|
||||
MQTTREASONCODE_BAD_USER_NAME_OR_PASSWORD = 134,
|
||||
MQTTREASONCODE_NOT_AUTHORIZED = 135,
|
||||
MQTTREASONCODE_SERVER_UNAVAILABLE = 136,
|
||||
MQTTREASONCODE_SERVER_BUSY = 137,
|
||||
MQTTREASONCODE_BANNED = 138,
|
||||
MQTTREASONCODE_SERVER_SHUTTING_DOWN = 139,
|
||||
MQTTREASONCODE_BAD_AUTHENTICATION_METHOD = 140,
|
||||
MQTTREASONCODE_KEEP_ALIVE_TIMEOUT = 141,
|
||||
MQTTREASONCODE_SESSION_TAKEN_OVER = 142,
|
||||
MQTTREASONCODE_TOPIC_FILTER_INVALID = 143,
|
||||
MQTTREASONCODE_TOPIC_NAME_INVALID = 144,
|
||||
MQTTREASONCODE_PACKET_IDENTIFIER_IN_USE = 145,
|
||||
MQTTREASONCODE_PACKET_IDENTIFIER_NOT_FOUND = 146,
|
||||
MQTTREASONCODE_RECEIVE_MAXIMUM_EXCEEDED = 147,
|
||||
MQTTREASONCODE_TOPIC_ALIAS_INVALID = 148,
|
||||
MQTTREASONCODE_PACKET_TOO_LARGE = 149,
|
||||
MQTTREASONCODE_MESSAGE_RATE_TOO_HIGH = 150,
|
||||
MQTTREASONCODE_QUOTA_EXCEEDED = 151,
|
||||
MQTTREASONCODE_ADMINISTRATIVE_ACTION = 152,
|
||||
MQTTREASONCODE_PAYLOAD_FORMAT_INVALID = 153,
|
||||
MQTTREASONCODE_RETAIN_NOT_SUPPORTED = 154,
|
||||
MQTTREASONCODE_QOS_NOT_SUPPORTED = 155,
|
||||
MQTTREASONCODE_USE_ANOTHER_SERVER = 156,
|
||||
MQTTREASONCODE_SERVER_MOVED = 157,
|
||||
MQTTREASONCODE_SHARED_SUBSCRIPTIONS_NOT_SUPPORTED = 158,
|
||||
MQTTREASONCODE_CONNECTION_RATE_EXCEEDED = 159,
|
||||
MQTTREASONCODE_MAXIMUM_CONNECT_TIME = 160,
|
||||
MQTTREASONCODE_SUBSCRIPTION_IDENTIFIERS_NOT_SUPPORTED = 161,
|
||||
MQTTREASONCODE_WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED = 162
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns a printable string description of an MQTT V5 reason code.
|
||||
* @param value an MQTT V5 reason code.
|
||||
* @return the printable string description of the input reason code.
|
||||
* NULL if the code was not found.
|
||||
*/
|
||||
LIBMQTT_API const char* MQTTReasonCode_toString(enum MQTTReasonCodes value);
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,913 +0,0 @@
|
||||
/*******************************************************
|
||||
HIDAPI - Multi-Platform library for
|
||||
communication with HID devices.
|
||||
|
||||
Alan Ott
|
||||
Signal 11 Software
|
||||
|
||||
8/22/2009
|
||||
|
||||
Copyright 2009, All Rights Reserved.
|
||||
|
||||
At the discretion of the user of this library,
|
||||
this software may be licensed under the terms of the
|
||||
GNU Public License v3, a BSD-Style license, or the
|
||||
original HIDAPI license as outlined in the LICENSE.txt,
|
||||
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
|
||||
files located at the root of the source distribution.
|
||||
These files may also be found in the public source
|
||||
code repository located at:
|
||||
http://github.com/signal11/hidapi .
|
||||
********************************************************/
|
||||
|
||||
// Hacked about a bit for BPQ32. John Wiseman G8BPQ April 2018
|
||||
|
||||
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#ifndef _NTDEF_
|
||||
typedef LONG NTSTATUS;
|
||||
#endif
|
||||
|
||||
#ifdef __MINGW32__
|
||||
#include <ntdef.h>
|
||||
#include <winbase.h>
|
||||
#endif
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
#include <ntdef.h>
|
||||
#define _wcsdup wcsdup
|
||||
#endif
|
||||
|
||||
//#define HIDAPI_USE_DDK
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#include <setupapi.h>
|
||||
#include <winioctl.h>
|
||||
#ifdef HIDAPI_USE_DDK
|
||||
#include <hidsdi.h>
|
||||
#endif
|
||||
|
||||
// Copied from inc/ddk/hidclass.h, part of the Windows DDK.
|
||||
#define HID_OUT_CTL_CODE(id) \
|
||||
CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
|
||||
#define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100)
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
#include "hidapi.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// Thanks Microsoft, but I know how to use strncpy().
|
||||
#pragma warning(disable:4996)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef HIDAPI_USE_DDK
|
||||
// Since we're not building with the DDK, and the HID header
|
||||
// files aren't part of the SDK, we have to define all this
|
||||
// stuff here. In lookup_functions(), the function pointers
|
||||
// defined below are set.
|
||||
typedef struct _HIDD_ATTRIBUTES{
|
||||
ULONG Size;
|
||||
USHORT VendorID;
|
||||
USHORT ProductID;
|
||||
USHORT VersionNumber;
|
||||
} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES;
|
||||
|
||||
typedef USHORT USAGE;
|
||||
typedef struct _HIDP_CAPS {
|
||||
USAGE Usage;
|
||||
USAGE UsagePage;
|
||||
USHORT InputReportByteLength;
|
||||
USHORT OutputReportByteLength;
|
||||
USHORT FeatureReportByteLength;
|
||||
USHORT Reserved[17];
|
||||
USHORT fields_not_used_by_hidapi[10];
|
||||
} HIDP_CAPS, *PHIDP_CAPS;
|
||||
typedef char* HIDP_PREPARSED_DATA;
|
||||
#define HIDP_STATUS_SUCCESS 0x0
|
||||
|
||||
typedef BOOLEAN (__stdcall *HidD_GetAttributes_)(HANDLE device, PHIDD_ATTRIBUTES attrib);
|
||||
typedef BOOLEAN (__stdcall *HidD_GetSerialNumberString_)(HANDLE device, PVOID buffer, ULONG buffer_len);
|
||||
typedef BOOLEAN (__stdcall *HidD_GetManufacturerString_)(HANDLE handle, PVOID buffer, ULONG buffer_len);
|
||||
typedef BOOLEAN (__stdcall *HidD_GetProductString_)(HANDLE handle, PVOID buffer, ULONG buffer_len);
|
||||
typedef BOOLEAN (__stdcall *HidD_SetFeature_)(HANDLE handle, PVOID data, ULONG length);
|
||||
typedef BOOLEAN (__stdcall *HidD_GetFeature_)(HANDLE handle, PVOID data, ULONG length);
|
||||
typedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len);
|
||||
typedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, HIDP_PREPARSED_DATA **preparsed_data);
|
||||
typedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(HIDP_PREPARSED_DATA *preparsed_data);
|
||||
typedef BOOLEAN (__stdcall *HidP_GetCaps_)(HIDP_PREPARSED_DATA *preparsed_data, HIDP_CAPS *caps);
|
||||
|
||||
static HidD_GetAttributes_ HidD_GetAttributes;
|
||||
static HidD_GetSerialNumberString_ HidD_GetSerialNumberString;
|
||||
static HidD_GetManufacturerString_ HidD_GetManufacturerString;
|
||||
static HidD_GetProductString_ HidD_GetProductString;
|
||||
static HidD_SetFeature_ HidD_SetFeature;
|
||||
static HidD_GetFeature_ HidD_GetFeature;
|
||||
static HidD_GetIndexedString_ HidD_GetIndexedString;
|
||||
static HidD_GetPreparsedData_ HidD_GetPreparsedData;
|
||||
static HidD_FreePreparsedData_ HidD_FreePreparsedData;
|
||||
static HidP_GetCaps_ HidP_GetCaps;
|
||||
|
||||
static HMODULE lib_handle = NULL;
|
||||
static BOOLEAN initialized = FALSE;
|
||||
#endif // HIDAPI_USE_DDK
|
||||
|
||||
struct hid_device_ {
|
||||
HANDLE device_handle;
|
||||
BOOL blocking;
|
||||
int input_report_length;
|
||||
void *last_error_str;
|
||||
DWORD last_error_num;
|
||||
BOOL read_pending;
|
||||
char *read_buf;
|
||||
OVERLAPPED ol;
|
||||
};
|
||||
|
||||
static hid_device *new_hid_device()
|
||||
{
|
||||
hid_device *dev = (hid_device*) calloc(1, sizeof(hid_device));
|
||||
dev->device_handle = INVALID_HANDLE_VALUE;
|
||||
dev->blocking = TRUE;
|
||||
dev->input_report_length = 0;
|
||||
dev->last_error_str = NULL;
|
||||
dev->last_error_num = 0;
|
||||
dev->read_pending = FALSE;
|
||||
dev->read_buf = NULL;
|
||||
memset(&dev->ol, 0, sizeof(dev->ol));
|
||||
dev->ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*inital state f=nonsignaled*/, NULL);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
||||
static void register_error(hid_device *device, const char *op)
|
||||
{
|
||||
WCHAR *ptr, *msg;
|
||||
|
||||
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL,
|
||||
GetLastError(),
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPWSTR)&msg, 0/*sz*/,
|
||||
NULL);
|
||||
|
||||
// Get rid of the CR and LF that FormatMessage() sticks at the
|
||||
// end of the message. Thanks Microsoft!
|
||||
ptr = msg;
|
||||
while (*ptr) {
|
||||
if (*ptr == '\r') {
|
||||
*ptr = 0x0000;
|
||||
break;
|
||||
}
|
||||
ptr++;
|
||||
}
|
||||
|
||||
// Store the message off in the Device entry so that
|
||||
// the hid_error() function can pick it up.
|
||||
LocalFree(device->last_error_str);
|
||||
device->last_error_str = msg;
|
||||
}
|
||||
|
||||
#ifndef HIDAPI_USE_DDK
|
||||
static int lookup_functions()
|
||||
{
|
||||
lib_handle = LoadLibraryA("hid.dll");
|
||||
if (lib_handle) {
|
||||
#define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1;
|
||||
RESOLVE(HidD_GetAttributes);
|
||||
RESOLVE(HidD_GetSerialNumberString);
|
||||
RESOLVE(HidD_GetManufacturerString);
|
||||
RESOLVE(HidD_GetProductString);
|
||||
RESOLVE(HidD_SetFeature);
|
||||
RESOLVE(HidD_GetFeature);
|
||||
RESOLVE(HidD_GetIndexedString);
|
||||
RESOLVE(HidD_GetPreparsedData);
|
||||
RESOLVE(HidD_FreePreparsedData);
|
||||
RESOLVE(HidP_GetCaps);
|
||||
#undef RESOLVE
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static HANDLE open_device(const char *path)
|
||||
{
|
||||
HANDLE handle;
|
||||
|
||||
/* First, try to open with sharing mode turned off. This will make it so
|
||||
that a HID device can only be opened once. This is to be consistent
|
||||
with the behavior on the other platforms. */
|
||||
handle = CreateFileA(path,
|
||||
GENERIC_WRITE |GENERIC_READ,
|
||||
0, /*share mode*/
|
||||
NULL,
|
||||
OPEN_EXISTING,
|
||||
FILE_FLAG_OVERLAPPED,//FILE_ATTRIBUTE_NORMAL,
|
||||
0);
|
||||
|
||||
if (handle == INVALID_HANDLE_VALUE) {
|
||||
/* Couldn't open the device. Some devices must be opened
|
||||
with sharing enabled (even though they are only opened once),
|
||||
so try it here. */
|
||||
handle = CreateFileA(path,
|
||||
GENERIC_WRITE |GENERIC_READ,
|
||||
FILE_SHARE_READ|FILE_SHARE_WRITE, /*share mode*/
|
||||
NULL,
|
||||
OPEN_EXISTING,
|
||||
FILE_FLAG_OVERLAPPED,//FILE_ATTRIBUTE_NORMAL,
|
||||
0);
|
||||
}
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
int HID_API_EXPORT hid_init(void)
|
||||
{
|
||||
#ifndef HIDAPI_USE_DDK
|
||||
if (!initialized) {
|
||||
if (lookup_functions() < 0) {
|
||||
hid_exit();
|
||||
return -1;
|
||||
}
|
||||
initialized = TRUE;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int HID_API_EXPORT hid_exit(void)
|
||||
{
|
||||
#ifndef HIDAPI_USE_DDK
|
||||
if (lib_handle)
|
||||
FreeLibrary(lib_handle);
|
||||
lib_handle = NULL;
|
||||
initialized = FALSE;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id)
|
||||
{
|
||||
BOOL res;
|
||||
struct hid_device_info *root = NULL; // return object
|
||||
struct hid_device_info *cur_dev = NULL;
|
||||
|
||||
// Windows objects for interacting with the driver.
|
||||
GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} };
|
||||
SP_DEVINFO_DATA devinfo_data;
|
||||
SP_DEVICE_INTERFACE_DATA device_interface_data;
|
||||
SP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL;
|
||||
HDEVINFO device_info_set = INVALID_HANDLE_VALUE;
|
||||
int device_index = 0;
|
||||
|
||||
if (hid_init() < 0)
|
||||
return NULL;
|
||||
|
||||
// Initialize the Windows objects.
|
||||
devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA);
|
||||
device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
||||
|
||||
// Get information for all the devices belonging to the HID class.
|
||||
device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
||||
|
||||
// Iterate over each device in the HID class, looking for the right one.
|
||||
|
||||
for (;;) {
|
||||
HANDLE write_handle = INVALID_HANDLE_VALUE;
|
||||
DWORD required_size = 0;
|
||||
HIDD_ATTRIBUTES attrib;
|
||||
|
||||
res = SetupDiEnumDeviceInterfaces(device_info_set,
|
||||
NULL,
|
||||
&InterfaceClassGuid,
|
||||
device_index,
|
||||
&device_interface_data);
|
||||
|
||||
if (!res) {
|
||||
// A return of FALSE from this function means that
|
||||
// there are no more devices.
|
||||
break;
|
||||
}
|
||||
|
||||
// Call with 0-sized detail size, and let the function
|
||||
// tell us how long the detail struct needs to be. The
|
||||
// size is put in &required_size.
|
||||
res = SetupDiGetDeviceInterfaceDetailA(device_info_set,
|
||||
&device_interface_data,
|
||||
NULL,
|
||||
0,
|
||||
&required_size,
|
||||
NULL);
|
||||
|
||||
// Allocate a long enough structure for device_interface_detail_data.
|
||||
device_interface_detail_data = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc(required_size);
|
||||
device_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);
|
||||
|
||||
// Get the detailed data for this device. The detail data gives us
|
||||
// the device path for this device, which is then passed into
|
||||
// CreateFile() to get a handle to the device.
|
||||
res = SetupDiGetDeviceInterfaceDetailA(device_info_set,
|
||||
&device_interface_data,
|
||||
device_interface_detail_data,
|
||||
required_size,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
if (!res) {
|
||||
//register_error(dev, "Unable to call SetupDiGetDeviceInterfaceDetail");
|
||||
// Continue to the next device.
|
||||
goto cont;
|
||||
}
|
||||
|
||||
//wprintf(L"HandleName: %s\n", device_interface_detail_data->DevicePath);
|
||||
|
||||
// Open a handle to the device
|
||||
write_handle = open_device(device_interface_detail_data->DevicePath);
|
||||
|
||||
// Check validity of write_handle.
|
||||
if (write_handle == INVALID_HANDLE_VALUE) {
|
||||
// Unable to open the device.
|
||||
//register_error(dev, "CreateFile");
|
||||
goto cont_close;
|
||||
}
|
||||
|
||||
|
||||
// Get the Vendor ID and Product ID for this device.
|
||||
attrib.Size = sizeof(HIDD_ATTRIBUTES);
|
||||
HidD_GetAttributes(write_handle, &attrib);
|
||||
//wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID);
|
||||
|
||||
// Check the VID/PID to see if we should add this
|
||||
// device to the enumeration list.
|
||||
if ((vendor_id == 0x0 && product_id == 0x0) ||
|
||||
(attrib.VendorID == vendor_id && attrib.ProductID == product_id)) {
|
||||
|
||||
#define WSTR_LEN 512
|
||||
const char *str;
|
||||
struct hid_device_info *tmp;
|
||||
HIDP_PREPARSED_DATA *pp_data = NULL;
|
||||
HIDP_CAPS caps;
|
||||
BOOLEAN res;
|
||||
NTSTATUS nt_res;
|
||||
wchar_t wstr[WSTR_LEN]; // TODO: Determine Size
|
||||
int len;
|
||||
|
||||
/* VID/PID match. Create the record. */
|
||||
tmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info));
|
||||
if (cur_dev) {
|
||||
cur_dev->next = tmp;
|
||||
}
|
||||
else {
|
||||
root = tmp;
|
||||
}
|
||||
cur_dev = tmp;
|
||||
|
||||
// Get the Usage Page and Usage for this device.
|
||||
res = HidD_GetPreparsedData(write_handle, &pp_data);
|
||||
if (res) {
|
||||
nt_res = HidP_GetCaps(pp_data, &caps);
|
||||
if (nt_res == HIDP_STATUS_SUCCESS) {
|
||||
cur_dev->usage_page = caps.UsagePage;
|
||||
cur_dev->usage = caps.Usage;
|
||||
}
|
||||
|
||||
HidD_FreePreparsedData(pp_data);
|
||||
}
|
||||
|
||||
/* Fill out the record */
|
||||
cur_dev->next = NULL;
|
||||
str = device_interface_detail_data->DevicePath;
|
||||
if (str) {
|
||||
len = (int)strlen(str);
|
||||
cur_dev->path = (char*) calloc(len+1, sizeof(char));
|
||||
strncpy(cur_dev->path, str, len+1);
|
||||
cur_dev->path[len] = '\0';
|
||||
}
|
||||
else
|
||||
cur_dev->path = NULL;
|
||||
|
||||
/* Serial Number */
|
||||
res = HidD_GetSerialNumberString(write_handle, wstr, sizeof(wstr));
|
||||
wstr[WSTR_LEN-1] = 0x0000;
|
||||
if (res) {
|
||||
cur_dev->serial_number = _wcsdup(wstr);
|
||||
}
|
||||
|
||||
/* Manufacturer String */
|
||||
res = HidD_GetManufacturerString(write_handle, wstr, sizeof(wstr));
|
||||
wstr[WSTR_LEN-1] = 0x0000;
|
||||
if (res) {
|
||||
cur_dev->manufacturer_string = _wcsdup(wstr);
|
||||
}
|
||||
|
||||
/* Product String */
|
||||
res = HidD_GetProductString(write_handle, wstr, sizeof(wstr));
|
||||
wstr[WSTR_LEN-1] = 0x0000;
|
||||
if (res) {
|
||||
cur_dev->product_string = _wcsdup(wstr);
|
||||
}
|
||||
|
||||
/* VID/PID */
|
||||
cur_dev->vendor_id = attrib.VendorID;
|
||||
cur_dev->product_id = attrib.ProductID;
|
||||
|
||||
/* Release Number */
|
||||
cur_dev->release_number = attrib.VersionNumber;
|
||||
|
||||
/* Interface Number. It can sometimes be parsed out of the path
|
||||
on Windows if a device has multiple interfaces. See
|
||||
http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or
|
||||
search for "Hardware IDs for HID Devices" at MSDN. If it's not
|
||||
in the path, it's set to -1. */
|
||||
cur_dev->interface_number = -1;
|
||||
if (cur_dev->path) {
|
||||
char *interface_component = strstr(cur_dev->path, "&mi_");
|
||||
if (interface_component) {
|
||||
char *hex_str = interface_component + 4;
|
||||
char *endptr = NULL;
|
||||
cur_dev->interface_number = strtol(hex_str, &endptr, 16);
|
||||
if (endptr == hex_str) {
|
||||
/* The parsing failed. Set interface_number to -1. */
|
||||
cur_dev->interface_number = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cont_close:
|
||||
CloseHandle(write_handle);
|
||||
cont:
|
||||
// We no longer need the detail data. It can be freed
|
||||
free(device_interface_detail_data);
|
||||
|
||||
device_index++;
|
||||
|
||||
}
|
||||
|
||||
// Close the device information handle.
|
||||
SetupDiDestroyDeviceInfoList(device_info_set);
|
||||
|
||||
return root;
|
||||
|
||||
}
|
||||
|
||||
void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs)
|
||||
{
|
||||
// TODO: Merge this with the Linux version. This function is platform-independent.
|
||||
struct hid_device_info *d = devs;
|
||||
while (d) {
|
||||
struct hid_device_info *next = d->next;
|
||||
free(d->path);
|
||||
free(d->serial_number);
|
||||
free(d->manufacturer_string);
|
||||
free(d->product_string);
|
||||
free(d);
|
||||
d = next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, wchar_t *serial_number)
|
||||
{
|
||||
// TODO: Merge this functions with the Linux version. This function should be platform independent.
|
||||
struct hid_device_info *devs, *cur_dev;
|
||||
const char *path_to_open = NULL;
|
||||
hid_device *handle = NULL;
|
||||
|
||||
devs = hid_enumerate(vendor_id, product_id);
|
||||
cur_dev = devs;
|
||||
while (cur_dev) {
|
||||
if (cur_dev->vendor_id == vendor_id &&
|
||||
cur_dev->product_id == product_id) {
|
||||
if (serial_number) {
|
||||
if (wcscmp(serial_number, cur_dev->serial_number) == 0) {
|
||||
path_to_open = cur_dev->path;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
path_to_open = cur_dev->path;
|
||||
break;
|
||||
}
|
||||
}
|
||||
cur_dev = cur_dev->next;
|
||||
}
|
||||
|
||||
if (path_to_open) {
|
||||
/* Open the device */
|
||||
handle = hid_open_path(path_to_open);
|
||||
}
|
||||
|
||||
hid_free_enumeration(devs);
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path)
|
||||
{
|
||||
hid_device *dev;
|
||||
HIDP_CAPS caps;
|
||||
HIDP_PREPARSED_DATA *pp_data = NULL;
|
||||
BOOLEAN res;
|
||||
NTSTATUS nt_res;
|
||||
|
||||
if (hid_init() < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dev = new_hid_device();
|
||||
|
||||
// Open a handle to the device
|
||||
dev->device_handle = open_device(path);
|
||||
|
||||
// Check validity of write_handle.
|
||||
if (dev->device_handle == INVALID_HANDLE_VALUE) {
|
||||
// Unable to open the device.
|
||||
register_error(dev, "CreateFile");
|
||||
goto err;
|
||||
}
|
||||
|
||||
// Get the Input Report length for the device.
|
||||
res = HidD_GetPreparsedData(dev->device_handle, &pp_data);
|
||||
if (!res) {
|
||||
register_error(dev, "HidD_GetPreparsedData");
|
||||
goto err;
|
||||
}
|
||||
nt_res = HidP_GetCaps(pp_data, &caps);
|
||||
if (nt_res != HIDP_STATUS_SUCCESS) {
|
||||
register_error(dev, "HidP_GetCaps");
|
||||
goto err_pp_data;
|
||||
}
|
||||
dev->input_report_length = caps.InputReportByteLength;
|
||||
HidD_FreePreparsedData(pp_data);
|
||||
|
||||
dev->read_buf = (char*) malloc(dev->input_report_length);
|
||||
|
||||
return dev;
|
||||
|
||||
err_pp_data:
|
||||
HidD_FreePreparsedData(pp_data);
|
||||
err:
|
||||
CloseHandle(dev->device_handle);
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length)
|
||||
{
|
||||
DWORD bytes_written;
|
||||
BOOL res;
|
||||
|
||||
OVERLAPPED ol;
|
||||
memset(&ol, 0, sizeof(ol));
|
||||
|
||||
res = WriteFile(dev->device_handle, data, (int)length, NULL, &ol);
|
||||
|
||||
if (!res)
|
||||
{
|
||||
int err = GetLastError();
|
||||
|
||||
if (GetLastError() != ERROR_IO_PENDING) {
|
||||
// WriteFile() failed. Return error.
|
||||
register_error(dev, "WriteFile");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// Wait here until the write is done. This makes
|
||||
// hid_write() synchronous.
|
||||
res = GetOverlappedResult(dev->device_handle, &ol, &bytes_written, TRUE/*wait*/);
|
||||
if (!res) {
|
||||
// The Write operation failed.
|
||||
register_error(dev, "WriteFile");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return bytes_written;
|
||||
}
|
||||
|
||||
int HID_API_EXPORT HID_API_CALL hid_set_ptt(int state)
|
||||
{
|
||||
int res;
|
||||
hid_device *handle;
|
||||
unsigned char buf[16];
|
||||
|
||||
handle = hid_open(0xd8c, 0x8, NULL);
|
||||
if (!handle) {
|
||||
printf("unable to open device\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
// Toggle PTT
|
||||
|
||||
buf[0] = 0;
|
||||
buf[1] = 0;
|
||||
buf[2]= 1 << (3 - 1);
|
||||
buf[3] = state << (3 - 1);
|
||||
buf[4] = 0;
|
||||
|
||||
|
||||
res = hid_write(handle, buf, 5);
|
||||
if (res < 0)
|
||||
{
|
||||
printf("Unable to write()\n");
|
||||
printf("Error: %ls\n", hid_error(handle));
|
||||
}
|
||||
|
||||
hid_close(handle);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds)
|
||||
{
|
||||
DWORD bytes_read = 0;
|
||||
BOOL res;
|
||||
|
||||
// Copy the handle for convenience.
|
||||
HANDLE ev = dev->ol.hEvent;
|
||||
|
||||
if (!dev->read_pending) {
|
||||
// Start an Overlapped I/O read.
|
||||
dev->read_pending = TRUE;
|
||||
ResetEvent(ev);
|
||||
res = ReadFile(dev->device_handle, dev->read_buf, dev->input_report_length, &bytes_read, &dev->ol);
|
||||
|
||||
if (!res) {
|
||||
if (GetLastError() != ERROR_IO_PENDING) {
|
||||
// ReadFile() has failed.
|
||||
// Clean up and return error.
|
||||
CancelIo(dev->device_handle);
|
||||
dev->read_pending = FALSE;
|
||||
goto end_of_function;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (milliseconds >= 0) {
|
||||
// See if there is any data yet.
|
||||
res = WaitForSingleObject(ev, milliseconds);
|
||||
if (res != WAIT_OBJECT_0) {
|
||||
// There was no data this time. Return zero bytes available,
|
||||
// but leave the Overlapped I/O running.
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Either WaitForSingleObject() told us that ReadFile has completed, or
|
||||
// we are in non-blocking mode. Get the number of bytes read. The actual
|
||||
// data has been copied to the data[] array which was passed to ReadFile().
|
||||
res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/);
|
||||
|
||||
// Set pending back to false, even if GetOverlappedResult() returned error.
|
||||
dev->read_pending = FALSE;
|
||||
|
||||
if (res && bytes_read > 0) {
|
||||
if (dev->read_buf[0] == 0x0) {
|
||||
/* If report numbers aren't being used, but Windows sticks a report
|
||||
number (0x0) on the beginning of the report anyway. To make this
|
||||
work like the other platforms, and to make it work more like the
|
||||
HID spec, we'll skip over this byte. */
|
||||
bytes_read--;
|
||||
memcpy(data, dev->read_buf+1, length);
|
||||
}
|
||||
else {
|
||||
/* Copy the whole buffer, report number and all. */
|
||||
memcpy(data, dev->read_buf, length);
|
||||
}
|
||||
}
|
||||
|
||||
end_of_function:
|
||||
if (!res) {
|
||||
register_error(dev, "GetOverlappedResult");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length)
|
||||
{
|
||||
return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0);
|
||||
}
|
||||
|
||||
int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock)
|
||||
{
|
||||
dev->blocking = !nonblock;
|
||||
return 0; /* Success */
|
||||
}
|
||||
|
||||
int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length)
|
||||
{
|
||||
BOOL res = HidD_SetFeature(dev->device_handle, (PVOID)data, (int)length);
|
||||
if (!res) {
|
||||
register_error(dev, "HidD_SetFeature");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return (int)length;
|
||||
}
|
||||
|
||||
|
||||
int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length)
|
||||
{
|
||||
BOOL res;
|
||||
#if 0
|
||||
res = HidD_GetFeature(dev->device_handle, data, length);
|
||||
if (!res) {
|
||||
register_error(dev, "HidD_GetFeature");
|
||||
return -1;
|
||||
}
|
||||
return 0; /* HidD_GetFeature() doesn't give us an actual length, unfortunately */
|
||||
#else
|
||||
DWORD bytes_returned;
|
||||
|
||||
OVERLAPPED ol;
|
||||
memset(&ol, 0, sizeof(ol));
|
||||
|
||||
res = DeviceIoControl(dev->device_handle,
|
||||
IOCTL_HID_GET_FEATURE,
|
||||
data, (int)length,
|
||||
data, (int)length,
|
||||
&bytes_returned, &ol);
|
||||
|
||||
if (!res) {
|
||||
if (GetLastError() != ERROR_IO_PENDING) {
|
||||
// DeviceIoControl() failed. Return error.
|
||||
register_error(dev, "Send Feature Report DeviceIoControl");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// Wait here until the write is done. This makes
|
||||
// hid_get_feature_report() synchronous.
|
||||
res = GetOverlappedResult(dev->device_handle, &ol, &bytes_returned, TRUE/*wait*/);
|
||||
if (!res) {
|
||||
// The operation failed.
|
||||
register_error(dev, "Send Feature Report GetOverLappedResult");
|
||||
return -1;
|
||||
}
|
||||
return bytes_returned;
|
||||
#endif
|
||||
}
|
||||
|
||||
void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev)
|
||||
{
|
||||
if (!dev)
|
||||
return;
|
||||
CancelIo(dev->device_handle);
|
||||
CloseHandle(dev->ol.hEvent);
|
||||
CloseHandle(dev->device_handle);
|
||||
LocalFree(dev->last_error_str);
|
||||
free(dev->read_buf);
|
||||
free(dev);
|
||||
}
|
||||
|
||||
int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen)
|
||||
{
|
||||
BOOL res;
|
||||
|
||||
res = HidD_GetManufacturerString(dev->device_handle, string, 2 * (int)maxlen);
|
||||
if (!res) {
|
||||
register_error(dev, "HidD_GetManufacturerString");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen)
|
||||
{
|
||||
BOOL res;
|
||||
|
||||
res = HidD_GetProductString(dev->device_handle, string, 2 * (int)maxlen);
|
||||
if (!res) {
|
||||
register_error(dev, "HidD_GetProductString");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen)
|
||||
{
|
||||
BOOL res;
|
||||
|
||||
res = HidD_GetSerialNumberString(dev->device_handle, string, 2 * (int)maxlen);
|
||||
if (!res) {
|
||||
register_error(dev, "HidD_GetSerialNumberString");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen)
|
||||
{
|
||||
BOOL res;
|
||||
|
||||
res = HidD_GetIndexedString(dev->device_handle, string_index, string, 2 * (int)maxlen);
|
||||
if (!res) {
|
||||
register_error(dev, "HidD_GetIndexedString");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev)
|
||||
{
|
||||
return (wchar_t*)dev->last_error_str;
|
||||
}
|
||||
|
||||
|
||||
//#define PICPGM
|
||||
//#define S11
|
||||
#define P32
|
||||
#ifdef S11
|
||||
unsigned short VendorID = 0xa0a0;
|
||||
unsigned short ProductID = 0x0001;
|
||||
#endif
|
||||
|
||||
#ifdef P32
|
||||
unsigned short VendorID = 0x04d8;
|
||||
unsigned short ProductID = 0x3f;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef PICPGM
|
||||
unsigned short VendorID = 0x04d8;
|
||||
unsigned short ProductID = 0x0033;
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
int __cdecl main(int argc, char* argv[])
|
||||
{
|
||||
int res;
|
||||
unsigned char buf[65];
|
||||
|
||||
UNREFERENCED_PARAMETER(argc);
|
||||
UNREFERENCED_PARAMETER(argv);
|
||||
|
||||
// Set up the command buffer.
|
||||
memset(buf,0x00,sizeof(buf));
|
||||
buf[0] = 0;
|
||||
buf[1] = 0x81;
|
||||
|
||||
|
||||
// Open the device.
|
||||
int handle = open(VendorID, ProductID, L"12345");
|
||||
if (handle < 0)
|
||||
printf("unable to open device\n");
|
||||
|
||||
|
||||
// Toggle LED (cmd 0x80)
|
||||
buf[1] = 0x80;
|
||||
res = write(handle, buf, 65);
|
||||
if (res < 0)
|
||||
printf("Unable to write()\n");
|
||||
|
||||
// Request state (cmd 0x81)
|
||||
buf[1] = 0x81;
|
||||
write(handle, buf, 65);
|
||||
if (res < 0)
|
||||
printf("Unable to write() (2)\n");
|
||||
|
||||
// Read requested state
|
||||
read(handle, buf, 65);
|
||||
if (res < 0)
|
||||
printf("Unable to read()\n");
|
||||
|
||||
// Print out the returned buffer.
|
||||
for (int i = 0; i < 4; i++)
|
||||
printf("buf[%d]: %d\n", i, buf[i]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
@ -1,386 +0,0 @@
|
||||
/*******************************************************
|
||||
HIDAPI - Multi-Platform library for
|
||||
communication with HID devices.
|
||||
|
||||
Alan Ott
|
||||
Signal 11 Software
|
||||
|
||||
8/22/2009
|
||||
|
||||
Copyright 2009, All Rights Reserved.
|
||||
|
||||
At the discretion of the user of this library,
|
||||
this software may be licensed under the terms of the
|
||||
GNU Public License v3, a BSD-Style license, or the
|
||||
original HIDAPI license as outlined in the LICENSE.txt,
|
||||
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
|
||||
files located at the root of the source distribution.
|
||||
These files may also be found in the public source
|
||||
code repository located at:
|
||||
http://github.com/signal11/hidapi .
|
||||
********************************************************/
|
||||
|
||||
/** @file
|
||||
* @defgroup API hidapi API
|
||||
*/
|
||||
|
||||
#ifndef HIDAPI_H__
|
||||
#define HIDAPI_H__
|
||||
|
||||
#include <wchar.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
// #define HID_API_EXPORT __declspec(dllexport) // BPQ
|
||||
#define HID_API_EXPORT
|
||||
#define HID_API_CALL
|
||||
#else
|
||||
#define HID_API_EXPORT /**< API export macro */
|
||||
#define HID_API_CALL /**< API call macro */
|
||||
#endif
|
||||
|
||||
#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
struct hid_device_;
|
||||
typedef struct hid_device_ hid_device; /**< opaque hidapi structure */
|
||||
|
||||
/** hidapi info structure */
|
||||
struct hid_device_info {
|
||||
/** Platform-specific device path */
|
||||
char *path;
|
||||
/** Device Vendor ID */
|
||||
unsigned short vendor_id;
|
||||
/** Device Product ID */
|
||||
unsigned short product_id;
|
||||
/** Serial Number */
|
||||
wchar_t *serial_number;
|
||||
/** Device Release Number in binary-coded decimal,
|
||||
also known as Device Version Number */
|
||||
unsigned short release_number;
|
||||
/** Manufacturer String */
|
||||
wchar_t *manufacturer_string;
|
||||
/** Product string */
|
||||
wchar_t *product_string;
|
||||
/** Usage Page for this Device/Interface
|
||||
(Windows/Mac only). */
|
||||
unsigned short usage_page;
|
||||
/** Usage for this Device/Interface
|
||||
(Windows/Mac only).*/
|
||||
unsigned short usage;
|
||||
/** The USB interface which this logical device
|
||||
represents. Valid on both Linux implementations
|
||||
in all cases, and valid on the Windows implementation
|
||||
only if the device contains more than one interface. */
|
||||
int interface_number;
|
||||
|
||||
/** Pointer to the next device */
|
||||
struct hid_device_info *next;
|
||||
};
|
||||
|
||||
|
||||
/** @brief Initialize the HIDAPI library.
|
||||
|
||||
This function initializes the HIDAPI library. Calling it is not
|
||||
strictly necessary, as it will be called automatically by
|
||||
hid_enumerate() and any of the hid_open_*() functions if it is
|
||||
needed. This function should be called at the beginning of
|
||||
execution however, if there is a chance of HIDAPI handles
|
||||
being opened by different threads simultaneously.
|
||||
|
||||
@ingroup API
|
||||
|
||||
@returns
|
||||
This function returns 0 on success and -1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT HID_API_CALL hid_init(void);
|
||||
|
||||
/** @brief Finalize the HIDAPI library.
|
||||
|
||||
This function frees all of the static data associated with
|
||||
HIDAPI. It should be called at the end of execution to avoid
|
||||
memory leaks.
|
||||
|
||||
@ingroup API
|
||||
|
||||
@returns
|
||||
This function returns 0 on success and -1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT HID_API_CALL hid_exit(void);
|
||||
|
||||
/** @brief Enumerate the HID Devices.
|
||||
|
||||
This function returns a linked list of all the HID devices
|
||||
attached to the system which match vendor_id and product_id.
|
||||
If @p vendor_id and @p product_id are both set to 0, then
|
||||
all HID devices will be returned.
|
||||
|
||||
@ingroup API
|
||||
@param vendor_id The Vendor ID (VID) of the types of device
|
||||
to open.
|
||||
@param product_id The Product ID (PID) of the types of
|
||||
device to open.
|
||||
|
||||
@returns
|
||||
This function returns a pointer to a linked list of type
|
||||
struct #hid_device, containing information about the HID devices
|
||||
attached to the system, or NULL in the case of failure. Free
|
||||
this linked list by calling hid_free_enumeration().
|
||||
*/
|
||||
struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);
|
||||
|
||||
/** @brief Free an enumeration Linked List
|
||||
|
||||
This function frees a linked list created by hid_enumerate().
|
||||
|
||||
@ingroup API
|
||||
@param devs Pointer to a list of struct_device returned from
|
||||
hid_enumerate().
|
||||
*/
|
||||
void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs);
|
||||
|
||||
/** @brief Open a HID device using a Vendor ID (VID), Product ID
|
||||
(PID) and optionally a serial number.
|
||||
|
||||
If @p serial_number is NULL, the first device with the
|
||||
specified VID and PID is opened.
|
||||
|
||||
@ingroup API
|
||||
@param vendor_id The Vendor ID (VID) of the device to open.
|
||||
@param product_id The Product ID (PID) of the device to open.
|
||||
@param serial_number The Serial Number of the device to open
|
||||
(Optionally NULL).
|
||||
|
||||
@returns
|
||||
This function returns a pointer to a #hid_device object on
|
||||
success or NULL on failure.
|
||||
*/
|
||||
HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, wchar_t *serial_number);
|
||||
|
||||
/** @brief Open a HID device by its path name.
|
||||
|
||||
The path name be determined by calling hid_enumerate(), or a
|
||||
platform-specific path name can be used (eg: /dev/hidraw0 on
|
||||
Linux).
|
||||
|
||||
@ingroup API
|
||||
@param path The path name of the device to open
|
||||
|
||||
@returns
|
||||
This function returns a pointer to a #hid_device object on
|
||||
success or NULL on failure.
|
||||
*/
|
||||
HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path);
|
||||
|
||||
/** @brief Write an Output report to a HID device.
|
||||
|
||||
The first byte of @p data[] must contain the Report ID. For
|
||||
devices which only support a single report, this must be set
|
||||
to 0x0. The remaining bytes contain the report data. Since
|
||||
the Report ID is mandatory, calls to hid_write() will always
|
||||
contain one more byte than the report contains. For example,
|
||||
if a hid report is 16 bytes long, 17 bytes must be passed to
|
||||
hid_write(), the Report ID (or 0x0, for devices with a
|
||||
single report), followed by the report data (16 bytes). In
|
||||
this example, the length passed in would be 17.
|
||||
|
||||
hid_write() will send the data on the first OUT endpoint, if
|
||||
one exists. If it does not, it will send the data through
|
||||
the Control Endpoint (Endpoint 0).
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param data The data to send, including the report number as
|
||||
the first byte.
|
||||
@param length The length in bytes of the data to send.
|
||||
|
||||
@returns
|
||||
This function returns the actual number of bytes written and
|
||||
-1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length);
|
||||
|
||||
/** @brief Read an Input report from a HID device with timeout.
|
||||
|
||||
Input reports are returned
|
||||
to the host through the INTERRUPT IN endpoint. The first byte will
|
||||
contain the Report number if the device uses numbered reports.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param data A buffer to put the read data into.
|
||||
@param length The number of bytes to read. For devices with
|
||||
multiple reports, make sure to read an extra byte for
|
||||
the report number.
|
||||
@param milliseconds timeout in milliseconds or -1 for blocking wait.
|
||||
|
||||
@returns
|
||||
This function returns the actual number of bytes read and
|
||||
-1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds);
|
||||
|
||||
/** @brief Read an Input report from a HID device.
|
||||
|
||||
Input reports are returned
|
||||
to the host through the INTERRUPT IN endpoint. The first byte will
|
||||
contain the Report number if the device uses numbered reports.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param data A buffer to put the read data into.
|
||||
@param length The number of bytes to read. For devices with
|
||||
multiple reports, make sure to read an extra byte for
|
||||
the report number.
|
||||
|
||||
@returns
|
||||
This function returns the actual number of bytes read and
|
||||
-1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length);
|
||||
|
||||
/** @brief Set the device handle to be non-blocking.
|
||||
|
||||
In non-blocking mode calls to hid_read() will return
|
||||
immediately with a value of 0 if there is no data to be
|
||||
read. In blocking mode, hid_read() will wait (block) until
|
||||
there is data to read before returning.
|
||||
|
||||
Nonblocking can be turned on and off at any time.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param nonblock enable or not the nonblocking reads
|
||||
- 1 to enable nonblocking
|
||||
- 0 to disable nonblocking.
|
||||
|
||||
@returns
|
||||
This function returns 0 on success and -1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock);
|
||||
|
||||
/** @brief Send a Feature report to the device.
|
||||
|
||||
Feature reports are sent over the Control endpoint as a
|
||||
Set_Report transfer. The first byte of @p data[] must
|
||||
contain the Report ID. For devices which only support a
|
||||
single report, this must be set to 0x0. The remaining bytes
|
||||
contain the report data. Since the Report ID is mandatory,
|
||||
calls to hid_send_feature_report() will always contain one
|
||||
more byte than the report contains. For example, if a hid
|
||||
report is 16 bytes long, 17 bytes must be passed to
|
||||
hid_send_feature_report(): the Report ID (or 0x0, for
|
||||
devices which do not use numbered reports), followed by the
|
||||
report data (16 bytes). In this example, the length passed
|
||||
in would be 17.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param data The data to send, including the report number as
|
||||
the first byte.
|
||||
@param length The length in bytes of the data to send, including
|
||||
the report number.
|
||||
|
||||
@returns
|
||||
This function returns the actual number of bytes written and
|
||||
-1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length);
|
||||
|
||||
/** @brief Get a feature report from a HID device.
|
||||
|
||||
Make sure to set the first byte of @p data[] to the Report
|
||||
ID of the report to be read. Make sure to allow space for
|
||||
this extra byte in @p data[].
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param data A buffer to put the read data into, including
|
||||
the Report ID. Set the first byte of @p data[] to the
|
||||
Report ID of the report to be read.
|
||||
@param length The number of bytes to read, including an
|
||||
extra byte for the report ID. The buffer can be longer
|
||||
than the actual report.
|
||||
|
||||
@returns
|
||||
This function returns the number of bytes read and
|
||||
-1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length);
|
||||
|
||||
/** @brief Close a HID device.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
*/
|
||||
void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device);
|
||||
|
||||
/** @brief Get The Manufacturer String from a HID device.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param string A wide string buffer to put the data into.
|
||||
@param maxlen The length of the buffer in multiples of wchar_t.
|
||||
|
||||
@returns
|
||||
This function returns 0 on success and -1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen);
|
||||
|
||||
/** @brief Get The Product String from a HID device.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param string A wide string buffer to put the data into.
|
||||
@param maxlen The length of the buffer in multiples of wchar_t.
|
||||
|
||||
@returns
|
||||
This function returns 0 on success and -1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen);
|
||||
|
||||
/** @brief Get The Serial Number String from a HID device.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param string A wide string buffer to put the data into.
|
||||
@param maxlen The length of the buffer in multiples of wchar_t.
|
||||
|
||||
@returns
|
||||
This function returns 0 on success and -1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen);
|
||||
|
||||
/** @brief Get a string from a HID device, based on its string index.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
@param string_index The index of the string to get.
|
||||
@param string A wide string buffer to put the data into.
|
||||
@param maxlen The length of the buffer in multiples of wchar_t.
|
||||
|
||||
@returns
|
||||
This function returns 0 on success and -1 on error.
|
||||
*/
|
||||
int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen);
|
||||
|
||||
/** @brief Get a string describing the last error which occurred.
|
||||
|
||||
@ingroup API
|
||||
@param device A device handle returned from hid_open().
|
||||
|
||||
@returns
|
||||
This function returns a string containing the last error
|
||||
which occurred or NULL if none has occurred.
|
||||
*/
|
||||
HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device);
|
||||
|
||||
int HID_API_EXPORT HID_API_CALL hid_set_ptt(int state);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,147 +0,0 @@
|
||||
|
||||
#define MAXSTACK 20
|
||||
#define INPUTLEN 512
|
||||
|
||||
#define MAXLINES 1000
|
||||
#define LINELEN 200
|
||||
|
||||
|
||||
#define BPQICON 2
|
||||
#define IDR_MENU1 101
|
||||
#define BPQMENU 101
|
||||
#define BPQCONNECT 102
|
||||
#define BPQDISCONNECT 103
|
||||
#define IDD_FONT 105
|
||||
|
||||
#define ID_WARNWRAP 415
|
||||
#define ID_WRAP 416
|
||||
#define ID_FLASHONBELL 417
|
||||
|
||||
#define IDC_FONTWIDTH 1008
|
||||
#define IDC_FONTNAME 1009
|
||||
#define IDC_CODEPAGE 1010
|
||||
#define IDC_CHARSET 1011
|
||||
#define IDC_FONTSIZE 1012
|
||||
#define BPQMTX 1164
|
||||
#define BPQMCOM 1165
|
||||
#define BPQCOPYMON 1166
|
||||
#define BPQCOPYOUT 1167
|
||||
#define BPQCLEARMON 1168
|
||||
#define BPQCLEAROUT 1169
|
||||
#define BPQBELLS 1170
|
||||
#define BPQCHAT 1171
|
||||
#define BPQHELP 1172
|
||||
#define BPQStripLF 1173
|
||||
#define BPQLogOutput 1174
|
||||
#define BPQLogMonitor 1175
|
||||
#define BPQSendDisconnected 1176
|
||||
#define BPQMNODES 1177
|
||||
#define MONCOLOUR 1178
|
||||
#define CHATTERM 1179
|
||||
#define IDM_CLOSEWINDOW 1180
|
||||
#define MONITORAPRS 1181
|
||||
#define MONLOCALTIME 1182
|
||||
#define MON_UI_ONLY 40006
|
||||
#define StopALLMon 40007
|
||||
|
||||
#define IDR_MAINFRAME_MENU 191
|
||||
#define TERM_MENU 192
|
||||
#define MON_MENU 193
|
||||
#define IDI_SIGMA_MAIN_ICON 104
|
||||
#define IDI_SYSTEM_INFO 106
|
||||
|
||||
#define RTFCOPY 30000
|
||||
#define ID_INFORMATION_SYSTEMINFORMATION 30001
|
||||
#define ID_HELP_ABOUT 30002
|
||||
#define ID_WINDOWS_CASCADE 30003
|
||||
#define ID_FILE_EXIT 30004
|
||||
#define ID_WINDOWS_TILE 30005
|
||||
#define ID_NEWWINDOW 30006
|
||||
#define ID_WINDOWS_RESTORE 30007
|
||||
#define ID_SETUP_FONT 30008
|
||||
#define ID_ACTION_RESETWINDOWSPLIT 30009
|
||||
|
||||
#define BPQBASE 40100
|
||||
|
||||
#define IDM_FIRSTCHILD 50000 // used in structure when creating mdi client area for the main frame
|
||||
|
||||
// Port monitoring flags use BPQBASE -> BPQBASE+100
|
||||
struct ConsoleInfo
|
||||
{
|
||||
struct ConsoleInfo * next;
|
||||
int BPQStream;
|
||||
BOOL Active;
|
||||
int Incoming;
|
||||
WNDPROC wpOrigInputProc;
|
||||
HWND hConsole;
|
||||
HWND hwndInput;
|
||||
HWND hwndOutput;
|
||||
HMENU hMenu; // handle of menu
|
||||
RECT ConsoleRect;
|
||||
RECT OutputRect;
|
||||
int CharWidth;
|
||||
|
||||
int Height, Width, Top, Left;
|
||||
|
||||
int ClientHeight, ClientWidth;
|
||||
char kbbuf[INPUTLEN];
|
||||
int kbptr;
|
||||
|
||||
int readbufflen; // Current Length
|
||||
char * readbuff; // Malloc'ed
|
||||
char * KbdStack[MAXSTACK];
|
||||
|
||||
int StackIndex;
|
||||
|
||||
// BOOL Bells;
|
||||
// BOOL FlashOnBell; // Flash instead of Beep
|
||||
BOOL StripLF;
|
||||
|
||||
// BOOL WarnWrap;
|
||||
// BOOL FlashOnConnect;
|
||||
// BOOL WrapInput;
|
||||
// BOOL CloseWindowOnBye;
|
||||
|
||||
unsigned int WrapLen;
|
||||
int WarnLen;
|
||||
int maxlinelen;
|
||||
|
||||
int PartLinePtr;
|
||||
int PartLineIndex; // Listbox index of (last) incomplete line
|
||||
|
||||
DWORD dwCharX; // average width of characters
|
||||
DWORD dwCharY; // height of characters
|
||||
DWORD dwClientX; // width of client area
|
||||
DWORD dwClientY; // height of client area
|
||||
DWORD dwLineLen; // line length
|
||||
int nCaretPosX; // horizontal position of caret
|
||||
int nCaretPosY; // vertical position of caret
|
||||
|
||||
COLORREF FGColour; // Text Colour
|
||||
COLORREF BGColour; // Background Colour
|
||||
COLORREF DefaultColour; // Default Text Colour
|
||||
|
||||
int CurrentLine; // Line we are writing to in circular buffer.
|
||||
|
||||
int Index;
|
||||
BOOL SendHeader;
|
||||
BOOL Finished;
|
||||
|
||||
char OutputScreen[MAXLINES][LINELEN];
|
||||
|
||||
int Colourvalue[MAXLINES];
|
||||
int LineLen[MAXLINES];
|
||||
|
||||
int CurrentColour;
|
||||
int Thumb;
|
||||
int FirstTime;
|
||||
BOOL Scrolled; // Set if scrolled back
|
||||
int RTFHeight; // Height of RTF control in pixels
|
||||
|
||||
BOOL CONNECTED;
|
||||
int SlowTimer;
|
||||
BOOL Minimized;
|
||||
BOOL NeedRefresh;
|
||||
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,32 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by BPQRemotePTT.rc
|
||||
//
|
||||
#define IDC_BPQHOST 1000
|
||||
#define IDC_COM1 1001
|
||||
#define IDC_HAMLIBPORT1 1002
|
||||
#define IDC_COM2 1003
|
||||
#define IDC_STATE1 1004
|
||||
#define IDC_TEST1 1005
|
||||
#define IDC_HAMLIBPORT2 1006
|
||||
#define IDC_STATE2 1007
|
||||
#define IDC_TEST2 1008
|
||||
#define IDC_COM3 1009
|
||||
#define IDC_HAMLIBPORT3 1010
|
||||
#define IDC_STATE3 1011
|
||||
#define IDC_TEST3 1012
|
||||
#define IDC_COM4 1013
|
||||
#define IDC_HAMLIBPORT4 1014
|
||||
#define IDC_STATE4 1015
|
||||
#define IDC_TEST4 1016
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 102
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1006
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,872 +0,0 @@
|
||||
// basic JASON API to BPQ Node
|
||||
|
||||
// Authentication is via Telnet USER records.
|
||||
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include <stdlib.h>
|
||||
#include "tncinfo.h"
|
||||
#include "asmstrucs.h"
|
||||
#include "kiss.h"
|
||||
|
||||
// Constants
|
||||
#define TOKEN_SIZE 32 // Length of the authentication token
|
||||
#define TOKEN_EXPIRATION 7200 // Token expiration time in seconds (2 hours)
|
||||
|
||||
// Token data structure
|
||||
typedef struct Token {
|
||||
char token[TOKEN_SIZE + 1];
|
||||
time_t expiration_time;
|
||||
struct Token* next;
|
||||
} Token;
|
||||
|
||||
typedef struct API
|
||||
{
|
||||
char *URL;
|
||||
int URLLen;
|
||||
int (* APIRoutine)(char * response, char * token, char * param, int Local);
|
||||
int Auth;
|
||||
} API;
|
||||
|
||||
// Auth defines
|
||||
|
||||
#define AuthNone 0
|
||||
#define AuthUser 1
|
||||
#define AuthBBSUser 2
|
||||
#define AuthSysop 4
|
||||
|
||||
// Function prototypes
|
||||
void handle_request(SOCKET client_socket, char * request, char * response);
|
||||
int verify_token(const char* token);
|
||||
void remove_expired_tokens();
|
||||
char* fetch_data(const char* endpoint);
|
||||
int request_token(char * response);
|
||||
int send_http_response(char * response, const char* msg);
|
||||
int create_json_response(char * response, char* access_token, int expires_in, char* scope);
|
||||
void add_token_to_list(Token* token);
|
||||
|
||||
Token* find_token(const char* token);
|
||||
Token* generate_token();
|
||||
|
||||
int sendPortList(char * response, char * token, char * Rest, int Local);
|
||||
int sendNodeList(char * response, char * token, char * Rest, int Local);
|
||||
int sendUserList(char * response, char * token, char * Rest, int Local);
|
||||
int sendInfo(char * response, char * token, char * Rest, int Local);
|
||||
int sendLinks(char * response, char * token, char * Rest, int Local);
|
||||
int sendPortMHList(char * response, char * token, char * Rest, int Local);
|
||||
int sendWhatsPacState(char * response, char * token, char * param, int Local);
|
||||
int sendWhatsPacConfig(char * response, char * token, char * param, int Local);
|
||||
|
||||
void BuildPortMH(char * MHJSON, struct PORTCONTROL * PORT);
|
||||
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
|
||||
|
||||
// Token list
|
||||
Token* token_list = NULL;
|
||||
|
||||
|
||||
struct API APIList[] =
|
||||
{
|
||||
"/api/ports", 10, sendPortList, 0,
|
||||
"/api/nodes", 10, sendNodeList, 0,
|
||||
"/api/info", 9, sendInfo, 0,
|
||||
"/api/links", 10, sendLinks, 0,
|
||||
"/api/users", 10, sendUserList, 0,
|
||||
"/api/mheard", 11, sendPortMHList, 0,
|
||||
"/api/v1/config", 14, sendWhatsPacConfig, AuthSysop,
|
||||
"/api/v1/state", 13, sendWhatsPacState, AuthSysop
|
||||
};
|
||||
|
||||
int APICount = sizeof(APIList) / sizeof(struct API);
|
||||
|
||||
extern int HTTPPort;
|
||||
|
||||
|
||||
int xx()
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
// Remove expired tokens
|
||||
remove_expired_tokens();
|
||||
|
||||
// Handle the client request
|
||||
// handle_request();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE)
|
||||
{
|
||||
const char * auth_header = "Authorization: Bearer ";
|
||||
char * token_begin = strstr(request, auth_header);
|
||||
char token[TOKEN_SIZE + 1]= "";
|
||||
int Flags = 0, n;
|
||||
|
||||
// Node Flags isn't currently used
|
||||
|
||||
char * Tok;
|
||||
char * param;
|
||||
|
||||
if (token_begin)
|
||||
{
|
||||
// Using Auth Header
|
||||
|
||||
// Extract the token from the request (assuming it's present in the request headers)
|
||||
|
||||
if (token_begin == NULL)
|
||||
{
|
||||
Debugprintf("Invalid request: No authentication token provided.\n");
|
||||
return send_http_response(response, "403 (Forbidden)");
|
||||
}
|
||||
|
||||
token_begin += strlen(auth_header); // Move to the beginning of the token
|
||||
strncpy(token, token_begin, TOKEN_SIZE);
|
||||
token[TOKEN_SIZE] = '\0'; // Null-terminate the token
|
||||
|
||||
param = strlop(URL, '?');
|
||||
}
|
||||
else
|
||||
{
|
||||
// There may be a token as first param, but if auth not needed may be misisng
|
||||
|
||||
Tok = strlop(URL, '?');
|
||||
param = strlop(Tok, '&');
|
||||
|
||||
if (Tok && strlen(Tok) == TOKEN_SIZE)
|
||||
{
|
||||
// assume auth token
|
||||
|
||||
strcpy(token, Tok);
|
||||
}
|
||||
else param = Tok;
|
||||
}
|
||||
|
||||
remove_expired_tokens(); // Tidy up
|
||||
|
||||
// Check if the request is for token generation
|
||||
|
||||
if (strcmp(Method, "OPTIONS") == 0)
|
||||
{
|
||||
// CORS Request
|
||||
|
||||
char Resp[] =
|
||||
"HTTP/1.1 200 OK\r\n"
|
||||
"Access-Control-Allow-Origin: *\r\n"
|
||||
"Access-Control-Allow-Methods: POST, GET, OPTIONS\r\n"
|
||||
"Access-Control-Allow-Headers: authorization";
|
||||
|
||||
return send_http_response(response, Resp);
|
||||
}
|
||||
|
||||
if (strcmp(Method, "POST") == 0)
|
||||
{
|
||||
if (_stricmp(URL, "/api/v1/config") == 0)
|
||||
{
|
||||
return send_http_response(response, "200 (OK)");
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(Method, "GET") != 0)
|
||||
return send_http_response(response, "403 (Bad Method)");
|
||||
|
||||
if (_stricmp(URL, "/api/request_token") == 0)
|
||||
return request_token(response);
|
||||
|
||||
/*
|
||||
if (token[0] == 0)
|
||||
{
|
||||
// Extract the token from the request (assuming it's present in the request headers)
|
||||
if (token_begin == NULL)
|
||||
{
|
||||
Debugprintf("Invalid request: No authentication token provided.\n");
|
||||
return send_http_response(response, "403 (Forbidden)");
|
||||
}
|
||||
token_begin += strlen(auth_header); // Move to the beginning of the token
|
||||
strncpy(token, token_begin, TOKEN_SIZE);
|
||||
token[TOKEN_SIZE] = '\0'; // Null-terminate the token
|
||||
}
|
||||
|
||||
// Verify the token
|
||||
if (!verify_token(token))
|
||||
{
|
||||
Debugprintf("Invalid authentication token.\n");
|
||||
return send_http_response(response, "401 Unauthorized");
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// Determine the requested API endpoint
|
||||
|
||||
for (n = 0; n < APICount; n++)
|
||||
{
|
||||
struct API * APIEntry;
|
||||
char * rest;
|
||||
|
||||
APIEntry = &APIList[n];
|
||||
|
||||
if (_memicmp(URL, APIEntry->URL, APIEntry->URLLen) == 0)
|
||||
{
|
||||
rest = &request[4 + APIEntry->URLLen]; // Anything following?
|
||||
|
||||
if (rest[0] == ' ' || rest[0] == '/' || rest[0] == '?')
|
||||
return APIEntry->APIRoutine(response, token, rest, LOCAL);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return send_http_response(response, "401 Invalid API Call");
|
||||
}
|
||||
|
||||
int request_token(char * response)
|
||||
{
|
||||
Token * token = generate_token();
|
||||
char scope[] = "create";
|
||||
|
||||
printf("Token generated: %s\n", token->token);
|
||||
|
||||
sprintf(response, "{\"access_token\":\"%s\", \"expires_at\":%ld,\"scope\":\"create\"}\r\n",
|
||||
token->token, token->expiration_time);
|
||||
|
||||
return strlen(response);
|
||||
}
|
||||
|
||||
Token * generate_token()
|
||||
{
|
||||
// Generate a random authentication token
|
||||
|
||||
int i;
|
||||
|
||||
Token * token = malloc(sizeof(Token));
|
||||
for (i = 0; i < TOKEN_SIZE; i++)
|
||||
{
|
||||
token->token[i] = 'A' + rand() % 26; // Random uppercase alphabet character
|
||||
}
|
||||
token->token[TOKEN_SIZE] = '\0'; // Null-terminate the token
|
||||
token->expiration_time = time(NULL) + TOKEN_EXPIRATION; // Set token expiration time
|
||||
add_token_to_list(token);
|
||||
return token;
|
||||
}
|
||||
|
||||
// Function to add the token to the token_list
|
||||
|
||||
void add_token_to_list(Token* token)
|
||||
{
|
||||
if (token_list == NULL)
|
||||
{
|
||||
token_list = token;
|
||||
token->next = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
Token* current = token_list;
|
||||
|
||||
while (current->next != NULL)
|
||||
current = current->next;
|
||||
|
||||
current->next = token;
|
||||
token->next = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
int verify_token(const char* token)
|
||||
{
|
||||
// Find the token in the token list
|
||||
Token * existing_token = find_token(token);
|
||||
|
||||
if (existing_token != NULL)
|
||||
{
|
||||
// Check if the token has expired
|
||||
time_t current_time = time(NULL);
|
||||
if (current_time > existing_token->expiration_time)
|
||||
{
|
||||
// Token has expired, remove it from the token list
|
||||
remove_expired_tokens();
|
||||
return 0;
|
||||
}
|
||||
// Token is valid
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Token doesn't exist in the token list
|
||||
return 0;
|
||||
}
|
||||
|
||||
void remove_expired_tokens()
|
||||
{
|
||||
time_t current_time = time(NULL);
|
||||
Token* current_token = token_list;
|
||||
Token* prev_token = NULL;
|
||||
Token* next_token;
|
||||
|
||||
while (current_token != NULL)
|
||||
{
|
||||
if (current_time > current_token->expiration_time)
|
||||
{
|
||||
// Token has expired, remove it from the token list
|
||||
if (prev_token == NULL)
|
||||
{
|
||||
token_list = current_token->next;
|
||||
} else {
|
||||
prev_token->next = current_token->next;
|
||||
}
|
||||
next_token = current_token->next;
|
||||
free(current_token);
|
||||
current_token = next_token;
|
||||
} else {
|
||||
prev_token = current_token;
|
||||
current_token = current_token->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Token * find_token(const char* token)
|
||||
{
|
||||
Token* current_token = token_list;
|
||||
while (current_token != NULL)
|
||||
{
|
||||
if (strcmp(current_token->token, token) == 0)
|
||||
{
|
||||
return current_token;
|
||||
}
|
||||
current_token = current_token->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int send_http_response(char * response, const char* msg)
|
||||
{
|
||||
return sprintf(response, "HTTP/1.1 %s\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", msg);
|
||||
}
|
||||
|
||||
/*
|
||||
{
|
||||
"access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
|
||||
"expires_in":3600,
|
||||
"scope":"create"
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
{"ports":[
|
||||
{"ID":"My Port", "Driver":"KISS", "Number":2, "State":"Active"),
|
||||
{ ...},
|
||||
{...}
|
||||
]}
|
||||
*/
|
||||
|
||||
extern int MasterPort[MAXBPQPORTS+1]; // Pointer to first BPQ port for a specific MPSK or UZ7HO host
|
||||
|
||||
int sendPortList(char * response, char * token, char * param, int Local)
|
||||
{
|
||||
char * Array = 0;
|
||||
int ArrayLen = 0;
|
||||
int ArrayPtr = 0;
|
||||
|
||||
struct _EXTPORTDATA * ExtPort;
|
||||
struct PORTCONTROL * Port;
|
||||
struct PORTCONTROL * SAVEPORT;
|
||||
int PortNo;
|
||||
|
||||
int count;
|
||||
char DLL[20];
|
||||
char Status[32]="Unknown";
|
||||
char ID[33];
|
||||
char * ptr;
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], "{\"ports\":[\r\n");
|
||||
|
||||
for (count = 1; count <= NUMBEROFPORTS; count++)
|
||||
{
|
||||
Port = GetPortTableEntryFromSlot(count);
|
||||
ExtPort = (struct _EXTPORTDATA *)Port;
|
||||
PortNo = Port->PORTNUMBER;
|
||||
|
||||
if (Port->PORTTYPE == 0x10)
|
||||
{
|
||||
strcpy(DLL, ExtPort->PORT_DLL_NAME);
|
||||
strlop(DLL, '.');
|
||||
strlop(DLL, ' ');
|
||||
}
|
||||
else if (Port->PORTTYPE == 0)
|
||||
strcpy(DLL, "ASYNC");
|
||||
|
||||
else if (Port->PORTTYPE == 22)
|
||||
strcpy(DLL, "I2C");
|
||||
|
||||
else if (Port->PORTTYPE == 14)
|
||||
strcpy(DLL, "INTERNAL");
|
||||
|
||||
else if (Port->PORTTYPE > 0 && Port->PORTTYPE < 14)
|
||||
strcpy(DLL, "HDLC");
|
||||
|
||||
|
||||
if (Port->PortStopped)
|
||||
{
|
||||
strcpy(Status, "Stopped");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Port->PORTTYPE == 0)
|
||||
{
|
||||
struct KISSINFO * KISS = (struct KISSINFO *)Port;
|
||||
NPASYINFO KPort;
|
||||
|
||||
SAVEPORT = Port;
|
||||
|
||||
if (KISS->FIRSTPORT && KISS->FIRSTPORT != KISS)
|
||||
{
|
||||
// Not first port on device
|
||||
|
||||
Port = (struct PORTCONTROL *)KISS->FIRSTPORT;
|
||||
KPort = KISSInfo[PortNo];
|
||||
}
|
||||
|
||||
KPort = KISSInfo[PortNo];
|
||||
|
||||
if (KPort)
|
||||
{
|
||||
// KISS like - see if connected
|
||||
|
||||
if (Port->PORTIPADDR.s_addr || Port->KISSSLAVE)
|
||||
{
|
||||
// KISS over UDP or TCP
|
||||
|
||||
if (Port->KISSTCP)
|
||||
{
|
||||
if (KPort->Connected)
|
||||
strcpy(Status, "Open ");
|
||||
else
|
||||
if (Port->KISSSLAVE)
|
||||
strcpy(Status, "Listen");
|
||||
else
|
||||
strcpy(Status, "Closed");
|
||||
}
|
||||
else
|
||||
strcpy(Status, "UDP");
|
||||
}
|
||||
else
|
||||
if (KPort->idComDev) // Serial port Open
|
||||
strcpy(Status, "Open ");
|
||||
else
|
||||
strcpy(Status, "Closed");
|
||||
|
||||
|
||||
Port = SAVEPORT;
|
||||
}
|
||||
}
|
||||
|
||||
if (Port->PORTTYPE == 14) // Loopback
|
||||
strcpy(Status, "Open ");
|
||||
|
||||
else if (Port->PORTTYPE == 16) // External
|
||||
{
|
||||
if (Port->PROTOCOL == 10) // 'HF' Port
|
||||
{
|
||||
struct TNCINFO * TNC = TNCInfo[PortNo];
|
||||
|
||||
if (TNC)
|
||||
{
|
||||
switch (TNC->Hardware) // Hardware Type
|
||||
{
|
||||
case H_SCS:
|
||||
case H_KAM:
|
||||
case H_AEA:
|
||||
case H_HAL:
|
||||
case H_TRK:
|
||||
case H_SERIAL:
|
||||
|
||||
// Serial
|
||||
|
||||
if (TNC->hDevice)
|
||||
strcpy(Status, "Open ");
|
||||
else
|
||||
strcpy(Status, "Closed");
|
||||
|
||||
break;
|
||||
|
||||
case H_UZ7HO:
|
||||
|
||||
if (TNCInfo[MasterPort[PortNo]]->CONNECTED)
|
||||
strcpy(Status, "Open ");
|
||||
else
|
||||
strcpy(Status, "Closed");
|
||||
|
||||
break;
|
||||
|
||||
case H_WINMOR:
|
||||
case H_V4:
|
||||
|
||||
case H_MPSK:
|
||||
case H_FLDIGI:
|
||||
case H_UIARQ:
|
||||
case H_ARDOP:
|
||||
case H_VARA:
|
||||
case H_KISSHF:
|
||||
case H_WINRPR:
|
||||
case H_FREEDATA:
|
||||
|
||||
// TCP
|
||||
|
||||
if (TNC->CONNECTED)
|
||||
{
|
||||
if (TNC->Streams[0].Attached)
|
||||
strcpy(Status, "In Use");
|
||||
else
|
||||
strcpy(Status, "Open ");
|
||||
}
|
||||
else
|
||||
strcpy(Status, "Closed");
|
||||
|
||||
break;
|
||||
|
||||
case H_TELNET:
|
||||
|
||||
strcpy(Status, "Open ");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// External but not HF - AXIP, BPQETHER VKISS, ??
|
||||
|
||||
struct _EXTPORTDATA * EXTPORT = (struct _EXTPORTDATA *)Port;
|
||||
|
||||
strcpy(Status, "Open ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
strlop(Status, ' ');
|
||||
strcpy(ID, Port->PORTDESCRIPTION);
|
||||
ptr = &ID[29];
|
||||
while (*(ptr) == ' ')
|
||||
{
|
||||
*(ptr--) = 0;
|
||||
}
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], " {\"ID\":\"%s\", \"Driver\":\"%s\", \"Number\":%d,\"State\":\"%s\"},\r\n",
|
||||
ID, DLL, Port->PORTNUMBER, Status);
|
||||
}
|
||||
|
||||
ArrayPtr -= 3; // remove trailing comma
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], "\r\n]}\r\n");
|
||||
|
||||
return ArrayPtr;
|
||||
}
|
||||
|
||||
/*
|
||||
{"Nodes":[
|
||||
{"Call":"xx", "Alias":"xx", "Nbour1 ":"xx", "Quality":192),
|
||||
{ ...},
|
||||
{...}
|
||||
]}
|
||||
*/
|
||||
|
||||
extern int MaxNodes;
|
||||
extern struct DEST_LIST * DESTS; // NODE LIST
|
||||
extern int DEST_LIST_LEN;
|
||||
|
||||
|
||||
int sendNodeList(char * response, char * token, char * param, int Local)
|
||||
{
|
||||
int ArrayPtr = 0;
|
||||
|
||||
int count, len, i;
|
||||
char Normcall[10], Portcall[10];
|
||||
char Alias[7];
|
||||
struct DEST_LIST * Dests = DESTS ;
|
||||
// struct ROUTE * Routes;
|
||||
|
||||
Dests = DESTS;
|
||||
MaxNodes = MAXDESTS;
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], "{\"nodes\":[\r\n");
|
||||
|
||||
Dests-=1;
|
||||
|
||||
for (count = 0; count < MaxNodes; count++)
|
||||
{
|
||||
Dests+=1;
|
||||
|
||||
if (Dests->DEST_CALL[0] == 0)
|
||||
continue;
|
||||
|
||||
len = ConvFromAX25(Dests->DEST_CALL, Normcall);
|
||||
Normcall[len] = 0;
|
||||
|
||||
memcpy(Alias, Dests->DEST_ALIAS, 6);
|
||||
|
||||
Alias[6]=0;
|
||||
|
||||
for (i=0;i<6;i++)
|
||||
{
|
||||
if (Alias[i] == ' ')
|
||||
Alias[i] = 0;
|
||||
}
|
||||
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\":\"%s\", \"Alias\":\"%s\", \"Routes\":[", Normcall, Alias);
|
||||
|
||||
|
||||
// Add an array with up to 6 objects (3 NR + 3 INP3 Neighbours
|
||||
|
||||
if (Dests->NRROUTE[0].ROUT_NEIGHBOUR != 0 && Dests->NRROUTE[0].ROUT_NEIGHBOUR->INP3Node == 0)
|
||||
{
|
||||
len = ConvFromAX25(Dests->NRROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL,Portcall);
|
||||
Portcall[len] = 0;
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], "{\"Call\":\"%s\", \"Port\":%d, \"Quality\":%d},",
|
||||
Portcall, Dests->NRROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dests->NRROUTE[0].ROUT_QUALITY);
|
||||
|
||||
|
||||
// if (Dests->NRROUTE[0].ROUT_OBSCOUNT > 127)
|
||||
// {
|
||||
// len=sprintf(&line[cursor],"! ");
|
||||
// cursor+=len;
|
||||
// }
|
||||
|
||||
|
||||
if (Dests->NRROUTE[1].ROUT_NEIGHBOUR != 0 && Dests->NRROUTE[1].ROUT_NEIGHBOUR->INP3Node == 0)
|
||||
{
|
||||
len=ConvFromAX25(Dests->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL,Portcall);
|
||||
Portcall[len]=0;
|
||||
|
||||
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\":\"%s\", \"Port\":%d, \"Quality\":%d},",
|
||||
Portcall, Dests->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dests->NRROUTE[1].ROUT_QUALITY);
|
||||
//if (Dests->NRROUTE[1].ROUT_OBSCOUNT > 127)
|
||||
//{
|
||||
//len=sprintf(&line[cursor],"! ");
|
||||
//cursor+=len;
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
if (Dests->NRROUTE[2].ROUT_NEIGHBOUR != 0 && Dests->NRROUTE[2].ROUT_NEIGHBOUR->INP3Node == 0)
|
||||
{
|
||||
len=ConvFromAX25(Dests->NRROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL,Portcall);
|
||||
Portcall[len]=0;
|
||||
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\":\"%s\", \"Port\":%d, \"Quality\":%d},",
|
||||
Portcall, Dests->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dests->NRROUTE[1].ROUT_QUALITY);
|
||||
|
||||
//if (Dests->NRROUTE[2].ROUT_OBSCOUNT > 127)
|
||||
//{
|
||||
//len=sprintf(&line[cursor],"! ");
|
||||
//cursor+=len;
|
||||
|
||||
}
|
||||
ArrayPtr -= 1; // remove comma
|
||||
}
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], "]},\r\n");
|
||||
}
|
||||
|
||||
ArrayPtr -= 3; // remove comma
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], "\r\n]}");
|
||||
|
||||
return ArrayPtr;
|
||||
}
|
||||
|
||||
|
||||
int sendUserList(char * response, char * token, char * param, int Local)
|
||||
{
|
||||
int ArrayPtr = 0;
|
||||
int n = MAXCIRCUITS;
|
||||
TRANSPORTENTRY * L4 = L4TABLE;
|
||||
// TRANSPORTENTRY * Partner;
|
||||
int MaxLinks = MAXLINKS;
|
||||
char State[12] = "", Type[12] = "Uplink";
|
||||
char LHS[50] = "", MID[10] = "", RHS[50] = "";
|
||||
// char Line[100];
|
||||
char Normcall[10];
|
||||
int len;
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], "{\"users\":[\r\n");
|
||||
|
||||
while (n--)
|
||||
{
|
||||
if (L4->L4USER[0])
|
||||
{
|
||||
RHS[0] = MID[0] = 0;
|
||||
|
||||
len = ConvFromAX25(L4->L4USER, Normcall);
|
||||
Normcall[len] = 0;
|
||||
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\": \"%s\"},\r\n", Normcall);
|
||||
L4++;
|
||||
}
|
||||
}
|
||||
|
||||
if (ArrayPtr == 12) //empty list
|
||||
{
|
||||
ArrayPtr -=2;
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], "]}\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ArrayPtr -= 3; // remove trailing comma
|
||||
ArrayPtr += sprintf(&response[ArrayPtr], "\r\n]}\r\n");
|
||||
}
|
||||
return ArrayPtr;
|
||||
}
|
||||
|
||||
extern char MYALIASLOPPED[];
|
||||
extern char TextVerstring[];
|
||||
extern char LOCATOR[];
|
||||
|
||||
int sendInfo(char * response, char * token, char * param, int Local)
|
||||
{
|
||||
char call[10];
|
||||
|
||||
memcpy(call, MYNODECALL, 10);
|
||||
strlop(call, ' ');
|
||||
|
||||
sprintf(response, "{\"info\":{\"NodeCall\":\"%s\", \"Alias\":\"%s\", \"Locator\":\"%s\", \"Version\":\"%s\"}}\r\n",
|
||||
call, MYALIASLOPPED, LOCATOR, TextVerstring);
|
||||
|
||||
return strlen(response);
|
||||
}
|
||||
|
||||
int sendLinks(char * response, char * token, char * param, int Local)
|
||||
{
|
||||
struct _LINKTABLE * Links = LINKS;
|
||||
int MaxLinks = MAXLINKS;
|
||||
int count;
|
||||
char Normcall1[10];
|
||||
char Normcall2[10];
|
||||
char State[12] = "", Type[12] = "Uplink";
|
||||
int axState;
|
||||
int cctType;
|
||||
int ReplyLen = 0;
|
||||
ReplyLen += sprintf(&response[ReplyLen],"{\"links\":[\r\n");
|
||||
|
||||
for (count=0; count<MaxLinks; count++)
|
||||
{
|
||||
if (Links->LINKCALL[0] != 0)
|
||||
{
|
||||
int len = ConvFromAX25(Links->LINKCALL, Normcall1);
|
||||
Normcall1[len] = 0;
|
||||
|
||||
len = ConvFromAX25(Links->OURCALL, Normcall2);
|
||||
Normcall2[len] = 0;
|
||||
|
||||
|
||||
axState = Links->L2STATE;
|
||||
|
||||
if (axState == 2)
|
||||
strcpy(State, "Connecting");
|
||||
else if (axState == 3)
|
||||
strcpy(State, "FRMR");
|
||||
else if (axState == 4)
|
||||
strcpy(State, "Closing");
|
||||
else if (axState == 5)
|
||||
strcpy(State, "Active");
|
||||
else if (axState == 6)
|
||||
strcpy(State, "REJ Sent");
|
||||
|
||||
cctType = Links->LINKTYPE;
|
||||
|
||||
if (cctType == 1)
|
||||
strcpy(Type, "Uplink");
|
||||
else if (cctType == 2)
|
||||
strcpy(Type, "Downlink");
|
||||
else if (cctType == 3)
|
||||
strcpy(Type, "Node-Node");
|
||||
|
||||
|
||||
|
||||
ReplyLen += sprintf(&response[ReplyLen], "{\"farCall\": \"%s\",\"ourCall\": \"%s\", \"port\": \"%d\", \"state\": \"%s\", \"linkType\": \"%s\", \"ax25Version\": \"%d\"},\r\n",
|
||||
Normcall1, Normcall2, Links->LINKPORT->PORTNUMBER,
|
||||
State, Type, 2 - Links->VER1FLAG );
|
||||
Links+=1;
|
||||
}
|
||||
}
|
||||
|
||||
if (ReplyLen < 13)
|
||||
ReplyLen -= 2; // no links
|
||||
else
|
||||
ReplyLen -= 3; // remove trailing comma
|
||||
|
||||
ReplyLen+= sprintf(&response[ReplyLen], "\r\n]}\r\n");
|
||||
|
||||
return ReplyLen;
|
||||
}
|
||||
|
||||
int sendPortMHList(char * response, char * token, char * param, int Local)
|
||||
{
|
||||
struct PORTCONTROL * PORTVEC ;
|
||||
int n;
|
||||
int port = 0;
|
||||
|
||||
if (param[0] = '?' || param[0] == '/')
|
||||
port = atoi(¶m[1]);
|
||||
|
||||
PORTVEC = GetPortTableEntryFromPortNum(port);
|
||||
response[0] = 0;
|
||||
|
||||
if (PORTVEC == 0)
|
||||
return send_http_response(response, "401 Invalid API Call");
|
||||
|
||||
n = sprintf(response,"{\"mheard\":[\r\n");
|
||||
|
||||
BuildPortMH(&response[n], PORTVEC );
|
||||
|
||||
if (response[n] == 0) // No entries
|
||||
{
|
||||
response[strlen(response) - 2] = '\0'; // remove \r\n
|
||||
strcat(response, "]}\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
response[strlen(response)-3 ] = '\0'; // remove ,\r\n
|
||||
strcat(response, "\r\n]}\r\n");
|
||||
// printf("MH for port %d:\r\n%s\r\n", PORTVEC->PORTNUMBER, response);
|
||||
}
|
||||
return strlen(response);
|
||||
}
|
||||
|
||||
// WhatsPac configuration interface
|
||||
// WhatsPac also uses Paula's Remote Host Protocol (RHP). This is in a separate module
|
||||
|
||||
extern int WhatsPacConfigured;
|
||||
|
||||
|
||||
int sendWhatsPacState(char * response, char * token, char * param, int Local)
|
||||
{
|
||||
if (Local == 0)
|
||||
return send_http_response(response, "401 Not Authorised");
|
||||
|
||||
if (WhatsPacConfigured)
|
||||
sprintf(response, "{\"configured\": true}\r\n");
|
||||
else
|
||||
sprintf(response, "{\"configured\": false}\r\n");
|
||||
|
||||
return strlen(response);
|
||||
}
|
||||
|
||||
|
||||
int sendWhatsPacConfig(char * response, char * token, char * param, int Local)
|
||||
{
|
||||
char Template[] =
|
||||
"{\"MODE\": 0,"
|
||||
"\"RHPPORT\": \"%d\","
|
||||
"\"AGWPORT\": \"7000\","
|
||||
"\"INTERFACES\": [{\"INTERFACE\": 1,\"PROTOCOL\": \"KISS\",\"TYPE\": \"TCP\",\"IOADDR\": \"127.0.0.1\",\"INTNUM\": 8100}],"
|
||||
"\"PORTS\": [{\"PORT\": 1,\"ID\": \"RHPPORT\", \"INTERFACENUM\": 1}]}";
|
||||
|
||||
if (Local == 0)
|
||||
return send_http_response(response, "401 Not Authorised");
|
||||
|
||||
sprintf(response, Template, HTTPPort);
|
||||
|
||||
return strlen(response);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,153 +0,0 @@
|
||||
/* $Id: miniupnpc.h,v 1.56 2020/12/20 18:07:35 nanard Exp $ */
|
||||
/* vim: tabstop=4 shiftwidth=4 noexpandtab
|
||||
* Project: miniupnp
|
||||
* http://miniupnp.free.fr/
|
||||
* Author: Thomas Bernard
|
||||
* Copyright (c) 2005-2018 Thomas Bernard
|
||||
* This software is subjects to the conditions detailed
|
||||
* in the LICENCE file provided within this distribution */
|
||||
#ifndef MINIUPNPC_H_INCLUDED
|
||||
#define MINIUPNPC_H_INCLUDED
|
||||
|
||||
#include "miniupnpc_declspec.h"
|
||||
#include "igd_desc_parse.h"
|
||||
#include "upnpdev.h"
|
||||
|
||||
/* error codes : */
|
||||
#define UPNPDISCOVER_SUCCESS (0)
|
||||
#define UPNPDISCOVER_UNKNOWN_ERROR (-1)
|
||||
#define UPNPDISCOVER_SOCKET_ERROR (-101)
|
||||
#define UPNPDISCOVER_MEMORY_ERROR (-102)
|
||||
|
||||
/* versions : */
|
||||
#define MINIUPNPC_VERSION "2.2.2"
|
||||
#define MINIUPNPC_API_VERSION 17
|
||||
|
||||
/* Source port:
|
||||
Using "1" as an alias for 1900 for backwards compatibility
|
||||
(presuming one would have used that for the "sameport" parameter) */
|
||||
#define UPNP_LOCAL_PORT_ANY 0
|
||||
#define UPNP_LOCAL_PORT_SAME 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Structures definitions : */
|
||||
struct UPNParg { const char * elt; const char * val; };
|
||||
|
||||
char *
|
||||
simpleUPnPcommand(int, const char *, const char *,
|
||||
const char *, struct UPNParg *,
|
||||
int *);
|
||||
|
||||
/* upnpDiscover()
|
||||
* discover UPnP devices on the network.
|
||||
* The discovered devices are returned as a chained list.
|
||||
* It is up to the caller to free the list with freeUPNPDevlist().
|
||||
* delay (in millisecond) is the maximum time for waiting any device
|
||||
* response.
|
||||
* If available, device list will be obtained from MiniSSDPd.
|
||||
* Default path for minissdpd socket will be used if minissdpdsock argument
|
||||
* is NULL.
|
||||
* If multicastif is not NULL, it will be used instead of the default
|
||||
* multicast interface for sending SSDP discover packets.
|
||||
* If localport is set to UPNP_LOCAL_PORT_SAME(1) SSDP packets will be sent
|
||||
* from the source port 1900 (same as destination port), if set to
|
||||
* UPNP_LOCAL_PORT_ANY(0) system assign a source port, any other value will
|
||||
* be attempted as the source port.
|
||||
* "searchalltypes" parameter is useful when searching several types,
|
||||
* if 0, the discovery will stop with the first type returning results.
|
||||
* TTL should default to 2. */
|
||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
||||
upnpDiscover(int delay, const char * multicastif,
|
||||
const char * minissdpdsock, int localport,
|
||||
int ipv6, unsigned char ttl,
|
||||
int * error);
|
||||
|
||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
||||
upnpDiscoverAll(int delay, const char * multicastif,
|
||||
const char * minissdpdsock, int localport,
|
||||
int ipv6, unsigned char ttl,
|
||||
int * error);
|
||||
|
||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
||||
upnpDiscoverDevice(const char * device, int delay, const char * multicastif,
|
||||
const char * minissdpdsock, int localport,
|
||||
int ipv6, unsigned char ttl,
|
||||
int * error);
|
||||
|
||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
||||
upnpDiscoverDevices(const char * const deviceTypes[],
|
||||
int delay, const char * multicastif,
|
||||
const char * minissdpdsock, int localport,
|
||||
int ipv6, unsigned char ttl,
|
||||
int * error,
|
||||
int searchalltypes);
|
||||
|
||||
/* parserootdesc() :
|
||||
* parse root XML description of a UPnP device and fill the IGDdatas
|
||||
* structure. */
|
||||
MINIUPNP_LIBSPEC void parserootdesc(const char *, int, struct IGDdatas *);
|
||||
|
||||
/* structure used to get fast access to urls
|
||||
* controlURL: controlURL of the WANIPConnection
|
||||
* ipcondescURL: url of the description of the WANIPConnection
|
||||
* controlURL_CIF: controlURL of the WANCommonInterfaceConfig
|
||||
* controlURL_6FC: controlURL of the WANIPv6FirewallControl
|
||||
*/
|
||||
struct UPNPUrls {
|
||||
char * controlURL;
|
||||
char * ipcondescURL;
|
||||
char * controlURL_CIF;
|
||||
char * controlURL_6FC;
|
||||
char * rootdescURL;
|
||||
};
|
||||
|
||||
/* UPNP_GetValidIGD() :
|
||||
* return values :
|
||||
* 0 = NO IGD found
|
||||
* 1 = A valid connected IGD has been found
|
||||
* 2 = A valid IGD has been found but it reported as
|
||||
* not connected
|
||||
* 3 = an UPnP device has been found but was not recognized as an IGD
|
||||
*
|
||||
* In any non zero return case, the urls and data structures
|
||||
* passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to
|
||||
* free allocated memory.
|
||||
*/
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetValidIGD(struct UPNPDev * devlist,
|
||||
struct UPNPUrls * urls,
|
||||
struct IGDdatas * data,
|
||||
char * lanaddr, int lanaddrlen);
|
||||
|
||||
/* UPNP_GetIGDFromUrl()
|
||||
* Used when skipping the discovery process.
|
||||
* When succeding, urls, data, and lanaddr arguments are set.
|
||||
* return value :
|
||||
* 0 - Not ok
|
||||
* 1 - OK */
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetIGDFromUrl(const char * rootdescurl,
|
||||
struct UPNPUrls * urls,
|
||||
struct IGDdatas * data,
|
||||
char * lanaddr, int lanaddrlen);
|
||||
|
||||
MINIUPNP_LIBSPEC void
|
||||
GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *,
|
||||
const char *, unsigned int);
|
||||
|
||||
MINIUPNP_LIBSPEC void
|
||||
FreeUPNPUrls(struct UPNPUrls *);
|
||||
|
||||
/* return 0 or 1 */
|
||||
MINIUPNP_LIBSPEC int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,29 +0,0 @@
|
||||
|
||||
char VersionString[50]="";
|
||||
char VersionStringWithBuild[50]="";
|
||||
int Ver[4] = {Vers};
|
||||
char TextVerstring[50] = "";
|
||||
|
||||
void GetVersionInfo(char * File)
|
||||
{
|
||||
#ifndef LINBPQ
|
||||
|
||||
char isDebug[40]="";
|
||||
|
||||
#ifdef SPECIALVERSION
|
||||
strcat(isDebug, " ");
|
||||
strcat(isDebug, SPECIALVERSION);
|
||||
#endif
|
||||
#ifdef _DEBUG
|
||||
strcat(isDebug, " Debug Build");
|
||||
#endif
|
||||
|
||||
sprintf(VersionString,"%d.%d.%d.%d%s", Ver[0], Ver[1], Ver[2], Ver[3], isDebug);
|
||||
|
||||
sprintf(TextVerstring,"V%d.%d.%d.%d", Ver[0], Ver[1], Ver[2], Ver[3]);
|
||||
|
||||
sprintf(VersionStringWithBuild,"%d.%d.%d Build %d %s", Ver[0], Ver[1], Ver[2], Ver[3], isDebug);
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,348 +0,0 @@
|
||||
/* $Id: upnpcommands.h,v 1.33 2019/02/10 12:29:25 nanard Exp $ */
|
||||
/* Miniupnp project : http://miniupnp.free.fr/
|
||||
* Author : Thomas Bernard
|
||||
* Copyright (c) 2005-2018 Thomas Bernard
|
||||
* This software is subject to the conditions detailed in the
|
||||
* LICENCE file provided within this distribution */
|
||||
#ifndef UPNPCOMMANDS_H_INCLUDED
|
||||
#define UPNPCOMMANDS_H_INCLUDED
|
||||
|
||||
#include "miniupnpc_declspec.h"
|
||||
#include "miniupnpctypes.h"
|
||||
|
||||
/* MiniUPnPc return codes : */
|
||||
#define UPNPCOMMAND_SUCCESS (0)
|
||||
#define UPNPCOMMAND_UNKNOWN_ERROR (-1)
|
||||
#define UPNPCOMMAND_INVALID_ARGS (-2)
|
||||
#define UPNPCOMMAND_HTTP_ERROR (-3)
|
||||
#define UPNPCOMMAND_INVALID_RESPONSE (-4)
|
||||
#define UPNPCOMMAND_MEM_ALLOC_ERROR (-5)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct PortMappingParserData;
|
||||
|
||||
MINIUPNP_LIBSPEC UNSIGNED_INTEGER
|
||||
UPNP_GetTotalBytesSent(const char * controlURL,
|
||||
const char * servicetype);
|
||||
|
||||
MINIUPNP_LIBSPEC UNSIGNED_INTEGER
|
||||
UPNP_GetTotalBytesReceived(const char * controlURL,
|
||||
const char * servicetype);
|
||||
|
||||
MINIUPNP_LIBSPEC UNSIGNED_INTEGER
|
||||
UPNP_GetTotalPacketsSent(const char * controlURL,
|
||||
const char * servicetype);
|
||||
|
||||
MINIUPNP_LIBSPEC UNSIGNED_INTEGER
|
||||
UPNP_GetTotalPacketsReceived(const char * controlURL,
|
||||
const char * servicetype);
|
||||
|
||||
/* UPNP_GetStatusInfo()
|
||||
* status and lastconnerror are 64 byte buffers
|
||||
* Return values :
|
||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
||||
* or a UPnP Error code */
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetStatusInfo(const char * controlURL,
|
||||
const char * servicetype,
|
||||
char * status,
|
||||
unsigned int * uptime,
|
||||
char * lastconnerror);
|
||||
|
||||
/* UPNP_GetConnectionTypeInfo()
|
||||
* argument connectionType is a 64 character buffer
|
||||
* Return Values :
|
||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
||||
* or a UPnP Error code */
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetConnectionTypeInfo(const char * controlURL,
|
||||
const char * servicetype,
|
||||
char * connectionType);
|
||||
|
||||
/* UPNP_GetExternalIPAddress() call the corresponding UPNP method.
|
||||
* if the third arg is not null the value is copied to it.
|
||||
* at least 16 bytes must be available
|
||||
*
|
||||
* Return values :
|
||||
* 0 : SUCCESS
|
||||
* NON ZERO : ERROR Either an UPnP error code or an unknown error.
|
||||
*
|
||||
* possible UPnP Errors :
|
||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
||||
* 501 Action Failed - See UPnP Device Architecture section on Control. */
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetExternalIPAddress(const char * controlURL,
|
||||
const char * servicetype,
|
||||
char * extIpAdd);
|
||||
|
||||
/* UPNP_GetLinkLayerMaxBitRates()
|
||||
* call WANCommonInterfaceConfig:1#GetCommonLinkProperties
|
||||
*
|
||||
* return values :
|
||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
||||
* or a UPnP Error Code. */
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetLinkLayerMaxBitRates(const char* controlURL,
|
||||
const char* servicetype,
|
||||
unsigned int * bitrateDown,
|
||||
unsigned int * bitrateUp);
|
||||
|
||||
/* UPNP_AddPortMapping()
|
||||
* if desc is NULL, it will be defaulted to "libminiupnpc"
|
||||
* remoteHost is usually NULL because IGD don't support it.
|
||||
*
|
||||
* Return values :
|
||||
* 0 : SUCCESS
|
||||
* NON ZERO : ERROR. Either an UPnP error code or an unknown error.
|
||||
*
|
||||
* List of possible UPnP errors for AddPortMapping :
|
||||
* errorCode errorDescription (short) - Description (long)
|
||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
||||
* 501 Action Failed - See UPnP Device Architecture section on Control.
|
||||
* 606 Action not authorized - The action requested REQUIRES authorization and
|
||||
* the sender was not authorized.
|
||||
* 715 WildCardNotPermittedInSrcIP - The source IP address cannot be
|
||||
* wild-carded
|
||||
* 716 WildCardNotPermittedInExtPort - The external port cannot be wild-carded
|
||||
* 718 ConflictInMappingEntry - The port mapping entry specified conflicts
|
||||
* with a mapping assigned previously to another client
|
||||
* 724 SamePortValuesRequired - Internal and External port values
|
||||
* must be the same
|
||||
* 725 OnlyPermanentLeasesSupported - The NAT implementation only supports
|
||||
* permanent lease times on port mappings
|
||||
* 726 RemoteHostOnlySupportsWildcard - RemoteHost must be a wildcard
|
||||
* and cannot be a specific IP address or DNS name
|
||||
* 727 ExternalPortOnlySupportsWildcard - ExternalPort must be a wildcard and
|
||||
* cannot be a specific port value
|
||||
* 728 NoPortMapsAvailable - There are not enough free ports available to
|
||||
* complete port mapping.
|
||||
* 729 ConflictWithOtherMechanisms - Attempted port mapping is not allowed
|
||||
* due to conflict with other mechanisms.
|
||||
* 732 WildCardNotPermittedInIntPort - The internal port cannot be wild-carded
|
||||
*/
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_AddPortMapping(const char * controlURL, const char * servicetype,
|
||||
const char * extPort,
|
||||
const char * inPort,
|
||||
const char * inClient,
|
||||
const char * desc,
|
||||
const char * proto,
|
||||
const char * remoteHost,
|
||||
const char * leaseDuration);
|
||||
|
||||
/* UPNP_AddAnyPortMapping()
|
||||
* if desc is NULL, it will be defaulted to "libminiupnpc"
|
||||
* remoteHost is usually NULL because IGD don't support it.
|
||||
*
|
||||
* Return values :
|
||||
* 0 : SUCCESS
|
||||
* NON ZERO : ERROR. Either an UPnP error code or an unknown error.
|
||||
*
|
||||
* List of possible UPnP errors for AddPortMapping :
|
||||
* errorCode errorDescription (short) - Description (long)
|
||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
||||
* 501 Action Failed - See UPnP Device Architecture section on Control.
|
||||
* 606 Action not authorized - The action requested REQUIRES authorization and
|
||||
* the sender was not authorized.
|
||||
* 715 WildCardNotPermittedInSrcIP - The source IP address cannot be
|
||||
* wild-carded
|
||||
* 716 WildCardNotPermittedInExtPort - The external port cannot be wild-carded
|
||||
* 728 NoPortMapsAvailable - There are not enough free ports available to
|
||||
* complete port mapping.
|
||||
* 729 ConflictWithOtherMechanisms - Attempted port mapping is not allowed
|
||||
* due to conflict with other mechanisms.
|
||||
* 732 WildCardNotPermittedInIntPort - The internal port cannot be wild-carded
|
||||
*/
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_AddAnyPortMapping(const char * controlURL, const char * servicetype,
|
||||
const char * extPort,
|
||||
const char * inPort,
|
||||
const char * inClient,
|
||||
const char * desc,
|
||||
const char * proto,
|
||||
const char * remoteHost,
|
||||
const char * leaseDuration,
|
||||
char * reservedPort);
|
||||
|
||||
/* UPNP_DeletePortMapping()
|
||||
* Use same argument values as what was used for AddPortMapping().
|
||||
* remoteHost is usually NULL because IGD don't support it.
|
||||
* Return Values :
|
||||
* 0 : SUCCESS
|
||||
* NON ZERO : error. Either an UPnP error code or an undefined error.
|
||||
*
|
||||
* List of possible UPnP errors for DeletePortMapping :
|
||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
||||
* 606 Action not authorized - The action requested REQUIRES authorization
|
||||
* and the sender was not authorized.
|
||||
* 714 NoSuchEntryInArray - The specified value does not exist in the array */
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_DeletePortMapping(const char * controlURL, const char * servicetype,
|
||||
const char * extPort, const char * proto,
|
||||
const char * remoteHost);
|
||||
|
||||
/* UPNP_DeletePortRangeMapping()
|
||||
* Use same argument values as what was used for AddPortMapping().
|
||||
* remoteHost is usually NULL because IGD don't support it.
|
||||
* Return Values :
|
||||
* 0 : SUCCESS
|
||||
* NON ZERO : error. Either an UPnP error code or an undefined error.
|
||||
*
|
||||
* List of possible UPnP errors for DeletePortMapping :
|
||||
* 606 Action not authorized - The action requested REQUIRES authorization
|
||||
* and the sender was not authorized.
|
||||
* 730 PortMappingNotFound - This error message is returned if no port
|
||||
* mapping is found in the specified range.
|
||||
* 733 InconsistentParameters - NewStartPort and NewEndPort values are not consistent. */
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_DeletePortMappingRange(const char * controlURL, const char * servicetype,
|
||||
const char * extPortStart, const char * extPortEnd,
|
||||
const char * proto,
|
||||
const char * manage);
|
||||
|
||||
/* UPNP_GetPortMappingNumberOfEntries()
|
||||
* not supported by all routers */
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetPortMappingNumberOfEntries(const char * controlURL,
|
||||
const char * servicetype,
|
||||
unsigned int * numEntries);
|
||||
|
||||
/* UPNP_GetSpecificPortMappingEntry()
|
||||
* retrieves an existing port mapping
|
||||
* params :
|
||||
* in extPort
|
||||
* in proto
|
||||
* in remoteHost
|
||||
* out intClient (16 bytes)
|
||||
* out intPort (6 bytes)
|
||||
* out desc (80 bytes)
|
||||
* out enabled (4 bytes)
|
||||
* out leaseDuration (16 bytes)
|
||||
*
|
||||
* return value :
|
||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
||||
* or a UPnP Error Code.
|
||||
*
|
||||
* List of possible UPnP errors for _GetSpecificPortMappingEntry :
|
||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
||||
* 501 Action Failed - See UPnP Device Architecture section on Control.
|
||||
* 606 Action not authorized - The action requested REQUIRES authorization
|
||||
* and the sender was not authorized.
|
||||
* 714 NoSuchEntryInArray - The specified value does not exist in the array.
|
||||
*/
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetSpecificPortMappingEntry(const char * controlURL,
|
||||
const char * servicetype,
|
||||
const char * extPort,
|
||||
const char * proto,
|
||||
const char * remoteHost,
|
||||
char * intClient,
|
||||
char * intPort,
|
||||
char * desc,
|
||||
char * enabled,
|
||||
char * leaseDuration);
|
||||
|
||||
/* UPNP_GetGenericPortMappingEntry()
|
||||
* params :
|
||||
* in index
|
||||
* out extPort (6 bytes)
|
||||
* out intClient (16 bytes)
|
||||
* out intPort (6 bytes)
|
||||
* out protocol (4 bytes)
|
||||
* out desc (80 bytes)
|
||||
* out enabled (4 bytes)
|
||||
* out rHost (64 bytes)
|
||||
* out duration (16 bytes)
|
||||
*
|
||||
* return value :
|
||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
||||
* or a UPnP Error Code.
|
||||
*
|
||||
* Possible UPNP Error codes :
|
||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
||||
* 606 Action not authorized - The action requested REQUIRES authorization
|
||||
* and the sender was not authorized.
|
||||
* 713 SpecifiedArrayIndexInvalid - The specified array index is out of bounds
|
||||
*/
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetGenericPortMappingEntry(const char * controlURL,
|
||||
const char * servicetype,
|
||||
const char * index,
|
||||
char * extPort,
|
||||
char * intClient,
|
||||
char * intPort,
|
||||
char * protocol,
|
||||
char * desc,
|
||||
char * enabled,
|
||||
char * rHost,
|
||||
char * duration);
|
||||
|
||||
/* UPNP_GetListOfPortMappings() Available in IGD v2
|
||||
*
|
||||
*
|
||||
* Possible UPNP Error codes :
|
||||
* 606 Action not Authorized
|
||||
* 730 PortMappingNotFound - no port mapping is found in the specified range.
|
||||
* 733 InconsistantParameters - NewStartPort and NewEndPort values are not
|
||||
* consistent.
|
||||
*/
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetListOfPortMappings(const char * controlURL,
|
||||
const char * servicetype,
|
||||
const char * startPort,
|
||||
const char * endPort,
|
||||
const char * protocol,
|
||||
const char * numberOfPorts,
|
||||
struct PortMappingParserData * data);
|
||||
|
||||
/* IGD:2, functions for service WANIPv6FirewallControl:1 */
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetFirewallStatus(const char * controlURL,
|
||||
const char * servicetype,
|
||||
int * firewallEnabled,
|
||||
int * inboundPinholeAllowed);
|
||||
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype,
|
||||
const char * remoteHost,
|
||||
const char * remotePort,
|
||||
const char * intClient,
|
||||
const char * intPort,
|
||||
const char * proto,
|
||||
int * opTimeout);
|
||||
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_AddPinhole(const char * controlURL, const char * servicetype,
|
||||
const char * remoteHost,
|
||||
const char * remotePort,
|
||||
const char * intClient,
|
||||
const char * intPort,
|
||||
const char * proto,
|
||||
const char * leaseTime,
|
||||
char * uniqueID);
|
||||
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_UpdatePinhole(const char * controlURL, const char * servicetype,
|
||||
const char * uniqueID,
|
||||
const char * leaseTime);
|
||||
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID);
|
||||
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype,
|
||||
const char * uniqueID, int * isWorking);
|
||||
|
||||
MINIUPNP_LIBSPEC int
|
||||
UPNP_GetPinholePackets(const char * controlURL, const char * servicetype,
|
||||
const char * uniqueID, int * packets);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@ -1,340 +0,0 @@
|
||||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "kernelresource.h"
|
||||
|
||||
#define CKernel
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
#include "BpqTermMDI.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.K.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
BPQMAINWINDOW DIALOG DISCARDABLE 17, 25, 382, 300
|
||||
STYLE DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU |
|
||||
WS_THICKFRAME
|
||||
CAPTION "BPQ32 Console"
|
||||
CLASS "BPQMAINWINDOW"
|
||||
FONT 8, "Fixedsys"
|
||||
BEGIN
|
||||
LTEXT "",IDC_BACKGROUND,22,20,337,273
|
||||
CONTROL "",IDC_ENIGATE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT |
|
||||
WS_TABSTOP,57,0,8,12
|
||||
LTEXT "IGate State - Disconnected",IGATESTATE,69,0,110,12,
|
||||
SS_CENTERIMAGE
|
||||
LTEXT "IGATE Stats - Msgs 0 Local Stns 0",IGATESTATS,180,0,
|
||||
152,12,SS_CENTERIMAGE
|
||||
LISTBOX BPQCONSOLE,1,17,359,262,LBS_NOINTEGRALHEIGHT |
|
||||
LBS_DISABLENOSCROLL | LBS_NOSEL | WS_VSCROLL |
|
||||
WS_HSCROLL
|
||||
LTEXT "GPS Off",IDC_GPS,332,0,40,12,SS_CENTERIMAGE
|
||||
LTEXT "Enable IGate",IDC_STATIC,5,2,49,10
|
||||
END
|
||||
|
||||
CONFIG DIALOGEX 249, 200, 160, 118
|
||||
STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION
|
||||
EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE
|
||||
CAPTION "Configuration"
|
||||
CLASS "CONFIG"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
EDITTEXT 1001,50,5,43,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
EDITTEXT 1002,50,25,100,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
EDITTEXT 1003,50,65,43,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Call",1,10,5,21,18,0,WS_EX_NOPARENTNOTIFY
|
||||
LTEXT "Host",2,10,25,30,20,0,WS_EX_NOPARENTNOTIFY
|
||||
LTEXT "UDP Port",3,10,65,32,15,0,WS_EX_NOPARENTNOTIFY
|
||||
PUSHBUTTON "Cancel",ID_CANCEL,15,95,35,14,0,WS_EX_NOPARENTNOTIFY
|
||||
PUSHBUTTON "Apply",ID_SAVE,55,95,35,14,0,WS_EX_NOPARENTNOTIFY
|
||||
CONTROL "UDP Flag ",1004,"Button",BS_AUTOCHECKBOX | BS_LEFT |
|
||||
WS_TABSTOP,8,45,50,14,WS_EX_RIGHT
|
||||
CONTROL "Broadcast Flag ",1005,"Button",BS_AUTOCHECKBOX |
|
||||
BS_LEFT | WS_TABSTOP,68,45,70,14,WS_EX_RIGHT
|
||||
END
|
||||
|
||||
IDD_WL2KSYSOP DIALOGEX 0, 0, 277, 355
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "WL2K Sysop Record Update"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
LTEXT "Name",3,5,31,28,10,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT NAME,60,30,64,12,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Address Line 1",6,5,72,50,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT ADDR1,60,71,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Address Line 2",7,5,92,50,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT ADDR2,60,91,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "City",4,5,112,40,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT CITY,60,111,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "State",8,5,132,40,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT STATE,60,131,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Country",9,5,152,40,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT COUNTRY,60,151,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
PUSHBUTTON "Cancel",ID_CANCEL,115,311,47,17,0,WS_EX_NOPARENTNOTIFY
|
||||
PUSHBUTTON "Apply",ID_SAVE,55,311,47,17,0,WS_EX_NOPARENTNOTIFY
|
||||
LTEXT "PostCode",10,5,172,40,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT POSTCODE,60,171,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Email",11,5,192,40,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT EMAIL,60,191,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Website",12,5,212,40,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT WEBSITE,60,209,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Phone",13,6,232,40,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT PHONE,60,231,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Addiitional Data",14,5,252,50,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT ADDITIONALDATA,60,251,205,14,ES_AUTOHSCROLL | NOT
|
||||
WS_BORDER,WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Password",15,5,13,50,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT IDC_Password,60,12,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
LTEXT "Locator",16,5,49,50,9,0,WS_EX_NOPARENTNOTIFY
|
||||
EDITTEXT IDC_Locator,60,48,133,14,ES_AUTOHSCROLL | NOT WS_BORDER,
|
||||
WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
|
||||
END
|
||||
|
||||
UIMAINWINDOW DIALOG DISCARDABLE 100, 100, 323, 304
|
||||
STYLE WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
|
||||
CAPTION "BPQ32 UI Utility"
|
||||
CLASS "UIMAINWINDOW"
|
||||
FONT 8, "FixedSys"
|
||||
BEGIN
|
||||
END
|
||||
|
||||
PORTPAGE DIALOG DISCARDABLE 26, 5, 366, 186
|
||||
STYLE WS_CHILD | WS_VISIBLE
|
||||
FONT 8, "FixedSys"
|
||||
BEGIN
|
||||
LTEXT "Send Beacon Every",IDC_STATIC,17,25,68,14,
|
||||
SS_CENTERIMAGE
|
||||
EDITTEXT IDC_INTERVAL,90,26,20,12,ES_AUTOHSCROLL
|
||||
LTEXT "Minutes to ",IDC_STATIC,117,25,55,14,SS_CENTERIMAGE
|
||||
EDITTEXT IDC_UIDEST,175,26,59,12,ES_UPPERCASE | ES_AUTOHSCROLL
|
||||
CONTROL "Send From File",IDC_FROMFILE,"Button",BS_AUTOCHECKBOX |
|
||||
BS_VCENTER | WS_TABSTOP,17,59,68,13
|
||||
EDITTEXT IDC_FILENAME,89,58,223,12,ES_AUTOHSCROLL
|
||||
PUSHBUTTON "Find File",IDC_FILE,316,58,40,12
|
||||
DEFPUSHBUTTON "Save",IDOK,122,142,40,12
|
||||
DEFPUSHBUTTON "Test",ID_TEST,205,142,40,12
|
||||
EDITTEXT IDC_MESSAGE,20,84,294,52,ES_MULTILINE | ES_AUTOVSCROLL |
|
||||
ES_AUTOHSCROLL | ES_WANTRETURN
|
||||
LTEXT "",IDC_PORTNAME,12,9,139,14,SS_CENTERIMAGE
|
||||
LTEXT "Path",IDC_STATIC,17,42,57,14,SS_CENTERIMAGE
|
||||
EDITTEXT IDC_UIDIGIS,90,42,223,12,ES_UPPERCASE | ES_AUTOHSCROLL
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDR_MAINFRAME_MENU MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "Window"
|
||||
BEGIN
|
||||
MENUITEM "New Terminal Window", ID_NEWWINDOW
|
||||
MENUITEM "Cascade", ID_WINDOWS_CASCADE
|
||||
MENUITEM "Tile", ID_WINDOWS_TILE
|
||||
MENUITEM "Beacon Config", BPQUICONFIG
|
||||
MENUITEM "Close all BPQ32 Programs", BPQCLOSEALL
|
||||
END
|
||||
END
|
||||
|
||||
CONS_MENU MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "Window"
|
||||
BEGIN
|
||||
MENUITEM "New Terminal Window", ID_NEWWINDOW
|
||||
MENUITEM "Cascade", ID_WINDOWS_CASCADE
|
||||
MENUITEM "Tile", ID_WINDOWS_TILE
|
||||
MENUITEM "Beacon Config", BPQUICONFIG
|
||||
MENUITEM "Close all BPQ32 Programs", BPQCLOSEALL
|
||||
END
|
||||
POPUP "Actions"
|
||||
BEGIN
|
||||
MENUITEM "Save Nodes to file BPQNODES.DAT", BPQSAVENODES
|
||||
MENUITEM "Save Registry Configuration", BPQSAVEREG
|
||||
MENUITEM "Diagnostic Dump to file BPQDUMP", BPQDUMP
|
||||
MENUITEM "Re-read Rigcontrol Config", SCANRECONFIG
|
||||
MENUITEM "Re-read APRS Config", APRSRECONFIG
|
||||
MENUITEM "Start Minimized", BPQSTARTMIN
|
||||
MENUITEM "Minimize to Notification Area (System Tray)", BPQMINTOTRAY
|
||||
MENUITEM "Update WL2K Sysop Record", IDD_WL2KSYSOP
|
||||
END
|
||||
END
|
||||
|
||||
TERM_MENU MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "Window"
|
||||
BEGIN
|
||||
MENUITEM "New Terminal Window", ID_NEWWINDOW
|
||||
MENUITEM "Cascade", ID_WINDOWS_CASCADE
|
||||
MENUITEM "Tile", ID_WINDOWS_TILE
|
||||
MENUITEM "Beacon Config", BPQUICONFIG
|
||||
MENUITEM "Close all BPQ32 Programs", BPQCLOSEALL
|
||||
END
|
||||
POPUP "Action"
|
||||
BEGIN
|
||||
MENUITEM "Connect", BPQCONNECT
|
||||
MENUITEM "Disconnect", BPQDISCONNECT, GRAYED
|
||||
END
|
||||
POPUP "Config"
|
||||
BEGIN
|
||||
MENUITEM "Font", ID_SETUP_FONT
|
||||
MENUITEM "Enable Bells", BPQBELLS
|
||||
MENUITEM "Strip Linefeeds", BPQStripLF
|
||||
MENUITEM "Log Output", BPQLogOutput
|
||||
MENUITEM "Send Disconnected", BPQSendDisconnected
|
||||
MENUITEM "Chat Terminal Mode (Send Keppalives)", CHATTERM
|
||||
MENUITEM "Restore Windows on load", ID_WINDOWS_RESTORE
|
||||
MENUITEM "Beep if input too long", ID_WARNWRAP
|
||||
MENUITEM "Wrap Input", ID_WRAP
|
||||
MENUITEM "Flash instead of Beep on Bell", ID_FLASHONBELL
|
||||
END
|
||||
POPUP "Edit"
|
||||
BEGIN
|
||||
MENUITEM "Copy Output Window", BPQCOPYOUT
|
||||
MENUITEM "Clear Output Window", BPQCLEAROUT
|
||||
END
|
||||
MENUITEM "Help", BPQHELP
|
||||
END
|
||||
|
||||
MON_MENU MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "Window"
|
||||
BEGIN
|
||||
MENUITEM "New Window", ID_NEWWINDOW
|
||||
MENUITEM "Cascade", ID_WINDOWS_CASCADE
|
||||
MENUITEM "Tile", ID_WINDOWS_TILE
|
||||
MENUITEM "Beacon Config", BPQUICONFIG
|
||||
MENUITEM "Close all BPQ32 Programs", BPQCLOSEALL
|
||||
END
|
||||
POPUP "Monitor"
|
||||
BEGIN
|
||||
MENUITEM "Use Local Time", MONLOCALTIME
|
||||
MENUITEM "Monitor TX", BPQMTX
|
||||
MENUITEM "Monitor Supervisory", BPQMCOM
|
||||
MENUITEM "Monitor UI Only", MON_UI_ONLY
|
||||
MENUITEM "Monitor NODES", BPQMNODES
|
||||
MENUITEM "Enable Colour", MONCOLOUR
|
||||
MENUITEM "Log Monitor", BPQLogMonitor
|
||||
MENUITEM "Trace APRS-IS", MONITORAPRS
|
||||
MENUITEM "Clear all port flags", StopALLMon
|
||||
END
|
||||
POPUP "Edit"
|
||||
BEGIN
|
||||
MENUITEM "Copy Monitor Window", BPQCOPYMON
|
||||
MENUITEM "Clear Monitor Window", BPQCLEARMON
|
||||
END
|
||||
MENUITEM "Help", BPQHELP
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// WAVE
|
||||
//
|
||||
|
||||
INCOMINGCALL WAVE MOVEABLE PURE "Ring.wav"
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"kernelresource.h\0"
|
||||
"""\r\n"
|
||||
"BpqTermMDI.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"#include ""BpqTermMDI.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""..\\CommonSource\\Versions.h""\r\n"
|
||||
"#include ""..\\CommonSource\\StdVer.inc""\r\n"
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
"BPQMAINWINDOW", DIALOG
|
||||
BEGIN
|
||||
RIGHTMARGIN, 360
|
||||
END
|
||||
|
||||
IDD_WL2KSYSOP, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 270
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 348
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // English (U.K.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#include "..\CommonSource\Versions.h"
|
||||
#include "..\StdVer.inc"
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
@ -1,72 +0,0 @@
|
||||
/* LzmaEnc.h -- LZMA Encoder
|
||||
2008-10-04 : Igor Pavlov : Public domain */
|
||||
|
||||
#ifndef __LZMAENC_H
|
||||
#define __LZMAENC_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#define LZMA_PROPS_SIZE 5
|
||||
|
||||
typedef struct _CLzmaEncProps
|
||||
{
|
||||
int level; /* 0 <= level <= 9 */
|
||||
LZ_UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version
|
||||
(1 << 12) <= dictSize <= (1 << 30) for 64-bit version
|
||||
default = (1 << 24) */
|
||||
int lc; /* 0 <= lc <= 8, default = 3 */
|
||||
int lp; /* 0 <= lp <= 4, default = 0 */
|
||||
int pb; /* 0 <= pb <= 4, default = 2 */
|
||||
int algo; /* 0 - fast, 1 - normal, default = 1 */
|
||||
int fb; /* 5 <= fb <= 273, default = 32 */
|
||||
int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */
|
||||
int numHashBytes; /* 2, 3 or 4, default = 4 */
|
||||
LZ_UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */
|
||||
unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */
|
||||
int numThreads; /* 1 or 2, default = 2 */
|
||||
} CLzmaEncProps;
|
||||
|
||||
void LzmaEncProps_Init(CLzmaEncProps *p);
|
||||
void LzmaEncProps_Normalize(CLzmaEncProps *p);
|
||||
LZ_UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
|
||||
|
||||
|
||||
/* ---------- CLzmaEncHandle Interface ---------- */
|
||||
|
||||
/* LzmaEnc_* functions can return the following exit codes:
|
||||
Returns:
|
||||
SZ_OK - OK
|
||||
SZ_ERROR_MEM - Memory allocation error
|
||||
SZ_ERROR_PARAM - Incorrect paramater in props
|
||||
SZ_ERROR_WRITE - Write callback error.
|
||||
SZ_ERROR_PROGRESS - some break from progress callback
|
||||
SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
|
||||
*/
|
||||
|
||||
typedef void * CLzmaEncHandle;
|
||||
|
||||
CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc);
|
||||
void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
|
||||
SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
|
||||
SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
|
||||
SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
|
||||
ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
|
||||
SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
|
||||
int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
|
||||
|
||||
/* ---------- One Call Interface ---------- */
|
||||
|
||||
/* LzmaEncode
|
||||
Return code:
|
||||
SZ_OK - OK
|
||||
SZ_ERROR_MEM - Memory allocation error
|
||||
SZ_ERROR_PARAM - Incorrect paramater
|
||||
SZ_ERROR_OUTPUT_EOF - output buffer overflow
|
||||
SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
|
||||
*/
|
||||
|
||||
SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
|
||||
const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
|
||||
ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -1,828 +0,0 @@
|
||||
|
||||
/* png.c - location for general purpose libpng functions
|
||||
*
|
||||
* libpng version 1.2.8 - December 3, 2004
|
||||
* For conditions of distribution and use, see copyright notice in png.h
|
||||
* Copyright (c) 1998-2004 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*/
|
||||
|
||||
#define PNG_INTERNAL
|
||||
#define PNG_NO_EXTERN
|
||||
#include "png.h"
|
||||
|
||||
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||
typedef version_1_2_8 Your_png_h_is_not_version_1_2_8;
|
||||
|
||||
/* Version information for C files. This had better match the version
|
||||
* string defined in png.h. */
|
||||
|
||||
#ifdef PNG_USE_GLOBAL_ARRAYS
|
||||
/* png_libpng_ver was changed to a function in version 1.0.5c */
|
||||
const char png_libpng_ver[18] = PNG_LIBPNG_VER_STRING;
|
||||
|
||||
/* png_sig was changed to a function in version 1.0.5c */
|
||||
/* Place to hold the signature string for a PNG file. */
|
||||
const png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
|
||||
|
||||
/* Invoke global declarations for constant strings for known chunk types */
|
||||
PNG_IHDR;
|
||||
PNG_IDAT;
|
||||
PNG_IEND;
|
||||
PNG_PLTE;
|
||||
PNG_bKGD;
|
||||
PNG_cHRM;
|
||||
PNG_gAMA;
|
||||
PNG_hIST;
|
||||
PNG_iCCP;
|
||||
PNG_iTXt;
|
||||
PNG_oFFs;
|
||||
PNG_pCAL;
|
||||
PNG_sCAL;
|
||||
PNG_pHYs;
|
||||
PNG_sBIT;
|
||||
PNG_sPLT;
|
||||
PNG_sRGB;
|
||||
PNG_tEXt;
|
||||
PNG_tIME;
|
||||
PNG_tRNS;
|
||||
PNG_zTXt;
|
||||
|
||||
/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||
|
||||
/* start of interlace block */
|
||||
const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
|
||||
|
||||
/* offset to next interlace block */
|
||||
const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
|
||||
|
||||
/* start of interlace block in the y direction */
|
||||
const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
|
||||
|
||||
/* offset to next interlace block in the y direction */
|
||||
const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
|
||||
|
||||
/* width of interlace block (used in assembler routines only) */
|
||||
#ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
|
||||
const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1};
|
||||
#endif
|
||||
|
||||
/* Height of interlace block. This is not currently used - if you need
|
||||
* it, uncomment it here and in png.h
|
||||
const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
|
||||
*/
|
||||
|
||||
/* Mask to determine which pixels are valid in a pass */
|
||||
const int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
|
||||
|
||||
/* Mask to determine which pixels to overwrite while displaying */
|
||||
const int FARDATA png_pass_dsp_mask[]
|
||||
= {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
|
||||
|
||||
#endif /* PNG_USE_GLOBAL_ARRAYS */
|
||||
|
||||
/* Tells libpng that we have already handled the first "num_bytes" bytes
|
||||
* of the PNG file signature. If the PNG data is embedded into another
|
||||
* stream we can set num_bytes = 8 so that libpng will not attempt to read
|
||||
* or write any of the magic bytes before it starts on the IHDR.
|
||||
*/
|
||||
|
||||
void PNGAPI
|
||||
png_set_sig_bytes(png_structp png_ptr, int num_bytes)
|
||||
{
|
||||
png_debug(1, "in png_set_sig_bytes\n");
|
||||
if (num_bytes > 8)
|
||||
png_error(png_ptr, "Too many bytes for PNG signature.");
|
||||
|
||||
png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes);
|
||||
}
|
||||
|
||||
/* Checks whether the supplied bytes match the PNG signature. We allow
|
||||
* checking less than the full 8-byte signature so that those apps that
|
||||
* already read the first few bytes of a file to determine the file type
|
||||
* can simply check the remaining bytes for extra assurance. Returns
|
||||
* an integer less than, equal to, or greater than zero if sig is found,
|
||||
* respectively, to be less than, to match, or be greater than the correct
|
||||
* PNG signature (this is the same behaviour as strcmp, memcmp, etc).
|
||||
*/
|
||||
int PNGAPI
|
||||
png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check)
|
||||
{
|
||||
png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
|
||||
if (num_to_check > 8)
|
||||
num_to_check = 8;
|
||||
else if (num_to_check < 1)
|
||||
return (0);
|
||||
|
||||
if (start > 7)
|
||||
return (0);
|
||||
|
||||
if (start + num_to_check > 8)
|
||||
num_to_check = 8 - start;
|
||||
|
||||
return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check)));
|
||||
}
|
||||
|
||||
/* (Obsolete) function to check signature bytes. It does not allow one
|
||||
* to check a partial signature. This function might be removed in the
|
||||
* future - use png_sig_cmp(). Returns true (nonzero) if the file is a PNG.
|
||||
*/
|
||||
int PNGAPI
|
||||
png_check_sig(png_bytep sig, int num)
|
||||
{
|
||||
return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num));
|
||||
}
|
||||
|
||||
/* Function to allocate memory for zlib and clear it to 0. */
|
||||
#ifdef PNG_1_0_X
|
||||
voidpf PNGAPI
|
||||
#else
|
||||
voidpf /* private */
|
||||
#endif
|
||||
png_zalloc(voidpf png_ptr, uInt items, uInt size)
|
||||
{
|
||||
png_voidp ptr;
|
||||
png_structp p=png_ptr;
|
||||
png_uint_32 save_flags=p->flags;
|
||||
png_uint_32 num_bytes;
|
||||
|
||||
if (items > PNG_UINT_32_MAX/size)
|
||||
{
|
||||
png_warning (png_ptr, "Potential overflow in png_zalloc()");
|
||||
return (NULL);
|
||||
}
|
||||
num_bytes = (png_uint_32)items * size;
|
||||
|
||||
p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
|
||||
ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes);
|
||||
p->flags=save_flags;
|
||||
|
||||
#if defined(PNG_1_0_X) && !defined(PNG_NO_ZALLOC_ZERO)
|
||||
if (ptr == NULL)
|
||||
return ((voidpf)ptr);
|
||||
|
||||
if (num_bytes > (png_uint_32)0x8000L)
|
||||
{
|
||||
png_memset(ptr, 0, (png_size_t)0x8000L);
|
||||
png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0,
|
||||
(png_size_t)(num_bytes - (png_uint_32)0x8000L));
|
||||
}
|
||||
else
|
||||
{
|
||||
png_memset(ptr, 0, (png_size_t)num_bytes);
|
||||
}
|
||||
#endif
|
||||
return ((voidpf)ptr);
|
||||
}
|
||||
|
||||
/* function to free memory for zlib */
|
||||
#ifdef PNG_1_0_X
|
||||
void PNGAPI
|
||||
#else
|
||||
void /* private */
|
||||
#endif
|
||||
png_zfree(voidpf png_ptr, voidpf ptr)
|
||||
{
|
||||
png_free((png_structp)png_ptr, (png_voidp)ptr);
|
||||
}
|
||||
|
||||
/* Reset the CRC variable to 32 bits of 1's. Care must be taken
|
||||
* in case CRC is > 32 bits to leave the top bits 0.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_reset_crc(png_structp png_ptr)
|
||||
{
|
||||
png_ptr->crc = crc32(0, Z_NULL, 0);
|
||||
}
|
||||
|
||||
/* Calculate the CRC over a section of data. We can only pass as
|
||||
* much data to this routine as the largest single buffer size. We
|
||||
* also check that this data will actually be used before going to the
|
||||
* trouble of calculating it.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length)
|
||||
{
|
||||
int need_crc = 1;
|
||||
|
||||
if (png_ptr->chunk_name[0] & 0x20) /* ancillary */
|
||||
{
|
||||
if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
|
||||
(PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
|
||||
need_crc = 0;
|
||||
}
|
||||
else /* critical */
|
||||
{
|
||||
if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
|
||||
need_crc = 0;
|
||||
}
|
||||
|
||||
if (need_crc)
|
||||
png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length);
|
||||
}
|
||||
|
||||
/* Allocate the memory for an info_struct for the application. We don't
|
||||
* really need the png_ptr, but it could potentially be useful in the
|
||||
* future. This should be used in favour of malloc(png_sizeof(png_info))
|
||||
* and png_info_init() so that applications that want to use a shared
|
||||
* libpng don't have to be recompiled if png_info changes size.
|
||||
*/
|
||||
png_infop PNGAPI
|
||||
png_create_info_struct(png_structp png_ptr)
|
||||
{
|
||||
png_infop info_ptr;
|
||||
|
||||
png_debug(1, "in png_create_info_struct\n");
|
||||
if(png_ptr == NULL) return (NULL);
|
||||
#ifdef PNG_USER_MEM_SUPPORTED
|
||||
info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
|
||||
png_ptr->malloc_fn, png_ptr->mem_ptr);
|
||||
#else
|
||||
info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
|
||||
#endif
|
||||
if (info_ptr != NULL)
|
||||
png_info_init_3(&info_ptr, png_sizeof(png_info));
|
||||
|
||||
return (info_ptr);
|
||||
}
|
||||
|
||||
/* This function frees the memory associated with a single info struct.
|
||||
* Normally, one would use either png_destroy_read_struct() or
|
||||
* png_destroy_write_struct() to free an info struct, but this may be
|
||||
* useful for some applications.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
|
||||
{
|
||||
png_infop info_ptr = NULL;
|
||||
|
||||
png_debug(1, "in png_destroy_info_struct\n");
|
||||
if (info_ptr_ptr != NULL)
|
||||
info_ptr = *info_ptr_ptr;
|
||||
|
||||
if (info_ptr != NULL)
|
||||
{
|
||||
png_info_destroy(png_ptr, info_ptr);
|
||||
|
||||
#ifdef PNG_USER_MEM_SUPPORTED
|
||||
png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn,
|
||||
png_ptr->mem_ptr);
|
||||
#else
|
||||
png_destroy_struct((png_voidp)info_ptr);
|
||||
#endif
|
||||
*info_ptr_ptr = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize the info structure. This is now an internal function (0.89)
|
||||
* and applications using it are urged to use png_create_info_struct()
|
||||
* instead.
|
||||
*/
|
||||
#if defined(PNG_1_0_X) || defined (PNG_1_2_X)
|
||||
#undef png_info_init
|
||||
void PNGAPI
|
||||
png_info_init(png_infop info_ptr)
|
||||
{
|
||||
/* We only come here via pre-1.0.12-compiled applications */
|
||||
png_info_init_3(&info_ptr, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
void PNGAPI
|
||||
png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
|
||||
{
|
||||
png_infop info_ptr = *ptr_ptr;
|
||||
|
||||
png_debug(1, "in png_info_init_3\n");
|
||||
|
||||
if(png_sizeof(png_info) > png_info_struct_size)
|
||||
{
|
||||
png_destroy_struct(info_ptr);
|
||||
info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
|
||||
*ptr_ptr = info_ptr;
|
||||
}
|
||||
|
||||
/* set everything to 0 */
|
||||
png_memset(info_ptr, 0, png_sizeof (png_info));
|
||||
}
|
||||
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
void PNGAPI
|
||||
png_data_freer(png_structp png_ptr, png_infop info_ptr,
|
||||
int freer, png_uint_32 mask)
|
||||
{
|
||||
png_debug(1, "in png_data_freer\n");
|
||||
if (png_ptr == NULL || info_ptr == NULL)
|
||||
return;
|
||||
if(freer == PNG_DESTROY_WILL_FREE_DATA)
|
||||
info_ptr->free_me |= mask;
|
||||
else if(freer == PNG_USER_WILL_FREE_DATA)
|
||||
info_ptr->free_me &= ~mask;
|
||||
else
|
||||
png_warning(png_ptr,
|
||||
"Unknown freer parameter in png_data_freer.");
|
||||
}
|
||||
#endif
|
||||
|
||||
void PNGAPI
|
||||
png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
|
||||
int num)
|
||||
{
|
||||
png_debug(1, "in png_free_data\n");
|
||||
if (png_ptr == NULL || info_ptr == NULL)
|
||||
return;
|
||||
|
||||
#if defined(PNG_TEXT_SUPPORTED)
|
||||
/* free text item num or (if num == -1) all text items */
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
|
||||
#else
|
||||
if (mask & PNG_FREE_TEXT)
|
||||
#endif
|
||||
{
|
||||
if (num != -1)
|
||||
{
|
||||
if (info_ptr->text && info_ptr->text[num].key)
|
||||
{
|
||||
png_free(png_ptr, info_ptr->text[num].key);
|
||||
info_ptr->text[num].key = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < info_ptr->num_text; i++)
|
||||
png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
|
||||
png_free(png_ptr, info_ptr->text);
|
||||
info_ptr->text = NULL;
|
||||
info_ptr->num_text=0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_tRNS_SUPPORTED)
|
||||
/* free any tRNS entry */
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
|
||||
#else
|
||||
if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
|
||||
#endif
|
||||
{
|
||||
png_free(png_ptr, info_ptr->trans);
|
||||
info_ptr->valid &= ~PNG_INFO_tRNS;
|
||||
#ifndef PNG_FREE_ME_SUPPORTED
|
||||
png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
|
||||
#endif
|
||||
info_ptr->trans = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_sCAL_SUPPORTED)
|
||||
/* free any sCAL entry */
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
|
||||
#else
|
||||
if (mask & PNG_FREE_SCAL)
|
||||
#endif
|
||||
{
|
||||
#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
|
||||
png_free(png_ptr, info_ptr->scal_s_width);
|
||||
png_free(png_ptr, info_ptr->scal_s_height);
|
||||
info_ptr->scal_s_width = NULL;
|
||||
info_ptr->scal_s_height = NULL;
|
||||
#endif
|
||||
info_ptr->valid &= ~PNG_INFO_sCAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_pCAL_SUPPORTED)
|
||||
/* free any pCAL entry */
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
|
||||
#else
|
||||
if (mask & PNG_FREE_PCAL)
|
||||
#endif
|
||||
{
|
||||
png_free(png_ptr, info_ptr->pcal_purpose);
|
||||
png_free(png_ptr, info_ptr->pcal_units);
|
||||
info_ptr->pcal_purpose = NULL;
|
||||
info_ptr->pcal_units = NULL;
|
||||
if (info_ptr->pcal_params != NULL)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
|
||||
{
|
||||
png_free(png_ptr, info_ptr->pcal_params[i]);
|
||||
info_ptr->pcal_params[i]=NULL;
|
||||
}
|
||||
png_free(png_ptr, info_ptr->pcal_params);
|
||||
info_ptr->pcal_params = NULL;
|
||||
}
|
||||
info_ptr->valid &= ~PNG_INFO_pCAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_iCCP_SUPPORTED)
|
||||
/* free any iCCP entry */
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
|
||||
#else
|
||||
if (mask & PNG_FREE_ICCP)
|
||||
#endif
|
||||
{
|
||||
png_free(png_ptr, info_ptr->iccp_name);
|
||||
png_free(png_ptr, info_ptr->iccp_profile);
|
||||
info_ptr->iccp_name = NULL;
|
||||
info_ptr->iccp_profile = NULL;
|
||||
info_ptr->valid &= ~PNG_INFO_iCCP;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_sPLT_SUPPORTED)
|
||||
/* free a given sPLT entry, or (if num == -1) all sPLT entries */
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
|
||||
#else
|
||||
if (mask & PNG_FREE_SPLT)
|
||||
#endif
|
||||
{
|
||||
if (num != -1)
|
||||
{
|
||||
if(info_ptr->splt_palettes)
|
||||
{
|
||||
png_free(png_ptr, info_ptr->splt_palettes[num].name);
|
||||
png_free(png_ptr, info_ptr->splt_palettes[num].entries);
|
||||
info_ptr->splt_palettes[num].name = NULL;
|
||||
info_ptr->splt_palettes[num].entries = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(info_ptr->splt_palettes_num)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
|
||||
png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
|
||||
|
||||
png_free(png_ptr, info_ptr->splt_palettes);
|
||||
info_ptr->splt_palettes = NULL;
|
||||
info_ptr->splt_palettes_num = 0;
|
||||
}
|
||||
info_ptr->valid &= ~PNG_INFO_sPLT;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
|
||||
#else
|
||||
if (mask & PNG_FREE_UNKN)
|
||||
#endif
|
||||
{
|
||||
if (num != -1)
|
||||
{
|
||||
if(info_ptr->unknown_chunks)
|
||||
{
|
||||
png_free(png_ptr, info_ptr->unknown_chunks[num].data);
|
||||
info_ptr->unknown_chunks[num].data = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
|
||||
if(info_ptr->unknown_chunks_num)
|
||||
{
|
||||
for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
|
||||
png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
|
||||
|
||||
png_free(png_ptr, info_ptr->unknown_chunks);
|
||||
info_ptr->unknown_chunks = NULL;
|
||||
info_ptr->unknown_chunks_num = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_hIST_SUPPORTED)
|
||||
/* free any hIST entry */
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_HIST) & info_ptr->free_me)
|
||||
#else
|
||||
if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
|
||||
#endif
|
||||
{
|
||||
png_free(png_ptr, info_ptr->hist);
|
||||
info_ptr->hist = NULL;
|
||||
info_ptr->valid &= ~PNG_INFO_hIST;
|
||||
#ifndef PNG_FREE_ME_SUPPORTED
|
||||
png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/* free any PLTE entry that was internally allocated */
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
|
||||
#else
|
||||
if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
|
||||
#endif
|
||||
{
|
||||
png_zfree(png_ptr, info_ptr->palette);
|
||||
info_ptr->palette = NULL;
|
||||
info_ptr->valid &= ~PNG_INFO_PLTE;
|
||||
#ifndef PNG_FREE_ME_SUPPORTED
|
||||
png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
|
||||
#endif
|
||||
info_ptr->num_palette = 0;
|
||||
}
|
||||
|
||||
#if defined(PNG_INFO_IMAGE_SUPPORTED)
|
||||
/* free any image bits attached to the info structure */
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
|
||||
#else
|
||||
if (mask & PNG_FREE_ROWS)
|
||||
#endif
|
||||
{
|
||||
if(info_ptr->row_pointers)
|
||||
{
|
||||
int row;
|
||||
for (row = 0; row < (int)info_ptr->height; row++)
|
||||
{
|
||||
png_free(png_ptr, info_ptr->row_pointers[row]);
|
||||
info_ptr->row_pointers[row]=NULL;
|
||||
}
|
||||
png_free(png_ptr, info_ptr->row_pointers);
|
||||
info_ptr->row_pointers=NULL;
|
||||
}
|
||||
info_ptr->valid &= ~PNG_INFO_IDAT;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_FREE_ME_SUPPORTED
|
||||
if(num == -1)
|
||||
info_ptr->free_me &= ~mask;
|
||||
else
|
||||
info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* This is an internal routine to free any memory that the info struct is
|
||||
* pointing to before re-using it or freeing the struct itself. Recall
|
||||
* that png_free() checks for NULL pointers for us.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_info_destroy(png_structp png_ptr, png_infop info_ptr)
|
||||
{
|
||||
png_debug(1, "in png_info_destroy\n");
|
||||
|
||||
png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
|
||||
|
||||
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
|
||||
if (png_ptr->num_chunk_list)
|
||||
{
|
||||
png_free(png_ptr, png_ptr->chunk_list);
|
||||
png_ptr->chunk_list=NULL;
|
||||
png_ptr->num_chunk_list=0;
|
||||
}
|
||||
#endif
|
||||
|
||||
png_info_init_3(&info_ptr, png_sizeof(png_info));
|
||||
}
|
||||
|
||||
/* This function returns a pointer to the io_ptr associated with the user
|
||||
* functions. The application should free any memory associated with this
|
||||
* pointer before png_write_destroy() or png_read_destroy() are called.
|
||||
*/
|
||||
png_voidp PNGAPI
|
||||
png_get_io_ptr(png_structp png_ptr)
|
||||
{
|
||||
return (png_ptr->io_ptr);
|
||||
}
|
||||
|
||||
#if !defined(PNG_NO_STDIO)
|
||||
/* Initialize the default input/output functions for the PNG file. If you
|
||||
* use your own read or write routines, you can call either png_set_read_fn()
|
||||
* or png_set_write_fn() instead of png_init_io(). If you have defined
|
||||
* PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
|
||||
* necessarily available.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_init_io(png_structp png_ptr, png_FILE_p fp)
|
||||
{
|
||||
png_debug(1, "in png_init_io\n");
|
||||
png_ptr->io_ptr = (png_voidp)fp;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_TIME_RFC1123_SUPPORTED)
|
||||
/* Convert the supplied time into an RFC 1123 string suitable for use in
|
||||
* a "Creation Time" or other text-based time string.
|
||||
*/
|
||||
png_charp PNGAPI
|
||||
png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
|
||||
{
|
||||
static PNG_CONST char short_months[12][4] =
|
||||
{"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||
|
||||
if (png_ptr->time_buffer == NULL)
|
||||
{
|
||||
png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29*
|
||||
png_sizeof(char)));
|
||||
}
|
||||
|
||||
#if defined(_WIN32_WCE)
|
||||
{
|
||||
wchar_t time_buf[29];
|
||||
wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"),
|
||||
ptime->day % 32, short_months[(ptime->month - 1) % 12],
|
||||
ptime->year, ptime->hour % 24, ptime->minute % 60,
|
||||
ptime->second % 61);
|
||||
WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29,
|
||||
NULL, NULL);
|
||||
}
|
||||
#else
|
||||
#ifdef USE_FAR_KEYWORD
|
||||
{
|
||||
char near_time_buf[29];
|
||||
sprintf(near_time_buf, "%d %s %d %02d:%02d:%02d +0000",
|
||||
ptime->day % 32, short_months[(ptime->month - 1) % 12],
|
||||
ptime->year, ptime->hour % 24, ptime->minute % 60,
|
||||
ptime->second % 61);
|
||||
png_memcpy(png_ptr->time_buffer, near_time_buf,
|
||||
29*png_sizeof(char));
|
||||
}
|
||||
#else
|
||||
sprintf(png_ptr->time_buffer, "%d %s %d %02d:%02d:%02d +0000",
|
||||
ptime->day % 32, short_months[(ptime->month - 1) % 12],
|
||||
ptime->year, ptime->hour % 24, ptime->minute % 60,
|
||||
ptime->second % 61);
|
||||
#endif
|
||||
#endif /* _WIN32_WCE */
|
||||
return ((png_charp)png_ptr->time_buffer);
|
||||
}
|
||||
#endif /* PNG_TIME_RFC1123_SUPPORTED */
|
||||
|
||||
#if 0
|
||||
/* Signature string for a PNG file. */
|
||||
png_bytep PNGAPI
|
||||
png_sig_bytes(void)
|
||||
{
|
||||
return ((png_bytep)"\211\120\116\107\015\012\032\012");
|
||||
}
|
||||
#endif
|
||||
|
||||
png_charp PNGAPI
|
||||
png_get_copyright(png_structp png_ptr)
|
||||
{
|
||||
if (&png_ptr != NULL) /* silence compiler warning about unused png_ptr */
|
||||
return ((png_charp) "\n libpng version 1.2.8 - December 3, 2004\n\
|
||||
Copyright (c) 1998-2004 Glenn Randers-Pehrson\n\
|
||||
Copyright (c) 1996-1997 Andreas Dilger\n\
|
||||
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n");
|
||||
return ((png_charp) "");
|
||||
}
|
||||
|
||||
/* The following return the library version as a short string in the
|
||||
* format 1.0.0 through 99.99.99zz. To get the version of *.h files
|
||||
* used with your application, print out PNG_LIBPNG_VER_STRING, which
|
||||
* is defined in png.h.
|
||||
* Note: now there is no difference between png_get_libpng_ver() and
|
||||
* png_get_header_ver(). Due to the version_nn_nn_nn typedef guard,
|
||||
* it is guaranteed that png.c uses the correct version of png.h.
|
||||
*/
|
||||
png_charp PNGAPI
|
||||
png_get_libpng_ver(png_structp png_ptr)
|
||||
{
|
||||
/* Version of *.c files used when building libpng */
|
||||
if (&png_ptr != NULL) /* silence compiler warning about unused png_ptr */
|
||||
return ((png_charp) PNG_LIBPNG_VER_STRING);
|
||||
return ((png_charp) "");
|
||||
}
|
||||
|
||||
png_charp PNGAPI
|
||||
png_get_header_ver(png_structp png_ptr)
|
||||
{
|
||||
/* Version of *.h files used when building libpng */
|
||||
if (&png_ptr != NULL) /* silence compiler warning about unused png_ptr */
|
||||
return ((png_charp) PNG_LIBPNG_VER_STRING);
|
||||
return ((png_charp) "");
|
||||
}
|
||||
|
||||
png_charp PNGAPI
|
||||
png_get_header_version(png_structp png_ptr)
|
||||
{
|
||||
/* Returns longer string containing both version and date */
|
||||
if (&png_ptr != NULL) /* silence compiler warning about unused png_ptr */
|
||||
return ((png_charp) PNG_HEADER_VERSION_STRING);
|
||||
return ((png_charp) "");
|
||||
}
|
||||
|
||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
int PNGAPI
|
||||
png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)
|
||||
{
|
||||
/* check chunk_name and return "keep" value if it's on the list, else 0 */
|
||||
int i;
|
||||
png_bytep p;
|
||||
if((png_ptr == NULL && chunk_name == NULL) || png_ptr->num_chunk_list<=0)
|
||||
return 0;
|
||||
p=png_ptr->chunk_list+png_ptr->num_chunk_list*5-5;
|
||||
for (i = png_ptr->num_chunk_list; i; i--, p-=5)
|
||||
if (!png_memcmp(chunk_name, p, 4))
|
||||
return ((int)*(p+4));
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This function, added to libpng-1.0.6g, is untested. */
|
||||
int PNGAPI
|
||||
png_reset_zstream(png_structp png_ptr)
|
||||
{
|
||||
return (inflateReset(&png_ptr->zstream));
|
||||
}
|
||||
|
||||
/* This function was added to libpng-1.0.7 */
|
||||
png_uint_32 PNGAPI
|
||||
png_access_version_number(void)
|
||||
{
|
||||
/* Version of *.c files used when building libpng */
|
||||
return((png_uint_32) PNG_LIBPNG_VER);
|
||||
}
|
||||
|
||||
|
||||
#if !defined(PNG_1_0_X)
|
||||
#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
|
||||
/* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */
|
||||
/* this INTERNAL function was added to libpng 1.2.0 */
|
||||
void /* PRIVATE */
|
||||
png_init_mmx_flags (png_structp png_ptr)
|
||||
{
|
||||
png_ptr->mmx_rowbytes_threshold = 0;
|
||||
png_ptr->mmx_bitdepth_threshold = 0;
|
||||
|
||||
# if (defined(PNG_USE_PNGVCRD) || defined(PNG_USE_PNGGCCRD))
|
||||
|
||||
png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_COMPILED;
|
||||
|
||||
if (png_mmx_support() > 0) {
|
||||
png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
|
||||
# ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
|
||||
| PNG_ASM_FLAG_MMX_READ_COMBINE_ROW
|
||||
# endif
|
||||
# ifdef PNG_HAVE_ASSEMBLER_READ_INTERLACE
|
||||
| PNG_ASM_FLAG_MMX_READ_INTERLACE
|
||||
# endif
|
||||
# ifndef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW
|
||||
;
|
||||
# else
|
||||
| PNG_ASM_FLAG_MMX_READ_FILTER_SUB
|
||||
| PNG_ASM_FLAG_MMX_READ_FILTER_UP
|
||||
| PNG_ASM_FLAG_MMX_READ_FILTER_AVG
|
||||
| PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ;
|
||||
|
||||
png_ptr->mmx_rowbytes_threshold = PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT;
|
||||
png_ptr->mmx_bitdepth_threshold = PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT;
|
||||
# endif
|
||||
} else {
|
||||
png_ptr->asm_flags &= ~( PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
|
||||
| PNG_MMX_READ_FLAGS
|
||||
| PNG_MMX_WRITE_FLAGS );
|
||||
}
|
||||
|
||||
# else /* !((PNGVCRD || PNGGCCRD) && PNG_ASSEMBLER_CODE_SUPPORTED)) */
|
||||
|
||||
/* clear all MMX flags; no support is compiled in */
|
||||
png_ptr->asm_flags &= ~( PNG_MMX_FLAGS );
|
||||
|
||||
# endif /* ?(PNGVCRD || PNGGCCRD) */
|
||||
}
|
||||
|
||||
#endif /* !(PNG_ASSEMBLER_CODE_SUPPORTED) */
|
||||
|
||||
/* this function was added to libpng 1.2.0 */
|
||||
#if !defined(PNG_USE_PNGGCCRD) && \
|
||||
!(defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_USE_PNGVCRD))
|
||||
int PNGAPI
|
||||
png_mmx_support(void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
#endif /* PNG_1_0_X */
|
||||
|
||||
#ifdef PNG_SIZE_T
|
||||
/* Added at libpng version 1.2.6 */
|
||||
PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
|
||||
png_size_t PNGAPI
|
||||
png_convert_size(size_t size)
|
||||
{
|
||||
if (size > (png_size_t)-1)
|
||||
PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */
|
||||
return ((png_size_t)size);
|
||||
}
|
||||
#endif /* PNG_SIZE_T */
|
||||
@ -1,46 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2018 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v2.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* https://www.eclipse.org/legal/epl-2.0/
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(SUBOPTS_H)
|
||||
#define SUBOPTS_H
|
||||
|
||||
/** The MQTT V5 subscribe options, apart from QoS which existed before V5. */
|
||||
typedef struct MQTTSubscribe_options
|
||||
{
|
||||
/** The eyecatcher for this structure. Must be MQSO. */
|
||||
char struct_id[4];
|
||||
/** The version number of this structure. Must be 0.
|
||||
*/
|
||||
int struct_version;
|
||||
/** To not receive our own publications, set to 1.
|
||||
* 0 is the original MQTT behaviour - all messages matching the subscription are received.
|
||||
*/
|
||||
unsigned char noLocal;
|
||||
/** To keep the retain flag as on the original publish message, set to 1.
|
||||
* If 0, defaults to the original MQTT behaviour where the retain flag is only set on
|
||||
* publications sent by a broker if in response to a subscribe request.
|
||||
*/
|
||||
unsigned char retainAsPublished;
|
||||
/** 0 - send retained messages at the time of the subscribe (original MQTT behaviour)
|
||||
* 1 - send retained messages on subscribe only if the subscription is new
|
||||
* 2 - do not send retained messages at all
|
||||
*/
|
||||
unsigned char retainHandling;
|
||||
} MQTTSubscribe_options;
|
||||
|
||||
#define MQTTSubscribe_options_initializer { {'M', 'Q', 'S', 'O'}, 0, 0, 0, 0 }
|
||||
|
||||
#endif
|
||||
@ -1,32 +0,0 @@
|
||||
/* Alloc.h -- Memory allocation functions
|
||||
2008-03-13
|
||||
Igor Pavlov
|
||||
Public domain */
|
||||
|
||||
#ifndef __COMMON_ALLOC_H
|
||||
#define __COMMON_ALLOC_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
void *MyAlloc(size_t size);
|
||||
void MyFree(void *address);
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
void SetLargePageSize();
|
||||
|
||||
void *MidAlloc(size_t size);
|
||||
void MidFree(void *address);
|
||||
void *BigAlloc(size_t size);
|
||||
void BigFree(void *address);
|
||||
|
||||
#else
|
||||
|
||||
#define MidAlloc(size) MyAlloc(size)
|
||||
#define MidFree(address) MyFree(address)
|
||||
#define BigAlloc(size) MyAlloc(size)
|
||||
#define BigFree(address) MyFree(address)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,230 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="BPQWinAPP"
|
||||
ProjectGUID="{005A91EA-3A00-4FB4-ADD9-EB78DBFA2B81}"
|
||||
RootNamespace="BPQWinAPP"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="C:\Dev\Msdev200\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
SuppressStartupBanner="true"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\Debug/BPQWinAPP.tlb"
|
||||
HeaderFileName=""
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="C:\Users\johnw\OneDrive\Dev\Source\bpq32\Commonsource;C:\Users\johnw\OneDrive\Dev\Source\bpq32\CInclude"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
||||
MinimalRebuild="true"
|
||||
RuntimeLibrary="1"
|
||||
PrecompiledHeaderFile=".\Debug/BPQWinAPP.pch"
|
||||
AssemblerListingLocation="$(IntDir)\"
|
||||
ObjectFile="$(IntDir)\"
|
||||
ProgramDataBaseFileName="$(IntDir)\"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="true"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="2057"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="..\lib\bpq32.lib DbgHelp.lib"
|
||||
OutputFile="c:\DevProgs\bpq32\bpq32.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="true"
|
||||
GenerateDebugInformation="true"
|
||||
ProgramDatabaseFile=".\Debug/bpq32.pdb"
|
||||
GenerateMapFile="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="0"
|
||||
StackCommitSize="0"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
SuppressStartupBanner="true"
|
||||
OutputFile=".\Debug/BPQWinAPP.bsc"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
SuppressStartupBanner="true"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\Release/BPQWinAPP.tlb"
|
||||
HeaderFileName=""
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="C:\Users\johnw\OneDrive\Dev\Source\bpq32\Commonsource"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
|
||||
StringPooling="true"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="true"
|
||||
PrecompiledHeaderFile="C:\msdev2005\Intermed\Release/BPQWinAPP.pch"
|
||||
AssemblerListingLocation="$(IntDir)\"
|
||||
ObjectFile="$(IntDir)\"
|
||||
ProgramDataBaseFileName="$(IntDir)\"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="true"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="2057"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="..\lib\bpq32.lib DbgHelp.lib"
|
||||
OutputFile="c:\DevProgs\bpq32\bpq32.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="true"
|
||||
ProgramDatabaseFile=".\Release/bpq32.pdb"
|
||||
GenerateMapFile="true"
|
||||
MapFileName="c:\DevProgs\bpq32\bpq32app.map"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
SuppressStartupBanner="true"
|
||||
OutputFile=".\Release/BPQWinAPP.bsc"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\BPQWinAPP.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\BPQWinAPP.rc"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,48 +0,0 @@
|
||||
/*
|
||||
Copyright 2001-2015 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
|
||||
|
||||
|
||||
//int SENDNODES() {return 0;}
|
||||
//int BYECMD() {return 0;}
|
||||
//int CMDR00() {return 0;}
|
||||
|
||||
//int DoNetromConnect() {return 0;}
|
||||
|
||||
|
||||
//int CMDC00() {return 0;}
|
||||
|
||||
|
||||
|
||||
//int CheckReceivedData() {return 0;}
|
||||
//int GetLastError() {return 0;}
|
||||
|
||||
|
||||
|
||||
VOID i2c_smbus_write_byte()
|
||||
{
|
||||
}
|
||||
|
||||
VOID i2c_smbus_read_byte()
|
||||
{
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue