[Search for users]
[Overall Top Noters]
[List of all Conferences]
[Download this site]
Title: | ALL-IN-1 (tm) Support Conference |
Notice: | Please spell ALL-IN-1 correctly - all CAPITALS! |
Moderator: | IOSG::PYE CE |
|
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.R | Title | User | Personal Name | Date | Lines |
---|
2620.1 | ConvertUID? | IOSG::DAVIS | | Tue Apr 15 1997 13:14 | 42 |
|
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.2 | External or Internal UID ??? | ATZIS2::EHRLICH_K | Never met a Lady like her before! | Mon Apr 21 1997 10:02 | 22 |
| 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.3 | Use external UID | IOSG::DAVIS | | Mon Apr 21 1997 18:30 | 20 |
|
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.4 | Perfect! | ATZIS2::EHRLICH_K | Never met a Lady like her before! | Tue Apr 22 1997 09:50 | 18 |
| 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
|