Commit 513f2afb authored by dfm%netscape.com's avatar dfm%netscape.com
Browse files

Moved a couple necessary things out of receipt.c into privacy.c. This

file doesn't build on the tip.
parent 664ffb1e
Loading
Loading
Loading
Loading
+555 −125
Original line number Diff line number Diff line

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public License
@@ -20,6 +21,7 @@
/*
   receipt.c --- functions to deal with transaction receipts/form prefilling.
   Created: David Meeker <dfm@netscape.com>, 09-Jun-98.
   Mothballed: 27-Jul-98
 */

#include "xp.h"
@@ -43,18 +45,78 @@
#include "vocab.h"
#include "receipt.h"

#undef DEBUG_dfm
#define TIME_RDF_CALLS


#ifdef DEBUG_dfm
#define TIME_RDF_CALLS
#define TIME_RDF_CALLS_OVERKILL
#endif




#ifdef TIME_RDF_CALLS

#include <sys/time.h>
#include <unistd.h>

#define MICROS_TO_SECOND 1000000
#define PROF_RDF(x) x

static struct timeval tv_rdf_start, tv_rdf_end, tv_rdf_elapsed, tv_main_start, tv_main_end;

#define PRINT_TIME(tv,label) printf("%s %d seconds, %d microseconds.\n", label, tv.tv_sec, tv.tv_usec)

#ifdef TIME_RDF_CALLS_OVERKILL
#define PRINT_TIME_OVERKILL PRINT_TIME
#else
#define PRINT_TIME_OVERKILL
#endif

#define RDF_START { gettimeofday(&tv_rdf_start, NULL); }
#define RDF_END { gettimeofday(&tv_rdf_end, NULL); \
 timersub( &tv_rdf_end, &tv_rdf_start, &tv_rdf_start ); \
 timeradd( &tv_rdf_start, &tv_rdf_elapsed, &tv_rdf_elapsed ); \
 PRINT_TIME_OVERKILL(tv_rdf_start,"This RDF call: "); }
#define PROFILING_START { gettimeofday(&tv_main_start, NULL); }
#define PROFILING_END { gettimeofday(&tv_main_end, NULL); \
 timersub( &tv_main_end, &tv_main_start, &tv_main_start ); \
 PRINT_TIME(tv_main_start,"Time elapsed: "); \
 timersub( &tv_main_start, &tv_rdf_elapsed, &tv_main_end ); \
 PRINT_TIME(tv_main_end,"Transaction code: "); \
 PRINT_TIME(tv_rdf_elapsed,"RDF code: "); } 
#else /* TIME_RDF_CALLS */

#define PROF_RDF(x)
#define RDF_START
#define RDF_END
#define PROFILING_START
#define PROFILING_END

#endif /* TIME_RDF_CALLS */



extern char *
resourceID(RDF_Resource r);

extern void
setContainerp(RDF_Resource, PRBool val);

extern RDF gLocalStore;
/* extern RDF gLocalStore; */
extern RDF_NCVocab gNavCenter;
extern RDF_WDVocab gWebData;
extern RDF_CoreVocab gCoreVocab;

static char* gRdfDbStr[] = {"rdf:localStore", NULL};
static RDF gRDFDB; 

#define RDF_SetContainer(x,y) setContainerp(x,y)
#define RDF_GetResourceID(x) resourceID(x)

#define RT_STR_NOTNULL(x) ((x == NULL)?"":x)

#ifdef DEBUG_dfm
#include <stdio.h>
@@ -67,115 +129,400 @@ extern RDF_CoreVocab gCoreVocab;
#pragma profile on
#endif


#define STRLEN_SERIAL_NO 11 /* 10 digits, plus one separator char. */


char *
rt_MakeNodeID(RDF_Resource parent, int32 serial, char *name, char *type)
{
  char *nodeID;

  /* Yes, I know I'm ignoring name and type. */

  nodeID = XP_ALLOC( XP_STRLEN(resourceID(parent)) + STRLEN_SERIAL_NO + 1);
  if (!nodeID) return NULL;
  XP_SPRINTF(nodeID,"%s#%d",resourceID(parent),serial);
  return nodeID;
}


RDF_Resource
rt_RDF_GetHostResource(char* host)
rt_RDF_MakeResource(RDF_Resource source,
                    char *name,
                    Bool container,
                    RDF_Resource relationship)
{
  char *prefixed_host;
  RDF_Resource hostResource;
  RDF_Resource res;

  prefixed_host = XP_ALLOC(XP_STRLEN(host) + 
                           XP_STRLEN(RECEIPT_CONTAINER_URL_PREFIX) + 1);
  XP_STRCPY(prefixed_host,RECEIPT_CONTAINER_URL_PREFIX);
  XP_STRCAT(prefixed_host,host);
  D(printf("Creating RDF_Resource: %s\n", name));
  
  D(printf("Creating RDF_Resource: %s\n",prefixed_host));
RDF_START
  
  hostResource = RDF_GetResource(NULL, host, 0);
  if (!hostResource) {
    hostResource = RDF_GetResource(NULL, host, 1);
    RDF_SetContainer(hostResource, TRUE);
    /* setResourceType(hostResource, RECEIPT_RT); */
  }
  res = RDF_GetResource(NULL, name, 0);

  if (hostResource)
    RDF_Assert(gLocalStore, 
               hostResource, 
               gCoreVocab->RDF_parent,
               gNavCenter->RDF_Receipts,
  if (!res) {
    res = RDF_GetResource(NULL, name, 1);
    RDF_SetContainer(res, container);
  } else {
    D(printf("Resource already existed! \n"));
  }
  if (res) {
    RDF_Assert(gRDFDB,
               source,
               relationship,
               res,
               RDF_RESOURCE_TYPE);
  return hostResource;
  }
RDF_END

  return res;
}


RDF_Resource
rt_RDF_GetFormResource(RDF_Resource host, 
#ifdef MOCHA
rt_RDF_MakeChildResource(RDF_Resource parent, char *name, Bool container)
{
  return rt_RDF_MakeResource(parent, name, container, gCoreVocab->RDF_child);
}


void
rt_RDF_NameResource(RDF_Resource source, char *name)
{
  if (name == NULL) return;
  D(printf("Naming ID(%s) to (%s)\n",RDF_GetResourceID(source),name));
RDF_START
  RDF_Assert(gRDFDB, 
             source, 
             gCoreVocab->RDF_name, 
             name, 
             RDF_STRING_TYPE);
RDF_END
}

RDF_Resource
rt_RDF_getEntryResourceText(RDF_Resource form_unit,
                            int32 serial,
                            char *name,
#endif
                       char *action,
                       int32 ele_cnt)
                            char *value,
                            int32 size)
{
  RDF_Resource textResource;
  char *resName;

  if (!name) 
    {
      D(printf("Name of field was NULL.\n"));
      return NULL;
    }

  resName = rt_MakeNodeID(form_unit,serial,name,"text");

  if (!resName) return NULL;

  textResource = rt_RDF_MakeChildResource(form_unit,
                                          resName,
                                          TRUE);
  XP_FREE(resName);
  
  if (!textResource) return NULL;

  rt_RDF_NameResource(textResource, name);

RDF_START
 
  RDF_Assert(gRDFDB,
             textResource,
             gCoreVocab->RDF_stringEquals,
             RT_STR_NOTNULL(value),
             RDF_STRING_TYPE);

RDF_END 
 
  return textResource;
}

RDF_Resource
rt_RDF_getEntryResourceToggle(RDF_Resource form_unit,
                              int32 serial,
                              char *name,
                              Bool toggled,
                              char *value)
{
  char *resName;
  RDF_Resource toggleResource;

int32
rt_countEntryBoxes(lo_DocState *top_doc_state, 
                   LO_FormElementStruct *ele_struct)
  if (!name) 
    {
  intn form_id;
  lo_FormData *form_list;
  lo_DocLists *doc_lists;
  int32 entry_count;
  LO_Element **elements;
  LO_Element *element;
  LO_ImageStruct *image;
  int32 element_iter;
      D(printf("Name of field was NULL.\n"));
      return NULL;
    }



  resName = rt_MakeNodeID(form_unit,serial,name,"toggle");

  if (!resName) return NULL;

  toggleResource = rt_RDF_MakeChildResource(form_unit,
                                            resName,
                                            FALSE);
  XP_FREE(resName);

  if (!toggleResource) return NULL;
 
  rt_RDF_NameResource(toggleResource, name);

  if ((top_doc_state == NULL) || (ele_struct == NULL)) return -1;
  if (ele_struct->type == LO_IMAGE)
  /* Assert the toggle state and value off this node */

RDF_START

  RDF_Assert(gRDFDB,
	     toggleResource,
	     gCoreVocab->RDF_stringEquals,
	     RT_STR_NOTNULL(value),
	     RDF_STRING_TYPE);

  RDF_Assert(gRDFDB,
             toggleResource,
             gCoreVocab->RDF_equals,
             /* URGENT -- SHOULD THIS BE A POINTER TO THE INT, 
                OR THE INT ITSELF? */
             &toggled,
             RDF_INT_TYPE);
  
RDF_END

  return toggleResource;

}
 
RDF_Resource
rt_RDF_getEntryResourceSelect(RDF_Resource form_unit,
                              int32 serial,
                              char *name,
                              int32 option_cnt)
{
      image = (LO_ImageStruct *)ele_struct; 
      form_id = image->image_attr->form_id;
    } else {
      form_id = ele_struct->form_id;
  char *resName;
  RDF_Resource selectResource;
  
  
  if (!name) 
    {
      D(printf("Name of field was NULL.\n"));
      return NULL;
    }

  doc_lists = lo_GetDocListsById(top_doc_state, ele_struct->layer_id);
  form_list = doc_lists->form_list;
  while(form_list != NULL)

  resName = rt_MakeNodeID(form_unit,serial,name,"select");

  if (!resName) return NULL;

  selectResource = rt_RDF_MakeChildResource(form_unit,
                                            resName,
                                            TRUE);
  XP_FREE(resName);

  if (!selectResource) return NULL;

  rt_RDF_NameResource(selectResource, name);
 
  /* Assert the option count off this node; children will be added after
     this function terminates. */
  
  /* Not necessary right now.. */

  return selectResource;
}
                  
RDF_Resource
rt_RDF_chainSubelement(RDF_Resource entry_unit,
                       int32 serial,
                       char *text_value,
                       char *value,
                       Bool selected)
{
      if (form_list->id == form_id)
        break;
      form_list = form_list->next;
  RDF_Resource subelementResource;
  char *resName;

  if (!value) 
    {
      D(printf("Value of subelement field was NULL.\n"));
      return NULL;
    }
  if (form_list == NULL) return -1;

  elements = (LO_Element **)form_list->form_elements;
  if (elements == NULL) return 0;
  entry_count = 0;
  for(element_iter = 0; 
      element_iter < form_list->form_ele_cnt; 
      element_iter++)

  resName = rt_MakeNodeID(entry_unit, serial, value, "subelement");

  if (!resName) return NULL;

  subelementResource = rt_RDF_MakeChildResource(entry_unit,
                                                resName,
                                                FALSE);
  XP_FREE(resName);

  if (!subelementResource) return NULL;
  
  rt_RDF_NameResource(subelementResource,value);

RDF_START

  RDF_Assert(gRDFDB,
             subelementResource,
             gCoreVocab->RDF_stringEquals,
             RT_STR_NOTNULL(value),
             RDF_STRING_TYPE);

  /*
  RDF_Assert(gRDFDB,
             subelementResource,
             gCoreVocab->RDF_equals,
             RT_STR_NOTNULL(text_value),
             RDF_STRING_TYPE);
  */

  RDF_Assert(gRDFDB,
             subelementResource,
             gCoreVocab->RDF_equals,
             /* URGENT -- SHOULD THIS BE AN INT* OR INT? */
             &selected,
             RDF_INT_TYPE);

RDF_END

  return subelementResource;
}
           
RDF_Resource
rt_RDF_getEntryResourceArea(RDF_Resource form_unit,
                            int32 serial,
                            char *name,
                            char *text)
{
      element = elements[element_iter];
      if (element == NULL) continue;
      if (element->type != LO_FORM_ELE) continue;
      if (element->lo_form.element_data == NULL) continue;
      if ((element->lo_form.element_data->type == FORM_TYPE_TEXT) &&
          !(element->lo_form.element_data->ele_text.read_only))
        entry_count++;
  char *resName;
  RDF_Resource areaResource;

  if (!name) 
    {
      D(printf("Name of textarea field was NULL.\n"));
      return NULL;
    }

  resName = rt_MakeNodeID(form_unit,serial,name,"area");

  if (!resName) return NULL;

  areaResource = rt_RDF_MakeChildResource(form_unit,
                                          resName,
                                          FALSE);
  XP_FREE(resName);

  if (!areaResource) return NULL;

  rt_RDF_NameResource(areaResource, name);
 
  /* Assert the text value off this node */

RDF_START

  RDF_Assert(gRDFDB,
             areaResource,
             gCoreVocab->RDF_equals,
             RT_STR_NOTNULL(text),
             RDF_STRING_TYPE);

RDF_END
  
  return areaResource;
}
  return entry_count;




RDF_Resource
rt_RDF_GetHostResource(char* host)
{
  char *prefixed_host;
  RDF_Resource hostResource;
  
  prefixed_host = XP_ALLOC(XP_STRLEN(host) + 
                           XP_STRLEN(RECEIPT_CONTAINER_URL_PREFIX) + 1);
  XP_STRCPY(prefixed_host,RECEIPT_CONTAINER_URL_PREFIX);
  XP_STRCAT(prefixed_host,host);

  hostResource = rt_RDF_MakeChildResource(gNavCenter->RDF_Receipts,
                                          prefixed_host,
                                          TRUE);

  XP_FREE(prefixed_host);
  /* Should I name this resource here? */
  return hostResource;
}

Bool 
rt_formIsSignificant(MWContext *ctxt, 
                     LO_FormElementStruct *ele_struct)
RDF_Resource
rt_RDF_GetReceiptResource(RDF_Resource host,
                          char *url)
{
  int32 doc_id;
  lo_TopState *top_state;
  char *receipt_name;
  RDF_Resource receiptResource;

  doc_id = XP_DOCID(ctxt);
  top_state = lo_FetchTopState(doc_id);
  if (top_state == NULL) return FALSE;
  /* This needs to have a timestamp in it, too. */
  receipt_name = XP_ALLOC(XP_STRLEN(resourceID(host)) + XP_STRLEN(url) + 1);
  XP_STRCPY(receipt_name,resourceID(host));
  XP_STRCAT(receipt_name,url);

  receiptResource = rt_RDF_MakeChildResource(host,receipt_name,TRUE);
  /* Name this receipt. */
 
  XP_FREE(receipt_name);

  return rt_countEntryBoxes(top_state->doc_state, ele_struct) > 1;
  return receiptResource;
}

RDF_Resource
rt_RDF_GetFormResource(RDF_Resource receipt, 
#ifdef MOCHA
                       char *name,
#endif
                       char *action,
                       int32 ele_cnt)
{
  char *form_name = NULL;
  char *form_url;
  RDF_Resource formResource;

#ifdef MOCHA
  form_name = name;
#endif

  if (form_name == NULL) form_name = "";

  form_url = XP_ALLOC(XP_STRLEN(resourceID(receipt)) + XP_STRLEN(form_name) + 2);
  XP_STRCPY(form_url,resourceID(receipt));
  XP_STRCAT(form_url,"#");
  XP_STRCAT(form_url,form_name);

  formResource = 
    rt_RDF_MakeResource(receipt, 
                        form_url, 
                        TRUE, 
                        gCoreVocab->RDF_content);

  XP_FREE(form_url);

  return formResource;
}


void
rt_saveFormElement(MWContext *context, LO_FormElementData *ele)
rt_saveFormElement(MWContext *context, 
                   LO_FormElementData *ele, 
                   RDF_Resource form_unit,
                   int32 ele_serial)
{
  int32 iter;
  RDF_Resource entry_unit = NULL;
  
#define E(x,y) (ele->ele_##x.y)
#define ES(x,y) (((lo_FormElementOptionData *)ele->ele_select.options)[x].y)
@@ -189,19 +536,31 @@ rt_saveFormElement(MWContext *context, LO_FormElementData *ele)
    case FORM_TYPE_TEXT:
    case FORM_TYPE_PASSWORD:
    case FORM_TYPE_FILE:
      D(printf("\tgot text-type field.\n\t\tName: %s"
      rt_RDF_getEntryResourceText(form_unit,
                                  ele_serial,
                                  (char *)E(text,name), 
                                  (char *)E(text,current_text), 
                                  E(text,size));
      /*      D(printf("\tgot text-type field.\n\t\tName: %s"
              "\n\t\tCurrent_Text: %s\n\t\tSize: %d\n",
              (char *)E(text,name), 
              (char *)E(text,current_text),
               E(text,size))); break;	
              E(text,size))); */
      break;	
      
    case FORM_TYPE_RADIO:
    case FORM_TYPE_CHECKBOX:
      D(printf("\tgot toggle-type field.\n\t\tName: %s"
      rt_RDF_getEntryResourceToggle(form_unit, 
                                    ele_serial,
                                    (char *)E(toggle,name), 
                                    E(toggle,toggled), 
                                    (char *)E(toggle,value));
      /*      D(printf("\tgot toggle-type field.\n\t\tName: %s"
              "\n\t\tToggled: %d\n\t\tValue: %s\n", 
              (char *)E(toggle,name),
              E(toggle,toggled),
               (char *)E(toggle,value))); break;
              (char *)E(toggle,value))); */ 
      break;
      
    case FORM_TYPE_HIDDEN:
    case FORM_TYPE_SUBMIT:
@@ -213,27 +572,40 @@ rt_saveFormElement(MWContext *context, LO_FormElementData *ele)
    case FORM_TYPE_SELECT_ONE:
    case FORM_TYPE_SELECT_MULT:
      { 
        int iter;
        D(printf("\tgot select-type field.\n\t\tName: %s"
        entry_unit = rt_RDF_getEntryResourceSelect(form_unit, 
                                                   ele_serial,
                                                   (char *)E(select,name), 
                                                   E(select,option_cnt));
        /*      D(printf("\tgot select-type field.\n\t\tName: %s"
                "\n\t\tOption-Count: %d\n",
                (char *)E(select,name),
                 E(select,option_cnt)));
                E(select,option_cnt))); */
        for(iter = 0; iter < E(select,option_cnt); iter++)
          {
            D(printf("\t\tsubelement.\n\t\t\t"
            rt_RDF_chainSubelement(entry_unit,
                                   iter,
                                   (char *)ES(iter,text_value),
                                   (char *)ES(iter,value),
                                   ES(iter,selected));
                                   
            /*            D(printf("\t\tsubelement.\n\t\t\t"
                          "Text_value: %s\n\t\t\t"
                          "Value: %s\n\t\t\tSelected: %d\n",
                          (char *)ES(iter,text_value),
                          (char *)ES(iter,value),
                     ES(iter,selected)));	
                          ES(iter,selected))); */	
          }
        break; 
      }
    case FORM_TYPE_TEXTAREA:
      D(printf("\tgot textarea-type field.\n\t\tName: %s"
      rt_RDF_getEntryResourceArea(form_unit,
                                  ele_serial,
                                  (char *)E(textarea,name),
                                  (char *)E(textarea,current_text));
      /*      D(printf("\tgot textarea-type field.\n\t\tName: %s"
              "\n\t\tCurrent_text: %s\n",
              (char *)E(textarea, name),
               (char *)E(textarea, current_text)));
              (char *)E(textarea, current_text))); */
      break;
    case FORM_TYPE_ISINDEX:
    case FORM_TYPE_IMAGE:
@@ -249,18 +621,18 @@ rt_saveFormElement(MWContext *context, LO_FormElementData *ele)
void 
rt_saveFormElements(MWContext *context, 
                    lo_FormData *form, 
                    RDF_Resource host_resource)
                    RDF_Resource receipt_unit)
{
  LO_Element **elements;
  LO_Element *element;
  int32 element_iter;
  RDF_Resource form_resource;
  RDF_Resource form_unit;


  if (form == NULL) return;
  elements = (LO_Element **)form->form_elements;
  if (elements == NULL) return;
  form_resource = rt_RDF_GetFormResource(host_resource,
  form_unit = rt_RDF_GetFormResource(receipt_unit,
#ifdef MOCHA
                                     (char *)form->name,
#endif /* MOCHA */
@@ -275,14 +647,17 @@ rt_saveFormElements(MWContext *context,
      element = elements[element_iter];
      if (element == NULL) continue;
      if (element->type != LO_FORM_ELE) continue;
      rt_saveFormElement(context, element->lo_form.element_data);
      rt_saveFormElement(context, 
                         element->lo_form.element_data, 
                         form_unit,
                         element_iter);
	}
}

void 
rt_saveFormList (MWContext *context, 
                 lo_FormData *form_list, 
                 RDF_Resource host_resource)
                 RDF_Resource receipt_unit)
{
  lo_FormData *form = form_list;
  
@@ -293,7 +668,7 @@ rt_saveFormList (MWContext *context,
      D(printf(" -- it is named %s\n",(char *)form->name));
#endif
      D(printf(" -- it has %d elements\n",form->form_ele_cnt));
      rt_saveFormElements(context,form,host_resource);
      rt_saveFormElements(context,form,receipt_unit);
      form = form->next;
    }
  
@@ -308,8 +683,8 @@ RT_SaveDocument (MWContext *context, LO_FormElementStruct *form_element)
  lo_TopState *top_state;
  lo_DocLists *doc_lists;
  lo_FormData *form_list;
  char *url;
  RDF_Resource host_unit;
  char *url, *hostname;
  RDF_Resource host_unit = NULL, receipt_unit = NULL;
  


@@ -323,7 +698,7 @@ RT_SaveDocument (MWContext *context, LO_FormElementStruct *form_element)
   * See if the form is significant.
   */
  D(printf("Transaction Receipts: Checking Significance: "));
  if (!rt_formIsSignificant(context,form_element))
  if (!prvcy_formIsSignificant(context,form_element))
  {
    D(printf("failed.\n"));
    return;
@@ -344,14 +719,37 @@ RT_SaveDocument (MWContext *context, LO_FormElementStruct *form_element)
    return;
  }

  url = NET_ParseURL(top_state->url, GET_PROTOCOL_PART | GET_HOST_PART | 
  url = NET_ParseURL(top_state->url, /* GET_PROTOCOL_PART | GET_HOST_PART | */
                                     GET_PATH_PART);

  hostname = NET_ParseURL(top_state->url, GET_HOST_PART);

PROFILING_START

  D(printf("Initializing RDF db.\n"));

RDF_START

  gRDFDB = RDF_GetDB((const char **)gRdfDbStr);

RDF_END
  
  if (!gRDFDB) 
  /* XXX Error Message */
    return;

  D(printf("Processing URL: %s\n",url)); 
  D(printf("Requesting Host Resource for: %s\n",hostname));
  
  if (hostname) 
  	host_unit = rt_RDF_GetHostResource(hostname);

  host_unit = rt_RDF_GetHostResource(url);

  if (!host_unit) {
  /* This should also pass in the doc title -- where do I get that?? */
  if (host_unit)
	receipt_unit = rt_RDF_GetReceiptResource(host_unit,RT_STR_NOTNULL(url));

  if (!receipt_unit) {
    D(printf("Unable to get RDF Host Unit!\n"));
    /* XXX -- BUG BUG BUG -- Move me to allxpstr */
    FE_Alert(context,"Running low on memory -- \n"
@@ -359,7 +757,6 @@ RT_SaveDocument (MWContext *context, LO_FormElementStruct *form_element)
                     "for this transaction.");
  }


/*  D(printf("processing base document\n")); */
/*  rt_saveFormList(context,top_state->doc_lists.form_list); */
  
@@ -371,9 +768,42 @@ RT_SaveDocument (MWContext *context, LO_FormElementStruct *form_element)
      XP_ASSERT(layer_state->doc_lists);
      doc_lists = layer_state->doc_lists;
      form_list = doc_lists->form_list;
      rt_saveFormList(context,form_list,host_unit);
      rt_saveFormList(context,form_list,receipt_unit);
    }

  D(printf("Releasing RDF db.\n"));

RDF_START

  RDF_ReleaseDB(gRDFDB);

RDF_END

PROFILING_END

  gRDFDB = NULL;

  XP_FREE(url);
  XP_FREE(hostname);


}

PUBLIC Bool
RT_GetMakeReceiptToggle(MWContext *m_context)
{
    return FALSE;
}

PUBLIC Bool
RT_GetMakeReceiptEnabled(MWContext *m_context)
{
    return FALSE;
}


PUBLIC Bool 
RT_ToggleMakeReceipt(MWContext *m_context)
{
    return FALSE;
}