properties.c-Dateireferenz

#include "/sys/thing/properties.h"
#include "/secure/wizlevels.h"
Include-Abhängigkeitsdiagramm für properties.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define NEED_PROTOTYPES

Funktionen

protected void InitializeProperties ()
protected void create ()
protected void create_super ()
nomask private int allowed ()
public varargs mixed Set (string name, mixed Value, int Type, int extern)
public varargs mixed Query (string name, int Type)
public mixed SetProp (string name, mixed Value)
public mixed QueryProp (string name)
public void SetProperties (mapping props)
public mapping QueryProperties ()
public mixed * __query_properties ()
public void _set_save_data (mixed data)
public mixed _get_save_data ()

Variablen

private nosave mapping * prop = ({ ([]), ([]), ([]), ([]) })
private mapping properties
private nosave int closure_call

Makro-Dokumentation

#define NEED_PROTOTYPES

Definiert in Zeile 21 der Datei properties.c.


Dokumentation der Funktionen

public mixed* __query_properties (  ) 

Definiert in Zeile 311 der Datei properties.c.

Benutzt prop.

00312 {
00313   if ( pointerp(prop) )
00314     return(deep_copy(prop));
00315   else
00316     return ({ ([]),([]),([]),([]) });
00317 }

public mixed _get_save_data (  ) 

Definiert in Zeile 325 der Datei properties.c.

Benutzt properties.

00325 { return properties; }

public void _set_save_data ( mixed  data  ) 

Definiert in Zeile 322 der Datei properties.c.

Benutzt properties.

00322 { properties = data; }

nomask private int allowed (  ) 

Definiert in Zeile 58 der Datei properties.c.

Benutzt IS_ARCH und ROOTID.

00059 {
00060     if ( (previous_object() && IS_ARCH(getuid(previous_object())) &&
00061           this_interactive() && IS_ARCH(this_interactive())) ||
00062          (previous_object() && getuid(previous_object()) == ROOTID &&
00063           geteuid(previous_object()) == ROOTID) )
00064         return 1;
00065     return 0;
00066 }

protected void create (  ) 

Definiert in Zeile 47 der Datei properties.c.

Benutzt set_next_reset().

00047                         {
00048   // Blueprints in /std benoetigenkeinen Reset ....
00049   if (object_name()=="/std/thing/properties")
00050     set_next_reset(-1);
00051 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

protected void create_super (  ) 

Definiert in Zeile 53 der Datei properties.c.

Benutzt set_next_reset().

00053                               {
00054   set_next_reset(-1);
00055 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

protected void InitializeProperties (  ) 

Definiert in Zeile 41 der Datei properties.c.

Benutzt prop.

00041                                       {
00042   prop = ({ ([]), ([]), ([]), ([]) });
00043   return;
00044 }

public varargs mixed Query ( string  name,
int  Type 
)

Definiert in Zeile 137 der Datei properties.c.

Benutzt prop.

00138 {
00139     if (pointerp(prop)) return prop[Type][name];
00140     return 0;
00141 }

public mixed QueryProp ( string  name  ) 

Definiert in Zeile 197 der Datei properties.c.

Benutzt closure_call, F_QUERY_METHOD, F_VALUE, flag, prop und result().

00198 {
00199   closure func;
00200   mixed result;
00201  
00202   // nur fuer heute
00203   if (!objectp(this_object()))
00204     return;
00205 
00206   // Query-Methode vorhanden?
00207   if ( func = prop[F_QUERY_METHOD][name] )
00208   {
00209     int flag;
00210 
00211     // Wert als Query-Method? Gleich zurueckgeben ...
00212     if (!closurep(func)) return func;
00213  
00214     // An dieser Stelle muss func eine Closure sein. Da Set() ungebundene
00215     // Lambdas bindet, kann es auch nur eine gebundene Closure sein und das
00216     // Objekt existiert auch noch (sonst waere func == 0).
00217    
00218     // closure_call setzen, falls noch nicht gesetzt
00219     if ((flag=closure_call<time()))
00220       closure_call = time()+59;
00221     
00222     // Dann Mal die Closure aufrufen. Bei Fehler selbige loeschen
00223     if (catch(result=funcall(func);publish))
00224     {
00225       prop[F_QUERY_METHOD]-=([name]);
00226     }
00227     // Wenn closure_call gesetzt wurde, wieder loeschen    
00228     if (flag) closure_call = 0;
00229     
00230     // Und zurueckgeben
00231     return result;
00232   }
00233   
00234   // _query_*-Methode vorhanden? falls ja, aufrufen.
00235   // TODO: Closurecache und nur rufen, wenn es _query_* auch gibt?
00236   if (call_resolved(&result,this_object(),"_query_"+name))
00237     return result;
00238   
00239   // Hilft alles nichts. Es ist eine 'normale' Property ...
00240   return prop[F_VALUE][name];
00241 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public mapping QueryProperties (  ) 

Definiert in Zeile 289 der Datei properties.c.

Benutzt i und prop.

00290 {
00291   mapping props;
00292   int i, j;
00293   string *names;
00294 
00295   props = m_allocate( 0, 4 );
00296   
00297   if (pointerp(prop))
00298   {
00299     i=4;
00300     while(i--)
00301     {
00302       names = m_indices(prop[i]);
00303       j=sizeof(names);
00304       while(j--) props[names[j], i] = prop[i][names[j]];
00305     }
00306   }
00307   return props;
00308 }

public varargs mixed Set ( string  name,
mixed  Value,
int  Type,
int  extern 
)

Definiert in Zeile 70 der Datei properties.c.

Benutzt allowed, closure_call, F_MODE, F_MODE_AD, F_MODE_AS, F_QUERY_METHOD, F_SET_METHOD, NOSETMETHOD, prop, PROTECTED, query_closure_object() und SECURED.

00071 {
00072 
00073   if (!objectp(this_object()))
00074     return 0;
00075 
00076   // Properties, die SECURED oder PROTECTED sind, duerfen nur vom Objekt
00077   // selber, EM+ oder ROOT veraendert werden
00078   if ((prop[F_MODE][name]&(PROTECTED|SECURED))&&
00079       (closure_call||extern||extern_call()) &&
00080        previous_object() != this_object() && !allowed())
00081     return -1;
00082   
00083   // Das SECURED-Flag darf bei Properties nicht mehr geloescht werden
00084   if ((prop[F_MODE][name]&SECURED)&&
00085       (Type==F_MODE||Type==F_MODE_AD)&&(Value & SECURED))
00086     return -2;
00087   
00088   // Setzen duerfen das SECURED-Flag nur das Objekt selber, EM+ oder ROOT
00089   if ((Type==F_MODE||Type==F_MODE_AS)&&(Value&SECURED)&&
00090       (closure_call ||extern || extern_call()) &&
00091        previous_object() != this_object() && !allowed() )
00092     return -3;
00093 
00094   switch(Type)
00095   {
00096     // Je nach Modus Flags veraendern
00097     case F_MODE_AS:  prop[F_MODE][name]|= Value;
00098                      return prop[F_MODE][name];
00099     case F_MODE_AD:  prop[F_MODE][name]&= ~Value;
00100                      if (!prop[F_MODE][name]) prop[F_MODE]-=([name]);
00101                      return prop[F_MODE][name];
00102     case F_MODE:     prop[F_MODE][name]^= Value;
00103                      if (!prop[F_MODE][name]) prop[F_MODE]-=([name]);
00104                      return prop[F_MODE][name];
00105     case F_SET_METHOD:
00106       // -1 als Setz-Methode: Nosetmethod setzen
00107       if (Value == -1)
00108       {
00109         prop[F_SET_METHOD]-=([name]);
00110         prop[F_MODE][name] |= NOSETMETHOD;
00111         return 0;
00112       }
00113       // Kein break!
00114     case F_QUERY_METHOD:
00115       // Ungebundene Lambda_Closure? Binden!
00116       if (closurep(Value)&&!query_closure_object(Value))
00117       {
00118         if (extern_call() &&
00119              (getuid(previous_object()) != getuid()||
00120               geteuid(previous_object()) != geteuid()))
00121           return prop[Type][name];
00122         
00123         Value = bind_lambda( Value,this_object());
00124       }
00125       // Kein break!
00126     default:
00127       if (!Value) prop[Type]-=([name]);
00128       else prop[Type][name] = Value;
00129   }
00130 
00131   // Gesamtwert zurueckgeben
00132   return prop[Type][name];
00133 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public mixed SetProp ( string  name,
mixed  Value 
)

Definiert in Zeile 144 der Datei properties.c.

Benutzt closure_call, F_MODE, F_SET_METHOD, F_VALUE, flag, NOSETMETHOD, prop, result() und Set().

Wird benutzt von _cd2(), _channel(), _check_wear_restrictions(), _clone_items(), _echo(), _examine(), _flush_cache(), _look(), _msg_beep(), _msg_prepend(), _oropax(), _query_questpoints(), _query_total_light(), _sense_exa(), _set_autoloadobj(), _set_disable_attack(), _set_extern_attributes_modifier(), _set_extern_health_modifier(), _set_frog(), _set_max_hp(), _set_max_sp(), _set_resistance(), _set_vulnerability(), _set_weight(), _setcmsg(), _setdmsg(), _toggle_brief(), _traenke(), add_player(), AddAmount(), AddArmour(), AddDefender(), AddExp(), AddItem(), AddLiquid(), AddPursuer(), AddRoomMessage(), AddSkill(), AddSpell(), AddWeapon(), AssocMember(), Attack(), binde_seil(), blaettere(), catch_up_hbs(), ChannelAdmin(), ChannelParser(), check_and_update_timed_key(), CiceroneCmd(), consume(), create(), create_default_npc(), Damage(), DeAssocMember(), defuel_drink(), defuel_food(), DelayPreparedSpells(), desc_check(), do_damage(), do_decay(), DoUnwear(), DoUnwield(), DoWear(), DoWield(), drink_alcohol(), drink_soft(), drink_this(), DryPlant(), eat_food(), eat_this(), empty(), FinalSetup(), FreeHands(), fuelle(), geschmack(), getmode(), getstatus(), getstring(), gettext(), heal_self(), heart_beat(), Identify(), init(), InitSkills(), InsertSensitiveObjectToList(), IsEqual(), lies(), LiquidContDescr(), liste(), loese_seil(), long(), MakeDrink(), mnpc_create(), move(), name(), NewbieChangeMsg(), NewbieStatusMsg(), NotifyMove(), oeffne(), Pacify(), PourLiquid(), QueryDamage(), QueryDefend(), QueryPreferedEnemy(), quit(), reduce_hit_points(), reduce_spell_points(), RegisterChannels(), reise(), remove(), RemoveDefender(), RemoveExit(), RemoveItem(), RemovePursuer(), RemoveSensitiveObjectFromList(), reset(), restore_spell_points(), schliesse(), set_email(), set_homepage(), set_icq(), set_messenger(), SetAttackChats(), SetChats(), SetEvalFactor(), setup(), team_aufnahmewunsch(), tie(), ungewaehlt(), unterschreibe(), UnwearArmour(), UnwearClothing(), UseHands(), walk_random(), WearArmour() und WearClothing().

00145 {
00146   closure func;
00147   mixed result;
00148    
00149   // nur fuer heute
00150   if (!objectp(this_object()))
00151     return 0;
00152 
00153   // NOSETMETHOD: Darf nicht gesetzt werden
00154   if (prop[F_MODE][name] & NOSETMETHOD ) return -1;
00155 
00156   // Set-Method abfragen, so vorhanden
00157   if (func=prop[F_SET_METHOD][name])
00158   {
00159     int flag;
00160 
00161     // Wert als Set-Method? gleich zurueckgeben
00162     if (!closurep(func)) return func;
00163 
00164     // An dieser Stelle muss func eine Closure sein. Da Set() ungebundene
00165     // Lambdas bindet, kann es auch nur eine gebundene Closure sein und das
00166     // Objekt existiert auch noch (sonst waere func == 0).
00167 
00168     // closure_call setzen, falls noch nicht gesetzt
00169     if ((flag=closure_call<time()))
00170       closure_call = time()+59;
00171 
00172     // Dann mal die Closure aufrufen. Bei Fehler selbige loeschen
00173     if (catch(result=funcall(func, Value, name);publish))
00174     {
00175       prop[F_SET_METHOD]-=([name]);
00176     }
00177       
00178     // Wenn closure_call gesetzt wurde, wieder loeschen
00179     if (flag) closure_call = 0;
00180 
00181     // Und zurueckgeben
00182     return result; 
00183   }
00184 
00185   // _set_*-Methode vorhanden? falls ja, aufrufen.i
00186   // TODO: Closurecache einfuehren und Funktionaufruf nur noch machen, wenn es
00187   // die _set_* auch gibt?
00188   if (call_resolved(&result,this_object(),"_set_"+name,Value ))
00189         return result;
00190 
00191   // Letzte Moeglichkeit: Muss eine 'normale' Property sein
00192   return Set( name, Value, F_VALUE, extern_call() );
00193 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public void SetProperties ( mapping  props  ) 

Definiert in Zeile 245 der Datei properties.c.

Benutzt allowed, closure_call, F_MODE, i, prop, PROTECTED und SECURED.

00246 {
00247   string *names;
00248   int i, j, same_object;
00249  
00250   // Kein Mapping? Schlecht ...
00251   if(!mappingp(props)) return;
00252 
00253   // Setzen wir selber?
00254   same_object = (!closure_call &&
00255                  (!extern_call()||previous_object()==this_object()||
00256                   allowed()));
00257   names = m_indices(props);
00258   
00259   // Das SECURED-Flag darf nur durch das Objekt selber gesetzt werden:
00260   // Alle SECURED-Flags aus props loeschen
00261   if (!same_object)
00262   {
00263     j=sizeof(names);
00264     while(j--) props[names[j], F_MODE] &= ~SECURED;
00265   }
00266 
00267   j=sizeof(names);
00268   while(j--)
00269   {
00270     // Properties, die schon SECURED oder PROTECTED sind, duerfen
00271     // nur vom Objekt selber manipuliert werden
00272     if (same_object||!(prop[F_MODE][names[j]] & (PROTECTED|SECURED)) )
00273     {
00274       i=4;
00275       while(i--)
00276       {
00277         if(props[names[j],i])
00278           prop[i][names[j]] = props[names[j], i];
00279         else
00280           prop[i]-=([names[j]]);
00281       }
00282     }
00283   }
00284   return;
00285 }


Variablen-Dokumentation

private nosave int closure_call

Definiert in Zeile 34 der Datei properties.c.

Wird benutzt von QueryProp(), Set(), SetProp() und SetProperties().

private nosave mapping* prop = ({ ([]), ([]), ([]), ([]) })
private mapping properties

Definiert in Zeile 31 der Datei properties.c.

Erzeugt am Thu Jun 3 14:43:21 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3