#ifdef COMPILE_DL_NOTES
#define HAVE_NOTES 1
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_globals.h"
#include "php_notes.h"
#include "ext/standard/info.h"
#ifdef PHP_WIN32
#include <global.h>
#else
#include <notes_global.h>
#endif
#include <nsfdb.h>
#include <nsfdata.h>
#include <osmisc.h>
#include <miscerr.h>
#include <nif.h>
#include <nsfnote.h>
#include <editods.h>
#include <osmem.h>
#include <stdnames.h>
#include <nsfsearc.h>
#include <colorid.h>
#include <names.h>
#include <stdnames.h>
#include <nsferr.h>
#include <idtable.h>
#include <kfm.h>
#include <malloc.h>
#include <io.h>
#include <direct.h>
#include <fcntl.h>
#include <globerr.h>
#ifdef PHP_WIN32
#include <mail.h>
#else
#include <notes_mail.h>
#endif
#include <mailserv.h>
#include <nsf.h>
#include <osfile.h>
#include <osenv.h>
#include <vmods.h>
#include <ft.h>
#include <textlist.h>
#define STRING_LENGTH 256
function_entry notes_functions[] = {
PHP_FE(notes_create_db, NULL)
PHP_FE(notes_drop_db, NULL)
PHP_FE(notes_version, NULL)
PHP_FE(notes_create_note, NULL)
PHP_FE(notes_unread, NULL)
PHP_FE(notes_mark_read, NULL)
PHP_FE(notes_mark_unread, NULL)
PHP_FE(notes_header_info, NULL)
PHP_FE(notes_body, NULL)
PHP_FE(notes_find_note, NULL)
PHP_FE(notes_nav_create, NULL)
PHP_FE(notes_search, NULL)
PHP_FE(notes_copy_db, NULL)
PHP_FE(notes_list_msgs, NULL)
{NULL, NULL, NULL}
};
zend_module_entry notes_module_entry = {
STANDARD_MODULE_HEADER,
"notes",
notes_functions,
PHP_MINIT(notes),
PHP_MSHUTDOWN(notes),
PHP_RINIT(notes),
PHP_RSHUTDOWN(notes),
PHP_MINFO(notes),
NO_VERSION_YET,
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_NOTES
ZEND_GET_MODULE(notes)
#endif
PHP_MINIT_FUNCTION(notes)
{
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(notes)
{
return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(notes)
{
return SUCCESS;
}
PHP_RINIT_FUNCTION(notes)
{
return SUCCESS;
}
PHP_MINFO_FUNCTION(notes)
{
php_info_print_table_start();
php_info_print_table_row(2, "Lotus Notes Database Support", "enabled");
php_info_print_table_end();
}
PHP_FUNCTION(notes_create_db)
{
int argc;
pval *argv[1];
STATUS error;
pval **db;
char error_string[200];
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE)
WRONG_PARAM_COUNT;
if (zend_get_parameters_ex(1, &db)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
error = NotesInitExtended( argc, (char **) argv );
if (error) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbCreate (Z_STRVAL_PP(db), (USHORT) DBCLASS_NOTEFILE, FALSE)) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to create database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
NotesTerm();
RETURN_TRUE;
}
PHP_FUNCTION(notes_drop_db)
{
int argc;
pval *argv[1];
STATUS error;
pval **db;
char error_string[200];
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE)
WRONG_PARAM_COUNT;
if (zend_get_parameters_ex(1, &db)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
error = NotesInitExtended( argc, (char **) argv );
if (error) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbDelete (Z_STRVAL_PP(db))) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to delete database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
NotesTerm();
RETURN_TRUE;
}
PHP_FUNCTION(notes_version)
{
int argc;
pval *argv[1];
STATUS error;
DBHANDLE db_handle;
WORD wbuild;
char error_string[200];
pval **db;
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(1, &db)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
error = NotesInitExtended(argc, (char **) argv);
if (error) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbOpen(Z_STRVAL_PP(db), &db_handle)) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = NSFDbGetBuildVersion(db_handle, &wbuild)) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to get Lotus Notes version: %s", error_string);
NSFDbClose(db_handle);
NotesTerm();
RETURN_FALSE;
}
NSFDbClose(db_handle);
NotesTerm();
if(wbuild > 0 && wbuild < 82) {
RETURN_DOUBLE(1.0);
} else if (wbuild > 81 && wbuild < 94) {
RETURN_DOUBLE(2.0);
} else if (wbuild > 93 && wbuild < 119) {
RETURN_DOUBLE(3.0);
} else if (wbuild > 118 && wbuild < 137) {
RETURN_DOUBLE(4.0);
} else if (wbuild == 138) {
RETURN_DOUBLE(4.1);
} else if (wbuild > 139 && wbuild < 146) {
RETURN_DOUBLE(4.5);
} else if (wbuild == 147) {
RETURN_DOUBLE(4.6);
} else {
RETURN_DOUBLE(5.0);
}
}
PHP_FUNCTION(notes_create_note)
{
int argc;
pval *argv[2];
STATUS error;
DBHANDLE db_handle;
NOTEHANDLE note_handle;
char error_string[200];
pval **db;
pval **form_name;
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(2, &db, &form_name)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
convert_to_string_ex(form_name);
error = NotesInitExtended( argc, (char **) argv );
if (error) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbOpen(Z_STRVAL_PP(db), &db_handle)) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = NSFNoteCreate (db_handle, ¬e_handle)) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to create note: error_string");
NSFDbClose( db_handle );
RETURN_FALSE;
}
if (error = NSFItemSetText(note_handle, FIELD_FORM, Z_STRVAL_PP(form_name), MAXWORD)) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to use the form: %s", error_string);
NSFNoteClose (note_handle);
NSFDbClose( db_handle );
RETURN_FALSE;
}
if (error = NSFNoteUpdate (note_handle, 0)) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to save the note: %s", error_string);
NSFNoteClose (note_handle);
NSFDbClose(db_handle);
RETURN_FALSE;
}
error = NSFNoteClose (note_handle);
NSFDbClose(db_handle);
NotesTerm();
RETURN_TRUE;
}
#define ACTION_COUNT_MAX (16)
typedef struct {
BOOL AddFlag;
NOTEID NoteID;
} ACTION_ENTRY;
ACTION_ENTRY ActionTable [ACTION_COUNT_MAX] = {FALSE, 0L};
STATUS DisplayUnread (
DBHANDLE db_handle,
char NOTESPTR pName,
WORD nameLen
);
STATUS UpdateUnread (
DBHANDLE db_handle,
char NOTESPTR pName,
WORD nameLen,
ACTION_ENTRY *pActions,
int actionCount,
NOTEID *pUndoID
);
STATUS UndoUnreadStatus (
DBHANDLE db_handle,
char NOTESPTR pName,
WORD nameLen,
ACTION_ENTRY *pActions,
int actionCount,
NOTEID UndoID);
PHP_FUNCTION(notes_mark_read)
{
int argc;
int ActionCount;
pval *argv[3];
STATUS error;
DBHANDLE db_handle;
pval **db;
pval **note_id;
pval **user_name;
WORD UserNameLen = 0;
char *pEnd;
int curAction;
int curArg;
NOTEID UndoID = 0L;
char error_string[200];
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(3, &db, &user_name, ¬e_id)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
convert_to_string_ex(note_id);
convert_to_string_ex(user_name);
error = NotesInitExtended( argc, (char **) argv );
if (error) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
curArg = 2;
UserNameLen = Z_STRLEN_PP(user_name);
curAction = 0;
ActionCount = 1;
ActionTable[curAction].AddFlag = FALSE;
ActionTable[curAction].NoteID = strtoul (Z_STRVAL_PP(note_id), &pEnd, 16);
if (error = NSFDbOpen(Z_STRVAL_PP(db), &db_handle)) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
error = UpdateUnread (db_handle, Z_STRVAL_PP(user_name), UserNameLen,
ActionTable, ActionCount, &UndoID);
if ((error == NOERROR) && UndoID) {
error = UndoUnreadStatus (db_handle, Z_STRVAL_PP(user_name), UserNameLen, ActionTable,
ActionCount, UndoID);
}
error = NSFDbClose (db_handle);
if (NOERROR == error) {
RETURN_TRUE;
} else {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to close database: %s", error_string);
RETURN_FALSE;
}
}
PHP_FUNCTION(notes_mark_unread)
{
int argc;
int ActionCount;
pval *argv[3];
STATUS error;
DBHANDLE db_handle;
pval **db;
pval **note_id;
pval **user_name;
WORD UserNameLen = 0;
char *pEnd;
int curAction;
int curArg;
NOTEID UndoID = 0L;
char error_string[200];
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(3, &db, &user_name, ¬e_id)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
convert_to_string_ex(note_id);
convert_to_string_ex(user_name);
error = NotesInitExtended( argc, (char **) argv );
if( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
curArg = 2;
UserNameLen = strlen (Z_STRVAL_PP(user_name));
curAction = 0;
ActionCount = 1;
ActionTable[curAction].AddFlag = TRUE;
ActionTable[curAction].NoteID =
strtoul (Z_STRVAL_PP(note_id), &pEnd, 16);
if (error = NSFDbOpen (Z_STRVAL_PP(db), &db_handle)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
error = UpdateUnread (db_handle, Z_STRVAL_PP(user_name), UserNameLen,
ActionTable, ActionCount, &UndoID);
if ( (error == NOERROR) && UndoID ){
error = UndoUnreadStatus (db_handle, Z_STRVAL_PP(user_name), UserNameLen, ActionTable,
ActionCount, UndoID);
}
error = NSFDbClose (db_handle);
if (NOERROR == error){
RETURN_TRUE;
}
else{
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to close the database: %s", error_string);
RETURN_FALSE;
}
}
STATUS UpdateUnread (
DBHANDLE db_handle,
char *pName,
WORD nameLen,
ACTION_ENTRY *pActions,
int actionCount,
NOTEID *pUndoID)
{
STATUS error;
HANDLE table_handle;
HANDLE hOriginalTable;
NOTEHANDLE note_handle;
BOOL gotUndoID = FALSE;
error = NSFDbGetUnreadNoteTable (
db_handle,
pName,
nameLen,
TRUE,
&table_handle);
if (NOERROR != error){
return (error);
}
error = IDTableCopy (table_handle, &hOriginalTable);
if (NOERROR != error){
IDDestroyTable (table_handle);
return (error);
}
error = NSFDbUpdateUnread (db_handle, table_handle);
if (NOERROR == error){
if (pActions[0].AddFlag){
if (IDIsPresent (table_handle, pActions[0].NoteID)){
php_error(E_WARNING,"Note %lX is already marked unread", pActions[0].NoteID);
}
else{
error = NSFNoteOpen(db_handle, pActions[0].NoteID, OPEN_SUMMARY, ¬e_handle);
if (error == NOERROR){
NSFNoteClose(note_handle);
error = IDInsert (table_handle, pActions[0].NoteID,
(NOTESBOOL NOTESPTR) NULL);
}
}
}
else{
if (IDIsPresent (table_handle, pActions[0].NoteID)){
error = IDDelete (table_handle, pActions[0].NoteID,
(NOTESBOOL NOTESPTR) NULL);
if (NOERROR == error){
if (!gotUndoID){
*pUndoID = pActions[0].NoteID;
gotUndoID = TRUE;
}
}
}
else{
php_error(E_WARNING,"Note %lX is already marked read", pActions[0].NoteID);
}
}
if (NOERROR == error){
error = NSFDbSetUnreadNoteTable (db_handle, pName, nameLen,
FALSE,
hOriginalTable,
table_handle);
}
}
error = IDDestroyTable (hOriginalTable);
if (NOERROR == error){
error = error;
}
error = IDDestroyTable (table_handle);
if (NOERROR == error){
error = error;
}
return (error);
}
STATUS UndoUnreadStatus (
DBHANDLE db_handle,
char *pName,
WORD nameLen,
ACTION_ENTRY *pActions,
int actionCount,
NOTEID UndoID)
{
STATUS error;
HANDLE table_handle;
HANDLE hOriginalTable;
DWORD noteID = 0L;
NOTEHANDLE note_handle;
BOOL bWasRead = TRUE;
error = NSFDbGetUnreadNoteTable (db_handle, pName, nameLen,
TRUE,
&table_handle);
if (NOERROR != error){
return (error);
}
error = IDTableCopy (table_handle, &hOriginalTable);
if (NOERROR != error){
IDDestroyTable (table_handle);
return (error);
}
bWasRead = !(IDIsPresent (table_handle, UndoID));
error = NSFNoteOpen (db_handle, UndoID, 0, ¬e_handle);
if (error){
IDDestroyTable (table_handle);
IDDestroyTable (hOriginalTable);
return (error);
}
error = NSFItemSetText (note_handle, "plain_text", "Unread undone",
(WORD) strlen("Unread undone"));
if (error){
NSFNoteClose (note_handle);
IDDestroyTable (table_handle);
IDDestroyTable (hOriginalTable);
return (error);
}
error = NSFNoteUpdate (note_handle, 0L);
if (error){
NSFNoteClose (note_handle);
IDDestroyTable (table_handle);
IDDestroyTable (hOriginalTable);
return (error);
}
error = NSFNoteClose (note_handle);
if (error){
IDDestroyTable (table_handle);
IDDestroyTable (hOriginalTable);
return (error);
}
error = NSFDbUpdateUnread (db_handle, table_handle);
if ( (NOERROR == error) && bWasRead ){
error = IDDelete (table_handle, UndoID,
(NOTESBOOL NOTESPTR) NULL);
if( error != NOERROR ){
php_error(E_NOTICE,"Note %lX is already marked read.", UndoID);
}
}
if (NOERROR == error){
error = NSFDbSetUnreadNoteTable (db_handle, pName, nameLen,
FALSE,
hOriginalTable, table_handle);
}
IDDestroyTable (hOriginalTable);
IDDestroyTable (table_handle);
return (error);
}
PHP_FUNCTION(notes_unread)
{
int argc;
pval *argv[2];
STATUS error;
DBHANDLE db_handle;
WORD UserNameLen;
HANDLE table_handle;
DWORD noteID;
BOOL FirstNote;
char error_string[200];
pval **db;
pval **user_name;
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(2, &db, &user_name)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
convert_to_string_ex(user_name);
error = NotesInitExtended( argc, (char **) argv );
if( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbOpen (Z_STRVAL_PP(db), &db_handle)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
UserNameLen = strlen(Z_STRVAL_PP(user_name));
if( error = NSFDbGetUnreadNoteTable (
db_handle,
Z_STRVAL_PP(user_name),
UserNameLen,
TRUE,
&table_handle) ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to get unread list: %s", error_string );
NotesTerm();
RETURN_FALSE;
}
error = NSFDbUpdateUnread (db_handle, table_handle);
if (NOERROR != error)
{
IDDestroyTable (table_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to get unread list: %s", error_string );
NotesTerm();
RETURN_FALSE;
}
FirstNote = TRUE;
array_init(return_value);
while (IDScan (table_handle, FirstNote, ¬eID)){
FirstNote = FALSE;
add_next_index_long(return_value, (long) noteID );
}
error = IDDestroyTable (table_handle);
error = NSFDbClose (db_handle);
if( error != NOERROR ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to close database: %s", error_string);
RETURN_FALSE;
}
}
#define ERR_READMAIL_NOUNIQUE (PKG_ADDIN + 0)
#define READMAIL_BODY_LINELEN 40
STATUS near pascal GetUniqueFileName(char *Drive, char *Ext, char *FileName);
PHP_FUNCTION(notes_header_info)
{
int argc;
pval *argv[3];
pval **server;
pval **mail_box;
pval **msg_number;
STATUS error = NOERROR;
char szMailFilePath[MAXPATH+1];
HANDLE hMessageFile;
HANDLE hMessageList = NULLHANDLE, hMessage;
DARRAY *MessageList;
WORD MessageCount;
char Originator[MAXRECIPIENTNAME+1];
WORD OriginatorLength;
char String[MAXSPRINTF+1];
WORD StringLength;
TIMEDATE Time;
BOOL NonDeliveryReport;
char error_string[200];
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(3, &server, &mail_box, &msg_number)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(server);
convert_to_string_ex(mail_box);
convert_to_long_ex(msg_number);
error = NotesInitExtended( argc, (char **) argv );
if( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
OSPathNetConstruct( NULL,
Z_STRVAL_PP(server),
Z_STRVAL_PP(mail_box),
szMailFilePath);
if (error = MailOpenMessageFile(szMailFilePath, &hMessageFile)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error: unable to open '%s': %s", szMailFilePath, error_string);
RETURN_FALSE;
}
if (error = MailCreateMessageList(hMessageFile,
&hMessageList, &MessageList, &MessageCount)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to create message list: %s", error_string);
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
RETURN_FALSE;
}
object_init(return_value);
if (error = MailOpenMessage (MessageList, (WORD)Z_LVAL_PP(msg_number), &hMessage)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open message number %d: %s", (WORD)Z_LVAL_PP(msg_number), error_string);
if (hMessageList != NULLHANDLE){
OSUnlockObject(hMessageList);
OSMemFree(hMessageList);
}
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
RETURN_FALSE;
}
if (error = MailGetMessageOriginator(MessageList, (WORD)Z_LVAL_PP(msg_number),
Originator, sizeof(Originator), &OriginatorLength)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to get message originator: %s", error_string);
if (hMessageList != NULLHANDLE){
OSUnlockObject(hMessageList);
OSMemFree(hMessageList);
}
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
RETURN_FALSE;
}
add_property_string(return_value,"originator",Originator, 1);
MailGetMessageItem (hMessage, MAIL_SENDTO_ITEM_NUM, String,
MAXSPRINTF, &StringLength);
add_property_string(return_value,"to",String, 1);
MailGetMessageItemTimeDate(hMessage, MAIL_POSTEDDATE_ITEM_NUM, &Time);
ConvertTIMEDATEToText(NULL, NULL, &Time, String,
sizeof(String), &StringLength);
add_property_string(return_value,"date",String, 1);
MailGetMessageItem (hMessage, MAIL_BLINDCOPYTO_ITEM_NUM, String,
MAXSPRINTF, &StringLength);
add_property_string(return_value,"bcc", String, 1);
MailGetMessageItem (hMessage, MAIL_COPYTO_ITEM_NUM, String,
MAXSPRINTF, &StringLength);
add_property_string(return_value,"cc", String, 1);
MailGetMessageItem (hMessage, MAIL_FROM_ITEM_NUM, String,
MAXSPRINTF, &StringLength);
add_property_string(return_value,"from",String, 1);
MailGetMessageItem (hMessage, MAIL_SUBJECT_ITEM_NUM, String,
MAXSPRINTF, &StringLength);
add_property_string(return_value,"subject",String, 1);
MailGetMessageItem (hMessage, MAIL_DELIVERYPRIORITY_ITEM_NUM, String,
MAXSPRINTF, &StringLength);
add_property_string(return_value,"priority",String, 1);
MailGetMessageItem (hMessage, MAIL_RETURNRECEIPT_ITEM_NUM, String,
MAXSPRINTF, &StringLength);
add_property_string(return_value,"receipt",String, 1);
NonDeliveryReport = MailIsNonDeliveryReport(hMessage);
if (NonDeliveryReport)
{
MailGetMessageItem(hMessage, MAIL_FAILUREREASON_ITEM_NUM,
String, sizeof(String), &StringLength);
add_property_string(return_value,"status",String, 1);
}
else{
add_property_string(return_value,"status","", 1);
}
MailCloseMessage (hMessage);
if (hMessageList != NULLHANDLE){
OSUnlockObject(hMessageList);
OSMemFree(hMessageList);
}
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
}
STATUS near pascal GetUniqueFileName(char *Drive, char *Ext,
char *FileName)
{
int file;
WORD Num;
char Name[17];
char cwd[MAXPATH];
char *Dir;
getcwd(cwd, MAXPATH);
Dir = (char *)&cwd;
for (Num = 0; Num <= 32767; Num++)
{
_itoa(Num, Name, 10);
_makepath(FileName, Drive, Dir, Name, Ext);
if ((file = open(FileName, O_BINARY | O_RDONLY)) == -1)
return(NOERROR);
close(file);
}
FileName[0] = '\0';
return(ERR_READMAIL_NOUNIQUE);
}
PHP_FUNCTION(notes_body)
{
int argc;
pval *argv[3];
pval **server;
pval **mail_box;
pval **msg_number;
STATUS error = NOERROR;
char szMailFilePath[MAXPATH+1];
HANDLE hMessageFile;
HANDLE hMessageList = NULLHANDLE, hMessage;
DARRAY *MessageList;
WORD MessageCount;
char String[MAXSPRINTF+1];
DWORD BodyFileSize;
char BodyFileName[MAXPATH_OLE];
FILE *BodyFile;
char error_string[200];
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(3, &server, &mail_box, &msg_number)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(server);
convert_to_string_ex(mail_box);
convert_to_long_ex(msg_number);
error = NotesInitExtended( argc, (char **) argv );
if( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
OSPathNetConstruct( NULL,
Z_STRVAL_PP(server),
Z_STRVAL_PP(mail_box),
szMailFilePath);
if (error = MailOpenMessageFile(szMailFilePath, &hMessageFile)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error: unable to open '%s': %s.", szMailFilePath, error_string);
RETURN_FALSE;
}
if (error = MailCreateMessageList(hMessageFile,
&hMessageList, &MessageList, &MessageCount)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to create message list: %s", error_string);
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
RETURN_FALSE;
}
if (error = MailOpenMessage (MessageList, (WORD)Z_LVAL_PP(msg_number), &hMessage)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open message number %d: %s", (WORD)Z_LVAL_PP(msg_number), error_string);
if (hMessageList != NULLHANDLE){
OSUnlockObject(hMessageList);
OSMemFree(hMessageList);
}
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
RETURN_FALSE;
}
if (error = GetUniqueFileName("", "TMP", BodyFileName)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Enable to create temporary file name: %s", error_string);
if (hMessageList != NULLHANDLE){
OSUnlockObject(hMessageList);
OSMemFree(hMessageList);
}
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
MailCloseMessage (hMessage);
RETURN_FALSE;
}
if (error = MailGetMessageBodyText(hMessage,
NULL,
"\r\n",
80,
TRUE,
BodyFileName,
&BodyFileSize)){
unlink(BodyFileName);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to get Message body into temporary file: %s", error_string);
if (hMessageList != NULLHANDLE){
OSUnlockObject(hMessageList);
OSMemFree(hMessageList);
}
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
MailCloseMessage (hMessage);
RETURN_FALSE;
}
if (!(BodyFile = fopen(BodyFileName, "r"))){
unlink(BodyFileName);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open temporary file: %s", error_string);
if (hMessageList != NULLHANDLE){
OSUnlockObject(hMessageList);
OSMemFree(hMessageList);
}
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
MailCloseMessage (hMessage);
RETURN_FALSE;
}
array_init(return_value);
while (fgets(String, READMAIL_BODY_LINELEN, BodyFile)){
add_next_index_string( return_value, String, 1);
}
fclose(BodyFile);
unlink(BodyFileName);
MailCloseMessage (hMessage);
if (hMessageList != NULLHANDLE){
OSUnlockObject(hMessageList);
OSMemFree(hMessageList);
}
if (hMessageFile != NULLHANDLE){
MailCloseMessageFile(hMessageFile);
}
}
PHP_FUNCTION(notes_find_note)
{
int argc;
pval *argv[3];
pval **db;
pval **name;
pval **type;
STATUS error = NOERROR;
DBHANDLE db_handle;
NOTEID note_id;
char error_string[200];
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(3, &db, &name, &type)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
convert_to_string_ex(name);
convert_to_string_ex(type);
error = NotesInitExtended( argc, (char **) argv );
if( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbOpen (Z_STRVAL_PP(db), &db_handle)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if( strcmp( Z_STRVAL_PP(type), "FORM" ) == 0 ){
if ((error = NIFFindDesignNote(db_handle, Z_STRVAL_PP(name), NOTE_CLASS_FORM, ¬e_id)) != ERR_NOT_FOUND) {
RETVAL_LONG( (long) note_id );
}
} else if( strcmp( Z_STRVAL_PP(type), "VIEW" ) == 0 ){
if ((error = NIFFindDesignNote(db_handle, Z_STRVAL_PP(name), NOTE_CLASS_VIEW, ¬e_id)) != ERR_NOT_FOUND) {
RETVAL_LONG( (long) note_id );
}
} else if( strcmp( Z_STRVAL_PP(type), "FILTER" ) == 0 ){
if ((error = NIFFindDesignNote(db_handle, Z_STRVAL_PP(name), NOTE_CLASS_FILTER, ¬e_id)) != ERR_NOT_FOUND) {
RETVAL_LONG( (long) note_id );
}
} else if( strcmp( Z_STRVAL_PP(type), "FIELD" ) == 0 ){
if ((error = NIFFindDesignNote(db_handle, Z_STRVAL_PP(name), NOTE_CLASS_FIELD, ¬e_id)) != ERR_NOT_FOUND) {
RETVAL_LONG( (long) note_id );
}
}
else{
if ((error = NIFFindDesignNote(db_handle, Z_STRVAL_PP(name), NOTE_CLASS_ALL, ¬e_id)) != ERR_NOT_FOUND) {
RETVAL_LONG( (long) note_id );
}
}
NSFDbClose(db_handle);
NotesTerm();
}
PHP_FUNCTION(notes_nav_create)
{
int argc;
pval *argv[2];
pval **db;
pval **name;
char error_string[200];
STATUS error = NOERROR;
DBHANDLE db_handle;
WORD ClassView = NOTE_CLASS_VIEW;
NOTEHANDLE view_handle;
char szMainView[] = "MainView";
VIEWMAP_HEADER_RECORD NavHeader;
WORD wLayoutCount;
WORD wNavLayoutBufLen;
HANDLE hNavLayoutBuffer;
char *pNavLayoutBuffer;
char *pNLBuf;
char szDFlags[3];
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(2, &db, &name)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
convert_to_string_ex(name);
error = NotesInitExtended( argc, (char **) argv );
if( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbOpen (Z_STRVAL_PP(db), &db_handle)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
error = NSFNoteCreate( db_handle, &view_handle );
if ( error ) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to create note in database: %s", error_string);
NSFDbClose( db_handle );
NotesTerm();
RETURN_FALSE;
}
NSFNoteSetInfo( view_handle, _NOTE_CLASS, &ClassView );
error = NSFItemSetText( view_handle, VIEW_TITLE_ITEM,
Z_STRVAL_PP(name), MAXWORD );
if ( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to set text item '%s' in view note: %s", VIEW_TITLE_ITEM, error_string);
NSFNoteClose( view_handle );
NSFDbClose( db_handle );
NotesTerm();
RETURN_FALSE;
}
szDFlags[0] = DESIGN_FLAG_VIEWMAP;
szDFlags[1] = DESIGN_FLAG_HIDE_FROM_V3;
szDFlags[2] = '\0';
error = NSFItemAppend( view_handle,
ITEM_SUMMARY,
DESIGN_FLAGS,
(WORD)strlen(DESIGN_FLAGS),
TYPE_TEXT,
szDFlags,
(DWORD)strlen(szDFlags ));
if ( error ) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to append item '%s' to view note: %s", DESIGN_FLAGS, error_string);
NSFNoteClose( view_handle );
NSFDbClose( db_handle );
NotesTerm();
RETURN_FALSE;
}
wLayoutCount = 0;
wNavLayoutBufLen = ODSLength( _VIEWMAP_HEADER_RECORD );
if ( error = OSMemAlloc( 0, wNavLayoutBufLen, &hNavLayoutBuffer )){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to allocate %d bytes memory: %s", wNavLayoutBufLen, error_string);
NSFNoteClose( view_handle );
NSFDbClose( db_handle );
NotesTerm();
RETURN_FALSE;
}
pNavLayoutBuffer = (char*) OSLockObject( hNavLayoutBuffer );
memset( pNavLayoutBuffer, 0, (size_t) wNavLayoutBufLen );
pNLBuf = pNavLayoutBuffer;
NavHeader.Header.Signature = SIG_CD_VMHEADER;
NavHeader.Header.Length = (BYTE) ODSLength(_VIEWMAP_HEADER_RECORD );
NavHeader.Version = VIEWMAP_VERSION;
NavHeader.NameLen = 0;
ODSWriteMemory( &pNLBuf, _VIEWMAP_HEADER_RECORD, &NavHeader, 1 );
error = NSFItemAppend( view_handle,
ITEM_SUMMARY,
VIEWMAP_LAYOUT_ITEM,
(WORD)strlen(VIEWMAP_LAYOUT_ITEM),
TYPE_VIEWMAP_LAYOUT,
pNavLayoutBuffer,
(DWORD)wNavLayoutBufLen );
OSUnlockObject( hNavLayoutBuffer );
OSMemFree( hNavLayoutBuffer );
if ( error ) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to append item '%s' to view note: %s", VIEWMAP_LAYOUT_ITEM, error_string);
NSFNoteClose( view_handle );
NSFDbClose( db_handle );
NotesTerm();
RETURN_FALSE;
}
error = NSFNoteUpdate( view_handle, 0 );
if ( error) {
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to update note: %s", error_string);
NSFNoteClose( view_handle );
NSFDbClose( db_handle );
NotesTerm();
RETURN_FALSE;
}
NSFNoteClose( view_handle );
NSFDbClose( db_handle );
NotesTerm();
RETURN_TRUE;
}
STATUS LNPUBLIC file_action (void *, SEARCH_MATCH *, ITEM_TABLE *);
STATUS LNPUBLIC print_file_summary (ITEM_TABLE *);
PHP_FUNCTION(notes_search)
{
int argc;
pval *argv[2];
STATUS error;
DBHANDLE db_handle;
HANDLE search_handle;
pval **db;
pval **keywords;
char error_string[200];
FT_INDEX_STATS Stats;
DWORD RetDocs;
HANDLE SearchResults_handle;
FT_SEARCH_RESULTS *pSearchResults;
HANDLE IDTable_handle;
NOTEID *pNoteID;
BYTE *pScores;
DWORD i;
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(2, &db, &keywords)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
convert_to_string_ex(keywords);
error = NotesInitExtended( argc, (char **) argv );
if( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbOpen (Z_STRVAL_PP(db), &db_handle)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
error = FTIndex(db_handle, FT_INDEX_AUTOOPTIONS, NULL, &Stats);
if (error){
NSFDbClose (db_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to search database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = FTOpenSearch(&search_handle)){
NSFDbClose (db_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open search: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
error = FTSearch (db_handle,
&search_handle,
(HCOLLECTION) NULLHANDLE,
Z_STRVAL_PP(keywords),
FT_SEARCH_SCORES |
FT_SEARCH_STEM_WORDS,
0,
NULLHANDLE,
&RetDocs,
NULL,
&SearchResults_handle);
if (error){
FTCloseSearch (search_handle);
NSFDbClose (db_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error during searchkkk: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (RetDocs == 0 )
{
php_printf("\n0 documents returned \n");
FTCloseSearch (search_handle);
NSFDbClose (db_handle);
NotesTerm();
RETURN_FALSE;
}
pSearchResults = OSLock (FT_SEARCH_RESULTS, SearchResults_handle);
if (error = IDCreateTable(sizeof(NOTEID), &IDTable_handle))
{
FTCloseSearch (search_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error creating ID table: %s", error_string);
NSFDbClose (db_handle);
NotesTerm();
RETURN_FALSE;
}
pNoteID = (NOTEID *) (((char *) pSearchResults)
+ sizeof(FT_SEARCH_RESULTS));
pScores = (BYTE *) (pNoteID + pSearchResults->NumHits);
for (i = 0; i < pSearchResults->NumHits; i++, pNoteID++, pScores++)
{
if (error = IDInsert (IDTable_handle, *pNoteID, NULL))
{
OSUnlockObject(SearchResults_handle);
OSMemFree (SearchResults_handle);
FTCloseSearch (search_handle);
IDDestroyTable (IDTable_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error saving note to ID table: %s", error_string);
NSFDbClose (db_handle);
NotesTerm();
RETURN_FALSE;
}
}
OSUnlockObject(SearchResults_handle);
OSMemFree (SearchResults_handle);
if (error = FTCloseSearch(search_handle))
{
IDDestroyTable (IDTable_handle);
NSFDbClose (db_handle);
NotesTerm();
RETURN_FALSE;
}
if (error = FTOpenSearch(&search_handle))
{
NSFDbClose (db_handle);
NotesTerm();
RETURN_FALSE;
}
error = FTSearch (db_handle,
&search_handle,
(HCOLLECTION) NULLHANDLE,
Z_STRVAL_PP(keywords),
FT_SEARCH_SCORES |
FT_SEARCH_REFINE,
0,
IDTable_handle,
&RetDocs,
NULL,
&SearchResults_handle);
if (error)
{
FTCloseSearch (search_handle);
IDDestroyTable (IDTable_handle);
NSFDbClose (db_handle);
NotesTerm();
RETURN_FALSE;
}
if (RetDocs == 0 )
{
php_printf("\n0 documents returned \n");
FTCloseSearch (search_handle);
IDDestroyTable (IDTable_handle);
NSFDbClose (db_handle);
NotesTerm();
RETURN_FALSE;
}
pSearchResults = OSLock (FT_SEARCH_RESULTS, SearchResults_handle);
pNoteID = (NOTEID *) (((char *) pSearchResults)
+ sizeof(FT_SEARCH_RESULTS));
array_init(return_value);
pScores = (BYTE *) (pNoteID + pSearchResults->NumHits);
for (i = 0; i < pSearchResults->NumHits; i++, pNoteID++, pScores++){
add_next_index_long(return_value, (long) *pNoteID );
}
OSUnlockObject (SearchResults_handle);
OSMemFree (SearchResults_handle);
IDDestroyTable (IDTable_handle);
if (error = FTCloseSearch(search_handle))
{
NSFDbClose (db_handle);
NotesTerm();
RETURN_FALSE;
}
NSFDbClose (db_handle);
NotesTerm();
}
PHP_FUNCTION(notes_copy_db)
{
int argc;
pval *argv[3];
STATUS error;
DBHANDLE input_handle;
DBHANDLE output_handle;
char error_string[200];
pval **db_input;
pval **db_output;
pval **title;
DBREPLICAINFO replica_info;
char output_db_info[NSF_INFO_SIZE];
TIMEDATE start_time;
TIMEDATE last_time;
DBID input_dbid;
DBID output_dbid;
HANDLE idtable_p;
DWORD num_scanned, num_entries;
NOTEID note_id;
NOTEHANDLE hIconNote;
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(3, &db_input, &db_output, &title)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db_input);
convert_to_string_ex(db_output);
convert_to_string_ex(title);
error = NotesInitExtended( argc, (char **) argv );
if( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbOpen (Z_STRVAL_PP(db_input), &input_handle)){
NSFDbClose (input_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open input database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = NSFDbCreate (Z_STRVAL_PP(db_output), DBCLASS_NOTEFILE, FALSE))
{
NSFDbClose (input_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to create database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = NSFDbOpen (Z_STRVAL_PP(db_output), &output_handle))
{
NSFDbClose (input_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error opening output database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = NSFDbReplicaInfoGet (input_handle, &replica_info))
{
NSFDbClose (input_handle);
NSFDbClose (output_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error copying replication information: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = NSFDbCopyACL (input_handle, output_handle))
{
NSFDbClose (input_handle);
NSFDbClose (output_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error copying ACL: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
TimeConstant (TIMEDATE_WILDCARD, &start_time);
NSFDbIDGet (input_handle, &input_dbid);
NSFDbIDGet (output_handle, &output_dbid);
if (error = NSFDbGetModifiedNoteTable (input_handle,
NOTE_CLASS_ALL,
start_time, &last_time,
&idtable_p) )
if (error == ERR_NO_MODIFIED_NOTES){
NSFDbClose (input_handle);
NSFDbClose (output_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_NOTICE,"There are no documents in the Database: %s", error_string);
NotesTerm();
RETURN_TRUE;
}
else
{
NSFDbClose (input_handle);
NSFDbClose (output_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error copying replication information: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
num_scanned = 0L;
num_entries = IDEntries (idtable_p);
if (num_entries)
while (IDScan (idtable_p, (FLAG)(num_scanned++ == 0), ¬e_id) )
if (error = NSFDbCopyNote (input_handle, &input_dbid,
&replica_info.ID, note_id,
output_handle, &output_dbid,
&replica_info.ID, NULL,
NULL) )
{
IDDestroyTable (idtable_p);
NSFDbClose (input_handle);
NSFDbClose (output_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error copying notes: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
IDDestroyTable (idtable_p);
output_db_info[0] = '\0';
if (error = NSFDbInfoGet (output_handle, output_db_info))
{
NSFDbClose (input_handle);
NSFDbClose (output_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error getting output database information buffer: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
NSFDbInfoModify (output_db_info, INFOPARSE_TITLE, Z_STRVAL_PP(title));
if (error = NSFDbInfoSet (output_handle, output_db_info))
{
NSFDbClose (input_handle);
NSFDbClose (output_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error adding the database title to the buffer: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (!NSFNoteOpen(output_handle, NOTE_ID_SPECIAL+NOTE_CLASS_ICON,
0, &hIconNote))
{
if (NSFItemIsPresent (hIconNote, FIELD_TITLE, (WORD) strlen (FIELD_TITLE)) )
{
NSFItemSetText(hIconNote, FIELD_TITLE, output_db_info, MAXWORD);
NSFNoteUpdate(hIconNote, 0);
}
NSFNoteClose(hIconNote);
}
if (error = NSFDbClose (input_handle))
{
NSFDbClose (output_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error closing the input database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = NSFDbClose (output_handle)){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Error closing the output database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
NotesTerm();
RETURN_TRUE;
}
STATUS LNPUBLIC ReadSummaryData (
VOID far *,
SEARCH_MATCH far *,
ITEM_TABLE far *);
STATUS PrintSummary (char *);
STATUS ExtractTextList (char *, char *);
#define MAX_ITEM_LEN 34816
#define MAX_ITEMS 32768/sizeof(ITEM)
#define MAX_ITEM_NAME_LEN DESIGN_NAME_MAX
ITEM Items[MAX_ITEMS];
char ItemText[MAX_ITEM_LEN];
char ItemName[MAX_ITEM_NAME_LEN];
PHP_FUNCTION(notes_list_msgs)
{
int argc;
pval *argv[1];
STATUS error;
DBHANDLE db_handle;
char error_string[200];
pval **db;
argc = ARG_COUNT(ht);
if (getParametersArray(ht, argc, argv) == FAILURE){
WRONG_PARAM_COUNT;
}
if (zend_get_parameters_ex(1, &db)==FAILURE) {
RETURN_FALSE;
}
convert_to_string_ex(db);
error = NotesInitExtended( argc, (char **) argv );
if( error ){
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to initialize Lotus Notes: %s", error_string);
RETURN_FALSE;
}
if (error = NSFDbOpen (Z_STRVAL_PP(db), &db_handle)){
NSFDbClose (db_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to open database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = NSFSearch (
db_handle,
NULLHANDLE,
NULL,
SEARCH_SUMMARY,
NOTE_CLASS_DATA,
NULL,
ReadSummaryData,
NULL,
NULL))
{
NSFDbClose (db_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to search database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
if (error = NSFDbClose (db_handle))
{
NSFDbClose (db_handle);
OSLoadString(NULLHANDLE, ERR(error), error_string, sizeof(error_string));
php_error(E_WARNING,"Unable to close database: %s", error_string);
NotesTerm();
RETURN_FALSE;
}
RETURN_TRUE
}
STATUS LNPUBLIC ReadSummaryData
(VOID far *optional_param,
SEARCH_MATCH far *search_info,
ITEM_TABLE far *summary_info)
{
SEARCH_MATCH SearchMatch;
STATUS error;
memcpy ((char*)(&SearchMatch), (char *)search_info, sizeof(SEARCH_MATCH));
if (!(SearchMatch.SERetFlags & SE_FMATCH))
return (NOERROR);
php_printf ("\nNote ID is: %lX.\n<br />", SearchMatch.ID.NoteID);
if (error = PrintSummary( (char*)summary_info ))
return (error);
return (NOERROR);
}
STATUS PrintSummary (char *pSummary)
{
char *pSummaryPos;
ITEM_TABLE ItemTable;
USHORT ItemCount;
USHORT NameLength;
USHORT ValueLength;
WORD DataType;
char *szDataType;
USHORT TextLen;
NUMBER NumericItem;
NUMBER_PAIR NumberPair;
RANGE Range;
TIMEDATE TimeItem;
TIMEDATE_PAIR TimePairItem;
WORD TimeStringLen;
STATUS error;
USHORT i;
USHORT j;
pSummaryPos = pSummary;
memcpy ((char*)(&ItemTable), pSummaryPos, sizeof(ITEM_TABLE));
pSummaryPos += sizeof(ItemTable);
ItemCount = ItemTable.Items;
for (i=0; i < ItemCount; i++)
{
memcpy((char*)(&Items[i]), pSummaryPos, sizeof(ITEM));
pSummaryPos += sizeof(ITEM);
}
for (i=0; i < ItemCount; i++)
{
memset (ItemText, 0, MAX_ITEM_LEN);
memset (ItemName, 0, MAX_ITEM_NAME_LEN);
NameLength = Items[i].NameLength;
memcpy (ItemName, pSummaryPos, NameLength);
ItemName[NameLength] = '\0';
pSummaryPos += NameLength;
if (Items[i].ValueLength == 0)
{
strcpy(ItemName, " * ");
ItemText[0] = '\0';
goto PrintItem;
}
memcpy ((char*)(&DataType), pSummaryPos, sizeof(WORD));
pSummaryPos += sizeof(WORD);
ValueLength = Items[i].ValueLength - sizeof(WORD);
switch (DataType)
{
case TYPE_TEXT:
szDataType = "TYPE_TEXT";
memcpy (ItemText, pSummaryPos, ValueLength);
ItemText[ValueLength] = '\0';
pSummaryPos += ValueLength;
break;
case TYPE_TEXT_LIST:
szDataType = "TYPE_TEXT_LIST";
if (error = ExtractTextList (pSummaryPos, ItemText))
{
printf ("Error: unable to extract text list.\n");
ItemText[0] = '\0';
}
pSummaryPos += ValueLength;
break;
case TYPE_NUMBER:
szDataType = "TYPE_NUMBER";
memcpy ((char *)(&NumericItem), pSummaryPos, sizeof(NUMBER));
sprintf (ItemText, "%f", NumericItem);
pSummaryPos += sizeof(NUMBER);
break;
case TYPE_NUMBER_RANGE:
szDataType = "TYPE_NUMBER_RANGE";
TextLen = 0;
memcpy ((char*)(&Range), pSummaryPos, sizeof(RANGE));
pSummaryPos += sizeof(RANGE);
for (j=0; j < Range.ListEntries; j++)
{
memcpy ((char*)(&NumericItem), pSummaryPos,
sizeof(NUMBER));
sprintf (ItemText+TextLen, "%f ", NumericItem);
pSummaryPos += sizeof(NUMBER);
TextLen = strlen(ItemText);
}
if ((Range.ListEntries != 0) && (Range.RangeEntries != 0))
{
memcpy (ItemText+TextLen, "; ", 2);
TextLen += 2;
}
for (j=0; j < Range.RangeEntries; j++)
{
memcpy ((char*)(&NumberPair), pSummaryPos,
sizeof(NUMBER_PAIR));
sprintf (ItemText+TextLen, "%f - %f ", NumberPair.Lower,
NumberPair.Upper);
pSummaryPos += sizeof(NUMBER_PAIR);
TextLen = strlen(ItemText);
}
break;
#ifndef APITESTMODE
case TYPE_TIME:
szDataType = "TYPE_TIME";
memcpy ((char*)(&TimeItem), pSummaryPos, sizeof(TIMEDATE));
pSummaryPos += sizeof(TIMEDATE);
if (error = ConvertTIMEDATEToText (
NULL, NULL, &TimeItem,
ItemText, MAXALPHATIMEDATE,
&TimeStringLen))
{
printf ("Error: unable to convert TIMEDATE to text.\n");
TimeStringLen = 0;
}
ItemText[TimeStringLen] = '\0';
break;
case TYPE_TIME_RANGE:
szDataType = "TYPE_TIME_RANGE";
TextLen = 0;
memcpy ((char*)(&Range), pSummaryPos, sizeof(RANGE));
pSummaryPos += sizeof(RANGE);
for (j=0; j < Range.ListEntries; j++)
{
if (j != 0)
{
memcpy (ItemText+TextLen, ",", 1);
TextLen++;
}
memcpy ((char*)(&TimeItem), pSummaryPos,
sizeof(TIMEDATE));
pSummaryPos += sizeof(TIMEDATE);
if (error = ConvertTIMEDATEToText (
NULL, NULL,
&TimeItem,
ItemText+TextLen,
MAXALPHATIMEDATE, &TimeStringLen))
{
printf("Error: unable to convert TIMEDATE to text.\n");
TimeStringLen = 0;
}
TextLen += TimeStringLen;
}
if (Range.RangeEntries == 0)
{
ItemText[TextLen] = '\0';
break;
}
memcpy (ItemText+TextLen, " ; ", 3);
TextLen += 3;
for (j=0; j < Range.RangeEntries; j++)
{
if (j != 0)
{
memcpy (ItemText+TextLen, ",", 1);
TextLen++;
}
memcpy ((char*)&TimePairItem, pSummaryPos,
sizeof(TIMEDATE_PAIR));
pSummaryPos += sizeof(TIMEDATE_PAIR);
if (error = ConvertTIMEDATEToText (
NULL, NULL,
&TimePairItem.Lower, ItemText+TextLen,
MAXALPHATIMEDATE, &TimeStringLen))
{
printf("Error: unable to convert TIMEDATE to text.\n");
TimeStringLen = 0;
}
TextLen += TimeStringLen;
memcpy (ItemText+TextLen, "-", 1);
TextLen++;
if (error = ConvertTIMEDATEToText (
NULL, NULL,
&TimePairItem.Upper, ItemText+TextLen,
MAXALPHATIMEDATE, &TimeStringLen))
{
printf("Error: unable to convert TIMEDATE to text.\n");
TimeStringLen = 0;
}
TextLen += TimeStringLen;
}
ItemText[TextLen] = '\0';
break;
#endif
default:
szDataType = "Unrecognized";
ItemText[0] = '\0';
pSummaryPos += ValueLength;
break;
}
PrintItem:
printf ("\tItem Name = %s\n", ItemName);
printf ("\tData Type = %s\n", szDataType);
#ifndef APITESTMODE
printf ("\tItem Value = \"%s\"\n\n", ItemText);
#else
if (strcmp(ItemName,"$UpdatedBy")==0)
printf ("\tItem Value =\n\n", ItemText);
else
printf ("\tItem Value = \"%s\"\n\n", ItemText);
#endif
}
printf ("\n");
return (NOERROR);
}
STATUS ExtractTextList (char *pBuffer, char *TextList)
{
LIST List;
char *ListEntry;
WORD TextLen;
WORD EntryLen;
STATUS error;
USHORT i;
TextLen = 0;
TextList[0] = '\0';
memcpy ((char*)(&List), pBuffer, sizeof(LIST));
for (i=0; i<List.ListEntries; i++)
{
if (error = ListGetText (
pBuffer,
FALSE,
i,
&ListEntry,
&EntryLen))
{
return (ERR(error));
}
memcpy (TextList+TextLen, ListEntry, EntryLen);
TextLen += EntryLen;
memcpy (TextList+TextLen, ",", 1);
TextLen++;
}
TextLen--;
memcpy (TextList+TextLen, "\0", 1);
return (NOERROR);
}