mIRC Homepage

$com issue

Posted By: Wims

$com issue - 31/08/20 12:41 PM

In this thread, kap tries to call the method 'load' of the object MSXML2.DOMDocument.6.0, described here:

Code
if ((!$com(XSL, load, 1, bstr, %xslt)) || ($comerr)) handle error


This code is not correct because the load method is not for literal string, rather for url, or others things.
Am i missing something, or shouldn't that code be setting $comerr all the time, rather than none of the time, as it is currently doing?
Posted By: Khaled

Re: $com issue - 06/09/20 10:45 AM

Thanks for your bug report. I have not been able to run this script as it reports "Can't load XML information". That said, if the COM call fails, it should always set $comerr.
Posted By: kap

Re: $com issue - 06/09/20 12:32 PM

Originally Posted by Khaled
Thanks for your bug report. I have not been able to run this script as it reports "Can't load XML information". That said, if the COM call fails, it should always set $comerr.


I think you get that error message because I rescinded that API key.

Here's the same block of code, but with a (now) working key. As you can see, Khaled, Ouims is right in pointing out that something is not working as expected?

It's not detecting the error in the objStylesheet alias...

Code
alias -l url_encode return $regsubex($1, /([\W\s])/Sg, $iif(\t == $chr(32), +, $+(%, $base($asc(\t), 10, 16, 2))))
alias objStylesheet {
  var %error, %xslt <?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:output method="text" indent="no" omit-xml-declaration="yes" /><xsl:template match="/">City: <xsl:value-of select="/current/city/@name" /> - Country: <xsl:value-of select="/current/city/country" /> - Temperature: <xsl:value-of select="/current/temperature/@value" /><xsl:value-of select="/current/temperature/@unit" /></xsl:template></xsl:stylesheet>
  if ($com(XSL)) .comclose XSL
  .comopen XSL MSXML2.DOMDocument.6.0
  if ((!$com(XSL, async, 4, bool, false)) || ($comerr)) %error = Can't set async property on obj XSL
  if ((!$com(XSL, load, 1, bstr, %xslt)) || ($comerr)) %error = Can't load stylesheet information from ' $+ %xslt $+ '

  :error
  if ($error) %error = $v1 | reseterror
  if (%error) echo $color(info text) -ag %error
}
alias objWeather {
  var %error, %loc $url_encode($1-)
  var %api_url http://api.openweathermap.org/data/2.5/weather
  ; Please specify your own api key below
  var %api_key 45ee6174666139e777e1d0fbc890137e
  ; You can specify units: `imperial`, `kelvin` and `metric`
  var %units metric
  var %page $+(%api_url,?q=,%loc,&units=,%units,&mode=xml,&appid=,%api_key)

  if ($com(XML)) .comclose XML
  .comopen XML MSXML2.DOMDocument.6.0 
  if ((!$com(XML, async, 4, bool, false)) || ($comerr)) %error = Can't set async property on obj XML
  if ((!$com(XML, load, 1, bstr, %page)) || ($comerr)) %error = Can't load XML information from ' $+ %page $+ '

  :error
  if ($error) %error = $v1 | reseterror
  if (%error) echo $color(info text) -ag %error
}

alias t1 {
  objStylesheet
  objWeather Vlissingen,nl
  if ($com(XML, transformNode, 1, dispatch, XSL)) {
    echo -ag Succeeded - $com(XML).result
  }
}
Posted By: Khaled

Re: $com issue - 06/09/20 12:51 PM

Your first step should be to remove the $com() call from the /if statement, and assign its result to a variable, eg. var %result = $com(). You can then /echo result: %result comerr: $comerr afer the $com() call to see whether it is succeeding or failing. If the value returned by $com() is 1, this means that the call succeeded.
Posted By: FroggieDaFrog

Re: $com issue - 06/09/20 02:05 PM

[Msxml2.DOMDocument.6.0].load() does not report an error for non-url string arguments. It returns a boolean value if the load was successful or not. If loading was not successful it returns false so you simply need to check against $com(XSL).result after the call to detect a load failure:

Code
if (!$com(XSL, load, 1, bstr, %xstl) || $comerr) {
  ; com related error
}
elseif (!$com(XSL).result) {
  ; load failed; you can dispatch parseError and check it's .reason property to get a plain text message as to why the load failed
}


I know it may seem like it would throw an error for a non-url input due to the page linked below mentioning E_INVALIDARGS but that error is only returned if the input type of load() is not of an applicable type


.load()
"Return Values
Boolean. Returns True if the load succeeded; False if the load failed."

"xmlSource
An indicator of the source XML to parse. This may be an URL (String/BSTR), a Request object (in an ASP page), an IStream, SAFEARRAY of bytes (VT_ARRAY|VT_UI1), a DOMDocument object, or any object that supports IStream, ISequentialStream, or IPersistStream."

parseError members


In short this is not a bug in mIRC, but rather scripter error.
Posted By: kap

Re: $com issue - 06/09/20 03:00 PM

Originally Posted by FroggieDaFrog
In short this is not a bug in mIRC, but rather scripter error.


Alright, cheers! Thank you for the information/break down SReject. :-)
© 2020 mIRC Discussion Forums