Uno/Cpp/Snippet/Function always returning an appropriate object

From Apache OpenOffice Wiki
< Uno‎ | Cpp
Jump to: navigation, search

Callee:

// This function is environment specialized on "c++<purpose>*".
uno::Reference<uno::XInterface> create_appropriateObject(void) {
  cppu::FreeReference<uno::XInterface> result_Obj;
 
  // We may want to open a new scope, to ensure that "result_Obj" does
  // not get destructed while "c++:unsafe" is active.
  {
    // We need to remember the callers environment, to "map-out/in"
    // the parameters and return values properly.
    uno::Environment outerEnv(uno::getCurrent());
 
    // We activate (enter) the "c++:unsafe" environment.
    // Note: Any other environment suiteable for "MyUnsafeObject" would work as well.
    cppu::EnvGuard unsafeGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_UPARAM("c++:unsafe"))));
 
    // This reference points to a "thread-unsafe" object.
    Reference<uno::XInterface> unsafeEnv_Obj(new MyUnsafeObject());
 
    // We may do some activations on "unsafeEnv_Obj".
    unsafeEnv_Obj->doThis();
    unsafeEnv_Obj->doThat();
 
    // We assign it to "result_Obj".
    // Using "result_obj" is "safe" anywhere.
    result_Obj.set(unsafeEnv_Obj, SAL_NO_ACQUIRE);
 
    // The unsafeEnv_Obj reference gets destructed here, actually calling the "release" method in the right environment.
    // The unsafeGuard gets destructed here, deactivating the "c++:unsafe" environment.
  }
 
  return result_Obj;
}

Caller:

...
{
  // Whatever "c++<purpose>*" we enter, the result of "create_appropriateObject" will 
  // always match.
  cppu::EnvGuard cppDebug_Guard(rtl::OUString(RTL_CONSTASCII_PARAM("c++:debug")));
 
  uno::Reference obj(create_appropriateObject());
}
...
Personal tools