[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference iosg::all-in-1

Title:ALL-IN-1 (tm) Support Conference
Notice:Please spell ALL-IN-1 correctly - all CAPITALS!
Moderator:IOSG::PYECE
Created:Fri Jul 01 1994
Last Modified:Fri Jun 06 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:2716
Total number of notes:12169

2620.0. "FCS API -> Determining IUID takes very very long!" by ATZIS1::EHRLICH_K (Never met a Lady like her before!) Mon Apr 14 1997 14:04

Dear engineers,

	now, really a support-question regarding FCS_programming:
(A very interesting one ;-))
We run into the problem that determining the IUID takes very very long
(approx. 1 minute) instead of some secs by using the ALL-IN-1 filecabinet
functions. Can you, dear engineers, have a look at this code, what we
do wrong. It seems that the FCS searches through the whole folder because
if you have less documents stored then it's much more faster...
Do we something wrong in getting the right IUID. Sorry, but there'S nothing
specific in the manual. Maybe you've an example for us, too?

ALL-IN-1 V3.1 German upto  ICF #4, OpenVMS V6.1

Many, many thanks in advance! And be sure, I'll honour it .!!!!.

PS:
The application copies documents from one drawer to another one (remote drawer
used!) and in the specified folder there are a lot of documents stored
(e.g 200+). 

PPS: The code is also located on CONSUL::COV_FCS.TXT!
PPPS: GAP, you can then remove the code from this entry!
      Cheers Charly



Subject: copy_test

#include <OAFCEXT.H>
#include STSDEF
#include STRING
#include STDIO
    
typedef struct _DocKey
{
 short		    FachLen;
 char		    *Fach;
 short		    OrdnerLen;
 char		    *Ordner;
 short		    DocNumLen;
 char		    *DocNum;
}		    DocKey;

typedef struct _VmsItmLst1
{
 short		    BufferLen;
 short		    ItemCode;
 char		    *Buffer;
}		    VmsItmLst1;

typedef struct _VmsItmLst2
{
 short		    BufferLen;
 short		    ItemCode;
 char		    *Buffer;
 long		    *BufferRetLen;
}		    VmsItmLst2;

extern		    Lib$Stop();

unsigned long	    Fc$CloseCabinet();
unsigned long	    Fc$CopyDocument(DocKey *,VmsItmLst1 *,DocKey *);
unsigned long	    Fc$CreateDocument(const char *,short,VmsItmLst1 *,DocKey *);
unsigned long	    Fc$GetDocFile(DocKey *,short,const char *,char);
unsigned long	    Fc$DoScript(const char *,short,VmsItmLst1 *);
unsigned long	    Fc$ListDocument(VmsItmLst1 *,VmsItmLst2 *);
    
main()
{
 struct _VmsItmTabPut
 {
  VmsItmLst1        Fach;
  VmsItmLst1	    Folder;
  long		    Ende;
 }		    VmsItmTabPut;
 
 DocKey		    NewDoc;
 DocKey		    CopyDoc;
 char		    CopyFach[30];
 char		    CopyOrdner[60];
 char		    CopyDocNum[6];
 char		    FachName[] = "STANDARD";
 char		    FachNew[] = "FAX";
 char		    FolderNew[] = "NEU";
 char		    FolderName[] = "TEST";
/* char		    FolderName[] = "TEST                          996771";*/
 char		    DocumentNummer[] = "003229";
/* char		    DocumentNummer[] = "996771";*/
 unsigned long	    Status;
  
 VmsItmTabPut.Fach.BufferLen = strlen(FachNew);
 VmsItmTabPut.Fach.ItemCode = OafcT_NickName;
 VmsItmTabPut.Fach.Buffer = FachNew;
 VmsItmTabPut.Folder.BufferLen = strlen(FolderNew);
 VmsItmTabPut.Folder.ItemCode = OafcT_ParentName;
 VmsItmTabPut.Folder.Buffer = FolderNew;
 VmsItmTabPut.Ende = 0;
 
 NewDoc.FachLen = strlen(FachName);
 NewDoc.Fach = FachName;
 NewDoc.OrdnerLen = strlen(FolderName);
 NewDoc.Ordner = FolderName;
 NewDoc.DocNumLen = strlen(DocumentNummer);
 NewDoc.DocNum = DocumentNummer;
  
 CopyDoc.FachLen = sizeof(CopyFach);
 CopyDoc.Fach = CopyFach;
 CopyDoc.OrdnerLen = sizeof(CopyOrdner);
 CopyDoc.Ordner = CopyOrdner;
 CopyDoc.DocNumLen = sizeof(CopyDocNum);
 CopyDoc.DocNum = CopyDocNum;
  
 Status = Fc$CopyDocument(&NewDoc
			 ,(struct _VmsItmLst1 *) &VmsItmTabPut
			 ,&CopyDoc);
 if (!$VMS_STATUS_SUCCESS(Status)) Lib$Stop(Status);
 
 printf("\nKopiertes Dokument:\n");
 printf(" Drawer = %.*s\n",CopyDoc.FachLen,CopyDoc.Fach);
 printf(" Folder = %.*s\n",CopyDoc.OrdnerLen,CopyDoc.Ordner);
 printf(" Docnum = %.*s\n",CopyDoc.DocNumLen,CopyDoc.DocNum);
 
 Status = Fc$CloseCabinet();
 if (!$VMS_STATUS_SUCCESS(Status)) Lib$Stop(Status);
}

#include <OAFCEXT.H>
#include <OAFCDEF.H>
#include STSDEF
#include STRING
#include STDLIB
#include SSDEF
#include STDIO
#include STDARG
#include STARLET
#include FSCNDEF
#include DESCRIP
#include RMSDEF

typedef struct _VmsItmLst
{
 union _EndUinon
 {
  long		    Ende;
  struct _Item
  {
   short	    BufferLen;
   short	    ItemCode;
  }		    Item;
 }		    EndUnion;
 char		    *Buffer;
 long		    *BufferRetLen;
 long		    Next;
}		    VmsItmLst;

typedef struct _ItmLst
{
 long		    FieldLen;
 char		    *FieldName;
 long		    ValueLen;
 char		    *ValueName;
 long		    *ValueRetLen;
}		    ItmLst;

typedef struct _DocKey
{
 short		    FachLen;
 char		    *Fach;
 short		    OrdnerLen;
 char		    *Ordner;
 short		    DocNumLen;
 char		    *DocNum;
}		    DocKey;

typedef struct _Cabinet
{
 OafcClientSession  *ClientSession;
 char		    *Allin1User;
 char		    *LocalNode;
 long		    Allin1FulnamLen;
 char		    Allin1Fulnam[64];
}		    FcCabinet;

void                vaxc$va_count(int *);
OafcCondValue	    OafcShowPartition(OafcDnsName *,OafcStringLength,OafcAttributes *,OafcStringLength,OafcDrawerSrc *,OafcTLV *,OafcBufferLength *,OafcTEXT8 *,OafcStringLength);

unsigned long	    Fc$CloseCabinet();
unsigned long	    Fc$CopyDocument(DocKey *,VmsItmLst *,DocKey *);
unsigned long	    Fc$CreateDocument(const char *,short,VmsItmLst *,DocKey *);
unsigned long	    Fc$DeleteDocument(DocKey *);
unsigned long	    Fc$DoScript(const char *,short,VmsItmLst *);
unsigned long	    Fc$GetDocFile(DocKey *,short,const char *,char);
unsigned long	    Fc$ListDocument(VmsItmLst *,VmsItmLst *);
unsigned long	    Fc$MoveDocument(DocKey *,VmsItmLst *,DocKey *);
unsigned long	    Fc$OpenCabinet();

unsigned long	    Aida$GetBwKey(long,long,const char *,long,char *,long,char *,ItmLst *);
unsigned long	    Aida$GetEqKey(long,const char *,long,char *,long,char *,ItmLst *);
unsigned long	    Aida$GetNext(long,ItmLst *);
unsigned long	    AllocCpy(char**,const char *,long);
unsigned long	    AllocCpyCheck(char**,const char *,long);
void		    application_log_routine(OafcCondValue,OafcStatus *,OafcUID *,OafcUID *);
unsigned long	    CheckDrawerState(char *,char *,char const *,short);
unsigned long	    CopyDocument(FcCabinet *,DocKey *,VmsItmLst *,DocKey *,char);
unsigned long	    CreateDocument(FcCabinet *,const char *,short,VmsItmLst *,DocKey *);
unsigned long	    DeleteDocument(FcCabinet *,DocKey *);
unsigned long	    DoScript(FcCabinet *,const char *,short,VmsItmLst *);
unsigned long	    FillTlvBuf(OafcAttributes **,OafcStringLength *,OafcStringLength *,short,...);
unsigned long	    GetA1UserName(char **,char *,const char *);
unsigned long	    GetCabinetName(char **,char **,char *,char **);
unsigned long	    GetDocFile(FcCabinet *,DocKey *,short,const char *,char);
unsigned long	    GetDocNum(OafcClientSession *,OafcUID *,char *,short *);
unsigned long	    GetDocumentUid(OafcClientSession *,OafcUID **,char const *,short,char const *,short,char const *,short);
unsigned long	    GetDrawerUid(OafcClientSession *,OafcUID **,char const *,short);
unsigned long	    GetFileExt(char **,short *,char *,short);
unsigned long	    GetSessionAddress(FcCabinet **);
unsigned long	    GetTwoLogNames(const char *,char **);
unsigned long	    GetVmsNodeName(char **);
unsigned long	    GetVmsPwd1(char **,const char *);
unsigned long	    GetVmsPwd2(char **,const char *);
unsigned long	    GetVmsUserName(char **,const char *);
unsigned long	    ListDocument(FcCabinet *,VmsItmLst *,VmsItmLst *);
unsigned long	    OpenCabinet(FcCabinet *);
char		    *Search(const char *,char *,short);


unsigned long	    Fc$OpenCabinet()
{
 FcCabinet	    *FcSession;

 return(GetSessionAddress(&FcSession));
}


unsigned long	    Fc$CloseCabinet()
{
 FcCabinet	    *FcSession;
 OafcCondValue	    Status;

 Status = GetSessionAddress(&FcSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 Status = OafcCloseCabinetW(FcSession -> ClientSession
			   ,0
			   ,0
			   ,0);

 if ($VMS_STATUS_SUCCESS(Status))
 {
  free(FcSession -> Allin1User);
  FcSession -> ClientSession = 0;
  free(FcSession -> LocalNode);
  FcSession -> LocalNode = 0;
 }

 return(Status);
}


unsigned long	    Fc$CreateDocument(const char *InFileName
				     ,short InFileNameLen
				     ,VmsItmLst *ItmTabPut
				     ,DocKey *NewDoc)
{
 FcCabinet	    *FcSession;
 OafcCondValue	    Status;

 Status = GetSessionAddress(&FcSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 for(;;)
 {
  Status = CreateDocument(FcSession
			 ,InFileName
			 ,InFileNameLen
			 ,ItmTabPut
			 ,NewDoc);
  if (Status != OafcInvalidSession) return(Status);

 /* falls beim create rauskommt das es gar kein connect zum server
 /* gibt wird das connect gemacht und dann das create widerholt
 */
  FcSession -> ClientSession = 0;
  Status = GetSessionAddress(&FcSession);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
}


unsigned long	    Fc$CopyDocument(DocKey *VonDoc
				   ,VmsItmLst *VmsItmTabPut
				   ,DocKey *NachDoc)
{
 FcCabinet	    *FcSession;
 OafcCondValue	    Status;

 Status = GetSessionAddress(&FcSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 for(;;)
 {
  Status = CopyDocument(FcSession
		       ,VonDoc
		       ,VmsItmTabPut
		       ,NachDoc
		       ,0);
  if (Status != OafcInvalidSession) return(Status);

 /* falls beim copy rauskommt das es gar kein connect zum server
 /* gibt wird das connect gemacht und dann das copy widerholt
 */
  FcSession -> ClientSession = 0;
  Status = GetSessionAddress(&FcSession);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
}


unsigned long	    Fc$DeleteDocument(DocKey *VonDoc)
{
 FcCabinet	    *FcSession;
 OafcCondValue	    Status;

 Status = GetSessionAddress(&FcSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 for(;;)
 {
  Status = DeleteDocument(FcSession
		         ,VonDoc);
  if (Status != OafcInvalidSession) return(Status);

 /* falls beim delete rauskommt das es gar kein connect zum server
 /* gibt wird das connect gemacht und dann das delete widerholt
 */
  FcSession -> ClientSession = 0;
  Status = GetSessionAddress(&FcSession);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
}


unsigned long	    Fc$MoveDocument(DocKey *VonDoc
				   ,VmsItmLst *VmsItmTabPut
				   ,DocKey *NachDoc)
{
 FcCabinet	    *FcSession;
 OafcCondValue	    Status;

 Status = GetSessionAddress(&FcSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 for(;;)
 {
  Status = CopyDocument(FcSession
		       ,VonDoc
		       ,VmsItmTabPut
		       ,NachDoc
		       ,1);
  if (Status != OafcInvalidSession) return(Status);

 /* falls beim move rauskommt das es gar kein connect zum server
 /* gibt wird das connect gemacht und dann das move widerholt
 */
  FcSession -> ClientSession = 0;
  Status = GetSessionAddress(&FcSession);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
}


unsigned long	    Fc$GetDocFile(DocKey *ResDoc
				 ,short FileNameLen
				 ,const char *FileName
				 ,char Reserve)
{
 FcCabinet	    *FcSession;
 OafcCondValue	    Status;

 Status = GetSessionAddress(&FcSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 for(;;)
 {
  Status = GetDocFile(FcSession
		     ,ResDoc
		     ,FileNameLen
		     ,FileName
		     ,Reserve);
  if (Status != OafcInvalidSession) return(Status);

 /* falls beim copy rauskommt das es gar kein connect zum server
 /* gibt wird das connect gemacht und dann das copy widerholt
 */
  FcSession -> ClientSession = 0;
  Status = GetSessionAddress(&FcSession);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
}


unsigned long	    Fc$ListDocument(VmsItmLst *InItmLst
				   ,VmsItmLst *OutItmLst)
{
 FcCabinet	    *FcSession;
 OafcCondValue	    Status;

 Status = GetSessionAddress(&FcSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 for(;;)
 {
  Status = ListDocument(FcSession
		       ,InItmLst
		       ,OutItmLst);
  if (Status != OafcInvalidSession) return(Status);

 /* falls beim list rauskommt das es gar kein connect zum server
 /* gibt wird das connect gemacht und dann das list widerholt
 */
  FcSession -> ClientSession = 0;
  Status = GetSessionAddress(&FcSession);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
}


unsigned long	    Fc$DoScript(const char *ScriptName
			       ,short ScriptNameLen
			       ,VmsItmLst *InItmLst)
{
 FcCabinet	    *FcSession;
 OafcCondValue	    Status;

 Status = GetSessionAddress(&FcSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 for(;;)
 {
  Status = DoScript(FcSession
		   ,ScriptName
		   ,ScriptNameLen
		   ,InItmLst);
  if (Status != OafcInvalidSession) return(Status);

 /* falls beim doscript rauskommt das es gar kein connect zum server
 /* gibt wird das connect gemacht und dann das doscript widerholt
 */
  FcSession -> ClientSession = 0;
  Status = GetSessionAddress(&FcSession);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
}


unsigned long	    GetSessionAddress(FcCabinet **Session)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcGetSessionAddressBlk" noshr
  FcCabinet static FcSession;
 #pragma extern_model restore

 /* es wird einfach die adresse des FcSession-Block zur�ckgeliefert
 /* wurde noch kein connect auf den server gemacht (.ClientSession = 0)
 /* dann wird vorm return opencabinet aufgerufen
 */

 *Session = &FcSession;

 return(FcSession.ClientSession ? OafcNormal : OpenCabinet(&FcSession));
}


unsigned long	    OpenCabinet(FcCabinet *Session)
{
 struct _ItmTab
 {
  ItmLst	    T1;
  ItmLst	    T2;
  long		    ItmEnde;
 }		    ItmTab;

 OafcFCName	    *fc_name;
 OafcUsertoken      VmsUserId;
 OafcCMParameters   *cm_parameters = 0;
 OafcStringLength   CmParamMaxLen = 0;
 OafcStringLength   cm_parameters_length = 0;
 char		    Profil_Fulnam[] = "FULNAM";
 char		    Profil_Editor[] = "EDITOR";
 char		    Profil_KeyName[] = "USER";
 char		    CabinetEditor[10];
 long		    CabinetEditorLen;
 OafcCondValue	    Status;

 Status = GetVmsNodeName(&(Session -> LocalNode));
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 /* hole cabinet-name, a1-user, vms-user, nodename
 */
 Status = GetCabinetName((char **) &fc_name
			,&(Session -> Allin1User)
			,Session -> LocalNode
			,(char **) &VmsUserId.vms_account);
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(Session -> LocalNode);
  return(Status);
 }

 /* hole 1. vms-passwort
 */
 Status = GetVmsPwd1((char **) &VmsUserId.vms_password
		    ,"FC");
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(Session -> LocalNode);
  free(fc_name);
  free(Session -> Allin1User);
  free(VmsUserId.vms_account);
  return(Status);
 }

 /* hole 2. vms-passwort
 */
 Status = GetVmsPwd2((char **) &VmsUserId.vms_password2
		    ,"FC");
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(Session -> LocalNode);
  free(fc_name);
  free(Session -> Allin1User);
  free(VmsUserId.vms_account);
  if (VmsUserId.vms_password != 0) free(VmsUserId.vms_password);
  return(Status);
 }

 /* f�r die default-extension brauchma den editor aus dem profile
 /* gleichzeitig nemma den full-name auch glei mit
 */

 ItmTab.T1.FieldLen = strlen(Profil_Editor);
 ItmTab.T1.FieldName = Profil_Editor;
 ItmTab.T1.ValueLen = sizeof(CabinetEditor);
 ItmTab.T1.ValueName = CabinetEditor;
 ItmTab.T1.ValueRetLen = &CabinetEditorLen;
 ItmTab.T2.FieldLen = strlen(Profil_Fulnam);
 ItmTab.T2.FieldName = Profil_Fulnam;
 ItmTab.T2.ValueLen = sizeof(Session -> Allin1Fulnam);
 ItmTab.T2.ValueName = &(Session -> Allin1Fulnam[0]);
 ItmTab.T2.ValueRetLen = &(Session -> Allin1FulnamLen);
 ItmTab.ItmEnde = 0;

 Status = Aida$GetEqKey(6
		       ,"PROFIL"
		       ,strlen(Profil_KeyName)
		       ,Profil_KeyName
		       ,strlen(Session -> Allin1User)
		       ,Session -> Allin1User
		       ,(struct _ItmLst *) &ItmTab);
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(Session -> LocalNode);
  free(fc_name);
  free(Session -> Allin1User);
  free(VmsUserId.vms_account);
  if (VmsUserId.vms_password != 0) free(VmsUserId.vms_password);
  if (VmsUserId.vms_password2 != 0) free(VmsUserId.vms_password2);
  return(Status);
 }

 /* wenn der profil-editor WPSPLUS ist wird die default-extension auf
 /* WPL gesetzt. ansonsten passiert nichts.
 */
 if (memcmp(CabinetEditor,&"WPSPLUS",CabinetEditorLen) == 0)
 {
  Status = FillTlvBuf(&cm_parameters
		     ,&CmParamMaxLen
		     ,&cm_parameters_length
		     ,OafcT_FileExtension
		     ,3
		     ,"WPL"
		     ,OafcTlv_EOC
		     ,OafcTlv_EOC);
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(Session -> LocalNode);
   free(fc_name);
   free(Session -> Allin1User);
   free(VmsUserId.vms_account);
   if (VmsUserId.vms_password != 0) free(VmsUserId.vms_password);
   if (VmsUserId.vms_password2 != 0) free(VmsUserId.vms_password2);
   return(Status);
  }
 }

 VmsUserId.vms_account_len = strlen((char *) VmsUserId.vms_account);

 VmsUserId.vms_password_len = strlen((char *) VmsUserId.vms_password);

 VmsUserId.vms_password2_len = VmsUserId.vms_password2 ? strlen((char *) VmsUserId.vms_password2) : 0;

 Session -> LocalNode = realloc(Session -> LocalNode,strlen(Session -> LocalNode) + 3);
 if (Session -> LocalNode == 0)
 {
  free(fc_name);
  free(Session -> Allin1User);
  free(Session -> LocalNode);
  free(VmsUserId.vms_account);
  free(VmsUserId.vms_password);
  if (VmsUserId.vms_password2 != 0) free(VmsUserId.vms_password2);
  if (cm_parameters != 0) free(cm_parameters);
  return(SS$_INSFMEM);
 }
 sprintf(Session -> LocalNode,"%s::",Session -> LocalNode);

 Status = OafcOpenCabinetW(fc_name
			  ,strlen((char *) fc_name)
			  ,OafcM_SessionRmsFileCab | OafcM_SessionMultiThread | OafcM_SessionGerman
			  ,&VmsUserId
			  ,&(Session -> ClientSession)
			  ,0
			  ,cm_parameters
			  ,cm_parameters_length
			  ,0
			  ,0);

 free(fc_name);
 free(VmsUserId.vms_account);
 free(VmsUserId.vms_password);
 if (VmsUserId.vms_password2 != 0) free(VmsUserId.vms_password2);
 if (cm_parameters != 0) free(cm_parameters);
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(Session -> Allin1User);
  Session -> Allin1User = 0;
  free(Session -> LocalNode);
  Session -> LocalNode = 0;
 }

 return(Status);
}


unsigned long	    CreateDocument(FcCabinet *Cabinet
				  ,const char *InFileName
				  ,short InFileNameLen
				  ,VmsItmLst *VmsItmTabPut
				  ,DocKey *NewDoc)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcCreateDocumentBlk" noshr
  OafcAttributes static    *InAttributes = 0;
  OafcStringLength static  InAttributesLen = 0;
  OafcCMParameters static  *CmParameters = 0;
  OafcStringLength static  CmParametersLen = 0;
 #pragma extern_model restore

 struct _ItmTab
 {
  ItmLst	    Dsab;
  ItmLst	    Type;
  long		    ItmEnde;
 }		    ItmTab;

 OafcAllSource	    AllSource = {0,0,0,0,0,0,0,0};
 OafcStringLength   attributes_length = 0;
 OafcStatus	    StatusBlock = {0,0,0,0,0,0,0,0};
 OafcStringLength   cm_parameters_length = 0;
 OafcCondValue	    Status;
 OafcUID            *parent_unique_id = 0;
 OafcUID            DocumentUID;
 char		    FolderIsDa = 0;
 char		    FormatIsDa = 0;
 char		    AuthorIsDa = 0;
 char		    *FileExt;
 short		    FileExtLen;
 char		    TypeField[] = "DEFAULT_FILE";
 char		    DsabField[] = "DSAB";
 char		    Type[44];
 long		    TypeLen;
 char		    Dsab[15];
 long		    DsabLen;
 VmsItmLst	    *VmsItmTab;

 /* die extensen des inputfiles wird festgestellt
 */
 Status = GetFileExt(&FileExt
		    ,&FileExtLen
		    ,(char *) InFileName
		    ,InFileNameLen);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 /* auf jeden fall wird der dsab und der file-type gebraucht
 /* deshalb wird die oaitem-tabelle gleich ausgef�llt
 */
 ItmTab.Dsab.FieldLen = strlen(DsabField);
 ItmTab.Dsab.FieldName = DsabField;
 ItmTab.Dsab.ValueLen = sizeof(Dsab);
 ItmTab.Dsab.ValueName = Dsab;
 ItmTab.Dsab.ValueRetLen = &DsabLen;
 ItmTab.Type.FieldLen = strlen(TypeField);
 ItmTab.Type.FieldName = TypeField;
 ItmTab.Type.ValueLen = sizeof(Type);
 ItmTab.Type.ValueName = Type;
 ItmTab.Type.ValueRetLen = &TypeLen;
 ItmTab.ItmEnde = 0;

 /* jetzt die itemtab durchgegange
 */
 for(VmsItmTab = VmsItmTabPut
    ;VmsItmTab -> EndUnion.Ende != 0
    ;VmsItmTab = (struct _VmsItmLst *) &(VmsItmTab -> BufferRetLen))
 {
  switch(VmsItmTab -> EndUnion.Item.ItemCode)
  {
   case OafcT_NickName:
   {
    /* ist ein fach angegeben brauchma die fach-uid
    */
    Status = GetDrawerUid(Cabinet -> ClientSession
		         ,&parent_unique_id
		         ,VmsItmTab -> Buffer
		         ,VmsItmTab -> EndUnion.Item.BufferLen);
    if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

    /* das fach wird gleich wieder in den output-parameter
    /* eingetragen
    */
    if (VmsItmTab -> EndUnion.Item.BufferLen > NewDoc -> FachLen) return(OafcBufferOverflow);
    memcpy(NewDoc -> Fach,VmsItmTab -> Buffer,VmsItmTab -> EndUnion.Item.BufferLen);
    NewDoc -> FachLen = VmsItmTab -> EndUnion.Item.BufferLen;

    break;
   }
   case OafcT_Format:
   {
    /* ist das format angegeben, wird einmal im format.dat nachgesehen
    /* ob es dort eingetragen ist. wenn nein ist das ein fehler und
    /* das create wird abgebrochen
    */
    Status = Aida$GetEqKey(6
		          ,"FORMAT"
		          ,0
		          ,0
		          ,VmsItmTab -> EndUnion.Item.BufferLen
		          ,VmsItmTab -> Buffer
		          ,(struct _ItmLst *) &ItmTab);
    if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

    /* gibts das format wird noch die extension des inputfiles mit dem
    /* type verglichen. stimmen sie nicht �berein wird das create abgebrochen
    */
    if (TypeLen != FileExtLen || memcmp(Type,FileExt,FileExtLen) != 0) return(OafcInsufficientArguments);

    /* wenn das format ok ist wirds im attribute-buffer aingetragen
    */
    Status = FillTlvBuf(&InAttributes
		       ,&InAttributesLen
		       ,&attributes_length
		       ,VmsItmTab -> EndUnion.Item.ItemCode
		       ,VmsItmTab -> EndUnion.Item.BufferLen
		       ,VmsItmTab -> Buffer);
    if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

    /* und auch gleich der dazugeh�rige dsab
    */
    Status = FillTlvBuf(&InAttributes
		       ,&InAttributesLen
		       ,&attributes_length
		       ,OafcT_DSAB
		       ,DsabLen
		       ,Dsab);
    if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

    FormatIsDa = 1;

    break;
   }
   case OafcT_ParentName:
   {
    /* ist der ordner angegebn wird der im attribute-buffer
    /* eingetragen
    */
    Status = FillTlvBuf(&InAttributes
		       ,&InAttributesLen
		       ,&attributes_length
		       ,VmsItmTab -> EndUnion.Item.ItemCode
		       ,VmsItmTab -> EndUnion.Item.BufferLen
		       ,VmsItmTab -> Buffer);
    if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

    /* und auch gleich in den output-parameter �bernommen
    */
    if (VmsItmTab -> EndUnion.Item.BufferLen > NewDoc -> OrdnerLen) return(OafcBufferOverflow);
    memcpy(NewDoc -> Ordner,VmsItmTab -> Buffer,VmsItmTab -> EndUnion.Item.BufferLen);
    NewDoc -> OrdnerLen = VmsItmTab -> EndUnion.Item.BufferLen;

    FolderIsDa = 1;

    break;
   }
   /* bei allen anderen eintr�gen wird nichts besonders gemacht
   /* als die werte in den attribute-buffer �bernommen
   */
   case OafcT_Author: AuthorIsDa = 1;
   case OafcT_Delete:
   case OafcT_Keywords:
   case OafcT_Modify:
   case OafcT_Title:
   {
    Status = FillTlvBuf(&InAttributes
		       ,&InAttributesLen
		       ,&attributes_length
		       ,VmsItmTab -> EndUnion.Item.ItemCode
		       ,VmsItmTab -> EndUnion.Item.BufferLen
		       ,VmsItmTab -> Buffer);
    if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

    break;
   }
   default: return(OafcInsufficientArguments);
  }
 }

 if (!FolderIsDa)
 {
  /* wurde kein folder in der itemlist angegeben
  /* wird der folder ALLGEMEIN genommen
  */
  Status = FillTlvBuf(&InAttributes
		     ,&InAttributesLen
		     ,&attributes_length
		     ,OafcT_ParentName
		     ,9
		     ,"ALLGEMEIN");
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

  /* und auch gleich in den output-parameter �bernommen
  */
  if (9 > NewDoc -> OrdnerLen) return(OafcBufferOverflow);
  memcpy(NewDoc -> Ordner,"ALLGEMEIN",9);
  NewDoc -> OrdnerLen = 9;
 }

 if (!FormatIsDa)
 {
  /* wurde kein format in der itemlist angegeben
  /* wird der format.dat sequentiell nach einem typ
  /* durchsucht der gleich der extension des infiles ist
  */
  Status = Aida$GetBwKey(6
		        ,6
		        ,"FORMAT"
		        ,0
		        ,0
		        ,0
		        ,0
		        ,(struct _ItmLst *) &ItmTab);

  while($VMS_STATUS_SUCCESS(Status))
  {
   if (TypeLen == FileExtLen && memcmp(Type,FileExt,FileExtLen) == 0)
   {
    /* wurde der richtige type gefunden kann der dsab
    /* in den attribute-buffer �bernommen werden
    */
    Status = FillTlvBuf(&InAttributes
		       ,&InAttributesLen
		       ,&attributes_length
		       ,OafcT_DSAB
		       ,DsabLen
		       ,Dsab);
    if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

    break;
   }
   Status = Aida$GetNext(6
		        ,(struct _ItmLst *) &ItmTab);
  }
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   if (Status == RMS$_EOF) return(SS$_BADFILENAME);
   return(Status);
  }
 }

 if (!AuthorIsDa)
 {
  /* wurde der author in der itemlist nicht angegeben
  /* wird der author aus dem profile genommen
  */
  Status = FillTlvBuf(&InAttributes
		     ,&InAttributesLen
		     ,&attributes_length
		     ,OafcT_Author
		     ,Cabinet -> Allin1FulnamLen
		     ,Cabinet -> Allin1Fulnam);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }

 if (parent_unique_id == 0)
 {
  /* wurde kein fach in der itemlist angegeben
  /* wird das fach STANDARD genommen
  */
  Status = GetDrawerUid(Cabinet -> ClientSession
		       ,&parent_unique_id
		       ,0
		       ,0);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

  /* und auch gleich in den output-parameter �bernommen
  */
  if (8 > NewDoc -> FachLen) return(OafcBufferOverflow);
  memcpy(NewDoc -> Fach,"STANDARD",8);
  NewDoc -> FachLen = 8;
 }

 /* die extension des infile wird in den attribute-buffer
 /* �bernommen
 */
 Status = FillTlvBuf(&InAttributes
		    ,&InAttributesLen
		    ,&attributes_length
		    ,OafcT_FileExtension
		    ,FileExtLen - 1
		    ,++FileExt);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 /* der type DOCUMENT wird in den attribute-buffer �bernommen
 */
 Status = FillTlvBuf(&InAttributes
		    ,&InAttributesLen
		    ,&attributes_length
		    ,OafcT_Type
		    ,8
		    ,"DOCUMENT");
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 /* StructuralType bezeichnet das es sich um ein dokument handelt
 /* OafcT_StructuralType mu� immer als letztes im attribute-buffer
 /* stehen
 */
 Status = FillTlvBuf(&InAttributes
		    ,&InAttributesLen
		    ,&attributes_length
		    ,OafcT_StructuralType
		    ,1
		    ,&OafcK_TypeDocument
		    ,OafcTlv_EOC
		    ,OafcTlv_EOC);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 /* mit den n�chsten zwei calls wird dem create der name
 /* des infiles bekanntgegeben
 */
 Status = FillTlvBuf(&CmParameters
		    ,&CmParametersLen
		    ,&cm_parameters_length
		    ,OafcT_ContentImport
		    ,1
		    ,&OafcK_ContentImportNoDelete);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 Status = FillTlvBuf(&CmParameters
		    ,&CmParametersLen
		    ,&cm_parameters_length
		    ,OafcT_ContentFileSpec
		    ,InFileNameLen
		    ,InFileName
		    ,OafcTlv_EOC
		    ,OafcTlv_EOC);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 Status = OafcCreateW(Cabinet -> ClientSession
		     ,parent_unique_id
		     ,0
		     ,0
		     ,InAttributes
		     ,attributes_length
		     ,&DocumentUID
		     ,0
		     ,&StatusBlock
		     ,CmParameters
		     ,cm_parameters_length);

 if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0) return(StatusBlock.status2);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0) return(StatusBlock.status1);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 if (StatusBlock.success_cnt <= 0) return(OafcNoModify);

 /* das create hat die uid des neuen dokuments zur�ckgeliefert
 /* damit holma uns jetzt noch die dokument-nummer
 */
 Status = GetDocNum(Cabinet -> ClientSession
		   ,&DocumentUID
		   ,NewDoc -> DocNum
		   ,&(NewDoc -> DocNumLen));

 /* is irgendwas net guatganga dann l�schma des neue
 /* dokument wieda
 */
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  AllSource.unique_id_p = &DocumentUID;
  AllSource.scope = OafcM_ScopeAbsolute;

  OafcDeleteW(Cabinet -> ClientSession
	     ,&AllSource
	     ,0
	     ,0
	     ,0
	     ,0);
 }

 return(Status);
}


unsigned long	    CopyDocument(FcCabinet *Cabinet
				,DocKey *VonDoc
				,VmsItmLst *VmsItmTabPut
				,DocKey *NachDoc
			        ,char Move)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcCopyDocumentBlk" noshr
  OafcAttributes static    *InAttributes = 0;
  OafcStringLength static  InAttributesLen = 0;
  OafcCMParameters static  *CmParameters = 0;
  OafcStringLength static  CmParametersLen = 0;
 #pragma extern_model restore

 OafcAllSource	    AllSource = {0,0,0,0,0,0,0,0};
 OafcUID	    DocumentUID;
 OafcStatus	    StatusBlock = {0,0,0,0,0,0,0,0};
 OafcCondValue	    Status;
 OafcUID	    *target_unique_id = 0;
 OafcStringLength   attributes_length = 0;
 OafcStringLength   cm_parameters_length = 0;
 OafcReporting      Reporting = {0,0,OafcM_ReportingUID};
 VmsItmLst	    *VmsItmTab;
 char		    FolderIsDa = 0;

/* anscheinend sollte es so sein das beim copy oder move
/* die current-uid das zielfach sein. das heist das letzte
/* GetDrawerUid vor dem move oder copy sollte auf das zielfach
/* gemacht werden.
*/

 Status = GetDocumentUid(Cabinet -> ClientSession
			,&AllSource.unique_id_p
			,VonDoc -> Fach
			,VonDoc -> FachLen
			,VonDoc -> Ordner
			,VonDoc -> OrdnerLen
			,VonDoc -> DocNum
			,VonDoc -> DocNumLen);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 if (VmsItmTabPut != 0)
 {
  for(VmsItmTab = VmsItmTabPut
     ;VmsItmTab -> EndUnion.Ende != 0
     ;VmsItmTab = (struct _VmsItmLst *) &(VmsItmTab -> BufferRetLen))
  {
   switch(VmsItmTab -> EndUnion.Item.ItemCode)
   {
    case OafcT_NickName:
    {
     Status = GetDrawerUid(Cabinet -> ClientSession
		          ,&target_unique_id
		          ,VmsItmTab -> Buffer
		          ,VmsItmTab -> EndUnion.Item.BufferLen);
     if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

     if (NachDoc -> Fach != 0 && NachDoc -> FachLen != 0)
     {
      if (VmsItmTab -> EndUnion.Item.BufferLen > NachDoc -> FachLen) return(OafcBufferOverflow);
      memcpy(NachDoc -> Fach,VmsItmTab -> Buffer,VmsItmTab -> EndUnion.Item.BufferLen);
      NachDoc -> FachLen = VmsItmTab -> EndUnion.Item.BufferLen;
     }

     break;
    }
    case OafcT_ParentName:
    {
     Status = FillTlvBuf(&InAttributes
		        ,&InAttributesLen
		        ,&attributes_length
		        ,VmsItmTab -> EndUnion.Item.ItemCode
		        ,VmsItmTab -> EndUnion.Item.BufferLen
		        ,VmsItmTab -> Buffer);
     if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

     if (NachDoc -> Ordner != 0 && NachDoc -> OrdnerLen != 0)
     {
      if (VmsItmTab -> EndUnion.Item.BufferLen > NachDoc -> OrdnerLen) return(OafcBufferOverflow);
      memcpy(NachDoc -> Ordner,VmsItmTab -> Buffer,VmsItmTab -> EndUnion.Item.BufferLen);
      NachDoc -> OrdnerLen = VmsItmTab -> EndUnion.Item.BufferLen;
     }

     FolderIsDa = 1;

     break;
    }
    case OafcT_Author:
    case OafcT_Delete:
    case OafcT_Keywords:
    case OafcT_Modify:
    case OafcT_Title:
    {
     Status = FillTlvBuf(&InAttributes
		        ,&InAttributesLen
		        ,&attributes_length
		        ,VmsItmTab -> EndUnion.Item.ItemCode
		        ,VmsItmTab -> EndUnion.Item.BufferLen
		        ,VmsItmTab -> Buffer);
     if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

     break;
    }
    default: return(OafcInsufficientArguments);
   }
  }
 }

 if (!FolderIsDa)
 {
  Status = FillTlvBuf(&InAttributes
		     ,&InAttributesLen
		     ,&attributes_length
		     ,OafcT_ParentName
		     ,VonDoc -> OrdnerLen
		     ,VonDoc -> Ordner
		     ,OafcTlv_EOC
		     ,OafcTlv_EOC);

  if (NachDoc -> Ordner != 0 && NachDoc -> OrdnerLen != 0)
  {
   if (VonDoc -> OrdnerLen > NachDoc -> OrdnerLen) return(OafcBufferOverflow);
   memcpy(NachDoc -> Ordner,VonDoc -> Ordner,VonDoc -> OrdnerLen);
   NachDoc -> OrdnerLen = VonDoc -> OrdnerLen;
  }
 }
 else
 {
  Status = FillTlvBuf(&InAttributes
		     ,&InAttributesLen
		     ,&attributes_length
		     ,OafcTlv_EOC
		     ,OafcTlv_EOC);
 }
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 if (target_unique_id == 0)
 {
  Status = GetDrawerUid(Cabinet -> ClientSession
		       ,&target_unique_id
		       ,VonDoc -> Fach
		       ,VonDoc -> FachLen);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

  if (NachDoc -> Fach != 0 && NachDoc -> FachLen != 0)
  {
   if (VonDoc -> FachLen > NachDoc -> FachLen) return(OafcBufferOverflow);
   memcpy(NachDoc -> Fach,VonDoc -> Fach,VonDoc -> FachLen);
   NachDoc -> FachLen = VonDoc -> FachLen;
  }
 }

 Status = FillTlvBuf(&CmParameters
		    ,&CmParametersLen
		    ,&cm_parameters_length
		    ,OafcT_ContentAction
		    ,1
		    ,"1"
		    ,OafcTlv_EOC
		    ,OafcTlv_EOC);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 AllSource.scope = OafcM_ScopeAbsolute;
 StatusBlock.appl_context = (OafcUINT32) &DocumentUID;;
 Reporting.logrtn =  application_log_routine;

 if (Move)
  Status = OafcRefileW(Cabinet -> ClientSession
		      ,&AllSource
		      ,target_unique_id
		      ,InAttributes
		      ,attributes_length
		      ,&Reporting
		      ,&StatusBlock
		      ,CmParameters
		      ,cm_parameters_length);
 else
  Status = OafcCopyW(Cabinet -> ClientSession
		    ,&AllSource
		    ,target_unique_id
		    ,InAttributes
		    ,attributes_length
		    ,&Reporting
		    ,&StatusBlock
		    ,CmParameters
		    ,cm_parameters_length);


 if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0) return(StatusBlock.status2);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0) return(StatusBlock.status1);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 if (StatusBlock.success_cnt <= 0) return(OafcNoModify);

 /* das copy hat die uid des neuen dokuments zur�ckgeliefert
 /* damit holma uns jetzt noch die dokument-nummer
 */
 Status = GetDocNum(Cabinet -> ClientSession
		   ,&DocumentUID
		   ,NachDoc -> DocNum
		   ,&(NachDoc -> DocNumLen));

 /* is irgendwas net guatganga dann l�schma des neue
 /* dokument wieda
 */
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  AllSource.unique_id_p = &DocumentUID;
  AllSource.scope = OafcM_ScopeAbsolute;

  OafcDeleteW(Cabinet -> ClientSession
	     ,&AllSource
	     ,0
	     ,0
	     ,0
	     ,0);
 }

 return(Status);
}


unsigned long	    DeleteDocument(FcCabinet *Cabinet
				  ,DocKey *VonDoc)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcDeleteDocumentBlk" noshr
  OafcCMParameters static  *CmParameters = 0;
  OafcStringLength static  CmParametersLen = 0;
 #pragma extern_model restore

 OafcAllSource	    AllSource = {0,0,0,0,0,0,0,0};
 OafcStatus	    StatusBlock = {0,0,0,0,0,0,0,0};
 OafcCondValue	    Status;
 OafcStringLength   cm_parameters_length = 0;

 Status = GetDocumentUid(Cabinet -> ClientSession
			,&AllSource.unique_id_p
			,VonDoc -> Fach
			,VonDoc -> FachLen
			,VonDoc -> Ordner
			,VonDoc -> OrdnerLen
			,VonDoc -> DocNum
			,VonDoc -> DocNumLen);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 Status = FillTlvBuf(&CmParameters
		    ,&CmParametersLen
		    ,&cm_parameters_length
		    ,OafcT_ContentAction
		    ,1
		    ,"1"
		    ,OafcTlv_EOC
		    ,OafcTlv_EOC);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 AllSource.scope = OafcM_ScopeAbsolute;

 Status = OafcDeleteW(Cabinet -> ClientSession
	             ,&AllSource
		     ,0
		     ,&StatusBlock
		     ,CmParameters
		     ,cm_parameters_length);


 if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0) return(StatusBlock.status2);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0) return(StatusBlock.status1);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 if (StatusBlock.success_cnt <= 0) return(OafcNoDelete);

 return(Status);
}


unsigned long	    GetDocFile(FcCabinet *Cabinet
			      ,DocKey *ResDoc
			      ,short FileNameLen
			      ,const char *FileName
			      ,char Reserve)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcGetDocFileBlk" noshr
  OafcCMParameters static  *CmParameters = 0;
  OafcStringLength static  CmParametersLen = 0;
 #pragma extern_model restore

 OafcUID	    *source_uid;
 OafcUINT32	    reserve_function;
 OafcStringLength   cm_parameters_length = 0;
 OafcStatus	    StatusBlock = {0,0,0,0,0,0,0,0};
 OafcCondValue	    Status;
 char		    File[512];

 Status = GetDocumentUid(Cabinet -> ClientSession
			,&source_uid
			,ResDoc -> Fach
			,ResDoc -> FachLen
			,ResDoc -> Ordner
			,ResDoc -> OrdnerLen
			,ResDoc -> DocNum
			,ResDoc -> DocNumLen);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 Status = FillTlvBuf(&CmParameters
		    ,&CmParametersLen
		    ,&cm_parameters_length
		    ,OafcT_ContentExport
		    ,1
		    ,"1");
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 if (Search("::",(char *) FileName,FileNameLen) == 0)
 {
  Status = CheckDrawerState(Cabinet -> LocalNode
			   ,Cabinet -> Allin1User
			   ,ResDoc -> Fach
			   ,ResDoc -> FachLen);
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   if (Status != OafcDrawerDoesNotExist) return(Status);

   Status = FillTlvBuf(&CmParameters
		      ,&CmParametersLen
		      ,&cm_parameters_length
		      ,OafcT_ContentFileSpec
		      ,sprintf(File,"%s%.*s",Cabinet -> LocalNode,FileNameLen,FileName)
		      ,File
		      ,OafcTlv_EOC
		      ,OafcTlv_EOC);
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  }
  else
  {
   Status = FillTlvBuf(&CmParameters
		      ,&CmParametersLen
		      ,&cm_parameters_length
		      ,OafcT_ContentFileSpec
		      ,FileNameLen
		      ,FileName
		      ,OafcTlv_EOC
		      ,OafcTlv_EOC);
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  }
 }
 else
 {
  Status = FillTlvBuf(&CmParameters
		     ,&CmParametersLen
		     ,&cm_parameters_length
		     ,OafcT_ContentFileSpec
		     ,FileNameLen
		     ,FileName
		     ,OafcTlv_EOC
		     ,OafcTlv_EOC);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }

 if (Reserve)
  reserve_function = OafcK_Reserve;
 else
  reserve_function = OafcK_Fetch;

 Status = OafcReserveW(Cabinet -> ClientSession
		      ,source_uid
		      ,0
		      ,reserve_function
		      ,0
		      ,0
		      ,0
		      ,&StatusBlock
		      ,CmParameters
		      ,cm_parameters_length);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0) return(StatusBlock.status2);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0) return(StatusBlock.status1);

 return(Status);
}


unsigned long	    ListDocument(FcCabinet *Cabinet
				,VmsItmLst *InItmTab
				,VmsItmLst *OutItmTab)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcListDocumentBlk" noshr
  OafcAttributes static	    *InAttributesBuf = 0;
  OafcStringLength static   InAttributesMaxLen = 0;
  OafcAttributes static	    *OutAttributesBuf = 0;
  OafcStringLength static   OutAttributesMaxLen = 0;
 #pragma extern_model restore

 struct _TlvAttribute
 {
  short		    Tag;
  short		    ValueLen;
  char		    Value;
 }		    *TlvAttribute;

 OafcAllSource	    AllSource = {0,0,0,0,0,0,0,0};
 OafcUINT16	    Attributes[200];
 OafcStringLength   attributes_length = 0;
 OafcStatus	    StatusBlock = {0,0,0,0,0,0,0,0};
 OafcBufferLength   attributes_buffer_size = 0;
 OafcCondValue	    Status;
 long		    AttributesIndex = -1;
 VmsItmLst	    *ItmTab;
 VmsItmLst	    *FachItm = 0;

 /* in den InAttributesBuf werden die selektionswerte
 /* eingetragen nach denen das dokument ausgesucht werden soll.
 /* die kriterien m��en alle mit eq zutreffen
 /* die elemente aus der initmtab werden in den InAttributesBuf
 /* eingetragen. sollte dabei ein facheintrag gefunden werden
 /* dann wird der extra behandelt
 /* steht kein fach in der initmtab dann wird STANDARD genommen
 */
 for(ItmTab = InItmTab
    ;ItmTab -> EndUnion.Ende != 0
    ;ItmTab = (struct _VmsItmLst *) &(ItmTab -> BufferRetLen))
 {
  if (ItmTab -> EndUnion.Item.ItemCode == OafcT_NickName)
   FachItm = ItmTab;
  else
  {
   /* OafcT_Eqc bedeutet, da� das element genau stimmen mu�
   */
   Status = FillTlvBuf(&InAttributesBuf
		      ,&InAttributesMaxLen
		      ,&AllSource.qual_len
		      ,ItmTab -> EndUnion.Item.ItemCode
		      ,ItmTab -> EndUnion.Item.BufferLen
		      ,ItmTab -> Buffer
		      ,OafcT_Eqc);
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  }
 }

 /* OafcT_And bedeuted, da� alle elemente zutreffen m��en
 */
 Status = FillTlvBuf(&InAttributesBuf
		    ,&InAttributesMaxLen
		    ,&AllSource.qual_len
		    ,OafcT_And
		    ,OafcTlv_EOC);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 Status = FillTlvBuf(&InAttributesBuf
		    ,&InAttributesMaxLen
		    ,&AllSource.qual_len
		    ,OafcTlv_EOC);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 Status = GetDrawerUid(Cabinet -> ClientSession
		      ,&AllSource.unique_id_p
		      ,FachItm ? (FachItm -> Buffer) : 0
		      ,FachItm ? (FachItm -> EndUnion.Item.BufferLen) : 0);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 /* hier wird die outitmetab durchgegangen also
 /* die attribute die zur�ckgeliefert werden sollen
 */
 for(ItmTab = OutItmTab
    ;ItmTab -> EndUnion.Ende != 0
    ;ItmTab = (struct _VmsItmLst *) &(ItmTab -> Next))
 {
  /* wird das fach auch verlangt, mu� das extra behandelt werden
  /* da es vom list �bergangen wird
  */
  if (ItmTab -> EndUnion.Item.ItemCode != OafcT_NickName)
  {
   /* die item-codes werden in die attribut-tabelle eingetragen
   */
   Attributes[++AttributesIndex] = ItmTab -> EndUnion.Item.ItemCode;

   /* die l�nge des return-buffers wird aufgerechnet
   */
   attributes_buffer_size = attributes_buffer_size + ItmTab -> EndUnion.Item.BufferLen + 4;
  }
 }
 /* die attribut-tabell wird mit 2 OafcTlv_EOC beendet
 /* und deren l�nge ermittelt
 */
 Attributes[AttributesIndex + 1] = OafcTlv_EOC;
 Attributes[AttributesIndex + 2] = OafcTlv_EOC;
 attributes_length = sizeof(Attributes[0]) * (AttributesIndex + 2);

 /* gr��enkontrolle des outattribut-buffers.
 /* ist er zu klein wird er vergr��ert
 */
 attributes_buffer_size = attributes_buffer_size + 4;
 if (OutAttributesMaxLen < attributes_buffer_size)
 {
  OutAttributesBuf = realloc(OutAttributesBuf,attributes_buffer_size);
  if (OutAttributesBuf == 0) return(SS$_INSFMEM);
  OutAttributesMaxLen = attributes_buffer_size;
 }

 AllSource.qualification = InAttributesBuf;
 AllSource.scope = OafcM_ScopeDescendants;

 Status = OafcListW(Cabinet -> ClientSession
		   ,&AllSource
		   ,0
		   ,0
		   ,0
		   ,(OafcAttributes *) &Attributes
		   ,attributes_length
		   ,0
		   ,OutAttributesBuf
		   ,attributes_buffer_size
		   ,0
		   ,0
		   ,0
		   ,&StatusBlock
		   ,0
		   ,0);

 /* wurde kein dokument gefunden (StatusBlock.success_cnt < 1)
 /* wird list mit einem fehler beendet.
 /* wurden mehrere dokumente gefunden (StatusBlock.success_cnt > 1)
 /* steht im OutAttributesBuf das j�ngste das auch zur�ckgeliefert wird
 */
 if ($VMS_STATUS_SUCCESS(Status))
  if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0)
   return(StatusBlock.status2);
  else
   if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0)
    return(StatusBlock.status1);
   else
    if (StatusBlock.success_cnt < 1)
     return(RMS$_RNF);
    else
     if (StatusBlock.success_cnt > 1) Status = OafcPartial;

 /* der OutAttributesBuf wird durchgegangen und die elemente
 /* in die outitmtab �bernommen.
 /* trifft der unwahrscheinliche fall ein, da� das element OafcT_NickName
 /* gefunden wird, wirds einfach �bergangen.
 */

 /* schleife �ber die outitmtab
 /* beendet wird die schleife wenn in ItmTab -> EndUnion.Ende 0 steht
 */
 for(ItmTab = OutItmTab
    ;ItmTab -> EndUnion.Ende != 0
    ;ItmTab = (struct _VmsItmLst *) &(ItmTab -> Next))
 {
  if (ItmTab -> EndUnion.Item.ItemCode == OafcT_NickName)
  {
   /* soll das fach auch zur�ckgeliefert werden dann wird es
   /* hier in die outitmtab eingetragen
   */
   if (FachItm != 0)
   {
    if (ItmTab -> EndUnion.Item.BufferLen < FachItm -> EndUnion.Item.BufferLen) return(OafcBufferOverflow);
    *(ItmTab -> BufferRetLen) = FachItm -> EndUnion.Item.BufferLen;
    memcpy(ItmTab -> Buffer,FachItm -> Buffer,FachItm -> EndUnion.Item.BufferLen);
   }
   else
   {
    if (ItmTab -> EndUnion.Item.BufferLen < 8) return(OafcBufferOverflow);
    *(ItmTab -> BufferRetLen) = 8;
    memcpy(ItmTab -> Buffer,&"STANDARD",8);
   }
  }
  else
  {
   /* schleife �ber den OutAttributesBuf
   /* beendet wird die schleife wenn der item oder 0 (bufferende) gefunden wird
   */
   for(TlvAttribute = (struct _TlvAttribute *) OutAttributesBuf
      ;(TlvAttribute -> Tag != ItmTab -> EndUnion.Item.ItemCode && TlvAttribute -> Tag != 0)
      ;TlvAttribute = (struct _TlvAttribute *) ((char *) TlvAttribute + TlvAttribute -> ValueLen + 4));

   if (TlvAttribute -> Tag == 0)
    *(ItmTab -> BufferRetLen) = 0;
   else
   {
    /* wurde der item gefunden werden die daten in die
    /* outitmtab �bernommen
    */
    if (ItmTab -> EndUnion.Item.BufferLen < TlvAttribute -> ValueLen) return(OafcBufferOverflow);
    *(ItmTab -> BufferRetLen) = TlvAttribute -> ValueLen;
    memcpy(ItmTab -> Buffer,&(TlvAttribute -> Value),TlvAttribute -> ValueLen);
   }
  }
 }

 /* so das w�re es, hoffentlich alles gutgegangen
 */
 return(Status);
}


unsigned long	    DoScript(FcCabinet *Cabinet
			    ,const char *ScriptName
			    ,short ScriptNameLen
			    ,VmsItmLst *InItmLst)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcDoScriptBlk" noshr
  OafcTLV static	    *ScriptParamsBuff = 0;
  OafcStringLength static   ScriptParamsBuffLen = 0;
 #pragma extern_model restore

 OafcTEXT8	    SymbiontName[] = "OA$SCRIPT";
 OafcQSB            QueueStatusBlock = {0,0,0,0,0,0,0};
 OafcStatus	    StatusBlock = {0,0,0,0,0,0,0,0};
 OafcCondValue	    Status;
 OafcStringLength   script_params_length = 0;
 OafcTLV static	    *script_params_buff = 0;
 VmsItmLst	    *ItmTab;
 char		    *TraceFile;

 /* schaumamal ob a tracefile mitgeschrieben werden soll
 */
 Status = GetTwoLogNames("ADV_FC$TRACE"
		        ,0);
 if ($VMS_STATUS_SUCCESS(Status))
 {
  /* wenn ja dan schauma no obs an bestimmten namen haben soll
  /* oder obs sys$login:a1trace.log hei�en kann
  */
  Status = GetTwoLogNames("ADV_FC$TRACEFILE"
		         ,&TraceFile);
  if ($VMS_STATUS_SUCCESS(Status))
  {
   Status = FillTlvBuf(&ScriptParamsBuff
		      ,&ScriptParamsBuffLen
		      ,&script_params_length
		      ,OafcT_ScriptLogFile
		      ,strlen(TraceFile)
		      ,TraceFile);
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  }
  else
  {
   if (Status != SS$_NOLOGNAM) return(Status);
   Status = FillTlvBuf(&ScriptParamsBuff
		      ,&ScriptParamsBuffLen
		      ,&script_params_length
		      ,OafcT_ScriptLogFile
		      ,21
		      ,"SYS$LOGIN:A1TRACE.LOG");
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  }
 }
 else
  if (Status != SS$_NOLOGNAM) return(Status);

 /* dann schreibma no die parameter in den buffer
 */
 if (InItmLst != 0)
 {
  for(ItmTab = InItmLst
     ;ItmTab -> EndUnion.Ende != 0
     ;ItmTab = (struct _VmsItmLst *) &(ItmTab -> BufferRetLen))
  {
   Status = FillTlvBuf(&ScriptParamsBuff
		      ,&ScriptParamsBuffLen
		      ,&script_params_length
		      ,ItmTab -> EndUnion.Item.ItemCode
		      ,ItmTab -> EndUnion.Item.BufferLen
		      ,ItmTab -> Buffer);
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  }
 }

 if (script_params_length > 0)
 {
  Status = FillTlvBuf(&ScriptParamsBuff
		     ,&ScriptParamsBuffLen
		     ,&script_params_length
		     ,OafcTlv_EOC
		     ,OafcTlv_EOC);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

  script_params_buff = ScriptParamsBuff;
 }

 /* zuerst wird �berpr�ft ob die queue in ordnung ist
 */
 Status = OafcSubmitScriptW(Cabinet -> ClientSession
			   ,OafcK_GetQueueInfo
			   ,0
			   ,0
			   ,SymbiontName
			   ,strlen((char *) SymbiontName)
			   ,0
			   ,0
			   ,0
			   ,0
			   ,0
			   ,0
			   ,&QueueStatusBlock
			   ,&StatusBlock);

 if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0) return(StatusBlock.status2);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0) return(StatusBlock.status1);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 /* ist die queue gestoppt oder ist sie aus einem anderen
 /* grund nicht funktionsf�hig, wird doscript mit einem error beendet
 */
 if ((QueueStatusBlock.queue_status & ~(OafcM_QueueIdle
				      | OafcM_QueueResuming
				      | OafcM_QueueStarting
				      | OafcM_QueueServer)) != 0) return(SS$_BADQUEUEHDR);

 /* jetzt wird der script in die queue gestellt
 */
 Status = OafcSubmitScriptW(Cabinet -> ClientSession
			   ,OafcK_SubmitScript
			   ,(OafcTEXT8 *) ScriptName
			   ,ScriptNameLen
			   ,SymbiontName
			   ,strlen((char *) SymbiontName)
			   ,script_params_buff
			   ,script_params_length
			   ,0
			   ,0
			   ,(OafcTEXT8 *) Cabinet -> Allin1User
			   ,strlen(Cabinet -> Allin1User)
			   ,0
			   ,&StatusBlock);

 /* steht in status1 OafcSystemError und enth�lt status2 keinen vern�nftigen
 /* statuscode kann man annehmen das der script mit einem errorstatus (oa$status)
 /* beendet wurde. status2 < 5 deswegen weil bei test immer 4 in status2 gestanden
 /* ist.
 */
 if (StatusBlock.status1 == OafcSystemError && StatusBlock.status2 < 5) return(StatusBlock.status1);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0) return(StatusBlock.status2);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0) return(StatusBlock.status1);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 return(Status);
}


/* von GetDrawerUid wird die UID des mitgegebenen
/* faches zur�ckgeliefert
*/
unsigned long	    GetDrawerUid(OafcClientSession *ClientSession
			        ,OafcUID **DrawerUID
				,char const *DrawerName
				,short DrawerName_Len)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcGetDrawerUidBlk" noshr
 /* DrawerATT mu� deswegen permanent sein weil die adresse
 /* von TlvUid dem aufrufer zur�ckgeliefert wird
 */
  struct _DrawerATT
  {
   struct _PreUid
   {
    short		    TlvTag;
    short		    TlvUidLen;
   }			    PreUid;
   OafcUID		    TlvUid;
   short		    Ende1;
   short		    Ende2;
  } static		    DrawerATT;
  OafcAttributes static	    *AttributesBuf = 0;
  OafcStringLength static   AttributesMaxLen = 0;
 #pragma extern_model restore

 OafcAllSource	    AllSource = {0,0,0,0,0,0,0,0};
 OafcUINT16	    Attributes[3] = {OafcT_InternalUID,OafcTlv_EOC,OafcTlv_EOC};
 OafcUINT32	    num_items = 1;
 OafcStatus	    StatusBlock = {0,0,0,0,0,0,0,0};
 OafcCondValue	    Status;

 /* das fach wird in den AttributesBuf (selektions-buffer)
 /* eingetragen
 */
 if (DrawerName == 0 || DrawerName_Len == 0)
 {
  Status = FillTlvBuf(&AttributesBuf
		     ,&AttributesMaxLen
		     ,&AllSource.qual_len
		     ,OafcT_NickName
		     ,8
		     ,"STANDARD"
		     ,OafcT_Eqc
		     ,OafcTlv_EOC
		     ,OafcTlv_EOC);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
 else
 {
  Status = FillTlvBuf(&AttributesBuf
		     ,&AttributesMaxLen
		     ,&AllSource.qual_len
		     ,OafcT_NickName
		     ,DrawerName_Len
		     ,DrawerName
		     ,OafcT_Eqc
		     ,OafcTlv_EOC
		     ,OafcTlv_EOC);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }

 AllSource.scope = OafcM_ScopeAbsolute;
 AllSource.qualification = AttributesBuf;

 Status = OafcListW(ClientSession
		   ,&AllSource
		   ,0
		   ,0
		   ,0
		   ,(OafcAttributes *) &Attributes
		   ,sizeof(Attributes)
		   ,num_items
		   ,(OafcAttributes *) &DrawerATT
		   ,sizeof(DrawerATT)
		   ,0
		   ,0
		   ,0
		   ,&StatusBlock
		   ,0
		   ,0);

 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0) return(StatusBlock.status2);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0) return(StatusBlock.status1);
 if (StatusBlock.success_cnt <= 0) return(OafcDrawerDoesNotExist);

 /* ist alles gutgegangen dann wird die adresse des uid-buffers
 /* in den parameter eingetragen und dann hammas
 */
 *DrawerUID = (union _OafcUID *) &DrawerATT.TlvUid.internal_uid[0];

 return(Status);
}


unsigned long	    CheckDrawerState(char *LocalNode
				    ,char *Allin1User
				    ,char const *DrawerName
				    ,short DrawerName_Len)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcCheckDrawerStateBlk" noshr
 /* DrawerATT mu� deswegen permanent sein weil die adresse
 /* von TlvUid dem aufrufer zur�ckgeliefert wird
 */
  OafcQualification static  *QualificationBuf = 0;
  OafcStringLength static   QualificationMaxLen = 0;
 #pragma extern_model restore

 OafcUINT16	    AttributesBuffer[3] = {OafcT_SysManDrawerUniqueName,OafcTlv_EOC,OafcTlv_EOC};
 OafcDrawerSrc      DrawerSrc = {0,0,0,0,0,0,0,0,0,0};
 OafcTLV            OutputBuffer[68];
 OafcBufferLength   OutputBufferLength = sizeof(OutputBuffer);
 OafcBufferLength   UniqueLen;
 OafcCondValue	    Status;

 UniqueLen =  sprintf((char *) OutputBuffer,"[%s]%.*s",Allin1User,DrawerName_Len,DrawerName);
 if (OutputBufferLength <= UniqueLen) return(SS$_ABORT);

 Status = FillTlvBuf(&QualificationBuf
		    ,&QualificationMaxLen
		    ,&DrawerSrc.dr_qual_len
		    ,OafcT_SysManDrawerUniqueName
		    ,UniqueLen
		    ,OutputBuffer
		    ,OafcT_Eqc
		    ,OafcTlv_EOC
		    ,OafcTlv_EOC);

 DrawerSrc.dr_qual_p = QualificationBuf;
 DrawerSrc.request_count = 1;

 Status = OafcShowPartition((OafcDnsName *) LocalNode
			   ,strlen(LocalNode)
			   ,(OafcAttributes *) &AttributesBuffer
			   ,sizeof(AttributesBuffer)
			   ,&DrawerSrc
			   ,OutputBuffer
			   ,&OutputBufferLength
			   ,0
			   ,0);

 if (Status == OafcPartitionNF) return(OafcDrawerDoesNotExist);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 if (DrawerSrc.returned_count == 0) return(OafcDrawerDoesNotExist);

 return(Status);
}


/* von GetDocumentUid wird die UID des mitgegebenen
/* Documents zur�ckgeliefert
*/
unsigned long	    GetDocumentUid(OafcClientSession *ClientSession
			          ,OafcUID **DocumentUID
				  ,char const *FachName
				  ,short FachName_Len
				  ,char const *OrdnerName
				  ,short OrdnerName_Len
				  ,char const *Docnum
				  ,short Docnum_Len)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcGetDocumentUidBlk" noshr
 /* DocumentATT mu� deswegen permanent sein weil die adresse
 /* von TlvUid dem aufrufer zur�ckgeliefert wird
 */
  struct _DocumentATT
  {
   struct _PreUid
   {
    short		    TlvTag;
    short		    TlvUidLen;
   }			    PreUid;
   OafcUID		    TlvUid;
   short		    Ende1;
   short		    Ende2;
  } static		    DocumentATT;
  OafcAttributes static	    *AttributesBuf = 0;
  OafcStringLength static   AttributesMaxLen = 0;
 #pragma extern_model restore

 OafcAllSource	    AllSource = {0,0,0,0,0,0,0,0};
 OafcUINT16	    Attributes[3] = {OafcT_InternalUID,OafcTlv_EOC,OafcTlv_EOC};
 OafcUINT32	    num_items = 1;
 OafcStatus	    StatusBlock = {0,0,0,0,0,0,0,0};
 OafcCondValue	    Status;

 Status = GetDrawerUid(ClientSession
		      ,&AllSource.unique_id_p
		      ,FachName
		      ,FachName_Len);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 if (OrdnerName == 0 || OrdnerName_Len == 0)
 {
  Status = FillTlvBuf(&AttributesBuf
		     ,&AttributesMaxLen
		     ,&AllSource.qual_len
		     ,OafcT_ParentName
		     ,9
		     ,"ALLGEMEIN"
		     ,OafcT_Eqc);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
 else
 {
  Status = FillTlvBuf(&AttributesBuf
		     ,&AttributesMaxLen
		     ,&AllSource.qual_len
		     ,OafcT_ParentName
		     ,OrdnerName_Len
		     ,OrdnerName
		     ,OafcT_Eqc);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }

 Status = FillTlvBuf(&AttributesBuf
		    ,&AttributesMaxLen
		    ,&AllSource.qual_len
		    ,OafcT_Docnum
		    ,Docnum_Len
		    ,Docnum
		    ,OafcT_Eqc
		    ,OafcTlv_EOC
		    ,OafcTlv_EOC);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

 AllSource.scope = OafcM_ScopeDescendants;
 AllSource.qualification = AttributesBuf;

 Status = OafcListW(ClientSession
		   ,&AllSource
		   ,0
		   ,0
		   ,0
		   ,(OafcAttributes *) &Attributes
		   ,sizeof(Attributes)
		   ,num_items
		   ,(OafcAttributes *) &DocumentATT
		   ,sizeof(DocumentATT)
		   ,0
		   ,0
		   ,0
		   ,&StatusBlock
		   ,0
		   ,0);

 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0) return(StatusBlock.status2);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0) return(StatusBlock.status1);
 if (StatusBlock.success_cnt <= 0) return(OafcDrawerDoesNotExist);

 /* ist alles gutgegangen dann wird die adresse des uid-buffers
 /* in den parameter eingetragen und dann hammas
 */
 *DocumentUID = (union _OafcUID *) &DocumentATT.TlvUid.internal_uid[0];

 return(Status);
}


/* von GetDocNum wird die Nummer der mitgegebenen
/* UID zur�ckgeliefert
*/
unsigned long	    GetDocNum(OafcClientSession *ClientSession
			     ,OafcUID *DocumentUID
			     ,char *Docnum
			     ,short *DocnumLen)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "FcGetDocNumBlk" noshr
  OafcAttributes static	    *AttributesBuf = 0;
  OafcStringLength static   AttributesMaxLen = 0;
 #pragma extern_model restore

 struct _TlvAttribute
 {
  short		    Tag;
  short		    ValueLen;
  char		    Value;
  short		    Ende1;
  short		    Ende2;
 }		    *TlvAttribute;

 OafcAllSource	    AllSource = {0,0,0,0,0,0,0,0};
 OafcUINT16	    Attributes[3] = {OafcT_Docnum,OafcTlv_EOC,OafcTlv_EOC};
 OafcUINT32	    num_items = 1;
 OafcStatus	    StatusBlock = {0,0,0,0,0,0,0,0};
 OafcCondValue	    Status;
 OafcStringLength   attributes_length = *DocnumLen + (sizeof(struct _TlvAttribute) - 1);

 if (AttributesMaxLen < attributes_length)
 {
  AttributesBuf = realloc(AttributesBuf,attributes_length);
  if (AttributesBuf == 0) return(SS$_INSFMEM);
  AttributesMaxLen = attributes_length;
 }

 AllSource.unique_id_p = DocumentUID;
 AllSource.scope = OafcM_ScopeAbsolute;
 TlvAttribute = (struct _TlvAttribute *) AttributesBuf;

 Status = OafcListW(ClientSession
		   ,&AllSource
		   ,0
		   ,0
		   ,0
		   ,(OafcAttributes *) &Attributes
		   ,sizeof(Attributes)
		   ,num_items
		   ,AttributesBuf
		   ,attributes_length
		   ,0
		   ,0
		   ,0
		   ,&StatusBlock
		   ,0
		   ,0);

 if (!$VMS_STATUS_SUCCESS(StatusBlock.status2) && StatusBlock.status2 != 0) return(StatusBlock.status2);
 if (!$VMS_STATUS_SUCCESS(StatusBlock.status1) && StatusBlock.status1 != 0) return(StatusBlock.status1);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 if (StatusBlock.success_cnt <= 0) return(SS$_ABORT);
 if (TlvAttribute -> ValueLen > *DocnumLen) return(OafcBufferOverflow);

 memcpy(Docnum,&(TlvAttribute -> Value),TlvAttribute -> ValueLen);
 *DocnumLen = TlvAttribute -> ValueLen;

 return(Status);
}


/* mit FillTlvBuf werden die diversen attribute-buffer im tlv-format
/* ausgef�llt
/* p4 - p5: word
/* p6: stringadresse
/* p7 - p10: word
/* wenn es P6 gibt mu� P5 die l�ngenangabe des strings enthalten
*/
unsigned long	FillTlvBuf(OafcAttributes **Attributes
			  ,OafcStringLength *AttributesLen
			  ,OafcStringLength *TlvBufLen
			  ,short P4
			  ,...)
{
 short	    *TagVal;
 short	    P5;
 const char *P6;
 short	    P7;
 short	    P8;
 short	    P9;
 short	    P10;
 int	    ArgCount;
 long	    NewTlvBufLen;
 va_list    AP;

 vaxc$va_count(&ArgCount);

 /* der AP wird durchgegange und ab dem 4. argument in die P..-variablen
 /* �bernommen
 /* zus�tzlich wird die gesamtl�nge des attribute-eintrages
 /* festgestellt
 */
 NewTlvBufLen = *TlvBufLen + sizeof(short);
 if (ArgCount > 4)
 {
  va_start(AP,P4);
  P5 = va_arg(AP,short);
  NewTlvBufLen = NewTlvBufLen + sizeof(short);
  if (ArgCount > 5)
  {
   P6 = va_arg(AP,const char *);
   NewTlvBufLen = NewTlvBufLen + P5;
   if(ArgCount > 6)
   {
    P7 = va_arg(AP,short);
    NewTlvBufLen = NewTlvBufLen + sizeof(short);
    if(ArgCount > 7)
    {
     P8 = va_arg(AP,short);
     NewTlvBufLen = NewTlvBufLen + sizeof(short);
     if(ArgCount > 8)
     {
      P9 = va_arg(AP,short);
      NewTlvBufLen = NewTlvBufLen + sizeof(short);
      if(ArgCount > 9)
      {
       P10 = va_arg(AP,short);
       NewTlvBufLen = NewTlvBufLen + sizeof(short);
      }
     }
    }
   }
  }
  va_end(AP);
 }

 /* es wird �berpr�ft ob der attribute-buffer gro�
 /* genug f�r den neune eintrag ist.
 /* wenn nicht dann wird er vergr��ert
 */
 if (*AttributesLen < NewTlvBufLen)
 {
  *Attributes = realloc(*Attributes,NewTlvBufLen);
  if (*Attributes == 0) return(SS$_INSFMEM);
  *AttributesLen = NewTlvBufLen;
 }

 /* der attribute-zeiger wird gesetzt
 */
 TagVal = (short *) (*Attributes + *TlvBufLen);

 /* die attribut-teile werden in den buffer eingetragen
 /* und der zeiger entsprechend weiter-gez�hlt
 */
 *(TagVal++) = P4;
 if (ArgCount > 4)
 {
  *(TagVal++) = P5;
  if (ArgCount > 5)
  {
   memcpy((char *) TagVal,P6,P5);
   if(ArgCount > 6)
   {
    TagVal = (short *) (((char *) TagVal) + P5);
    *(TagVal++) = P7;
    if(ArgCount > 7)
    {
     *(TagVal++) = P8;
     if(ArgCount > 8)
     {
      *(TagVal++) = P9;
      if(ArgCount > 9)
      {
       *TagVal = P10;
      }
     }
    }
   }
  }
 }

 *TlvBufLen = NewTlvBufLen;

 return(SS$_NORMAL);
}


unsigned long	GetCabinetName(char **CabinetName
			      ,char **CabinetUser
			      ,char *NodeName
			      ,char **VmsUserName)
{
 struct _ItmTab
 {
  ItmLst	    VmsUser;
  long		    ItmEnde;
 }		    ItmTab;

 char		*DummyNode = 0;
 long		BufferLen;
 char		Buffer[256];
 char		VmsUsr[] = "VMSUSR";
 unsigned long	Status;

 /* schauma mal ob es den logischen namen f�r
 /* den cabinet-namen gibt (node.user)
 */
 Status = GetTwoLogNames("ADV_FC$CABINET_NAME"
		        ,&(*CabinetName));
 if ($VMS_STATUS_SUCCESS(Status))
 {
  /* ist der punkt und der user da?
  */
  DummyNode = strchr(*CabinetName,'.');
  if (DummyNode == 0 || strlen(++DummyNode) == 0)
  {
   free(*CabinetName);
   return(OafcInvalidFileCabinet);
  }

  /* �betrage den user in den CabinetUser-parameter
  */
  Status = AllocCpy(&(*CabinetUser)
		   ,DummyNode
		   ,strlen(DummyNode));
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(*CabinetName);
   return(Status);
  }

  /* jetzt brauchma no den vms-user
  */
  ItmTab.VmsUser.FieldLen = strlen(VmsUsr);
  ItmTab.VmsUser.FieldName = VmsUsr;
  ItmTab.VmsUser.ValueLen = sizeof(Buffer);
  ItmTab.VmsUser.ValueName = Buffer;
  ItmTab.VmsUser.ValueRetLen = &BufferLen;
  ItmTab.ItmEnde = 0;

  Status = Aida$GetEqKey(6
		        ,"PROFIL"
		        ,0
		        ,0
		        ,strlen(*CabinetUser)
		        ,*CabinetUser
		        ,(struct _ItmLst *) &ItmTab);
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(*CabinetName);
   free(*CabinetUser);
   return(Status);
  }

  Status = AllocCpyCheck(&(*VmsUserName)
		        ,Buffer
		        ,BufferLen);
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(*CabinetName);
   free(*CabinetUser);
   return(Status);
  }
 }
 else
 {
  if (Status != SS$_NOLOGNAM) return(Status);

  /* es gibt keinen logischen namen.
  /* naja dann m��ma ihn halt zusammenstellen.
  /*
  /* hole den nodenamen
  */
  Status = GetTwoLogNames("ADV_FC$CABINET_NODE"
		         ,&DummyNode);
  if (Status == SS$_NOLOGNAM)
   DummyNode = NodeName;
  else
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);

  /* hole den vmsuser
  */
  Status = GetVmsUserName(&(*VmsUserName)
		         ,"FC");
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   if (DummyNode != NodeName) free(DummyNode);
   return(Status);
  }

  /* hole den allin1-user
  /* den vmsuser brauchma daf�r (profile)
  */
  Status = GetA1UserName(&(*CabinetUser)
		        ,*VmsUserName
		        ,"FC");
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(*VmsUserName);
   if (DummyNode != NodeName) free(DummyNode);
   return(Status);
  }

  /* der bereich f�r den cabinet-name wird reserviert
  /* und der name zusammengestellt
  */
  *CabinetName = malloc(strlen(*CabinetUser) + strlen(DummyNode) + 2);
  if (*CabinetName == 0)
  {
   free(*VmsUserName);
   free(*CabinetUser);
   if (DummyNode != NodeName) free(DummyNode);
   return(SS$_INSFMEM);
  }
  sprintf(*CabinetName,"%s.%s",DummyNode,*CabinetUser);

  if (DummyNode != NodeName) free(DummyNode);
 }

 return(SS$_NORMAL);
}


unsigned long	GetFileExt(char **FileExt
			  ,short *FileExtLen
			  ,char *FileName
			  ,short FileNameLen)
{
 struct _Valuelst
 {
  struct fscndef    Fscndef;
  long		    Ende;
 }		    Valuelst = {0,FSCN$_TYPE,0,0};

 struct dsc$descriptor_s    DFileName;
 unsigned long	Status;

 DFileName.dsc$w_length = FileNameLen;
 DFileName.dsc$b_dtype = DSC$K_DTYPE_T;
 DFileName.dsc$b_class = DSC$K_CLASS_S;
 DFileName.dsc$a_pointer = FileName;

 Status = sys$filescan(&DFileName
		      ,&Valuelst
		      ,0
		      ,0
		      ,0);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 if (Valuelst.Fscndef.fscn$w_length == 0) return(SS$_BADFILENAME);

 *FileExt = (char *) Valuelst.Fscndef.fscn$l_addr;
 *FileExtLen = Valuelst.Fscndef.fscn$w_length;

 return(SS$_NORMAL);
}


void	application_log_routine(OafcCondValue status,
                                OafcStatus *status_blk_p,
                                OafcUID *source_uid_p,
                                OafcUID *destination_uid_p)
{
 if (!$VMS_STATUS_SUCCESS(status))
  status_blk_p -> status1 = status;
 else
  memcpy((OafcUID *) status_blk_p -> appl_context,destination_uid_p,sizeof(OafcUID));
}


char *Search(const char *String
	    ,char *Buffer
	    ,short BufferLen)
{
 char	*BP;
 long	SPLen;
 long	SPIdx;

 SPLen = strlen(String);

 for(BP = (char *) Buffer;BP <= ((Buffer + BufferLen) - SPLen);BP++)
 {
  if (*BP == *String)
  {
   for(SPIdx = 1;SPIdx < SPLen && *(BP + SPIdx) == *(String + SPIdx);SPIdx++);
   if (SPIdx >= SPLen) return(BP);
  }
 }

 return(0);
}

#include <OA$BUILD:OARTL.H>
#include STSDEF
#include STDLIB
#include STRING
#include SSDEF
#include STDIO
#include STARLET
#include JPIDEF
#include LNMDEF
#include DESCRIP
#include RMSDEF
        
typedef struct _VmsItmLst
{
 short		    BufferLen;
 short		    ItemCode;
 char		    *Buffer;
 long		    *BufferRetLen;
 long		    Ende;
}		    VmsItmLst;

typedef struct _SearchEle
{
 oartl_t_search	    Search;
 oartl_t_int	    OpRecCt;
 oartl_t_status	    LastStatus;
 long		    EleAnz;
 long		    MaxIndex;
 oartl_t_sa	    FieldNames;
 oartl_t_sa	    FieldValues;
}		    SearchEle;
 
typedef struct _AidaCabinet
{
 oartl_t_session    ClientSession;
 oartl_t_sa	    FieldNames;
 oartl_t_sa	    FieldValues;
 SearchEle	    Search[6];
}		    AidaCabinet;
    
typedef struct _ItmLst
{
 long		    FieldLen;
 char		    *FieldName;
 long		    ValueLen;
 char		    *ValueName;
 long		    *ValueRetLen;
 long		    Next;
}		    ItmLst;

unsigned long	    Aida$Connect();
unsigned long	    Aida$DisConnect();
unsigned long	    Aida$GetBwKey(long,long,const char *,long,char *,long,char *,ItmLst *);
unsigned long	    Aida$GetEqKey(long,const char *,long,char *,long,char *,ItmLst *);
unsigned long	    Aida$GetGeKey(long,long,char *,long,char *,long,char *,ItmLst *);
unsigned long	    Aida$GetGtKey(long,long,char *,long,char *,long,char *,ItmLst *);
unsigned long	    Aida$GetNext(long,ItmLst *);

unsigned long	    AllocCpy(char**,const char *,long);
unsigned long	    AllocCpyCheck(char**,const char *,long);
unsigned long	    AllocFieldValueTab(oartl_t_sa *);
unsigned long	    AllocI(char **,char *,long,char **,char *,long);
unsigned long	    ConnectToServer(AidaCabinet **);
void		    DeleteFieldTab(oartl_t_sa *);
unsigned long	    FillFieldNameTab(oartl_t_sa *,ItmLst *,long *);
unsigned long	    GetA1Pwd(char **);
unsigned long	    GetA1UserName(char **,char *,const char *);
unsigned long	    GetBw(AidaCabinet *,long,char *,char *,long,char *,ItmLst *);
unsigned long	    GetEq(AidaCabinet *,char *,char *,long,char *,ItmLst *);
unsigned long	    GetFieldValueKey(oartl_t_sa,ItmLst *,long,char *,long,long,long *,long *);
unsigned long	    GetFieldValueTab(oartl_t_sa,ItmLst *,long,long *);
unsigned long	    GetGeGt(AidaCabinet *,long,char *,char *,long,char *,long,ItmLst *);
unsigned long	    GetLogName(const char *,const char *,char **);
unsigned long	    GetNext(AidaCabinet *,long,ItmLst *);
unsigned long	    GetNodeName(char **,const char *);
unsigned long	    GetServerName(char **);
unsigned long	    GetTwoLogNames(const char *,char **);
unsigned long	    GetVmsNodeName(char **);
unsigned long	    GetVmsPwd1(char **,const char *);
unsigned long	    GetVmsPwd2(char **,const char *);
unsigned long	    GetVmsUser(char **);
unsigned long	    GetVmsUserName(char **,const char *);
unsigned long	    SearchEnd(oartl_t_session,SearchEle *);


unsigned long	    Aida$Connect()
{
 AidaCabinet	    *AidaSession;
 
 return(ConnectToServer(&AidaSession));
}


unsigned long	    Aida$DisConnect()
{
 AidaCabinet	    *AidaSession;
 oartl_t_status	    Status;
 long		    Index;
 
 Status = ConnectToServer(&AidaSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = oartl_session_disconnect(AidaSession -> ClientSession);
 if ($VMS_STATUS_SUCCESS(Status))
 {
  if (AidaSession -> FieldNames != 0) DeleteFieldTab(&(AidaSession -> FieldNames));
  if (AidaSession -> FieldValues != 0) DeleteFieldTab(&(AidaSession -> FieldValues));
  for(Index = 0;Index < (sizeof(AidaSession -> Search) / sizeof(AidaSession -> Search[0]));Index++)
  {
   if (AidaSession -> Search[Index].FieldNames != 0) DeleteFieldTab(&(AidaSession -> Search[Index].FieldNames));
   if (AidaSession -> Search[Index].FieldValues != 0) DeleteFieldTab(&(AidaSession -> Search[Index].FieldValues));
  }
  memset(AidaSession,'\0',sizeof(AidaCabinet));
 }
 
 return(Status);
}


unsigned long	    Aida$GetEqKey(long DatasetLen
				 ,const char *Dataset
				 ,long KeyNameLen
				 ,char *KeyName
				 ,long KeyLen
				 ,char *Key
				 ,ItmLst *ItmList)
{
 AidaCabinet	*AidaSession;
 unsigned long	Status;
 char		*DatasetI;
 char		*KeyNameI;
 
 Status = ConnectToServer(&AidaSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = AllocI(&DatasetI
		,(char *) Dataset
		,DatasetLen
		,&KeyNameI
		,KeyName
		,KeyNameLen);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  
 for(;;)
 {
  Status = GetEq(AidaSession
		,DatasetI
		,KeyNameI
		,KeyLen
		,Key
		,ItmList);
  if (Status != OARTL_S_STATE_NOT_OPEN)
  {
   if (Status == OARTL_S_RNF) Status = RMS$_RNF;
   free(DatasetI);
   free(KeyNameI);
   return(Status);
  }
  
  AidaSession -> ClientSession = 0;
  Status = ConnectToServer(&AidaSession);
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(DatasetI);
   free(KeyNameI);
   return(Status);
  }
 }
}


unsigned long	    Aida$GetBwKey(long Context
			         ,long DatasetLen
			         ,const char *Dataset
			         ,long KeyNameLen
			         ,char *KeyName
			         ,long KeyLen
			         ,char *Key
			         ,ItmLst *ItmList)
{
 AidaCabinet	*AidaSession;
 unsigned long	Status;
 char		*DatasetI;
 char		*KeyNameI;
 
 Status = ConnectToServer(&AidaSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = AllocI(&DatasetI
		,(char *) Dataset
		,DatasetLen
		,&KeyNameI
		,KeyName
		,KeyNameLen);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 for(;;)
 {
  Status = GetBw(AidaSession
	        ,Context - 1
		,DatasetI
		,KeyNameI
		,KeyLen
		,Key
		,ItmList);
  if (Status != OARTL_S_STATE_NOT_OPEN)
  {
   free(DatasetI);
   free(KeyNameI);
   return(Status);
  }

  AidaSession -> ClientSession = 0;
  Status = ConnectToServer(&AidaSession);
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(DatasetI);
   free(KeyNameI);
   return(Status);
  }
 }
}


unsigned long	    Aida$GetGeKey(long Context
			         ,long DatasetLen
			         ,char *Dataset
			         ,long KeyNameLen
			         ,char *KeyName
			         ,long KeyLen
			         ,char *Key
			         ,ItmLst *ItmList)
{
 AidaCabinet	*AidaSession;
 unsigned long	Status;
 char		*DatasetI;
 char		*KeyNameI;
 
 Status = ConnectToServer(&AidaSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = AllocI(&DatasetI
		,Dataset
		,DatasetLen
		,&KeyNameI
		,KeyName
		,KeyNameLen);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 for(;;)
 {
  Status = GetGeGt(AidaSession
	          ,Context - 1
		  ,DatasetI
		  ,KeyNameI
		  ,KeyLen
		  ,Key
		  ,0
		  ,ItmList);
  if (Status != OARTL_S_STATE_NOT_OPEN)
  {
   free(DatasetI);
   free(KeyNameI);
   return(Status);
  }

  AidaSession -> ClientSession = 0;
  Status = ConnectToServer(&AidaSession);
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(DatasetI);
   free(KeyNameI);
   return(Status);
  }
 }
}


unsigned long	    Aida$GetGtKey(long Context
			         ,long DatasetLen
			         ,char *Dataset
			         ,long KeyNameLen
			         ,char *KeyName
			         ,long KeyLen
			         ,char *Key
			         ,ItmLst *ItmList)
{
 AidaCabinet	*AidaSession;
 unsigned long	Status;
 char		*DatasetI;
 char		*KeyNameI;
 
 Status = ConnectToServer(&AidaSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = AllocI(&DatasetI
		,Dataset
		,DatasetLen
		,&KeyNameI
		,KeyName
		,KeyNameLen);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 for(;;)
 {
  Status = GetGeGt(AidaSession
	          ,Context - 1
		  ,DatasetI
		  ,KeyNameI
		  ,KeyLen
		  ,Key
		  ,1
		  ,ItmList);
  if (Status != OARTL_S_STATE_NOT_OPEN)
  {
   free(DatasetI);
   free(KeyNameI);
   return(Status);
  }

  AidaSession -> ClientSession = 0;
  Status = ConnectToServer(&AidaSession);
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(DatasetI);
   free(KeyNameI);
   return(Status);
  }
 }
}


unsigned long	    Aida$GetNext(long Context
				,ItmLst *ItmList)
{
 AidaCabinet	*AidaSession;
 unsigned long	Status;
 
 Status = ConnectToServer(&AidaSession);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 return(GetNext(AidaSession
	       ,Context - 1
	       ,ItmList));
}


unsigned long	    ConnectToServer(AidaCabinet **Session)
{
 #pragma extern_model save
 #pragma extern_model strict_refdef "AidaCtrBlk" noshr
  AidaCabinet static AidaSession;
 #pragma extern_model restore
 
 oartl_t_string	    server_name;
 oartl_t_string	    vms_user_name;
 oartl_t_string	    vms_pwd_1;
 oartl_t_string	    vms_pwd_2;
 oartl_t_string	    a1_user_name;
 oartl_t_int	    a1_pwd_len;
 oartl_t_string	    a1_pwd;
 oartl_t_int	    aida_dsl_status = 0;
 oartl_t_status	    Status;
  
 *Session = &AidaSession;
 
 if (AidaSession.ClientSession != 0) return(OARTL_S_NORMAL);
 
 Status = GetVmsUserName(&vms_user_name
		        ,"AIDA");
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = GetServerName(&server_name);
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(vms_user_name);
  return(Status);
 }
 
 Status = GetA1UserName(&a1_user_name
		       ,vms_user_name
		       ,"AIDA");
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(vms_user_name);
  free(server_name);
  return(Status);
 }
 
 Status = GetA1Pwd(&a1_pwd);
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(vms_user_name);
  free(server_name);
  free(a1_user_name);
  return(Status);
 }

 Status = GetVmsPwd1(&vms_pwd_1
		    ,"AIDA");
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(vms_user_name);
  free(server_name);
  free(a1_user_name);
  if (a1_pwd != 0) free(a1_pwd);
  return(Status);
 }
 
 Status = GetVmsPwd2(&vms_pwd_2
		    ,"AIDA");
 if (!$VMS_STATUS_SUCCESS(Status))
 {
  free(vms_user_name);
  free(server_name);
  free(a1_user_name);
  if (a1_pwd != 0) free(a1_pwd);
  if (vms_pwd_1 != 0) free(vms_pwd_1);
  return(Status);
 }

 if (a1_pwd != 0)
  a1_pwd_len = strlen(a1_pwd);
 else
  a1_pwd_len = 0;
 
 Status = oartl_session_connect(&AidaSession.ClientSession
			       ,server_name
			       ,vms_user_name
			       ,vms_pwd_1
			       ,vms_pwd_2
			       ,strlen(a1_user_name)
			       ,a1_user_name
			       ,a1_pwd_len
			       ,a1_pwd
			       ,0
			       ,&aida_dsl_status
			       ,0);

 free(vms_user_name);
 free(server_name);
 free(a1_user_name);
 if (a1_pwd != 0) free(a1_pwd);
 if (vms_pwd_1 != 0) free(vms_pwd_1);
 if (vms_pwd_2 != 0) free(vms_pwd_2);

 return(Status);
}


unsigned long	    GetEq(AidaCabinet *Cabinet
			 ,char *Dataset
			 ,char *KeyName
			 ,long KeyLen
			 ,char *Key
			 ,ItmLst *ItmList)
{
 oartl_t_status	    Status;
 long		    MaxIndex = 0;
 long		    EleAnz;
  
 Status = FillFieldNameTab(&(Cabinet -> FieldNames)
			  ,ItmList
			  ,&EleAnz);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = AllocFieldValueTab(&(Cabinet -> FieldValues));
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = oartl_dsr_read(Cabinet -> ClientSession
		        ,Dataset
			,KeyName
			,KeyLen
			,Key
			,Cabinet -> FieldNames
			,Cabinet -> FieldValues
			,0);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 return(GetFieldValueTab(Cabinet -> FieldValues
			,ItmList
			,EleAnz
			,&MaxIndex));
}


unsigned long	    GetBw(AidaCabinet *Cabinet
			 ,long Context
			 ,char *Dataset
			 ,char *KeyName
			 ,long KeyLen
			 ,char *Key
			 ,ItmLst *ItmList)
{
 oartl_t_status	    Status;
 oartl_t_int	    rec_ct = 10;
 oartl_t_p_int	    op_rec_ct;
  
 if (Context < 0 || Context > ((sizeof(Cabinet -> Search) / sizeof(Cabinet -> Search[0])) - 1))
  return(SS$_BADCONTEXT);
 
 if (Cabinet -> Search[Context].Search != 0)
 {
  Status = SearchEnd(Cabinet -> ClientSession
		    ,&(Cabinet -> Search[Context]));
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
 
 Status = FillFieldNameTab(&(Cabinet -> Search[Context].FieldNames)
			  ,ItmList
			  ,&(Cabinet -> Search[Context].EleAnz));
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = AllocFieldValueTab(&(Cabinet -> Search[Context].FieldValues));
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = oartl_dsr_search_begin(Cabinet -> ClientSession
			        ,&(Cabinet -> Search[Context].Search)
				,Dataset
				,KeyName
				,KeyLen
				,Key
				,Cabinet -> Search[Context].FieldNames
				,Cabinet -> Search[Context].FieldValues
				,rec_ct
				,&(Cabinet -> Search[Context].OpRecCt));
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 if (Status == OARTL_S_SEARCH_ENDED && Cabinet -> Search[Context].OpRecCt < 1) return(RMS$_EOF);
  
 Cabinet -> Search[Context].LastStatus = Status;
 Status = GetFieldValueTab(Cabinet -> Search[Context].FieldValues
			  ,ItmList
			  ,Cabinet -> Search[Context].EleAnz
			  ,&(Cabinet -> Search[Context].MaxIndex));
 if ($VMS_STATUS_SUCCESS(Status)) (Cabinet -> Search[Context].OpRecCt)--;
 
 return(Status);
}


unsigned long	    GetGeGt(AidaCabinet *Cabinet
			   ,long Context
			   ,char *Dataset
			   ,char *KeyName
			   ,long KeyLen
			   ,char *Key
			   ,long Funk
			   ,ItmLst *ItmList)
{
 oartl_t_status	    Status;
 oartl_t_int	    rec_ct = 10;
  
 if (Context < 0 || Context > ((sizeof(Cabinet -> Search) / sizeof(Cabinet -> Search[0])) - 1))
  return(SS$_BADCONTEXT);
 
 if (Cabinet -> Search[Context].Search != 0)
 {
  Status = SearchEnd(Cabinet -> ClientSession
		    ,&(Cabinet -> Search[Context]));
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
 
 Status = FillFieldNameTab(&(Cabinet -> Search[Context].FieldNames)
			  ,ItmList
			  ,&(Cabinet -> Search[Context].EleAnz));
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = AllocFieldValueTab(&(Cabinet -> Search[Context].FieldValues));
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 Status = oartl_dsr_search_begin(Cabinet -> ClientSession
			        ,&(Cabinet -> Search[Context].Search)
				,Dataset
				,KeyName
				,0
				,0
				,Cabinet -> Search[Context].FieldNames
				,Cabinet -> Search[Context].FieldValues
				,rec_ct
				,&(Cabinet -> Search[Context].OpRecCt));
 
 while($VMS_STATUS_SUCCESS(Status))
 {
  if (Status == OARTL_S_SEARCH_ENDED && Cabinet -> Search[Context].OpRecCt < 1)
  {
   if (Cabinet -> ClientSession != 0)
   {
    Status = SearchEnd(Cabinet -> ClientSession
		      ,&(Cabinet -> Search[Context]));
    if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
   }
   return(RMS$_EOF);
  }
 
  Cabinet -> Search[Context].LastStatus = Status;
 
  Status = GetFieldValueKey(Cabinet -> Search[Context].FieldValues
			   ,ItmList
			   ,KeyLen
			   ,Key
			   ,Funk
			   ,Cabinet -> Search[Context].EleAnz
			   ,&(Cabinet -> Search[Context].OpRecCt)
			   ,&(Cabinet -> Search[Context].MaxIndex));
  
  if ($VMS_STATUS_SUCCESS(Status))
  {
   (Cabinet -> Search[Context].OpRecCt)--;
   return(Status);
  }
  
  if (!$VMS_STATUS_SUCCESS(Status) && Status != OARTL_S_LSA_NO_MORE_STRINGS) return(Status);
 
  if (Cabinet -> Search[Context].LastStatus == OARTL_S_SEARCH_ENDED)
  {
   Status = SearchEnd(Cabinet -> ClientSession
		     ,&(Cabinet -> Search[Context]));
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
   return(RMS$_EOF);
  }
 
  Status = oartl_dsr_search_more(Cabinet -> ClientSession
			        ,Cabinet -> Search[Context].Search
			        ,Cabinet -> Search[Context].FieldNames
			        ,Cabinet -> Search[Context].FieldValues
			        ,rec_ct
			        ,&(Cabinet -> Search[Context].OpRecCt));
 }
 
 return(Status);
}


unsigned long	    GetNext(AidaCabinet *Cabinet
			   ,long Context
			   ,ItmLst *ItmList)
{
 oartl_t_status	    Status;
 oartl_t_int	    rec_ct = 10;
  
 if (Context < 0 || Context > ((sizeof(Cabinet -> Search) / sizeof(Cabinet -> Search[0])) - 1))
  return(SS$_BADCONTEXT);
 
 if (Cabinet -> Search[Context].OpRecCt < 1)
 {
  if (Cabinet -> Search[Context].LastStatus == OARTL_S_SEARCH_ENDED)
  {
   Status = SearchEnd(Cabinet -> ClientSession
		     ,&(Cabinet -> Search[Context]));
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
   return(RMS$_EOF);
  }
  
  Status = oartl_dsr_search_more(Cabinet -> ClientSession
			        ,Cabinet -> Search[Context].Search
			        ,Cabinet -> Search[Context].FieldNames
			        ,Cabinet -> Search[Context].FieldValues
			        ,rec_ct
			        ,&(Cabinet -> Search[Context].OpRecCt));
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  if (Status == OARTL_S_SEARCH_ENDED && Cabinet -> Search[Context].OpRecCt < 1)
  {
   Status = SearchEnd(Cabinet -> ClientSession
		     ,&(Cabinet -> Search[Context]));
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
   return(RMS$_EOF);
  }
  Cabinet -> Search[Context].LastStatus = Status;
  Cabinet -> Search[Context].MaxIndex = 0;
 }
 
 Status = GetFieldValueTab(Cabinet -> Search[Context].FieldValues
			  ,ItmList
			  ,Cabinet -> Search[Context].EleAnz
			  ,&(Cabinet -> Search[Context].MaxIndex));
 if ($VMS_STATUS_SUCCESS(Status)) (Cabinet -> Search[Context].OpRecCt)--;
 
 return(Status);
}


unsigned long	GetServerName(char **ServerName)
{
 char			    *NodeName;
 unsigned long		    Status;
 
 Status = GetTwoLogNames("ADV_AIDA$SERVER_NAME"
		        ,&(*ServerName));
 if (Status != SS$_NOLOGNAM) return(Status);
 
 Status = GetNodeName(&NodeName
		     ,"AIDA");
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 *ServerName = malloc(strlen(NodeName) + 21);
 if (*ServerName == 0)
 {
  free(NodeName);
  return(SS$_INSFMEM);
 }
 
 sprintf(*ServerName,"%s::DECNET:[0=OA$AIDA]",NodeName);
 
 free(NodeName);
 
 return(SS$_NORMAL);
}


unsigned long	GetNodeName(char **NodeName
			   ,const char *ServerType)
{
 unsigned long		    Status;
 char			    Buffer[256];
 
 sprintf(Buffer,"ADV_%s$SERVER_NODE",ServerType);
 
 Status = GetTwoLogNames(Buffer
		        ,&(*NodeName));
 if (Status != SS$_NOLOGNAM) return(Status);
 
 return(GetVmsNodeName(&(*NodeName)));
}


unsigned long	GetVmsNodeName(char **NodeName)
{
 VmsItmLst		    ItmLst;
 unsigned long		    Status;
 long			    BufferLen = 0;
 char			    Buffer[256];
 
 ItmLst.BufferLen = sizeof(Buffer);
 ItmLst.ItemCode = JPI$_NODENAME;
 ItmLst.Buffer = Buffer;
 ItmLst.BufferRetLen = &BufferLen;
 ItmLst.Ende = 0;
 
 Status = sys$getjpiw(0
		     ,0
		     ,0
		     ,&ItmLst
		     ,0
		     ,0
		     ,0);
 
 if ($VMS_STATUS_SUCCESS(Status))
  Status = AllocCpyCheck(&(*NodeName)
			,Buffer
			,BufferLen);
 
 return(Status);
}


unsigned long	GetVmsUserName(char **Username
			      ,const char *ServerType)
{
 unsigned long		    Status;
 char			    LogName[24];
 
 sprintf(LogName,"ADV_%s$SERVER_VMSUSER",ServerType);
 
 Status = GetTwoLogNames(LogName
		        ,&(*Username));
 if (Status != SS$_NOLOGNAM) return(Status);
 
 return(GetVmsUser(&(*Username)));
} 


unsigned long	GetVmsPwd1(char **VmsPwd1
			  ,const char *ServerType)
{ 
 unsigned long	Status;
 char		Buffer[256];
 
 sprintf(Buffer,"ADV_%s$SERVER_VMSPWD1",ServerType);
 
 Status = GetTwoLogNames(Buffer
		        ,&(*VmsPwd1));
 if (Status != SS$_NOLOGNAM) return(Status);
 
 if (strcmp("AIDA",ServerType) == 0)
  *VmsPwd1 = 0;
 else
 {
  *VmsPwd1 = calloc(2,1);
  if (*VmsPwd1 == 0) return(SS$_INSFMEM);
  **VmsPwd1 = 'X';
 }
  
 return(SS$_NORMAL);
}


unsigned long	GetVmsPwd2(char **VmsPwd2
			  ,const char *ServerType)
{ 
 unsigned long	Status;
 char		Buffer[256];
 
 sprintf(Buffer,"ADV_%s$SERVER_VMSPWD2",ServerType);
 
 Status = GetTwoLogNames("ADV_AIDA$SERVER_VMSPWD2"
		        ,&(*VmsPwd2));
 if (Status != SS$_NOLOGNAM) return(Status);
 
 *VmsPwd2 = 0;
  
 return(SS$_NORMAL);
}


unsigned long	GetA1UserName(char **A1UserName
			     ,char *VmsUserName
			     ,const char *ServerType)
{ 
 unsigned long	Status;
 long		BufferLen;
 char		Buffer[256];
 char		User[] = "USER";
 char		Dataset[] = "PROFIL";
 char		KeyName[] = "VMSUSR";
 ItmLst		ItmTab;
 
 sprintf(Buffer,"ADV_%s$SERVER_A1USER",ServerType);
 
 Status = GetTwoLogNames(Buffer
		        ,&(*A1UserName));
 if (Status != SS$_NOLOGNAM) return(Status);

 if (strcmp("AIDA",ServerType) == 0)
 {
  if (memcmp(VmsUserName,&"ALLIN1",strlen(VmsUserName)) == 0)
  {
   Status = AllocCpy(&(*A1UserName)
		    ,"MANAGER"
		    ,7);
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  }
  else
  {
   Status = AllocCpy(&(*A1UserName)
		    ,VmsUserName
		    ,strlen(VmsUserName));
   if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  }
 }
 else
 {
  ItmTab.FieldLen = strlen(User);
  ItmTab.FieldName = User;
  ItmTab.ValueLen = sizeof(Buffer);
  ItmTab.ValueName = Buffer;
  ItmTab.ValueRetLen = &BufferLen;
  ItmTab.Next = 0;
 
  Status = Aida$GetEqKey(strlen(Dataset)
		        ,Dataset
		        ,strlen(KeyName)
		        ,KeyName
		        ,strlen(VmsUserName)
		        ,VmsUserName
		        ,(ItmLst *) &ItmTab);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  
  Status = AllocCpyCheck(&(*A1UserName)
			,Buffer
			,BufferLen);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
 
 return(SS$_NORMAL);
}


unsigned long	GetA1Pwd(char **A1Pwd)
{ 
 unsigned long	Status;
 
 Status = GetTwoLogNames("ADV_AIDA$SERVER_A1PWD"
		        ,&(*A1Pwd));
 if (Status != SS$_NOLOGNAM) return(Status);
 
 *A1Pwd = 0;
  
 return(SS$_NORMAL);
}


unsigned long	FillFieldNameTab(oartl_t_sa *FieldNames
			        ,ItmLst *ItmList
				,long *EleAnz)
{ 
 oartl_t_status	    Status;
 
 if (*FieldNames == 0)
  Status = oartl_sa_create(&(*FieldNames));
 else
  Status = oartl_sa_reset(*FieldNames);
  
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 (*EleAnz) = 0;
 while(ItmList -> FieldLen != 0)
 {
  Status = oartl_sa_put(*FieldNames
		       ,-1
		       ,ItmList -> FieldLen
		       ,ItmList -> FieldName);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  
  (*EleAnz)++;
  ItmList = (struct _ItmLst *) &(ItmList -> Next);
 }
 
 return(OARTL_S_NORMAL);
}


unsigned long	GetFieldValueTab(oartl_t_sa FieldValues
			        ,ItmLst *ItmList
				,long EleAnz
				,long *MaxIndex)
{ 
 oartl_t_status	    Status;
 oartl_t_int	    Index;
 oartl_t_int	    ValRetLen; 
 long		    Step;
 
 if (*MaxIndex == 0)
 {
  Status = oartl_sa_rewind(FieldValues);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 }
 
 for(Step = 1;Step <= EleAnz;Step++)
 {
  Status = oartl_sa_get_next(FieldValues
		            ,&Index
		            ,&ValRetLen
		            ,ItmList -> ValueName
		            ,ItmList -> ValueLen);
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  
  if (ItmList -> ValueRetLen != 0) *(ItmList -> ValueRetLen) = ValRetLen;
  
  ItmList = (struct _ItmLst *) &(ItmList -> Next);
 }
 
 *MaxIndex = *MaxIndex + EleAnz;
 
 return(OARTL_S_NORMAL); 
}


unsigned long	GetFieldValueKey(oartl_t_sa FieldValues
			        ,ItmLst *ItmList
				,long KeyLen
				,char *Key
				,long Funk
				,long EleAnz
				,long *OpRecCt 
				,long *MaxIndex)
{ 
 oartl_t_status	    Status;
 oartl_t_int	    index;
 oartl_t_int	    ValRetLen; 
 long		    Comp;
 long		    TabAnz = (EleAnz * (*OpRecCt));
   
 Status = oartl_sa_rewind(FieldValues);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 for(index = 0;index < TabAnz;index = index + EleAnz)
 {
  Status = oartl_sa_get(FieldValues
		       ,index
		       ,&ValRetLen
		       ,ItmList -> ValueName
		       ,ItmList -> ValueLen);
			    
  if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
  
  if (ValRetLen >= KeyLen)
  {
   Comp = memcmp(ItmList -> ValueName,Key,KeyLen);
   if (Comp > 0 || (Funk == 0 && Comp == 0))
   {
    if (ItmList -> ValueRetLen != 0) *(ItmList -> ValueRetLen) = ValRetLen;
    *MaxIndex = index + 1;
    return(GetFieldValueTab(FieldValues
			   ,(struct _ItmLst *) &(ItmList -> Next)
			   ,EleAnz - 1
 			   ,MaxIndex));
   }
  }
  (*OpRecCt)--;
 }
   
 return(OARTL_S_LSA_NO_MORE_STRINGS);
}


unsigned long	AllocI(char **DatasetI
		      ,char *Dataset
		      ,long DatasetLen
		      ,char **KeyNameI
		      ,char *KeyName
		      ,long KeyNameLen)
{ 
 unsigned long	Status;
 
 Status = AllocCpyCheck(&(*DatasetI)
		       ,Dataset
		       ,DatasetLen);
 if (!$VMS_STATUS_SUCCESS(Status)) return(Status);
 
 if (KeyName == 0)
 {
  *KeyNameI = calloc(1,1);
  if (*KeyNameI == 0)
  {
   free(*DatasetI);
   return(SS$_INSFMEM);
  }
 }
 else
 {
  Status = AllocCpyCheck(&(*KeyNameI)
			,KeyName
			,KeyNameLen);
  if (!$VMS_STATUS_SUCCESS(Status))
  {
   free(*DatasetI);
   return(Status);
  }
 }
 
 return(SS$_NORMAL);
}


unsigned long	AllocFieldValueTab(oartl_t_sa *FieldValues)
{ 
 if (*FieldValues == 0) return(oartl_sa_create(&(*FieldValues)));

 return(OARTL_S_NORMAL); 
}


void DeleteFieldTab(oartl_t_sa *Field)
{ 
 if (*Field != 0)
  {
   oartl_sa_delete(*Field); 
   *Field = 0;
  }
}


unsigned long	GetVmsUser(char **Username)
{
 char			    Buffer[L_cuserid];
 
 if (cuserid(Buffer) == 0) return(SS$_ABORT);
 
 return(AllocCpyCheck(&(*Username)
		     ,Buffer
		     ,strlen(Buffer)));
} 


unsigned long	GetTwoLogNames(const char *LogName
			      ,char **LogValue)
{
 unsigned long		    Status;
 
 Status = GetLogName(LogName
		    ,"LNM$JOB"
		    ,&(*LogValue));
 if (Status != SS$_NOLOGNAM) return(Status);
 
 return(GetLogName(LogName
		  ,"LNM$SYSTEM_TABLE"
		  ,&(*LogValue)));
}


unsigned long	GetLogName(const char *LogName
			  ,const char *TabName
			  ,char **LogValue)
{
 VmsItmLst		    ItmLst;
 struct dsc$descriptor_s    Dtabnam;
 struct dsc$descriptor_s    Dlognam;
 long			    BufferLen = 0;
 char			    Buffer[256];
 unsigned long		    Status;
 
 Dlognam.dsc$w_length = strlen(LogName);
 Dlognam.dsc$b_dtype = DSC$K_DTYPE_T;
 Dlognam.dsc$b_class = DSC$K_CLASS_S;
 Dlognam.dsc$a_pointer = (char *) LogName;
 
 Dtabnam.dsc$w_length = strlen(TabName);
 Dtabnam.dsc$b_dtype = DSC$K_DTYPE_T;
 Dtabnam.dsc$b_class = DSC$K_CLASS_S;
 Dtabnam.dsc$a_pointer = (char *) TabName;
 
 if (LogValue != 0)
 {
  ItmLst.BufferLen = sizeof(Buffer);
  ItmLst.ItemCode = LNM$_STRING;
  ItmLst.Buffer = Buffer;
  ItmLst.BufferRetLen = &BufferLen;
  ItmLst.Ende = 0;
 
  Status = sys$trnlnm(0
		     ,&Dtabnam
		     ,&Dlognam
		     ,0
		     ,&ItmLst);
 
  if ($VMS_STATUS_SUCCESS(Status))
   Status = AllocCpyCheck(&(*LogValue)
			 ,Buffer
			 ,BufferLen);
 }
 else
 {
  Status = sys$trnlnm(0
		     ,&Dtabnam
		     ,&Dlognam
		     ,0
		     ,0);
 }
 
 return(Status);
}


unsigned long	SearchEnd(oartl_t_session Session
			 ,SearchEle *Search)
{
 oartl_t_status	    Status;
   
 Status = oartl_dsr_search_end(Session
			      ,Search -> Search);
 if (!$VMS_STATUS_SUCCESS(Status) && Status != OARTL_S_SEARCH_NO_SUCH) return(Status);
 
 Search -> Search = 0;
 Search -> OpRecCt = 0;
 Search -> LastStatus = 0;
 Search -> EleAnz = 0;
 Search -> MaxIndex = 0;
 
 return(OARTL_S_NORMAL);
}


unsigned long	AllocCpyCheck(char** Nach
			     ,const char *Von
			     ,long VonLen)
{
 *Nach = malloc(VonLen + 1);
 if (*Nach == 0) return(SS$_INSFMEM);
 
 if (VonLen != sprintf(*Nach,"%.*s",VonLen,Von))
 {
  free(*Nach);
  return(SS$_ABORT);
 }
 
 return(SS$_NORMAL);
}


unsigned long	AllocCpy(char** Nach
			,const char *Von
			,long VonLen)
{
 *Nach = malloc(VonLen + 1);
 if (*Nach == 0) return(SS$_INSFMEM);
 
 strcpy(*Nach,Von);
 
 return(SS$_NORMAL);
}
    
T.RTitleUserPersonal
Name
DateLines
2620.1ConvertUID?IOSG::DAVISTue Apr 15 1997 13:1442
    
    Charlie,
    
       I am not altogether sure that I understand the code or what you are 
       trying to do. However it does look as though the OafcListW's that you 
       are using to get the UIDs would have the effect that you describe.
    
       If you know what the externaluid is, you can use the function 
       OafcConvertUIDW to get the internaluid. You can construct the 
       externaluid if you know the name of the drawer, folder etc.
    
       Alternatively it is always quicker when listing to include 
       OafcM_ScopeComponents in the scope. (e.g AllSource.scope = 
       OafcM_ScopeDescendants | OafcM_ScopeComponents)
    
       				Mark
    
    
       Example of OafcConvertUIDW :-
    
       strcpy (convert_object, "ALFFA::"[DAVIS]MAIL".JUNK.037458");
    
           memset(input_buffer, 0, sizeof(input_buffer));
           memset(output_buffer, 0, sizeof(output_buffer));
    
           *(OafcUINT16 *)&input_buffer[0] = OafcT_ExternalDnsName;
           *(OafcUINT16 *)&input_buffer[2] = strlen(convert_object);
           memcpy(&input_buffer[4],convert_object,strlen(convert_object));
           input_buffer_length = 4 + strlen(convert_object);
           input_buffer_length+= 2;
    
           status = OafcConvertUIDW(session_p,
                                    input_buffer,
                                    input_buffer_length,
                                    output_buffer,
                                    (OafcStringLength)output_buffer_size,
                                    &status_block);
    
           memcpy(&document_uid, &output_buffer[4], UIDSIZE);
    
    
    
2620.2External or Internal UID ???ATZIS2::EHRLICH_KNever met a Lady like her before!Mon Apr 21 1997 10:0222
Hi,

	thank you very much (again!) Mark, for your great help here.
I've just  (another) small question according the OafcConvertUID
function which 

converts a FCS EXTERNAL FORMAT UNIQUE IDENTIFIER to and from its
equivalent EXTERNAL NAME. 

Now my question is, there are many other functions (e.g. OafcCopy in our
case) which deals with a 'target_unique_id'. Is this now the
external UID (from OafcConvertUID) or the internal UID???
Is there a way to get to the internal UID or can we use the external UID?

This is all a little bit confusing. Can you please bring some light
in my darkness.

MTIA,
Cheers
Charly

    
2620.3Use external UIDIOSG::DAVISMon Apr 21 1997 18:3020
    
    Charlie,
    
       Although my example was correct in .1 my terminology was a bit off.
    
       Something like
    
       ALFFA::"[DAVIS]MAIL".JUNK.037458
    
       is an external name.
    
       OafcConvertUID converts this to an external uid. You can then use the 
       external uid anywhere where a unique_id is required such as OafcCopy.
    
       You can get the internal uid as an attribute returned from OafcList 
       and some other calls. I think that the internal UID is supposed to be 
       slightly more efficient but any difference is imperceptible.
    
       				Mark
    
2620.4Perfect!ATZIS2::EHRLICH_KNever met a Lady like her before!Tue Apr 22 1997 09:5018
    Hi Mark,
    
    	thank you very much. Especially many many thanks from the
    engineer at CoV !!! 
    
    Yes, that's what we wanted to know. Because -sometimes- in the
    FCS docs it's not so clear which UID is really important.
    
    We tried it yesterday by specifying the external UID (from
    OafcConvertUID, as mentioned in your example) and it worked with
    many functions. And you're right, OafcListW is a little bit different
    to handle. 
    
    Really a wonderful support!
    
    Cheers
    Charly