/** \file helphelper.c * use OSX Help system */ /* XTrkCad - Model Railroad CAD * Copyright (C) 2015 Martin Fischer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #import #import #include #include #include #include #include #include #include #include #include #include #include #include #define HELPCOMMANDPIPE "/tmp/helppipe" #define EXITCOMMAND "##exit##" OSStatus MyGoToHelpPage (CFStringRef pagePath, CFStringRef anchorName) { CFBundleRef myApplicationBundle = NULL; CFStringRef myBookName = NULL; OSStatus err = noErr; printf("HelpHelper: Started to look for help\n"); myApplicationBundle = CFBundleGetMainBundle(); if (myApplicationBundle == NULL) { printf("HelpHelper: Error - No Application Bundle\n"); err = fnfErr; return err; } printf("HelpHelper: Application Bundle Found\n"); myBookName = CFBundleGetValueForInfoDictionaryKey( myApplicationBundle, CFSTR("CFBundleHelpBookName")); if (myBookName == NULL) { myBookName = CFStringCreateWithCString(NULL, "XTrackCAD Help", kCFStringEncodingMacRoman); printf("HelpHelper: Defaulting to 'XTrackCAD Help'\n" ); err = fnfErr; return err; } printf("HelpHelper: BookName dictionary name %s found\n", CFStringGetCStringPtr(myBookName, kCFStringEncodingMacRoman)); if (CFGetTypeID(myBookName) != CFStringGetTypeID()) { printf("HelpHelper: Error - BookName is not a string\n" ); err = paramErr; } if (err == noErr) { err = AHGotoPage (myBookName, pagePath, anchorName); if (err != noErr) { printf("HelpHelper: Error in AHGoToPage('%s','%s')\n", CFStringGetCStringPtr(myBookName, kCFStringEncodingMacRoman), CFStringGetCStringPtr(pagePath, kCFStringEncodingMacRoman)); } } return err; }; int displayHelp(char* name) { CFStringRef str = CFStringCreateWithCString(NULL,name, kCFStringEncodingMacRoman); OSStatus err = MyGoToHelpPage(str, NULL); if (err != noErr) { printf("HelpHelper: MyGoToHelpPage had error %d\n", err); } return err; }; int main( int argc, char **argv ) { int handleOfPipe = 0; char buffer[ 100 ]; char issue[ 100 ]; int len; int finished = 0; int numBytes = 0; int numBytes2 = 0; printf( "HelpHelper: starting!\n" ); handleOfPipe = open( HELPCOMMANDPIPE, O_RDONLY ); if( handleOfPipe ) { printf( "HelpHelper: opened pipe for reading\n" ); while( !finished ) { printf( "HelpHelper: reading from pipe...\n" ); numBytes = read( handleOfPipe, &len, sizeof( int )); if( numBytes > 0 ) { printf( "HelpHelper: read %d bytes\n", numBytes ); } if( numBytes == sizeof(int)) { printf( "HelpHelper: Expecting %d bytes\n", len ); numBytes2 = read( handleOfPipe, buffer, len + 1 ); buffer[numBytes2] = '\0'; if (numBytes2 > 0) { printf( "HelpHelper: Display help on: %s\n", buffer ); } if( !strcmp(buffer, EXITCOMMAND )) { finished = 1; } else { if (displayHelp(buffer) != 0) { printf( "HelpHelper: Error\n"); } } } if( numBytes <= 0 ) { printf( "HelpHelper: exiting on pipe error\n" ); exit( 1 ); } } } else { printf( "HelpHelper: Could not open pipe for reading\n" ); } printf( "HelpHelper: exiting!" ); exit( 0 ); };