225 lines
6.9 KiB
Plaintext
225 lines
6.9 KiB
Plaintext
compile function httpSvr_GetReposImage( httpServer, requestID, requestHeaders )
|
|
/*
|
|
****************************************************************************
|
|
** IF YOU WANT TO MODIFY THIS FOR YOUR OWN APPLICATIONS PLEASE USE A COPY **
|
|
** DO NOT CHANGE THIS PROGRAM AS IT MAY BE OVERWRITTEN BY FUTURE UPDATES! **
|
|
****************************************************************************
|
|
|
|
** Copyright (C) 2012-2022 Revelation Software Inc. All Rights Reserved **
|
|
|
|
Author : Wile C Coyote - Super Genius
|
|
Date : August 2022
|
|
Purpose : Simple function for the HTTPSERVER control to return
|
|
: repository images.
|
|
|
|
Query Parameters
|
|
================
|
|
|
|
classid : Repository CLASSID of the image (defaults to "PNG")
|
|
[req] entid : Repository ENTITYID of the image
|
|
useFile : If TRUE$ ("1") then return the image via the server's
|
|
: SetResponseContentFile method, otherwise return via the
|
|
: normal SetResponseContent method.
|
|
dpi : Specifies the requested DPI for the image - this can be
|
|
: an actual DPI (like 96,192 etc) or a percentage (100%,
|
|
: 200%) etc (Defaults to 96)
|
|
|
|
Comments
|
|
========
|
|
|
|
Amended Date Reason
|
|
======= ==== ======
|
|
*/
|
|
#pragma precomp event_precomp
|
|
|
|
declare function repository, rti_ResolvePath, rti_ErrorText, rti_UC
|
|
$insert ps_HTTPServer_Equates
|
|
$insert repository_Equates
|
|
$insert reposErrors
|
|
$insert rti_SSP_Equates
|
|
$insert logical
|
|
|
|
equ BASE_DPI$ to 96
|
|
|
|
errStat = FALSE$
|
|
errInfo = ""
|
|
|
|
classID = ""
|
|
entID = ""
|
|
dpi = ""
|
|
bUseFile = FALSE$
|
|
mimeType = ""
|
|
|
|
// NOTE: We're expecting this to be a GET request - if it's POST then we
|
|
// need to extract these arguments from the request content as they won't
|
|
// be in the query names and values fields.
|
|
|
|
queryNames = requestHeaders<PS_HSVR_REQHDR_QUERYNAMES$>
|
|
|
|
locateC "classid" in queryNames using @vm setting pos then
|
|
classID = rti_UC( trim( requestHeaders<PS_HSVR_REQHDR_QUERYVALUES$,pos> ) )
|
|
end
|
|
|
|
locateC "entid" in queryNames using @vm setting pos then
|
|
entID = rti_UC( trim( requestHeaders<PS_HSVR_REQHDR_QUERYVALUES$,pos> ) )
|
|
end
|
|
|
|
locateC "useFile" in queryNames using @vm setting pos then
|
|
bUseFile = trim( requestHeaders<PS_HSVR_REQHDR_QUERYVALUES$,pos> )
|
|
end
|
|
|
|
locateC "dpi" in queryNames using @vm setting pos then
|
|
dpi = trim( requestHeaders<PS_HSVR_REQHDR_QUERYVALUES$,pos> )
|
|
end
|
|
|
|
if bLen( classID ) else
|
|
classID = "PNG"
|
|
end
|
|
|
|
if bLen( dpi ) then
|
|
if ( dpi[-1,1] = "%" ) then
|
|
convert "%" to "" in dpi
|
|
if num( dpi ) then
|
|
dpi = int( ( dpi / 100 ) * BASE_DPI$ )
|
|
end else
|
|
dpi = ""
|
|
end
|
|
end
|
|
end
|
|
|
|
if ( dpi ) then
|
|
if ( dpi < BASE_DPI$ ) then
|
|
dpi = BASE_DPI$
|
|
end
|
|
end else
|
|
dpi = BASE_DPI$
|
|
end
|
|
|
|
begin case
|
|
case ( classID == "JPG" )
|
|
mimeType = "image/jpeg"
|
|
case ( classID == "GIF" )
|
|
mimeType = "image/gif"
|
|
case ( classID == "BMP" )
|
|
mimeType = "image/bmp"
|
|
case ( classID == "PNG" )
|
|
mimeType = "image/png"
|
|
case OTHERWISE$
|
|
null
|
|
end case
|
|
|
|
if bLen( entID ) then
|
|
reposID = @appID<1> : "*IMAGE*" : classID : "*" : entID
|
|
|
|
call set_Status( SETSTAT_OK$ )
|
|
|
|
fileNames = repository( "GETSUBKEY", reposID )
|
|
if get_Status( errInfo ) then
|
|
if ( errInfo<1,1> == REP_ENT_NOEXISTS_ERR$ ) then
|
|
@httpServer->setResponseStatus( requestID, 404 )
|
|
end else
|
|
goSub setHTTPError
|
|
end
|
|
end else
|
|
|
|
goSub resolveFileNameForDPI
|
|
|
|
if bLen( filename ) then
|
|
fileName = rti_ResolvePath( fileName, "" )
|
|
|
|
if bUseFile then
|
|
|
|
@httpServer->setResponseFile( requestID, fileName )
|
|
@httpServer->setResponseHeader( requestID, "Content-Type", mimeType )
|
|
|
|
end else
|
|
osRead fileContents from fileName then
|
|
@httpServer->setResponseContent( requestID, fileContents )
|
|
@httpServer->setResponseHeader( requestID, "Content-Type", mimeType )
|
|
end else
|
|
@httpServer->setResponseStatus( requestID, 404 )
|
|
end
|
|
end
|
|
end else
|
|
@httpServer->setResponseStatus( requestID, 404 )
|
|
end
|
|
|
|
end
|
|
end else
|
|
@httpServer->setResponseStatus( requestID, 404 )
|
|
end
|
|
|
|
return TRUE$
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// resolveFileNameForDPI subroutine
|
|
//
|
|
// Finds the best fitting image file for the DPI requested fro the list of
|
|
// files defined in the repository:
|
|
//
|
|
// <0,1> 96 (100%)
|
|
// <0,2> 120 (125%)
|
|
// <0,3> 144 (150%)
|
|
// <0,4> 168 (175%)
|
|
// <0,5> 192 (200%) <-- After this point we step up in 50% increments
|
|
// <0,6> 240 (250%)
|
|
// <0,7> 288 (300%)
|
|
// <0,8> 336 (350%)
|
|
// <0,9> 384 (400%)
|
|
// <0,10> 432 (450%)
|
|
// <0,11> 480 (500%)
|
|
//
|
|
// If we can't find an exact match then we go for the next highest we can find
|
|
//
|
|
// ----------------------------------------------------------------------------
|
|
// [i] dpi : DPI requested
|
|
// [i] fileNames : @vm'd list of file names to search
|
|
// [o] fileName : Resolved file name
|
|
// ----------------------------------------------------------------------------
|
|
resolveFileNameForDPI:
|
|
|
|
fileName = ""
|
|
dpiTest = BASE_DPI$
|
|
|
|
eofNames = bLen( fileNames )
|
|
pos = 1
|
|
loop
|
|
fileName_ = fileNames[pos,@vm,TRUE$]; pos = bCol2()+1
|
|
if bLen( fileName_ ) then
|
|
transfer fileName_ to fileName
|
|
begin case
|
|
case ( dpiTest == dpi )
|
|
return
|
|
case ( dpiTest > dpi )
|
|
return
|
|
case OTHERWISE$
|
|
null
|
|
end case
|
|
end
|
|
until ( pos > eofNames )
|
|
// After 200% DPI we go up in 50% steps, otherwise we go up in 25% steps
|
|
if ( dpiTest >= 192 ) then
|
|
dpiTest += 48
|
|
end else
|
|
dpiTest += 24
|
|
end
|
|
repeat
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
setHTTPError:
|
|
|
|
errInfo = rti_ErrorText( "SP", errInfo )
|
|
@httpServer->setResponseContent( requestID, errInfo )
|
|
@httpServer->setResponseHeader( requestID, "Content-Type", "text/plain" )
|
|
@httpServer->setResponseStatus( requestID, 500 )
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|