Enable helpbrowser within YaSp
[scilab.git] / scilab / modules / gui / sci_gateway / cpp / sci_helpbrowser.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2011 - DIGITEO - Bruno JOFRET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "gui_gw.hxx"
14 #include "function.hxx"
15 #include "bool.hxx"
16 #include "double.hxx"
17 #include "string.hxx"
18
19 extern "C"
20 {
21 #include "loadOnUseClassPath.h"
22 #include "CallHelpBrowser.h"
23 #include "Scierror.h"
24 #include "localization.h"
25 #include "charEncoding.h"
26 }
27
28 using namespace types;
29
30 static BOOL loadedDep = FALSE;
31
32 Function::ReturnValue sci_helpbrowser(typed_list &in, int _iRetCount, typed_list& out)
33 {
34     int iHelpAdrSize    = 0;
35     char **helpAdr      = NULL;
36     char **languageAdr  = NULL;
37
38     if(_iRetCount > 1)
39     {
40         ScierrorW(78, _W("%ls:  Wrong number of output argument(s): %d to %d expected."), L"helpbrowser", 0, 1);
41         return Function::Error;
42     }
43     switch (in.size())
44     {
45     case 4:
46         if( !(in[3]->isBool() == true && in[3]->getAs<Bool>()->isScalar() == true))
47         {
48             ScierrorW(999, _W("%ls:  Wrong type for input argument #%d: A boolean expected."), L"helpbrowser", 4);
49             return Function::Error;
50         }
51         if( !(in[2]->isString() == true && in[2]->getAs<String>()->isScalar() == true))
52         {
53             ScierrorW(999, _W("%ls:  Wrong type for input argument #%d: A string expected."), L"helpbrowser", 3);
54             return Function::Error;
55         }
56     case 2:
57         // Second argument must be String or at least [].
58         if( !(in[1]->isString() == true && in[1]->getAs<String>()->isScalar() == true))
59         {
60             ScierrorW(999, _W("%ls:  Wrong type for input argument #%d: A string expected."), L"helpbrowser", 2);
61             return Function::Error;
62         }
63         // Scalar String or [] allowed.
64         if( !( (in[0]->isString() == true && in[0]->getAs<String>()->isScalar() == true)
65                || (in[0]->isDouble() == true && in[0]->getAs<Double>()->isEmpty() == true)) )
66         {
67             ScierrorW(999, _W("%ls:  Wrong type for input argument #%d: A string expected."), L"helpbrowser", 1);
68             return Function::Error;
69         }
70         break;
71     default:
72         ScierrorW(77, _W("%ls:  Wrong number of input argument(s): %d to %d expected."), L"helpbrowser", 2, 4);
73         return Function::Error;
74     }
75
76     /* We load SciNotes when calling javahelp because we have no way to know
77      * to load it when using Javahelp because it can call SciNotes directly */
78     if (!loadedDep)
79     {
80         loadOnUseClassPath("SciNotes");
81         loadedDep = TRUE;
82     }
83
84     if (in[0]->isString() == true)
85     {
86         String *pInHelpAdr =  in[0]->getAs<String>();
87         helpAdr = new char*[pInHelpAdr->getSize()];
88         iHelpAdrSize = pInHelpAdr->getSize();
89
90         for (int i = 0 ; i < pInHelpAdr->getSize() ; ++i)
91         {
92             helpAdr[i] = wide_string_to_UTF8(pInHelpAdr->get(i));
93         }
94     }
95
96     char* pstLang   = NULL;
97     char* pstKey    = NULL;
98     if (in.size() == 2)
99     {
100         pstLang = wide_string_to_UTF8(in[1]->getAs<String>()->get(0));
101         launchHelpBrowser(helpAdr, iHelpAdrSize, pstLang);
102     }
103
104     if (in.size() == 4)
105     {
106         pstLang = wide_string_to_UTF8(in[2]->getAs<String>()->get(0));
107         pstKey  = wide_string_to_UTF8(in[1]->getAs<String>()->get(0));
108         int iFullText = in[3]->getAs<Bool>()->get(0);
109         searchKeyword(helpAdr, iHelpAdrSize, pstKey, pstLang, iFullText);
110     }
111
112     if(pstLang != NULL)
113     {
114         FREE(pstLang);
115     }
116
117     if(pstKey != NULL)
118     {
119         FREE(pstKey);
120     }
121
122     if(helpAdr != NULL) /* No toolboxes loaded */
123     {
124         for(int i = 0 ; i < iHelpAdrSize ; i++)
125         {
126             FREE(helpAdr[i]);
127         }
128         delete[] helpAdr;
129     }
130
131     return Function::OK;
132 }