Files
cdesktop/cde/programs/dtappbuilder/src/abmf/connect.c
Pascal Stumpf 1177e21080 WIP to make dtbuilder work on 64bit.
Fixes many, though not all 64bit-warnings.  In lots of places, pointers are
cast to ints to be then used as array subscripts.  The only way to deal with
this is to change them to long.  Additionally, use calloc() to allocate the
int_array in istr.c and drop the (wrong) macro patch to istr.h.  Should make
dtbuilder work on 32bit again.
2012-08-13 19:42:44 -06:00

285 lines
7.0 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these librararies and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/*
* $XConsortium: connect.c /main/3 1995/11/06 18:03:27 rswiston $
*
* @(#)connect.c 3.25 13 Feb 1994 cde_app_builder/src/abmf
*
* RESTRICTED CONFIDENTIAL INFORMATION:
*
* The information in this document is subject to special restrictions in a
* confidential disclosure agreement between HP, IBM, Sun, USL, SCO and
* Univel. Do not distribute this document outside HP, IBM, Sun, USL, SCO,
* or Univel without Sun's specific written approval. This document and all
* copies and derivative works thereof must be returned or destroyed at Sun's
* request.
*
* Copyright 1993 Sun Microsystems, Inc. All rights reserved.
*
*/
/*
* connect.c - Handles connections stuff
*/
#include <stdio.h>
#include <string.h>
#include <ab_private/trav.h>
#include "ui_header_fileP.h" /* abmfP_comp_get_widget_specific_includes */
#include "obj_namesP.h"
#include "connectP.h"
#define APP_PREFIX_LEN 4
#define APP_PREFIX "_app"
static int abmfP_set_action_names_for_obj(ABObj rootObj);
STRING
abmfP_get_action_name(ABObj action)
{
static char name[256];
STRING parent_name = (STRING) NULL;
ABObj from = NULL, parent = NULL;
STRING tmpName = NULL;
*name = 0;
from = obj_get_from(action);
if (action->info.action.auto_named && (from != NULL))
{
/* If the source object is the project,
* then this is an "Application" connection.
* This probably won't happen because right
* now "Application" connections can only be
* of type AB_FUNC_USER_DEF (which means auto-
* named is FALSE).
*/
if (obj_is_project(from))
{
parent = obj_get_project(action);
parent_name = (STRING) util_malloc(
strlen(obj_get_name(parent))
+ APP_PREFIX_LEN + 1);
strcpy(parent_name, obj_get_name(parent));
strcat(parent_name, APP_PREFIX);
}
else
{
parent = obj_get_module(from);
parent_name = obj_get_name(parent);
}
if (!util_strempty(parent_name) &&
!util_strempty(obj_get_name(from)))
{
sprintf(name, "%s_%s%s",
parent_name,
obj_get_name(from),
obj_get_func_name_suffix(action));
}
if (obj_is_project(from))
{
util_free(parent_name);
}
}
else
{
if ((tmpName = obj_get_func_name(action)) != NULL)
{
sprintf(name, "%s", tmpName);
}
}
return (name[0] == 0 ? NULL : name);
}
/*
*
*/
int
abmfP_tree_set_action_names(ABObj rootObj)
{
int return_value = 0;
AB_TRAVERSAL moduleTrav;
ABObj module = NULL;
if (!obj_is_project(rootObj))
{
return_value = abmfP_set_action_names_for_obj(rootObj);
}
else
{
/* for efficiency, we'll only visit those modules that are
* going to be written
*/
abmfP_set_action_names_for_obj(rootObj); /* project 1st */
for (trav_open(&moduleTrav, rootObj, AB_TRAV_MODULES);
(module = trav_next(&moduleTrav)) != NULL; )
{
if (obj_get_write_me(module))
{
abmfP_set_action_names_for_obj(module); /* each module */
}
}
trav_close(&moduleTrav);
}
return return_value;
}
static int
abmfP_set_action_names_for_obj(ABObj rootObj)
{
int return_value = 0;
int actionNum = -1;
AB_TRAVERSAL actionTrav;
ABObj action = NULL;
ABObj fromObj = NULL;
char buf[256];
if (mfobj_data(rootObj) == NULL)
{
return -1;
}
for (trav_open(&actionTrav, rootObj, AB_TRAV_ACTIONS_FOR_OBJ);
(action = trav_next(&actionTrav)) != NULL;)
{
if ( (obj_get_func_type(action) != AB_FUNC_USER_DEF)
&& ((fromObj = obj_get_from(action)) != NULL) )
{
action->info.action.auto_named = TRUE;
actionNum = mfobj_data(fromObj)->num_auto_callbacks + 1;
mfobj_data(fromObj)->num_auto_callbacks = actionNum;
sprintf(buf, "_CB%d", actionNum);
obj_set_func_name_suffix(action, buf);
}
}
trav_close(&actionTrav);
return return_value;
}
int
abmfP_get_connect_includes(StringList includeFiles, ABObj projOrModule)
{
AB_TRAVERSAL trav;
BOOL actionIsCrossModule = FALSE;
ABObj project = obj_get_project(projOrModule);
ABObj action = NULL;
ABObj toObj = NULL;
ABObj compRoot = NULL;
ABObj toModule = NULL;
ABObj win_parent = NULL;
ABObj popup_win = NULL;
char headerFilename[MAXPATHLEN+1];
*headerFilename = 0;
strlist_set_is_unique(includeFiles, TRUE);
assert(project != NULL);
if (project == NULL)
{
return 0;
}
for (trav_open(&trav, projOrModule, AB_TRAV_ACTIONS_FOR_OBJ);
(action = trav_next(&trav)) != NULL; )
{
actionIsCrossModule = obj_is_cross_module(action);
toObj = obj_get_to(action);
if (toObj == NULL)
{
continue;
}
toModule = obj_get_module(toObj);
if (actionIsCrossModule)
{
sprintf(headerFilename, "\"%s\"",
abmfP_get_ui_header_file_name(toModule));
strlist_add_str(includeFiles, headerFilename, NULL);
}
/*
* Check to see if the popup's window parent is in another module
*/
compRoot = obj_get_root(toObj);
popup_win = NULL;
if (obj_is_popup_win(compRoot))
{
popup_win = compRoot;
}
if (popup_win == NULL)
{
popup_win = obj_get_parent_of_type(compRoot, AB_TYPE_DIALOG);
}
if (popup_win == NULL)
{
popup_win = obj_get_parent_of_type(compRoot, AB_TYPE_BASE_WINDOW);
}
if (popup_win != NULL)
{
win_parent= obj_get_win_parent(popup_win);
if (win_parent != NULL)
{
toModule = obj_get_module(win_parent);
if (toModule != NULL)
{
sprintf(headerFilename, "\"%s\"",
abmfP_get_ui_header_file_name(toModule));
strlist_add_str(includeFiles, headerFilename, NULL);
}
}
}
/*
* For some actions, we need widget-specific convenience
* functions and resource strings that exist in the header files.
*/
if (obj_get_func_type(action) == AB_FUNC_BUILTIN)
{
switch (obj_get_func_builtin(action))
{
case AB_STDACT_SET_LABEL:
case AB_STDACT_SET_TEXT:
case AB_STDACT_SET_VALUE:
abmfP_comp_get_widget_specific_includes(
includeFiles, obj_get_root(toObj));
break;
}
}
}
trav_close(&trav);
return 0;
}