ACSErr::Completion *ErrorComponent::completionOnStack(CORBA::Short depth) 
{
    ACS_TRACE("::ErrorComponent::completionOnStack");

    // here we get LOCAL (C++) completion 
    CompletionImpl *comp = createCompletion(depth);
    

    // if comp does not contain error (=is error free) we return it 
    // otherwise we create a new completion which takes the error trace from a completion comp.
    if (comp->isErrorFree())
	{
	// memory for comp is released in the call 
	return comp->returnCompletion();
	}
    else
	{
	// The constructor takes care for the memory manamgent 
	// for the passed completion or exception.
	// If a completion or an exception is passed as pointer the constructor assumes that
        // completion was created on the heap and thus it deletes it afterwards,
	// so it MUST NOT be deleted by the user !
	// If a completion or an exception is passed as an object (or reference to it) 
	// the constructor assumes that the it was created on the stack 
	// and thus it does not delete it.
        //
        // NOTE: do not pass a pointer of a completion or an exception 
	// which was created on the stack !! In this case just send the completion object.
	ACSErrTypeCommon::GenericErrorCompletion erg(comp, 
						     __FILE__, __LINE__, 
						     "ErrorComponent::completionOnStack");
	erg.setErrorDesc("Put an error trace in completionOnStack");
	return erg.returnCompletion(false); 
        // With false flag we tell returnCompletion() 
	// not to delete its object
	// since it is automatically deleted when we go out of scope
	}//if
}//completionOnStack
Пример #2
0
int set_new_value(KscServerBase* Server, Dienst_param* Params,
                  PltString& out)
/*****************************************************************************/
{
    KsSetVarParams          setpar(1);
    KsSetVarResult          erg(1);
    KscAvSimpleModule       *AV = GetClientAV();

    SetInstVarItems         *pset;
    PltString               log;
    int                     error;
    int                     fehler = 0;
    size_t                  siz;        // Merker : Anzahl zu setzenden Variablen
    size_t                  i;          // Lauf-Variable
    KsString                VarName;    // Merker : NAme der zu setzender Variable
    //char                    help[256];
    int                     isVendor = 0;

    if( !Params->Set_Inst_Var) {
        return 0;
    }
    if( !Params->Set_Inst_Var->Inst_var) {
        return 0;
    }

    pset = Params->Set_Inst_Var;

    // Sonderfall: "Vendor"
    VarName = pset->Inst_name;
    if(VarName == "/vendor") {
        isVendor = 1;
    }
    
    while(pset) {
        error = GetCreateObjectVar( pset->Inst_var, setpar.items);
        if(!error) {
            siz = setpar.items.size();
            for(i = 0; i < siz; i++) {
                VarName = setpar.items[i].path_and_name;
                setpar.items[i].path_and_name = pset->Inst_name;
                if(isVendor) {
                    // Trenner ist '/'. Der Variable wurde '.' hinzugefuegt
                    setpar.items[i].path_and_name += "/";
                    setpar.items[i].path_and_name += VarName.substr(1);
                } else {
                    // Part-Variable. Trenner '.' bereits in Name
                    setpar.items[i].path_and_name += VarName;
                }
            }
            bool ok = Server->requestByOpcode ( KS_SETVAR, AV, setpar, erg);
            if(!ok) {
                error = Server->getLastResult();
                if(error == KS_ERR_OK) error = KS_ERR_GENERIC;
            } else if(erg.result) {
                error = erg.result;
            } else {
                siz = erg.results.size();
                for(i = 0; i < siz; i++) {
                    if( erg.results[i].result) {
                        error = erg.results[i].result;
                        break;
                    }
                }
            }
        }
        if(error) {
            // Letzte Fehler-Kode merken
            fehler = error;
            out += log_getErrMsg(error, "Instance",pset->Inst_name,"couldn't be updated.");
        
            log  = "\"%s\"  \"";
            log += pset->Inst_name;
            log += "\"";
            iFBS_SetLastError(1, error, log);

        } else {
            out += log_getOkMsg("Instance",pset->Inst_name,"updated");
        }

        pset = pset->next;
    } /* while pset */ 

    return fehler;

} /* set_new_value() */