360 lines
9.2 KiB
Plaintext
360 lines
9.2 KiB
Plaintext
#INCLUDE WCONNECT.h
|
|
|
|
SET PROCEDURE TO wwConfig ADDITIVE
|
|
|
|
*** Dependencies
|
|
SET CLASSLIB TO wwXML ADDITIVE
|
|
SET PROCEDURE TO wwAPI ADDITIVE
|
|
SET PROCEDURE TO wwUtils ADDITIVE
|
|
|
|
*!* #IF .F.
|
|
*!* *** Test/demo code
|
|
*!* CLEAR
|
|
*!* o=create("MyConfig")
|
|
*!* o.cFileName = "Config.xml"
|
|
*!* o.cMode = "XML"
|
|
|
|
*!* IF .F.
|
|
*!* o.cFileName = "Config.ini"
|
|
*!* o.cAppName = "Ini File Test"
|
|
*!* ? o.Save()
|
|
*!* ENDIF
|
|
*!* IF .F.
|
|
*!* o.cFileName = "Config.ini"
|
|
*!* ? o.LoadIni()
|
|
*!* ? o.cAppName
|
|
*!* ? o.oTest.cHTMLPagePath
|
|
*!* ENDIF
|
|
*!* IF .F.
|
|
*!* o.cAppName = "Default Application - Not yet set"
|
|
*!* o.nTimerInterval = 100
|
|
*!* o.cTemplate="cfg_"
|
|
*!* ? o.Save()
|
|
*!* modi comm config.xml
|
|
*!* ENDIF
|
|
*!* IF .F.
|
|
*!* o.Load()
|
|
*!* ENDIF
|
|
|
|
*!* IF .F.
|
|
*!* o.cAppName = "Test Application"
|
|
*!* o.nTimerInterval = 100
|
|
|
|
*!* o.cRegPath = "Software\West Wind Technologies\TestConfig"
|
|
*!* o.cRegNode = "Parameters"
|
|
*!* ? o.SaveRegistry()
|
|
*!* ENDIF
|
|
*!* IF .F.
|
|
*!* o.cRegPath = "Software\West Wind Technologies\TestConfig"
|
|
*!* o.cRegNode = "Parameters"
|
|
*!*
|
|
*!* ? o.LoadRegistry()
|
|
*!* ENDIF
|
|
|
|
*!* ? o.cAppName
|
|
*!* ? o.nTimerInterval
|
|
*!* ? o.cTemplate
|
|
|
|
*!* RETURN
|
|
|
|
*!* *** All you have to do is add properties
|
|
*!* *** for the config items and type them properly
|
|
*!* *** with default values for first startup
|
|
*!* DEFINE CLASS MyConfig AS wwConfig
|
|
*!* cPath="d:\temp\"
|
|
*!* cTemplate="wc_"
|
|
*!* nPriority=1
|
|
*!* lDebugMode=.F.
|
|
*!* lLogToFile=.T.
|
|
*!* lShowStatus=.T.
|
|
*!* nScriptMode=3
|
|
*!* nTimerInterval=250
|
|
*!* lSaveRequestFiles=.F.
|
|
*!* cAppName = ""
|
|
*!* oTest = .NULL.
|
|
*!* FUNCTION Init
|
|
*!* *THIS.oTest = CREATE("cTest")
|
|
*!* *THIS.oTest.cHTMLPagePath = "d:\westwind\wconnect\"
|
|
*!* RETURN
|
|
*!* ENDFUNC
|
|
*!* ENDDEFINE
|
|
|
|
*!* DEFINE CLASS cTest as Relation
|
|
*!* cHTMLPagePath = "Test Path"
|
|
*!* *cDataPath = "d:\westwind\data"
|
|
*!* ENDDEFINE
|
|
*!* #ENDIF
|
|
*************************************************************
|
|
DEFINE CLASS wwConfig AS Relation
|
|
*************************************************************
|
|
|
|
*** These values are not part of the XML exported
|
|
*** interface.
|
|
cFileName = ""
|
|
cSubName = "config"
|
|
oXML = .NULL.
|
|
cRegPath = "SOFTWARE\West Wind Technologies\Config"
|
|
cRegNode = "Parameters"
|
|
cMode = "INI"
|
|
|
|
PROTECTED cPropertyExclusionList
|
|
cPropertyExclusionList = ",cfilename,oxml,cregpath,cregnode,"+;
|
|
"csubname,cmode,cpropertyexclusionlist,loverwriteini"
|
|
|
|
|
|
****************************************************************
|
|
FUNCTION Save
|
|
*************
|
|
LPARAMETER loObject
|
|
|
|
THIS.cMode = UPPER(THIS.cMode)
|
|
|
|
DO CASE
|
|
CASE THIS.cMode = "XML"
|
|
IF EMPTY(THIS.cFileName)
|
|
RETURN .F.
|
|
ENDIF
|
|
|
|
STRTOFILE(THIS.CreateXML(),THIS.cFileName)
|
|
CASE THIS.cMode = "INI"
|
|
IF EMPTY(THIS.cFileName)
|
|
RETURN .F.
|
|
ENDIF
|
|
*ERASE (FULLPATH(THIS.cFileName))
|
|
THIS.SaveIni(this)
|
|
CASE THIS.cMode = "REGISTRY"
|
|
THIS.SaveRegistry()
|
|
ENDCASE
|
|
|
|
RETURN .T.
|
|
|
|
****************************************************************
|
|
FUNCTION Load
|
|
*************
|
|
LPARAMETER loOBject
|
|
|
|
THIS.cMode = UPPER(THIS.cMode)
|
|
|
|
DO CASE
|
|
CASE THIS.cMode = "XML"
|
|
IF EMPTY(THIS.cFileName) or !FILE(THIS.cFileName)
|
|
RETURN .F.
|
|
ENDIF
|
|
|
|
lcXML = FILETOSTR(THIS.cFileName)
|
|
THIS.LoadFromXML(lcXML)
|
|
CASE THIS.cMode = "INI"
|
|
RETURN THIS.LoadIni(loObject)
|
|
CASE THIS.cMode = "REGISTRY"
|
|
RETURN THIS.LOADREGISTRY()
|
|
ENDCASE
|
|
|
|
RETURN
|
|
|
|
|
|
****************************************************************
|
|
FUNCTION SaveRegistry
|
|
*********************
|
|
loAPi = CREATE("wwAPI")
|
|
|
|
lcXML = THIS.CreateXML()
|
|
|
|
RETURN loAPI.WriteRegistryString(,THIS.cRegPath,THIS.cRegNode,lcXML,.T.)
|
|
|
|
|
|
****************************************************************
|
|
FUNCTION LoadRegistry
|
|
*********************
|
|
|
|
loAPI = CREATE("wwAPI")
|
|
lcXML = loAPI.ReadRegistryString(,THIS.cRegPath,THIS.cRegNode)
|
|
IF ISNULL(lcXML)
|
|
RETURN .F.
|
|
ENDIF
|
|
|
|
RETURN THIS.LoadFromXML(lcXML)
|
|
|
|
****************************************************************
|
|
PROTECTED FUNCTION CreateXML
|
|
****************************
|
|
|
|
loXML = CREATE("wwXML")
|
|
loXML.lRecurseObjects = .T.
|
|
loXML.lStripTypePrefix = .T.
|
|
|
|
loXML.cDocRootName = lower(JustStem(THIS.cFileName))
|
|
IF loXML.cDocRootName="config"
|
|
loXML.cDocRootName = "wwConfig"
|
|
ENDIF
|
|
|
|
*** We have to exclude these internal properties
|
|
loXML.cPropertyExclusionList = loXML.cPropertyExclusionList + ;
|
|
THIS.cPropertyExclusionList
|
|
|
|
RETURN loXML.ObjectToXML(THIS,THIS.cSubName)
|
|
|
|
****************************************************************
|
|
PROTECTED FUNCTION LoadFromXML
|
|
******************************
|
|
LPARAMETER lcXML
|
|
|
|
loXML = CREATE("wwXML")
|
|
loXML.lRecurseObjects = .T.
|
|
loXML.lStripTypePrefix = .T.
|
|
|
|
*** Simply reload the object properties from the XML
|
|
loXML.XMLToObject(lcXML,THIS)
|
|
|
|
RETURN loXML.lError
|
|
|
|
****************************************************************
|
|
FUNCTION SaveIni
|
|
*********************
|
|
LPARAMETER loObject, lcName
|
|
LOCAL lcOutput, lnX, lnCount, laFields(1), lcField, lcType, lvValue, loXML
|
|
|
|
loXML = CREATE("wwXML")
|
|
*** We have to exclude these internal properties
|
|
loXML.cPropertyExclusionList = loXML.cPropertyExclusionList + ;
|
|
THIS.cPropertyExclusionList
|
|
|
|
lcName=IIF(EMPTY(lcName),THIS.cSubName,lcName)
|
|
lcFileName = FULLPATH(THIS.cFileName)
|
|
|
|
EXTERNAL ARRAY la_array
|
|
|
|
IF VARTYPE(loObject)#"O"
|
|
loObject = THIS
|
|
ENDIF
|
|
|
|
loAPI = CREATE("wwAPI")
|
|
|
|
lnCount = AMEMBERS(laFields, loObject)
|
|
|
|
FOR lnX=1 TO lnCount
|
|
lcField = LOWER(laFields[lnX])
|
|
IF AT("," + lcField + ",", "," + loXML.cPropertyExclusionList + ",")>0
|
|
LOOP
|
|
ENDIF
|
|
lcType = TYPE("loObject."+lcField)
|
|
lvValue = EVAL("loObject."+lcField)
|
|
|
|
IF .T. &&THIS.lStripTypePrefix
|
|
lcDispField = Proper(SUBSTR(lcField,2))
|
|
ELSE
|
|
lcDispField = Proper(lcField)
|
|
ENDIF
|
|
|
|
DO CASE
|
|
CASE ISNULL(lvValue)
|
|
loAPI.WriteProfileString(lcFileName,lcName,lcDispField,"NULL")
|
|
CASE lcType = "C"
|
|
loAPI.WriteProfileString(lcFileName,lcName,lcDispField,TRIM(lvValue))
|
|
CASE lcType = "D" OR lcType = "T"
|
|
loAPI.WriteProfileString(lcFileName,lcName,lcDispField,TRANSFORM(lvValue))
|
|
CASE lcType = "L"
|
|
loAPI.WriteProfileString(lcFileName,lcName,lcDispField,IIF(lvValue,"On","Off"))
|
|
CASE lcType = "O"
|
|
THIS.SaveIni(loObject.&lcField,lcDispField)
|
|
CASE lcType = "U"
|
|
loAPI.WriteProfileString(lcFileName,lcName,lcDispField,"NULL")
|
|
OTHERWISE
|
|
loAPI.WriteProfileString(lcFileName,lcName,lcDispField,TRANSFORM(lvValue))
|
|
ENDCASE
|
|
ENDFOR
|
|
|
|
RETURN .T.
|
|
|
|
****************************************************************
|
|
FUNCTION LoadIni
|
|
*********************
|
|
LPARAMETER loObject, lcName
|
|
LOCAL lcName, lcFileName, loAPI, loXML, lnProperties, lnX,;
|
|
lcField, lcXMLField, lcType, lcValue, loObject,;
|
|
laProperties[1]
|
|
|
|
IF VARTYPE(loObject) # "O"
|
|
loObject=THIS
|
|
ENDIF
|
|
|
|
lcName=IIF(EMPTY(lcName),THIS.cSubName,lcName)
|
|
lcFileName = FULLPATH(THIS.cFileName)
|
|
|
|
loAPI = CREATE("wwAPI")
|
|
loXML = CREATE("wwXML")
|
|
*** We have to exclude these internal properties
|
|
loXML.cPropertyExclusionList = loXML.cPropertyExclusionList + ;
|
|
THIS.cPropertyExclusionList
|
|
|
|
*** Walk the object and then pull properties
|
|
*** from the INI to repopulate it
|
|
lnProperties = AMEMBERS(laProperties,loObject)
|
|
|
|
lnX=0
|
|
FOR lnX=1 TO lnProperties
|
|
lcField = lower(laProperties[lnX])
|
|
if "," + lower(lcField) + "," $ "," + loXML.cPropertyExclusionList + ","
|
|
LOOP
|
|
ENDIF
|
|
|
|
lcXMLField = SUBSTR(lcField,2)
|
|
lcType = TYPE("loObject." + lcField)
|
|
lcValue = loAPI.GetProfileString(lcFileName,lcName,lcXMLField)
|
|
IF ISNULL(lcValue) AND lcType # "O"
|
|
LOOP
|
|
ENDIF
|
|
|
|
DO CASE
|
|
CASE lcType $ "CM"
|
|
loObject.&lcField = lcValue
|
|
CASE lcType $ "NIF"
|
|
loObject.&lcField = VAL(lcValue)
|
|
CASE lcType = "T"
|
|
loObject.&lcField = CTOT(lcValue)
|
|
CASE lcType = "D"
|
|
loObject.&lcField = CTOD(lcValue)
|
|
CASE lcType = "L"
|
|
IF lcValue = "1" or UPPER(lcValue) = "ON"
|
|
loObject.&lcField = .T.
|
|
ELSE
|
|
loObject.&lcField = .F.
|
|
ENDIF
|
|
CASE lcType = "O"
|
|
THIS.LoadIni(loObject.&lcField,lcXMLField)
|
|
ENDCASE
|
|
ENDFOR
|
|
|
|
RETURN .T.
|
|
|
|
|
|
ENDDEFINE
|
|
|
|
|
|
*** CODE TO CREATE A NEW SUBTREE IN THE HELP HIERARCHY
|
|
|
|
*!* loAPI = THIS.oAPI
|
|
|
|
*!* this.cSubTree = "SOFTWARE\"+THIS.cCompany+"\"+THIS.cAppName
|
|
*!* IF VARTYPE(THIS.cVersion) # "C"
|
|
*!* this.cVersion = TRANS(THIS.cVersion)
|
|
*!* ENDIF
|
|
|
|
*!* lcValue = loAPI.ReadRegistryString(,THIS.cSubTree,"")
|
|
|
|
*!* lcValue = loAPI.ReadRegistryString(,"SOFTWARE\"+THIS.cCompany+"\"+THIS.cAppName+"\Parameters","CurrentVersion")
|
|
*!* IF ISNULL(lcValue)
|
|
*!* loAPI.WriteRegistryString(,"SOFTWARE\"+THIS.cCompany,"","",.T.)
|
|
*!* loAPI.WriteRegistryString(,THIS.cSubTree,"","",.T.)
|
|
*!* loAPI.WriteRegistryString(,THIS.cSubTree+"\Parameters","CurrentVersion",THIS.cVersion,.T.)
|
|
*!* ELSE
|
|
*!* *** Update the version if its different
|
|
*!* IF lcValue # THIS.cVersion
|
|
*!* loAPI.WriteRegistryString(,THIS.cSubTree+"\Parameters","CurrentVersion",THIS.cVersion,.T.)
|
|
*!* ENDIF
|
|
*!* ENDIF
|
|
|
|
*!* RETURN
|
|
|
|
|
|
|