CAD-ProEngineer
view release on metacpan or search on metacpan
ProEngineer.xs view on Meta::CPAN
/* CAD::ProEngineer.xs
*
* Copyright (c) 2003 Marc Mettes
*
* See COPYRIGHT section in ProEngineer.pm for usage and distribution rights.
*/
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ProToolkit.h"
#include "ProUtil.h"
#include "ProMenu.h"
#include "ProMenuBar.h"
#include "ProUICmd.h"
#include "ProParameter.h"
#include "ProDimension.h"
/* bless_safefree()
Generates a blessed object from a pointer. Will mark the object for
use with Safefree() if 'add_safefree' is TRUE. The object is compatible
with blessed objects created by sv_setref_pv().
In the context of a VisitAction or VisitFilter function, we should not
be attempting to free the object pointer when perl destroys the object.
This function can flag the new perl object so that Safefree() will not
be called.
*/
/* */
SV* bless_safefree(char *class_name, void *ptr, int add_safefree) {
SV *tmp_sv, *rv;
tmp_sv = newSV(0);
sv_setiv(tmp_sv, PTR2IV(ptr));
sv_setpv(tmp_sv, (add_safefree ? "safefree" : "Do not safefree this object!"));
SvIOK_on(tmp_sv);
rv = (SV *)newRV_noinc((SV *)tmp_sv);
sv_bless(rv, gv_stashpv(class_name,FALSE));
/* printf("class_name: %s\n", HvNAME(gv_stashpv(class_name,FALSE))); */
/* printf("Object: |%s| |%d|\n", SvPV_nolen((SV*)SvRV(rv)), SvIV((SV*)SvRV(rv)) ); */
/* printf("sv_isobject:%d sv_derived_from:%d sv_isa:%d\n",
sv_isobject(rv), sv_derived_from(rv, "CAD::ProEngineer::ProModelitem"),
sv_isa(rv, "CAD::ProEngineer::ProModelitem")); */
/* Was this, but we need to be able to flag objects for Safefree */
/* promdlitem_sv = newSV(0); */
/* sv_setref_pv(promdlitem_sv, "CAD::ProEngineer::ProModelitem", (void*)modelitem); */
return(rv);
}
/* std_DESTROY()
Common code for object destructor.
*/
/* */
int std_DESTROY(SV *rv) {
void *ptr;
IV tmp = SvIV((SV*)SvRV(rv));
ptr = INT2PTR(void *,tmp);
if (strEQ(SvPV_nolen((SV*)SvRV(rv)), "safefree")) {
Safefree(ptr);
return(TRUE);
}
else {
ProEngineer.xs view on Meta::CPAN
item_idx = 1;
total_items = items - 1;
}
else {
item_idx = 0;
total_items = items;
}
if (total_items < 7 || total_items > 8) {
XSRETURN_UNDEF;
}
/* Extract arguments */
/* */
action_name = SvPV_nolen(ST(item_idx));
rv_uiCmdCmdActFn_cv = ST(item_idx+1);
if (!SvROK(rv_uiCmdCmdActFn_cv) || SvTYPE(SvRV(rv_uiCmdCmdActFn_cv)) != SVt_PVCV) {
rv_uiCmdCmdActFn_cv = &PL_sv_undef;
}
priority = SvIV(ST(item_idx+2));
uiCmdAccessState_type = SvIV(ST(item_idx+3));
active_win = SvIV(ST(item_idx+4));
aux_win = SvIV(ST(item_idx+5));
cmdid_sv = ST(item_idx+6);
switch (uiCmdAccessState_type) {
case ACCESS_AVAILABLE:
default:
uiCmdAccessState_fp = (void *)std_uiCmdAccessState_ACCESS_AVAILABLE;
break;
}
err = ProCmdActionAdd(action_name, (uiCmdCmdActFn)std_uiCmdCmdActFn, priority,
(uiCmdAccessFn)uiCmdAccessState_fp, active_win, aux_win, &cmd_id);
/* Store cmd_id in an sv */
/* */
ptr_iv = PTR2IV(cmd_id);
/* printf(" ProCmdActionAdd: cmd_id_str = %d\n", ptr_iv); */
sv_setiv(cmdid_sv, ptr_iv);
/* Store uiCmdCmdActFn cv ref in new HV using stringified cmd_id as the key */
/* */
uiCmdCmdActFn_hv = (HV *)sv_2mortal((SV *)newHV());
hv_store(uiCmdCmdActFn_hv, SvPV_nolen(cmdid_sv), SvCUR(cmdid_sv), SvREFCNT_inc(rv_uiCmdCmdActFn_cv), 0);
rv_uiCmdCmdActFn_hv = (SV *)newRV_inc((SV *)uiCmdCmdActFn_hv);
if (rv_uiCmdCmdActFn_hv == NULL) { printf("rv_uiCmdCmdActFn_hv is NULL\n"); } else { /* printf("rv_uiCmdCmdActFn_hv ok\n"); */ }
/* Store HV ref in "Callbacks" hash under key: "uiCmdCmdActFn" */
/* */
module_cb_hv = get_hv("CAD::ProEngineer::Callbacks", TRUE);
if (module_cb_hv == NULL) { printf("module_cb_hv is NULL\n"); } else { /* printf("module_cb_hv ok\n"); */ }
/* Store uiCmdCmdActFn ref in "Callbacks" hash under key: "uiCmdCmdActFn" */
/* */
hv_store(module_cb_hv, uiCmdCmdActFn_hv_key, strlen(uiCmdCmdActFn_hv_key), SvREFCNT_inc(rv_uiCmdCmdActFn_hv), 0);
void
ProMenubarmenuPushbuttonAdd(...)
INIT:
int item_idx = 0, total_items = 0;
char *menu_name, *button_name, *button_label, *button_help, *neighbor;
int add_after_neighbor;
uiCmdCmdId cmd_id;
ProFileName msg_file_wstr;
ProError err;
PPCODE:
/* Determine if OO calling syntax */
/* */
if (items >= 1 && sv_isobject(ST(0)) && sv_isa(ST(0), "CAD::ProEngineer")) {
item_idx = 1;
total_items = items - 1;
}
else {
item_idx = 0;
total_items = items;
}
if (total_items < 8 || total_items > 9) {
XSRETURN_UNDEF;
}
menu_name = SvPV_nolen(ST(item_idx));
button_name = SvPV_nolen(ST(item_idx+1));
button_label = SvPV_nolen(ST(item_idx+2));
button_help = SvPV_nolen(ST(item_idx+3));
neighbor = SvPV_nolen(ST(item_idx+4));
add_after_neighbor = SvIV(ST(item_idx+5));
cmd_id = INT2PTR(uiCmdCmdId,SvIV(ST(item_idx+6)));
ProStringToWstring(msg_file_wstr, SvPV_nolen(ST(item_idx+7)));
/* printf("cmd_id: %d\n", cmd_id); */
err = ProMenubarmenuPushbuttonAdd(menu_name, button_name, button_label, button_help,
neighbor, add_after_neighbor, cmd_id, msg_file_wstr);
if (GIMME_V != G_VOID) {
/* return err */
XPUSHs(sv_2mortal(newSViv(err)));
}
void
ProParameterInit(...)
INIT:
int item_idx = 0, total_items = 0;
ProError err;
SV *proparameter_sv, *rv;
ProModelitem *modelitem;
ProParameter *parameter;
ProName w_name;
char *name;
PPCODE:
/* Determine if OO calling syntax */
/* */
if (items >= 1 && sv_isobject(ST(0)) && sv_isa(ST(0), "CAD::ProEngineer")) {
item_idx = 1;
total_items = items - 1;
}
else {
item_idx = 0;
total_items = items;
}
if (items >= 1 && sv_derived_from(ST(item_idx), "CAD::ProEngineer::ProModelitem")) {
/* Perl CAD::ProEngineer::ProModelitem to C ProModelitem conversion here */
IV tmp = SvIV((SV*)SvRV(ST(item_idx)));
modelitem = INT2PTR(void *,tmp);
}
else {
/* If not Perl CAD::ProEngineer::ProModelitem, then return Perl undef */
XSRETURN_UNDEF;
}
/* printf("before arg checks\n"); */
if (total_items < 2 || total_items > 3) {
XSRETURN_UNDEF;
}
name = SvPV_nolen(ST(item_idx+1));
ProStringToWstring(w_name,name);
New(0, parameter, 1, ProParameter);
err = ProParameterInit(modelitem, w_name, parameter);
if (parameter == NULL) {
printf(" parameter was NULL\n");
}
if (err != PRO_TK_NO_ERROR) {
parameter = NULL;
}
/* proparameter_sv = newSV(0);
sv_setref_pv(proparameter_sv, "CAD::ProEngineer::ProParameter", (void*)parameter); */
rv = (SV *)bless_safefree("CAD::ProEngineer::ProParameter", (void*)parameter, TRUE);
( run in 0.613 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )