' **********************************************************************
' ** **
' ** Resource stream for Rapid-Q (c) 2000 Pavel "Crusher" Minayev **
' ** Version 1.10 (built on 6/25/2000) **
' ** If you find a bug, e-mail me to minayev@aport.ru **
' ** **
' ** You can freely distribute & modify this file if you mention **
' ** somewhere that original file was written by me. **
' ** **
' ** To use this file, $INCLUDE it in your programs, and you will **
' ** be able to declare variables of QResourceStream type. They'll **
' ** work exactly like file streams opened in fmOpenRead mode, but **
' ** you should open resources by <variable>.Open(<resource-number>) **
' ** Note that you don't have to use RESOURCE() function, it's done **
' ** automatically. Access mode is always read-only, calls to Write **
' ** functions doesn't do anything. Also, ReadUDT will not work at **
' ** all for now. And you should NEVER use resource streams as **
' ** arguments of CopyFrom method - that'll give you an error. **
' ** **
' ** I don't know if this library will work on future versions of **
' ** Rapid-Q. It may work, or may not. However, I'll try to release **
' ** new versions of this library for the new versions of Rapid-Q. **
' ** **
' ** This library was made for Win32. I doubt it works under Unix or **
' ** Linux, and I don't have one to test it. You can however port it **
' ** it to any OS you like if you want to do so. **
' ** **
' ** Program history: **
' ** **
' ** Version 1.10 **
' ** - got rid of ResourceStart definition **
' ** - implemented EOF property **
' ** **
' ** Version 1.00 **
' ** - initial release **
' ** **
' **********************************************************************
$TYPECHECK ON
$INCLUDE "rapidq.inc"
TYPE QResourceStream EXTENDS QFileStream
PRIVATE:
DataTypeToSize(Num_BYTE TO Num_DOUBLE) AS INTEGER
Offset AS INTEGER
ResourceStart AS INTEGER
RealFile AS QFileStream
PUBLIC:
LineCount AS INTEGER
Position AS INTEGER
Size AS INTEGER
CONSTRUCTOR
Offset = 0
LineCount = 0
DataTypeToSize(Num_BYTE) = SIZEOF(BYTE)
DataTypeToSize(Num_SHORT) = SIZEOF(SHORT)
DataTypeToSize(Num_WORD) = SIZEOF(WORD)
DataTypeToSize(Num_LONG) = SIZEOF(LONG)
DataTypeToSize(Num_DWORD) = SIZEOF(DWORD)
DataTypeToSize(Num_SINGLE) = SIZEOF(SINGLE)
DataTypeToSize(Num_DOUBLE) = SIZEOF(DOUBLE)
RealFile.Open(Command$(0), fmOpenRead)
RealFile.Seek(-4, soFromEnd)
ResourceStart = QResourceStream.RealFile.Size - QResourceStream.RealFile.ReadNum(Num_LONG) - 4
END CONSTRUCTOR
FUNCTION Open(Res AS INTEGER) AS INTEGER
WITH QResourceStream
IF Res >= RESOURCECOUNT THEN
Result = False
ELSE
.Offset = .ResourceStart + RESOURCE(Res)
.RealFile.Seek(.Offset, soFromBeginning)
.Size = .RealFile.ReadNum(Num_LONG)
.Offset + = SIZEOF(LONG)
.Position = 0
Result = True
END IF
END WITH
END SUB
SUB Close
QResourceStream.Offset = 0
END SUB
SUB Seek(NewPos AS INTEGER, From AS INTEGER)
WITH QResourceStream
SELECT CASE From
CASE IS = soFromBeginning
.Position = NewPos
CASE IS = soFromCurrent
.Position + = NewPos
CASE IS = soFromEnd
.Position = .Size - NewPos - 1
END SELECT
IF .Position < 0 THEN .Position = 0
IF .Position >= .Size THEN .Position = .Size - 1
.RealFile.Seek(.Offset + .Position, soFromBeginning)
END WITH
END SUB
FUNCTION EOF AS INTEGER
IF QResourceStream.Position = QResourceStream.Size THEN
Result = True
ELSE
Result = False
END IF
END FUNCTION
PRIVATE:
SUB CheckForEOF
WITH QResourceStream
IF .Position > .Size THEN
.Position = .Size
' .Seek(0, soFromEnd)
END IF
END WITH
END SUB
PUBLIC:
FUNCTION ReadNum(Size AS INTEGER) AS DOUBLE
WITH QResourceStream
IF .Position = .Size THEN EXIT FUNCTION ' EOF
Result = .RealFile.ReadNum(Size)
.Position + = .DataTypeToSize(Size)
.CheckForEOF
END WITH
END FUNCTION
FUNCTION ReadStr(Size AS INTEGER) AS STRING
DEFSTR Tmp
WITH QResourceStream
IF .Position = .Size THEN EXIT FUNCTION ' EOF
Tmp = .RealFile.ReadStr(Size)
IF .Position >= .Size THEN
Tmp = LEFT$(Tmp, LEN(Tmp) - (.Position - .Size + 1))
.Position = .Size - 1
.Seek(0, soFromEnd)
END IF
Result = Tmp
END WITH
END FUNCTION
FUNCTION ReadBinStr(Size AS INTEGER) AS STRING
Result = QResourceStream.ReadStr(Size)
END FUNCTION
FUNCTION ReadLine AS STRING
DEFINT char
DEFSTR Res
WITH QResourceStream
IF .Position = .Size THEN EXIT FUNCTION ' EOF
char = 0 : Res = ""
WHILE char <> 13 AND .Size <> .Position
char = .ReadNum(Num_BYTE)
IF char <> 13 AND char <> 10 THEN
Res = Res + CHR$(char)
END IF
WEND
Result = Res
END WITH
END FUNCTION
SUB ReadUDT(Data AS QObject)
' Not yet implemented
END SUB
SUB WriteNum(Number AS INTEGER, Size AS INTEGER)
' Does nothing
END SUB
SUB WriteStr(Data AS STRING, Size AS INTEGER)
' Does nothing
END SUB
SUB WriteBinStr(Data AS STRING, Size AS INTEGER)
' Does nothing
END SUB
SUB WriteLine(Line AS STRING)
' Does nothing
END SUB
SUB WriteUDT(Data AS QObject)
' Does nothing
END SUB
SUB CopyFrom(Stream AS QObject, Bytes AS INTEGER)
' Does nothing
END SUB
END TYPE