Trace.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #if DEBUG
  2. # include "../Constants.h"
  3. # include "../LinJam.h"
  4. # include "Trace.h"
  5. /* Trace class public class variables */
  6. int Trace::DbgPrevStatus = APP::LINJAM_STATUS_INIT ;
  7. /* Trace class public class methods */
  8. void Trace::TraceEvent (String msg) { if (DEBUG_TRACE_EVENTS ) DBG("[EVENT]: " + msg) ; }
  9. void Trace::TraceConfig (String msg) { if (DEBUG_TRACE_CONFIG ) DBG("[CONFIG]: " + msg) ; }
  10. void Trace::TraceConfigVb(String msg) { if (DEBUG_TRACE_CONFIG_VB) DBG("[CONFIG]: " + msg) ; }
  11. void Trace::TraceClient (String msg) { if (DEBUG_TRACE_CLIENT ) DBG("[CLIENT]: " + msg) ; }
  12. void Trace::TraceServer (String msg) { if (DEBUG_TRACE_SERVER ) DBG("[SERVER]: " + msg) ; }
  13. void Trace::TraceGui (String msg) { if (DEBUG_TRACE_GUI ) DBG("[GUI]: " + msg) ; }
  14. void Trace::TraceGuiVb (String msg) { if (DEBUG_TRACE_GUI_VB ) DBG("[GUI]: " + msg) ; }
  15. #ifndef DEBUG_ANSI_COLORS
  16. void Trace::TraceState (String msg) { if (DEBUG_TRACE_STATE ) DBG("[STATE]: " + msg) ; }
  17. void Trace::TraceError (String msg) { if (DEBUG_TRACE_STATE ) DBG("[ERROR]: " + msg) ; }
  18. // void Trace::TraceNetwork(String msg) { if (DEBUG_TRACE_EVENTS) DBG("[NETWORK]: " + msg) ; }
  19. #else // DEBUG_ANSI_COLORS
  20. void Trace::TraceState (String msg)
  21. { if (DEBUG_TRACE_STATE) DBG("\033[1;33m[STATE]: " + msg + "\033[0m") ; }
  22. void Trace::TraceError (String msg)
  23. { if (DEBUG_TRACE_STATE) DBG("\033[0;31m[ERROR]: " + msg + "\033[0m") ; }
  24. // void Trace::TraceNetwork(String msg)
  25. // { if (DEBUG_TRACE_EVENTS) DBG("\033[0;32m[NETWORK]: " + msg + "\033[0m") ; }
  26. #endif // DEBUG_ANSI_COLORS
  27. void Trace::DumpStoreXml(ValueTree store)
  28. {
  29. StringArray xml_lines = StringArray::fromLines(store.toXmlString()) ;
  30. xml_lines.removeRange(0 , 1) ; // supress doctype
  31. DBG(String(store.getType()) + " xml=\n" + xml_lines.joinIntoString("\n")) ;
  32. }
  33. void Trace::TraceKVP(String indent , String a_key , String a_value)
  34. {
  35. DBG(indent + a_key.paddedRight(' ' , 20) + " => " + a_value) ;
  36. }
  37. String Trace::DumpStoredChannels()
  38. {
  39. String dump = " localChannels =>" ;
  40. ValueTree channels = LinJam::Config->localChannels ;
  41. ValueTree users = LinJam::Config->remoteUsers ;
  42. for (int ch_n = 0 ; ch_n < channels.getNumChildren() ; ++ch_n)
  43. dump += "\n " + channels.getChild(ch_n)[CONFIG::CHANNEL_NAME_ID].toString() ;
  44. dump += "\n remoteChannels =>" ;
  45. for (int user_n = 0 ; user_n < users.getNumChildren() ; ++user_n)
  46. {
  47. channels = users.getChild(user_n) ;
  48. for (int ch_n = 0 ; ch_n < channels.getNumChildren() ; ++ch_n)
  49. dump += "\n " + String(channels.getType()) + " " +
  50. channels.getChild(ch_n)[CONFIG::CHANNEL_NAME_ID].toString() ;
  51. }
  52. return dump ;
  53. }
  54. String Trace::DumpClientChannels()
  55. {
  56. String dump = "\n client locals =>" ; int channel_n = -1 ; int channel_idx ;
  57. while (~(channel_idx = LinJam::Client->EnumLocalChannels(++channel_n)))
  58. dump += "\n " + LinJam::GetLocalChannelClientName(channel_idx) ;
  59. dump =+ "\n client remotes =>" ;
  60. int user_idx = LinJam::Client->GetNumUsers() ; String user_name ;
  61. while ((user_name = LinJam::GetRemoteUserName(--user_idx)).isNotEmpty())
  62. {
  63. dump += "\n " + user_name + " =>" ;
  64. int channel_n = -1 ; int channel_idx ;
  65. while (~(channel_idx = LinJam::Client->EnumUserChannels(user_idx , ++channel_n)))
  66. dump += "\n " + LinJam::GetRemoteChannelClientName(user_idx , channel_idx) ;
  67. }
  68. return dump ;
  69. }
  70. String Trace::DumpConfig(ValueTree default_config , ValueTree stored_config , String pad)
  71. {
  72. if (!default_config.isValid()) return "ERROR: default config invalid" ;
  73. if (!stored_config .isValid()) return "ERROR: stored config invalid" ;
  74. Identifier node_name = default_config.getType() ;
  75. int n_properties = default_config.getNumProperties() ;
  76. int n_default_children = default_config.getNumChildren() ;
  77. int n_stored_children = stored_config .getNumChildren() ;
  78. int n_unique_children = n_default_children ;
  79. // count unique child nodes
  80. if (stored_config.isValid())
  81. for (int child_n = 0 ; child_n < stored_config.getNumChildren() ; ++child_n)
  82. {
  83. Identifier child_node_name = stored_config.getChild(child_n).getType() ;
  84. if (!default_config.getChildWithName(child_node_name).isValid())
  85. ++n_unique_children ;
  86. }
  87. String dbg = pad + "node => " + String(node_name) +
  88. " (properties: " + String(n_properties ) +
  89. " - children: " + String(n_default_children) + " default, " +
  90. String(n_stored_children ) + " stored, " +
  91. String(n_unique_children ) + " unique" +
  92. ((!stored_config.isValid()) ? "- stored node n/a - adding)" : ")") ;
  93. // enumnerate properties
  94. if (n_properties)
  95. {
  96. for (int property_n = 0 ; property_n < n_properties ; ++property_n)
  97. {
  98. Identifier key = default_config.getPropertyName(property_n) ;
  99. var default_value = default_config.getProperty(key) ;
  100. var stored_value = (!stored_config.isValid()) ? "n/a - adding" :
  101. stored_config.getProperty(key , "n/a - adding") ;
  102. dbg += "\n" + pad + " key => " + String(key) +
  103. "\n" + pad + " default_value => " + default_value.toString() +
  104. "\n" + pad + " stored_value => " + stored_value.toString() ;
  105. }
  106. }
  107. // recurse on child nodes
  108. for (int child_n = 0 ; child_n < default_config.getNumChildren() ; ++child_n)
  109. {
  110. ValueTree default_child = default_config.getChild(child_n) ;
  111. Identifier child_node_name = default_child .getType() ;
  112. ValueTree stored_child = stored_config .getChildWithName(child_node_name) ;
  113. dbg += DumpConfig(default_child , stored_child , pad + " ") ;
  114. }
  115. // user-defined nodes
  116. Array<Identifier> user_keys ;
  117. user_keys.add(CONFIG::BLACKLIST_ID) ;
  118. user_keys.add(CONFIG::SERVERS_ID ) ;
  119. user_keys.add(CONFIG::LOCALS_ID ) ;
  120. user_keys.add(CONFIG::REMOTES_ID ) ;
  121. if (user_keys.contains(node_name))
  122. {
  123. for (int child_n = 0 ; child_n < stored_config.getNumChildren() ; ++child_n)
  124. {
  125. ValueTree stored_child = stored_config .getChild(child_n) ;
  126. Identifier node_name = stored_child .getType() ;
  127. ValueTree default_child = default_config.getChildWithName(node_name) ;
  128. int n_children = stored_child .getNumChildren() ;
  129. int n_properties = stored_child .getNumProperties() ;
  130. if (default_child.isValid() || n_children) continue ;
  131. dbg += "\n" + pad + " stored node => " + String(node_name) + " (" +
  132. ((n_properties)? String(n_properties) + " properties" : "empty") + ")" ;
  133. for (int property_n = 0 ; property_n < n_properties ; ++property_n)
  134. {
  135. Identifier key = stored_child.getPropertyName(property_n) ;
  136. String stored_value = stored_child.getProperty(key).toString() ;
  137. dbg += "\n" + pad + " key => " + String(key) +
  138. "\n" + pad + " stored_value => " + stored_value ;
  139. }
  140. }
  141. }
  142. return dbg ;
  143. }
  144. void Trace::TraceInvalidDefault(String a_default_name)
  145. { Trace::TraceError("default '" + a_default_name + "' invalid") ; }
  146. void Trace::TraceInvalidNode(String a_node_name)
  147. { Trace::TraceError("node '" + a_node_name + "' invalid") ; }
  148. void Trace::TraceMissingValue(String a_node_name , String a_value_name)
  149. { Trace::TraceError("node '" + a_node_name + "' - missing key '" + a_value_name + "'") ; }
  150. void Trace::TraceMissingProperty(String a_node_name , String a_property_name ,
  151. String parent_node_name )
  152. {
  153. if (parent_node_name.isNotEmpty()) parent_node_name += " " ;
  154. Trace::TraceError(parent_node_name + "node '" + a_node_name +
  155. "' - missing property '" + a_property_name + "'") ;
  156. }
  157. void Trace::TraceTypeMismatch(ValueTree a_node , String a_property_name ,
  158. String expected_type , var a_var ,
  159. String parent_node_name )
  160. {
  161. String a_node_name = String(a_node.getType()) ;
  162. if (parent_node_name.isNotEmpty()) parent_node_name += " " ;
  163. Trace::TraceError("type mismatch - " + parent_node_name + a_node_name +
  164. "[" + a_property_name + "] => " +
  165. VarType(a_var) + " (expected " + expected_type + ")") ;
  166. }
  167. void Trace::TraceInvalidValue(ValueTree a_node , Identifier a_property_id)
  168. {
  169. String a_node_name = String(a_node.getType()) ;
  170. String a_property_name = String(a_property_id) ;
  171. String a_value = a_node[a_property_id].toString() ;
  172. TraceError(a_node_name + " property " + a_property_name + " value " + a_value +
  173. " out of bounds - restoring default" ) ;
  174. }
  175. String Trace::VarType(var a_var) // juce var dynamic datatypes
  176. {
  177. return (a_var.isVoid() ) ? "void" :
  178. (a_var.isUndefined() ) ? "undefined" :
  179. (a_var.isInt() ) ? "int" :
  180. (a_var.isInt64() ) ? "int64" :
  181. (a_var.isBool() ) ? "bool" :
  182. (a_var.isDouble() ) ? "double" :
  183. (a_var.isString() ) ? "string" :
  184. (a_var.isObject() ) ? "object" :
  185. (a_var.isArray() ) ? "array" :
  186. (a_var.isBinaryData()) ? "binary" :
  187. (a_var.isMethod() ) ? "method" :
  188. "unknown" ;
  189. }
  190. String Trace::DumpVar(String val_name , var a_var)
  191. {
  192. return "key => " + val_name .paddedRight(' ' , 20) +
  193. " type => " + VarType(a_var).paddedRight(' ' , 10) +
  194. " value => " + a_var.toString() ;
  195. }
  196. String Trace::Status2String(int status)
  197. {
  198. return (status == -10) ? "LINJAM_STATUS_INIT" :
  199. (status == -9) ? "LINJAM_STATUS_AUDIOINIT" :
  200. (status == -8) ? "LINJAM_STATUS_CONFIGPENDING" :
  201. (status == -7) ? "LINJAM_STATUS_AUDIOERROR" :
  202. (status == -6) ? "LINJAM_STATUS_READY" :
  203. (status == -5) ? "LINJAM_STATUS_LICENSEPENDING" :
  204. (status == -4) ? "LINJAM_STATUS_ROOMFULL" :
  205. (status == -3) ? "NJC_STATUS_DISCONNECTED" :
  206. (status == -2) ? "NJC_STATUS_INVALIDAUTH" :
  207. (status == -1) ? "NJC_STATUS_CANTCONNECT" :
  208. (status == 0) ? "NJC_STATUS_OK" :
  209. (status == 1) ? "NJC_STATUS_PRECONNECT" :
  210. "(unknown: " + String(status) + ")" ;
  211. }
  212. #endif // #if DEBUG