Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: bikerboy am 04.02.10 - 11:40:09

Titel: Fusszeile per Skript setzen
Beitrag von: bikerboy am 04.02.10 - 11:40:09
Hallo, gibt es ne Möglichkeit die Fusszeile per Skript zu setzen ?

Habe mal ein Dokument per DXL exportiert und folgendes erfahren:

Code
<item name='$Footer'>
<rawitemdata type='1'>
jv9gACBEZWZhdWx0IFNhbnMgU2VyaWYAIHhtbHNjaGVtYXMvZAEAAAg0AHxfX19fX19fX19fIFJv
YmVydCBLcmV1dHplciAtIFNlaXRlOiAmcCBfX19fX19fX19ffAAG
</rawitemdata></item>

Da ich leider kein rawitemdata spreche wird es schwierig für mich das zu setzen
Titel: Re: Fusszeile per Skript setzen
Beitrag von: m3 am 04.02.10 - 11:44:42
Musst Du ja nur Base64 decoden.
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 04.02.10 - 11:46:19
Mit welcher Klasse mache ich das ?
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 04.02.10 - 11:47:31
http://www.openntf.org/Projects/codebin/codebin.nsf/0/CDC76794F898357288256BDC000CBF49
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 04.02.10 - 11:49:54
@Ulrich

Danke wird direkt probiert
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 04.02.10 - 12:04:08
 ???

hmmm hat leider nicht geklappt

habe den Code folgendermaßen probiert.

Code
Dim Workspace As New NotesUIWorkspace
	
	Dim doc As NotesDocument
	
	Dim exporter As NotesDXLExporter
	
	Dim strExport As String
	Dim strChunk As String
	Dim strDecode As String
	
	Set doc = Workspace.CurrentDocument.Document
	
	Set exporter = Session.CreateDXLExporter
	
	Call exporter.Setinput(doc)
	
	strExport = exporter.Export
	
	strChunk = getItemValue(strExport,"$Footer")
	
	Call IndexTable
	
	strDecode = Decode64(strChunk)

Get "getItemValue" ist eine Funktion die aus dem DXL-Wust mir nur den Wert holt

Wenn ich nun in die Funktion den Inhalt von oben rein gebe erhalte ich folgendes zurück

Zitat
Žÿ`

Da hätte aber sowas stehen müssen " Robert Kreutzer Seite - 1"
Titel: Re: Fusszeile per Skript setzen
Beitrag von: m3 am 04.02.10 - 12:12:29
Wenn Du Dir das z.B. auf http://coderstoolbox.net/string/ ansiehst, wirst Du merken, dass da auch Null-Bytes (String-Terminatoren) drinnen sind => daher wird nicht alles ausgegeben.
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 04.02.10 - 12:46:18
:(

Sieht also ganz so aus, als hätte ich keine Möglichkeit darauf zuzugreifen ?

Habe mal den Wert aus dem Chunk gegen nen codierten String ausgetauscht. Hat leider nicht hingehauen. Hat jemand noch ne Idee.
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 04.02.10 - 13:15:37
Na ja, eine Möglichkeit ( oder zwei ) gibt es noch .... A P I  ;D ( oder Midas )

habe mir das mal in NotesPeek angesehen. Das $Footer item ist ein RichTextItem. Diueses besteht bekanntermassen aus CD-records. In diesem Fall eines vom Typ Header. (siehe screenshot)

Sollte also nicht sonderlich schwer sein, den Textanteil zu beeinflussen. Die grundsätzlichen Funktionen dazu habe ich ja ( rücke die aber vor dem EC nicht raus  ;D ;D )

Möchte auch nicht versprechen, dass es in jedem Fall funktioniert; habe es noch nicht getestet.
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 04.02.10 - 13:23:01
Habe die Definition in der C-API Reference gefunden, aber noch leider nicht verstanden wie ich es jetzt setzen soll. Der Aufbau ist ja sauber beschrieben.

Zitat
...( rücke die aber vor dem EC nicht raus  Grin Grin )...

Was ist EC ?
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 04.02.10 - 13:34:22
EC = Entwickler Camp
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 04.02.10 - 13:40:46
 :-[

Ja zu offensichtlich.
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 05.02.10 - 08:12:04
Ein anderer Weg als über die API ist der "Window Title" In den Footer kommt dann ein &W. Das wird dann automatisch befüllt. Und im Windows Title kannst du ja Formeln verwenden. Weiss nicht, ob es auf deine Anforderungen passt, aber wäre ein Weg.
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 12.02.10 - 07:43:04
@Robert:
Hier mal die Routine, um den Inhalt von $Footer auszulesen:

Code
Function GetFooter (doc As NotesDocument) As String
TRY:
	Dim ITEM_OBJ As String
	Const FOOTER_TEXT_START = 43
	ITEM_OBJ = "$Footer"
	If Not (doc.HasItem(ITEM_OBJ)) Then
		GetFooter = "ERROR: No Footer"
		Exit function
	End If
	
	irc = NSFItemInfo _
	(doc.handle, ITEM_OBJ, Len(ITEM_OBJ),_
	item_blockid, idatatype, value_blockid, value_len )
	If irc = 0 then
		pBuff = OSLockObject _
		(value_blockid.pool) + (CLng(value_blockid.block) And &H0FFFF&)
		
		Call ODSReadMemory (pBuff+4, ODS_WORD, ODS_LENGTH, 1)
		
		bufferlen = ODS_LENGTH - FOOTER_TEXT_START
		bufferText = Space(bufferLen)
		
		Call ODSReadMemoryStr (pbuff+2 + FOOTER_TEXT_START, _
		ODS_WORD, bufferText, CLng(bufferlen))

		OSUnLockObject (value_blockid.pool)
		
		GetFooter = buffertext
	Else 
		GetFooter = "ERROR:"
	End if
EXIT_HERE:
	Exit Function
CATCH:
	GetFooter = "ERROR:"
	Resume EXIT_HERE
End Function

Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 12.02.10 - 08:56:32
Danke !!! Schaue ich mir gleich mal an
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 12.02.10 - 09:01:39
Und hier noch die ( erste Fassung ) der Schreibroutine:

Code
Function SetFooter (doc As NotesDocument, strFooter As String) As integer
TRY:
	Dim ITEM_OBJ As String
	ITEM_OBJ = "$Footer"
	If Not (doc.HasItem(ITEM_OBJ)) Then
		SetFooter = -1
		Exit Function
	End If
	ODS_OFFSET = 0
	
	irc = NSFItemInfo _
	(doc.handle, ITEM_OBJ, Len(ITEM_OBJ),_
	item_blockid, idatatype, value_blockid, value_len )
	
	pBuff = OSLockObject _
	(value_blockid.pool) + (CLng(value_blockid.block) And &H0FFFF&)
	
	Call ODSReadMemory (pBuff+(ODS_OFFSET+4), ODS_WORD, ODS_LENGTH, 1)
	
	Call W32_ODSWriteMemoryStr _ 
	(pbuff + (ODS_OFFSET+2)+43, _
	ODS_WORD, strFooter, Len(strFooter))

	OSUnLockObject (value_blockid.pool)
	Call W32_NSFNoteUpdate (doc.handle, 0)
	SetFooter = 0
EXIT_HERE:
	Exit Function
CATCH:
	SetFooter = 1
	Resume EXIT_HERE
End Function

Ein kleiner Hinweis: Da der Code bestimmt irgendwann einmal in irgendein Kundenprojekt einfliessen wird, weise ich vorsorglich schon einmal darauf hin, daß hierzu eine Genehmigung meinerseits erforderlich ist.
Ich habe ein paar Stunden Arbeit und Wissen investiert.
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 12.02.10 - 11:59:03
Das versteht sich.

Habe aber noch ein Problem mit der folgenden Zeile

Code
bufferlen = ODS_LENGTH - FOOTER_TEXT_START

Hier kommt bei mir immer -43 raus. Was mache ich da falsch
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 12.02.10 - 12:22:34
Wie ist denn ODS_LENGTH deklariert? Muss Long sein.
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 12.02.10 - 14:48:46
So es funktioniert nun, aber ich kann es noch nicht verwenden weil  ich es noch nicht verstanden habe.

Aber ich und sicherlich tausend andere danken dir.  :love: :love: :love: :love:
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 12.02.10 - 14:52:05
Die Schreibroutine ist noch nicht sauber und schmeisst eine Runde Napalm in den Rechner, wenn der neue Inhalt des Footers > alter Inhalt ist.
 
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 15.02.10 - 16:03:47
hmmm kurze nachfrage,

Code
Call W32_ODSWriteMemoryStr _ 
	(pbuff + (ODS_OFFSET+2)+43, _
	ODS_WORD, strFooter, Len(strFooter))

müsstes du nicht bei (ODS_OFFSET)+43 anfangen ? ,

Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 15.02.10 - 16:21:27
nein, CDHeader beginnt bei OFFSET+ 2 von pBuff. Und dann geht ab (OFFSET+2) + 43 der Textanteil los. Siehe Bild.

Du kannst auch nicht einfach den text ändern, so wie ich es im ersten Entwurf gemacht habe. Das geht so lange gut, wie der neue Text <= dem alten text ist. Ist er länger, wird es unangenehm.
Daher musst du die ursprünglichen Werte erst sichern, dann das Item Mit NSFItemDeleteByBlockID löschen, und einen neuen Buffer erstellen und entsprechend mit OSMemoryAllocate anmelden. Die Länge  des neuen Puffers muss statische Werte aus dem ((alten pBuff - len ( text) + neueTextlänge sein).
Danach füllst du die Struktur und schreibst den Kram in das doc.

 
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 17.02.10 - 11:16:14
Wie sieht es eigentlich aus, wenn noch kein Footer gesetzt wurde ? Dann bricht die Funktion doch ab, oder sehe ich das falsch ?
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 17.02.10 - 11:31:22
Ja, das tut sie. Bin momentan dabei, die entsprechende Funktion dazu zu schreiben.

Declare Function W32_NSFItemAppend Lib W32_LIB Alias {NSFItemAppend} (ByVal hNote As Long, ByVal flags As Integer, ByVal ItemName As String, ByVal ItemNameLength As Integer, ByVal itemType As Integer, ByVal Buff As Long, ByVal BuffLength As Long) As Integer
Declare Function W32_NSFNoteUpdate Lib W32_LIB Alias {NSFNoteUpdate} (ByVal note_handle As Long, ByVal update_flags As Integer) As Integer

sind deine Freunde bei diesem Vorhaben
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 23.02.10 - 17:22:19
Habe jetzt meine Script Klasse soweit, dass mir beim Setzen eines neuen FooterTextes nicht gleich der Rechner um die Ohren fliegt. Ein paar Bit werden noch an die falsche Stelle gesetzt. Das ist jetzt ein bisschen Fummelei, da sich das setzen von Bits und Bytes im Speicher nicht so leicht debuggen lässt.

Alle Methoden und Properties funktionieren unter Windows und Linux.

Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 23.02.10 - 18:02:10
Zitat
Ein paar Bit werden noch an die falsche Stelle gesetzt

erledigt.
Titel: Re: Fusszeile per Skript setzen
Beitrag von: bikerboy am 24.02.10 - 08:14:12
Ruhm und Ehre für Ulrich !!!
Titel: Re: Fusszeile per Skript setzen
Beitrag von: eknori am 24.02.10 - 17:06:57
Zitat
Ruhm und Ehre für Ulrich !!!
:P
Werde ich beim nächsten Grosseinkauf mal an der Kasse verwenden ...