Example #1
0
static lua_State* luacom_DoRegistryFile(const char* luaclsid) {
  lua_State* L_inproc = NULL;
  char* fileName;
  char* key = new char[strlen(luaclsid)+18];

  strcpy(key, "CLSID\\");
  strcat(key,luaclsid);
  strcat(key,"\\ScriptFile");

  if(tCOMUtil::GetRegKeyValue(key,&fileName)) {
    L_inproc = luaL_newstate();
    luaL_openlibs(L_inproc);
    #ifdef IUP
      /* iuplua initialization */
      iuplua_open(L_inproc);
      iupkey_open(L_inproc);
      cdlua5_open(L_inproc);
      #ifndef NO_CPICONTROLS
      controlslua_open(L_inproc);
      gllua_open(L_inproc);
      #endif
      #ifdef SPEECH_SDK
      speechlua_open(L_inproc);
      #endif
      #ifdef USE_GLLUA
      gl_open(L_inproc);
      #endif
      iupluaim_open(L_inproc);
    #endif

    luacom_open(L_inproc);
    lua_pushvalue(L_inproc, LUA_REGISTRYINDEX);
    lua_pushstring(L_inproc,"inproc");
    lua_pushboolean(L_inproc,TRUE);
    lua_settable(L_inproc,-3);
    lua_pop(L_inproc,1);

    if(!lua_dofile(L_inproc,fileName)) {
      lua_pushstring(L_inproc,"StartAutomation");
      lua_gettable(L_inproc,-2);
      if(luaCompat_call(L_inproc, 0, 0)) {
        luacom_close(L_inproc);
        lua_close(L_inproc);
        L_inproc = NULL;
      }
    } else {
      luacom_close(L_inproc);
      lua_close(L_inproc);
      L_inproc = NULL;
    }
  }

  delete[] key;
  SAFEDELETEARR(fileName);
  return L_inproc;
}
// lua C function that dispatches events
// to sinks
int tLuaCOMConnPoint::call_sinks(lua_State *L)
{
  /// positions of parameters
  
  // self param (not used, but needed for ensuring
  // consistency
  const int self_param        = 1;

  // first user param 
  const int user_first_param  = 2;
  
  // last user param, excluding upvalues
  const int user_last_param   = luaCompat_getNumParams(L, 2);

  // upvalues
  const int connpoint         = luaCompat_upvalueIndex(L, 1, 2);
  const int event             = luaCompat_upvalueIndex(L, 2, 2);

  int num_params = 0;

  if(user_last_param < user_first_param)
    num_params = 0;
  else
    num_params = user_last_param - user_first_param + 1;

  // counter
  int i = 0;
   
  // gets connection point
  tLuaCOMConnPoint* cp = 
    (tLuaCOMConnPoint*) luaCompat_getPointer(L, connpoint);

  // call each sink
  for(i = 0; i < (int)cp->cConnections; i++)
  {
    // pushes function
    LuaBeans::push(L, cp->sinks[i]);
    cp->sinks[i]->Lock();

    lua_pushvalue(L, event);
    lua_gettable(L, -2);
    
    // removes table, leaving just function
    lua_remove(L, -2);

    // self param (mandatory but unused)
    LuaBeans::push(L, cp->sinks[i]);
    cp->sinks[i]->Lock();

    // duplicates parameters (if any)
    for(i = user_first_param; i <= user_last_param; i++)
    {
      lua_pushvalue(L, i);
    }

    // calls function (including self param)
    // ignoring errors
    luaCompat_call(L, num_params+1, 0, NULL);

    // cleans stack
    lua_settop(L, user_last_param);
  }

  // events do not return nothing
  return 0;
}
Example #3
0
int luaCompat_call(lua_State* L, int nargs, int nresults)
{
	tStringBuffer err;
	return luaCompat_call(L, nargs, nresults, err);
}